Определение функции и функции-блока
В Техно 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