<< Click to Display Table of Contents >> Navigation: Проект > Элементы дерева объектов > Палитра ФБ > Служебные > Программа ST > Создание собственных функциональных блоков, функций и программ. |
MasterSCADA позволяет создавать собственные функции, функциональные блоки и структуры данных. Это позволяет сократить время разработки за счет внесения часто используемого кода в библиотеку. Это также упрощает разработку, отладку и модернизацию кода.
Функция - это простейший из создаваемых компонентов. Функция может иметь несколько входных значений и формировать на выходе одно выходное значение.
При объявлении функции нужно указать тип возвращаемого значения, заканчивается объявление функции оператором END_FUNCTION. Например, функция возвращает вещественную переменную:
FUNCTION My_FUN:real;
<инструкции>
END_FUNCTION
Имя, данное функции используется как выходное значение – присвоенное ему в теле функции значение возвращается в вызываемый код.
Входные переменные объявляются в стандартной секции Var_input:
VAR_INPUT
In: int;
In2:real;
END_VAR
Функция может содержать внутренние переменные, которые объявляются также как и при создании программы – при помощи инструкции var … end_var.
Пример. Создадим функцию, которая будет извлекать квадратный корень из одной входной переменной и складывать с другой входной переменной.
FUNCTION My_SQRT : real
(*входные переменные*)
VAR_INPUT
in:real; (*первая входная переменная*)
in1:int; (*вторая входная переменная*)
END_VAR
(*локальные переменные*)
VAR
k:real ; (*локальная переменная*)
END_VAR
(*КОД ФУНКЦИИ*)
k:=SQRT(in); (*вычисляем квадратный корень*)
My_SQRT:=in1+k; (*сложение со второй входной переменной и присвоение функции*)
END_FUNCTION
Для того чтобы использовать функцию в коде программы, ее нужно вызвать. Для вызова функции используется следующий синтаксис:
имя_функции(параметр1,параметр2,… параметрN);
Где, Параметр – значения, передаваемые в функцию.
Пример:
VAR
first:real;
second:int;
END_VAR
VAR_OUTPUT
out:real;
END_VAR
first:=11.238; (*первая переменная в функции (real) - из нее извлекается квадратный корень*)
second:=2; (*вторая переменная (int) - с ней складывается вычисленное значения корня*)
out:=My_SQRT(first,second); (*порядок записи переменных соответствует порядку заданному при объявлении переменных VAR_INPUT*)
(*в результате в out=5.3523*)
В теле функции допускается вызывать другие функции.
Функциональный блок имеет неограниченное количество входных и выходных переменных, может иметь локальные переменные, а также вызывать функции.
Для работы с функциональным блоком, в коде нужно объявить экземпляр блока и далее вести работу уже с ним. Экземпляры одного и того же блока работают независимо друг от друга.
Объявление функционального блока:
FUNCTION_BLOCK имя_блока
END_FUNCTION_BLOCK
Внутри блока нужно разместить объявление внутренних, внешних и локальных переменных.
Создадим для примера функциональный блок, который будет использовать созданную ранее функцию My_SQRT, передавая в нее значения входов, а затем возведет полученное из функции значение в степень используя стандартную функцию EXPT.
Пример:
FUNCTION_BLOCK My_FB
(*входные переменные*)
VAR_INPUT
in:real;
in1:int;
ste:int;
END_VAR
(*выходные переменные*)
VAR_OUTPUT
output:real;
END_VAR
(*локальные переменные*)
VAR
p:real;
END_VAR
(*Код функционального блока*)
p:=My_SQRT(in,in1); (*вызов функции*)
output:=EXPT(p,ste); (*возведение в степень*)
END_FUNCTION_BLOCK
Большинство функциональных блоков вызываются следующим образом (на примере блока счетчика CTU). Сначала, в секции объявления переменных, нужно объявить экземпляр функционального блока (подобно объявлению обычной переменной):
var
Count:CTU; (*переменная Count - тип счетчик*)
end_var
Функциональный блок может иметь любое количество экземпляров, каждый из которых будет работать независимо от других.
Далее в разделе кода, происходит вызов функционального блока, и работа с его входами и выходами:
Count(CU:=in,R:=in2,PV:=10,Q=>out1,CV=>out2);
Где Count – экземпляр функционального блока типа CTU
CU,R,PV – входные переменные блока
Q,CV – выходные переменные блока.
Входным переменным блока присваивание значений осуществляется при помощи инструкции := , получение выходных переменных блока осуществляется при помощи инструкции =>.
Можно получить доступ к входам и выходам экземпляра функционального блока используя инструкцию:
Имя_экземпляра.имя_переменной
Используя такую инструкцию можно по другому представить аналогичный код:
Count.CU:=in;
Count.R:=in1;
Count();
out1:=Count.Q;
out2:=Count.CV;
При подобном методе присваивания входных переменных блока, распространенной ошибкой является отсутствие в коде инструкции:
Count();
Если данная инструкция отсутствует то блок не будет вызываться, а значит и не будет выполняться.
Примечание. Некоторые функциональные блоки будут работать, только если установлен периодический опрос ФБ «ST». Например, блоки таймеров и детекторов импульсов.
Ссылки: