Обращение к переменным проекта

<< Click to Display Table of Contents >>

Navigation:  Проект > Элементы дерева объектов > Палитра ФБ > Служебные > Скрипт > Руководство и примеры > Обращение к переменным проекта >

Обращение к переменным проекта

В разделе мы рассмотрели работу со входами и выходами ФБ "Скрипт C#" - это его штатный функционал, который можно использовать для решения каких-либо алгоритмических задач. Однако в ряде случаев необходимо иметь возможность обращаться к переменным дерева объектов вне данного скрипта - для чтения или для записи.

В данном уроке мы разберем код для обращения к таким переменным.​

Рассмотрим простой пример. Есть три переменных с различными способами имитации (Синус - Пила - Шум), необходимо найти среди значений максимальное и вывести это значение и имя переменной.

sluzhebnie_skript_rukovodstvo_i_primery_obrashchenie_k_peremennym_proekta_polucheniya_znacheniya_peremennoj

Сделаем это с помощью скрипта. Добавим в дерево объектов скрипт и перейдем на вкладку Код.

sluzhebnie_skript_rukovodstvo_i_primery_obrashchenie_k_peremennym_proekta_polucheniya_znacheniya_peremennoj1

Нам необходимо обратится поочередно сначала к значению1, сохранить его значение и имя, затем к значению 2 и 3, и если их значение больше - то заменить сохраненное значение ими.

Чтобы получить значение переменной, сначала нужно получить сам класс данной переменной, и затем обратится к его методам и свойствам для получения значений.

Есть несколько способов обращения к переменной. Первый - по полному имени. Пример такого кода:

var item = (ITreePinHlp)HostFB.TreeItemHlp.Project.Item("Объект.Объект 1.Объект 1.Значение 1");

Если же переменная находится на том же уровне, где и скрипт, можно вызвать специальный метод GetChild у класса ParentObject.

var item =(ITreePinHlp)HostFB.TreeItemHlp.ParentObject.GetChild("Значение 1");

Этот вариант нам подходит больше - на нем и остановимся.

После того как переменная item получена, можно получать ее значение в режиме исполнения. Для этого есть специальный метод - GetRTPin.

var ItemValue=(double?)(item.GetRTPin().ObjectValue);

В данном случае мы берем значение нашей переменной с помощью метода GetRTPin, который возвращает класс RtPinHlp, у которого есть набор членов, одним из которых является ObjectValue - значение нашей переменной. Значение представлено типом object, поэтому для работы с ним как с числом нужно выполнить приведение к числу, что и делается вызовом (double?). В итоге наша переменная ItemValue получает тип double(Nullable), и дальше с ней можно работать как нам требуется.

Помимо ObjectValue, есть и другие свойства: Quality - признак качества и TimeStamp - метка времени. Вы также можете использовать их в своем коде.

Теперь, зная все два метода получения данных, мы можем решить нашу задачу.

public override void Execute()
{
    double? Max = null;
    string NameMax = "";
    for (int i = 1; i <= 3; i++) //цикл для перебора всех значений от 1 до 3
    {
        string Name = "Значение " + i.ToString(); //формирование имени
        var item = (ITreePinHlp)HostFB.TreeItemHlp.ParentObject.GetChild(Name); //получение переменной
        var ItemValue = (double?)(item.GetRTPin().ObjectValue); //получение значения
        if (ItemValue.HasValue && (Max.HasValue == false || ItemValue.Value > Max.Value)) //сохранение значения
        {
            Max = ItemValue;
            NameMax = Name;
        }
    }
    if (Max.HasValue) // если значение есть, то пишем его на выходы
    {
        Ошибка = false;
        Значение = Max;
        Имя = NameMax;
    }
    else //значений нет, ничего не нашли - выдаем ошибку
    {
        Ошибка = true;
        Значение = null;
        Имя = "";
    }
}

В код добавлены комментарии, поэтому трудности в понимании возникнуть не должно. Единственное, что стоит уточнить это условие:

if (ItemValue.HasValue && (Max.HasValue==false || ItemValue.Value>Max.Value))

В нем мы проверяем, есть ли у переменной значение, если есть, то проверяем есть ли значение у Max, если нет - то это значение мы и сохраним, а если же у Max значение есть, то сравниваем с переменной, и если значение переменной больше - сохраняем его.

Можно проверить работу кода, но необходимо включить у него периодический опрос:

sluzhebnie_skript_rukovodstvo_i_primery_obrashchenie_k_peremennym_proekta_polucheniya_znacheniya_peremennoj3

Если этого не сделать то код работать не будет - так как входов у него нет, не будет изменений значения, и метод Execute не вызовется. Но у периодического опроса тоже есть минусы - если значения меняются редко, то код все равно будет постоянно вызываться. В нашем случае код простой и он не создаст большую нагрузку, но если вам нужно делать перебор по большому количеству переменных, то следует поискать другой вариант - например выполнять такой проход по определенному сигналу (импульсу).

Запустим режим исполнения.

sluzhebnie_skript_rukovodstvo_i_primery_obrashchenie_k_peremennym_proekta_polucheniya_znacheniya_peremennoj2

Все функционирует корректно.

Пример скрипта по ссылке.