Пользовательские функции Техно ST

  Определение функции и функции-блока

  Вызов функции и функции-блока

В Техно ST определены две разновидности пользовательских функций: собственно функция и функция-блок. Функция-блок играет роль подпрограммы, т.е. не возвращает значений.

Функции и функции-блоки создаются с помощью табличного редактора. Если при создании указан тип данного компонента, создается функция, в противном случае – функция-блок.

Определение функции и функции-блока

Синтаксис:

function {имя} : {тип возвращаемого значения}

{определение аргументов}

{список предложений}

end_function

  

function_block {имя}

{определение аргументов}

{список предложений}

end_function_block

Эти конструкции создаются автоматически при создании функции и функции-блока в табличном редакторе.

Необязательное выражение {определение аргументов} задается аналогично выражению {определение переменной} для операторов определения переменной (см. Операторы определения переменных в разделе Операторы Техно ST ). Тело функции составляет {список предложений}.

Если при определении аргумента задано его значение, он считается опциональным. Такой аргумент может не указываться в вызове функции; в этом случае используется значение, заданное аргументу при его описании. После определения опционального аргумента не может следовать определение аргумента, для которого значение не задается (такой аргумент обязательно указывается в вызове функции).

Функция может возвращать значение структурного типа, а также массив.

Вызов функции и функции-блока

Синтаксис:

{имя функции}({аргументы})

где {аргументы} – последовательность выражений, разделенных запятыми, или

{имя функции}()

если аргументы у функции или функции-блока отсутствуют.

Число аргументов в вызове функции (функции-блока) должно быть равно числу аргументов, заданных для этой функции (функции-блока).

Передача аргумента по значению или по ссылке задается определением аргумента функции (см. Операторы определения переменных в разделе Операторы Техно ST ). Строки и массивы всегда передаются по ссылке. В случае, когда соответствующий аргумент определяет передачу по значению, передача все равно осуществляется по ссылке, а аргумент считается константой.

Термин по значению обозначает передачу значения аргумента в вызываемую функцию. При этом функция оперирует с копией переменной и не может изменить ее истинное значение. Термин по ссылке обозначает передачу адреса аргумента в вызываемую функцию. При этом функция оперирует с самой переменной и может изменить ее значение.

Вызываемая функция или функция-блок может быть запрограммирована на любом из встроенных языков (функцию нельзя запрограммировать на Техно SFC) – см. также Создание пользовательских функциональных блоков .

Следующие функции (функции-блоки) могут быть вызваны в основной программе только однократно:

   содержащие глобальные переменные программы;

   содержащие FBD-блоки с внутренними переменными (см. Редактирование FBD-программ ).

Другие функции могут вызываться в основной программе многократно.

Пример

Данная программа выполняет возведение в квадрат с использованием ST-функции. При этом показано отличие передачи значения аргумента по ссылке и по значению:

FUNCTION SecondDegree: LREAL

//VAR_ARG определяет передачу значения

//переменной loc_var1

VAR_ARG xx: REAL; END_VAR

//VAR_INOUT определяет передачу адреса

//переменной loc_var2

VAR_INOUT yy: REAL; END_VAR

//следующее действие не изменяет

//значение loc_var1

xx = xx+1;

//следующее действие изменяет значение loc_var2

yy = yy+1;

RETURN (xx+yy)**2;

END_FUNCTION

PROGRAM

VAR

loc_var1:INT;

loc_var2:INT;

d : LREAL;

END_VAR

loc_var1 = 2;

loc_var2=1;

// передача loc_var1 и loc_var2 в функцию,

// способ передачи задается в функции.

// Переменной d присваивается значение,

// определенное в функции оператором RETURN

d := SecondDegree(loc_var1, loc_var2);

END_PROGRAM

Пример

Данный пример демонстрирует особенности использования функции-блока.

FUNCTION_BLOCK Sec_Degree

VAR_ARG

xx: REAL;

yy: REAL;

END_VAR

VAR_OUTPUT

result: LREAL;

END_VAR

result =(xx+yy+1)**2;

END_FUNCTION_BLOCK

PROGRAM

VAR

loc_var1:INT:=2;

loc_var2:INT:=1;

d : LREAL;

END_VAR

//Передача значений loc_var1 и loc_var2

//в функцию-блок. Переменной d присваивается

//значение переменной result функции-блока.

//Чтобы такое присвоение работало корректно,

//переменная result должна быть определена в

//функции-блоке оператором VAR_OUTPUT или

//VAR_INOUT

Sec_Degree(loc_var1, loc_var2, d);

END_PROGRAM