Вызовы функций

<< 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 были добавлены специальные функции. Подробно их использование описано в разделе Вызов внешних функций.