ФБ «Скрипт C#» и его использование в MasterSCADA

ФБ «Скрипт C#» и его использование в MasterSCADA

С данной статьи мы начинаем цикл публикаций, посвященных ФБ «Скрипт C#». Данный ФБ предназначен для вставки в проект MasterSCADA кода, написанного на языке C#. Такой код открывает ряд дополнительных возможностей. Во-первых, используя огромное количество .Net библиотек и удобство языка C# можно написать алгоритм любой сложности, реализация которого штатными средствами была бы очень трудоемкой. Во-вторых, из ФБ «Скрипт C#» есть доступ к объектной модели MasterSCADA, что позволяет решать различные нестандартные задачи – отслеживание состояние сообщений, обработка архива по произвольному алгоритму, работа с файлами любых типов и т.д. То есть если вам нужно решить задачу, которую штатными средствами MasterSCADA решить нельзя, то скорее всего ее можно будет решить с помощью ФБ «Скрипт C#».
Целью наших публикаций будет показать возможности, а также несколько типовых примеров использования этого ФБ. Рассказывать подробно про сам язык C# мы не будем, тем более книг по нему существует огромное количество.
«Скрипт C#» находится на закладке «Служебные» палитры ФБ – добавим его в проект.
Вставка его в дерево объектов производится аналогично другим функциональным блокам – нужно отметить его щелчком мыши в палитре, а затем указать в каком объекте его нужно разместить.
ФБ имеет две группы «Входы» и «Выходы», изначально пустые. Также он имеет пять вкладок свойств, 3 стандартные для всех ФБ – «Общие», «Опрос», «Архив», и 2 собственные – «Настройки» и «Код».
На вкладке «Настройки» задаются ссылки на сборки. Сборки – это различные .Net библиотеки, классы и методы которых могут использоваться в коде скрипта. Можно подключать как сборки из поставки MasterSCADA, так и добавлять собственные (сторонние).
Для того чтобы подключить сборку к коду, нужно открыть «Редактор коллекции сборок» нажатием на кнопку с тремя точками, и затем ввести название сборки в поле.
В случае использования собственных библиотек их нужно предварительно разместить в папке MasterSCADA в Program Files.
Вкладка «Код» предназначена непосредственно для написания алгоритма.
Данная вкладка состоит из 4 секций:
1 – секция кода. В данной секции производится написание кода скрипта.
2 – секция входов и выходов. В данной секции создаются входы и выходы, через которые скрипт сможет принимать и передавать данные.
3 – кнопки компиляции и ручного вызова методов.
4 – секция вывода результатов компиляции. Если при компиляции будут обнаружены ошибки, они будут выведены в эту секцию.
Основной является секция кода – именно в ней и будет производится написание алгоритма. Изначально в ней уже находится небольшой код – это шаблон-заготовка, для написания пользовательского кода. В начале находится секция using, в данной секции производится определение пространства имен – какие свойства, классы и методы подключенных библиотек будут доступны из кода.
Затем следует определение класса:
public partial class ФБ : ScriptBase

В данной строчке происходит объявление класса ФБ унаследованного от класса ScriptBase.
Затем происходит объявление метода (метод – это функция, принадлежащая классу) Execute:
public override void Execute()

Данный метод вызывается, когда происходит опрос ФБ (изменилось значение на одном из входов при опросе по изменению, или пришло время опроса если опрос периодический). То есть код размещенный в данном методе будет выполняться при опросе ФБ, поэтому пользовательский код, в основном пишется в теле данного метода (но можно создать собственные классы и вызывать их метода Execute).
Также в классе доступны еще 3 метода:
public override void Start() //метод вызывается один раз при старте режима исполнения. В нем можно произвести инициализацию переменных.
public override void Stop() //метод вызывается один раз при остановке режиме исполнения. В нем можно выполнить завершить необходимые процессы.
public override void DoAction() //метод ручного вызова. Метод вызывается при нажатии на кнопку "DoAction" в секции кнопок. Данный метод нужен для ручного вызова кода - например если код реализует автопостроение проекта.

Если данные методы необходимы в коде, то их нужно прописать в теле класса.
Для примера напишем простейший скрипт для работы в RunTime. Например, сделаем чтобы скрипт выполнял сумму двух чисел, выводил на выход их результат и контролировал чтобы сумма не превышала 100.
Сначала добавим два входа. Для этого в секции входов и выходов вызовем контекстное меню и добавим выберем пункт «Добавить».
Добавился вход.
Вход имеет три столбца для настройки.
Имя – имя переменной (это имя будет присутствовать в дереве объектов, и по нему вы будете обращаться ко входу из кода). Имя допустимо написать кириллицей, но в нем не должно быть пробелов и спецсимволов, и он должен начинаться с буквы. Для переименования нужно выделить поле мышью, а затем еще раз щелкнуть мышью. Переименуем нашу переменную во «Вход1».
Тип – тип доступа переменной. Возможны три варианта – «Чтение», тогда переменная добавляется в группу «Входы», Запись – переменная добавляется в группу «Выходы» и «ЧтениеЗапись» - переменная с одним и тем же именем добавляется и в группу «Входы» и в группу «Выходы». Оставим тип «Чтение».
Тип значения – тип данных входа или выхода. В столбце указывается тип согласно принципам именования в MasterSCADA, но в C#, разумеется, используются другие именования типов. В таблице представлены соотношения типов MasterSCADA и C#.


Тип MasterSCADA


Тип C#


Вещественный


Double?


Целый


Int?


Беззнаковый целый


Uint?


Логический


Bool?


Строковый


String


Время


DateTime?


Нет


Object
Обратите внимание на знак вопроса в наименовании типа в C#. Дело в том, что в MasterSCADA у переменной может отсутствовать значение – вы наверняка видели это когда добавляли команду и не включали у нее значение до опроса. Тип данных у которого значение может отсутствовать в C# называется типом Nullable. Если значения в них нет, то они имеют значение Null. Проверить наличие значения можно проверив на истинность свойство HasValue (то есть Параметр1.HasValue вернет true если значение у переменной Параметр1 есть), получить значение можно через свойство Value (то есть если переменная Параметр1 имеет тип Double?, то Параметр1.Value вернет значение типа Double). Подробнее про Nullable типы можно прочитать здесь:
https://msdn.microsoft.com/ru-ru/library/1t3y8s4s.aspx
Оставим у входа «Вещественный».
Добавим еще одну переменную и назовем ее «Вход2», тип «Чтение», тип данных «Вещественный».
Добавим еще одну переменную, назовем ее «Выход», тип «Запись», тип данных «Вещественный».
Если мы нажмем на кнопку «Применить», то в ФБ в дереве добавятся новые входы и выход.
Теперь приступим к написанию кода.
В секции Execute напишем наш код. Напомним – нам нужно вычислить сумму значений входа1 и входа2, и выдать ее на выход, при этом значение на выходе не должно превышать 100.
Сначала нам нужно убедится, что на Входе1 и Входе2 есть значения, в противном случае на выход нужно записать Null (то есть на выходе тоже тогда значения быть не должно).
public override void Execute()
  {
  if (Вход1.HasValue && Вход2.HasValue)
  {
    //здесь мы потом посчитаем сумму
  }    
  else
Выход=null;  
  }

Имя входа (выхода) в код можно ввести вручную, а можно из панели переменных – либо через контекстное меню, либо двойным кликом. В обоих случая переменная будет установлена в место где находился курсор ввода.
Также при написании кода доступна технология intellisense – это технология автодополнения, т.е. дописывания название функций при вводе начальных букв.
Теперь посчитаем сумму значений и выведем ее на выход. Заведем для суммы отдельную переменную Summ, типа Double и сохраним в нее сумму входов.
double Summ=Вход1.Value+Вход2.Value;

Убедимся, что сумма не превышает 100, иначе на выход запишем 100.
double Summ=Вход1.Value+Вход2.Value;
if (Summ<100) Выход=Summ;
else Выход=100;

Итоговый код метода Execute будет выглядеть так:
public override void Execute()
  {
  if (Вход1.HasValue && Вход2.HasValue)
  {
   double Summ=Вход1.Value+Вход2.Value;
   if (Summ<100) Выход=Summ;
   else Выход=100;
  }    
  else
Выход=null;  
  }

Теперь скомпилируем наш код, нажав на кнопку «Компилировать». Если ошибок не будет, то в панели компиляции будет сообщено об успешности операции.
В противном случае будет выведено описание ошибки, и строка в которой она возникла. Например, если дадим неправильное имя переменной «Вход1»:
В этом случае нужно посмотреть на номер строки, на который ссылается компилятор и исправить ошибку. Следует помнить – из-за особенностей компиляции скриптов при запуске проекта, если скрипт не пройдет компиляцию, то в проекте не будет работать не только этот скрипт, но и другие скрипты проекта.
Запустим режим исполнения и подадим значения на вход.
Если сумма превысит 100, то на значение на выходе будет ограничено.
Все функционирует корректно.
Скачать проект с примером данного скрипта можно по этой ссылке.
В следующих статьях мы рассмотрим несколько практических примеров использования скриптов в проектах.