<< Click to Display Table of Contents >> Navigation: Проект > Элементы дерева объектов > Палитра ФБ > Служебные > Скрипт > Руководство и примеры > Обращение к переменным проекта > Обращение к переменным проекта |
В разделе мы рассмотрели работу со входами и выходами ФБ "Скрипт C#" - это его штатный функционал, который можно использовать для решения каких-либо алгоритмических задач. Однако в ряде случаев необходимо иметь возможность обращаться к переменным дерева объектов вне данного скрипта - для чтения или для записи.
В данном уроке мы разберем код для обращения к таким переменным.
Рассмотрим простой пример. Есть три переменных с различными способами имитации (Синус - Пила - Шум), необходимо найти среди значений максимальное и вывести это значение и имя переменной.
Сделаем это с помощью скрипта. Добавим в дерево объектов скрипт и перейдем на вкладку Код.
Нам необходимо обратится поочередно сначала к значению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 значение есть, то сравниваем с переменной, и если значение переменной больше - сохраняем его.
Можно проверить работу кода, но необходимо включить у него периодический опрос:
Если этого не сделать то код работать не будет - так как входов у него нет, не будет изменений значения, и метод Execute не вызовется. Но у периодического опроса тоже есть минусы - если значения меняются редко, то код все равно будет постоянно вызываться. В нашем случае код простой и он не создаст большую нагрузку, но если вам нужно делать перебор по большому количеству переменных, то следует поискать другой вариант - например выполнять такой проход по определенному сигналу (импульсу).
Запустим режим исполнения.
Все функционирует корректно.
Пример скрипта по ссылке.