<< Click to Display Table of Contents >> Navigation: Modbus Universal MasterOPC Server > Руководство по языку Lua 5.1 > Язык и синтаксис > Выражения > Вызовы функций |
В MasterOPC можно выделить три варианта функций:
1.Системные функции и функции API сервера;
2.Пользовательские функции в текущем скрипте (то есть функции в пределах одного тега, устройства, подустройства);
3.Пользовательские функции во внешнем скрипте относительно текущего скрипта (например вызов из скрипта тега функции находящейся в устройстве).
Сначала рассмотрим вызовы системных функций и пользовательских функций текущего скрипта. В этом случае вызовы функций в Lua имеют следующий синтаксис:
prefixexp(args)
При этом функция может возвращать несколько значений, а также может не возвращать их вовсе. Примеры вызова функций:
a=f(x) --вызов функции с передачей одного аргумента, и возвратом одного параметра
a,b,c,d=f(x,2,"string") --вызов функции с передачей 3 аргументов (переменной, числа и строки), и возвратом 4 значений
f(x) --вызов функций без возвращаемых значений
f() --вызов функции без передаваемых и возвращаемых значений
Все выражения вычисляются перед вызовом. Вызов в форме f{fields} синтаксически аналогичен f({fields}); то есть список аргументов является по сути новой таблицей. Вызов в форме f’string’ (или f"string" или f[[string]]) синтаксически равен f(’string’); в данном случае список аргументов – единстванная символьная строка.
Исключением в довольно свободном синтаксисе Lua является правило, по которому нельзя переходить на новую строку непосредственно перед символом ’(’ в вызове функции. Это ограничение позволяет избежать некоторой двусмысленности в языке. Если вы напишите
a = f
(g).x(a)
Lua трактует эту запись как выражение a = f(g).x(a). Поэтому, если вам нужно 2 выражения, вы должны добавить точку с запятой между ними. Если вы действительно хотите вызвать f, вы необходимо убрать переход на новую строку перед (g).
Вызов в форме return functioncall называется koнцeвым вызoвoм. Lua также поддерживает koнцeвoй вызoв "ceбя" (или pekуpcивный koнцeвoй вызoв): в этом случае вызванная функция использует стек вызывающей функции. Поэтому количество вложенных концевых вызовов может быть любым. Заметим только, что концевой вызов стирает отладочную информацию о вызывающей функции. Синтаксис концевого вызова допускает только единичный вызов функции после оператора return. Таким образом, return вернет в точности тот результат, что вернет вызов функции. Ни один из представленных ниже примеров не является допустимым концевым вызовом:
return (f(x)) -- список-результат обрезается
return 2 * f(x) -- удвоение результата функции
return x, f(x) -- возвращается несколько значений
f(x); return -- результат вызова отбрасывается
return x or f(x) -- список-результат обрезается
Вызов внешних функций
Вызовом внешних функций называется вызов функций находящегося в теле другого скрипта (например из тега вызвать функцию устройства). Данный способ вызова может быть удобен если необходимо вынести код для множественного использования, например - подсчет контрольной суммы выносится на уровень устройства, а затем вызывается из скрипта каждого тега при опросе устройства.
Стандартными средствами вызывать внешние функции нельзя, так как функция может с одним названием может располагаться в различных элементах конфигурации. Для решения данной проблемы, в API были добавлены специальные функции. Подробно их использование описано в разделе Вызов внешних функций.