Создание собственных функциональных блоков, функций и программ.

<< 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

Функция может содержать внутренние переменные, которые объявляются также как и при создании программы – при помощи инструкции varend_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». Например, блоки таймеров и детекторов импульсов.

 

Ссылки:

Описание стандарта