使用 Lua 输入和输出参数
输入和输出参数用于在 Lua 脚本和触发器动作之间传递信息。
输入
在 Lua 脚本中,来自触发器动作的所有输入均可通过 DWInput 对象进行访问。它们可以是任何有效的数据类型,尽管某些 Lua 函数可能不支持特定类型。
在 Execute Lua Script(执行 Lua 脚本)(执行 Lua 脚本)和 执行来自文件的 Lua 函数(执行来自文件的 Lua 函数)动作中,使用 Variables(变量)对话框声明输入。
声明这些输入后,即可在 Lua 脚本中以 DWInput["variable_name"] 的形式访问它们。
例如:
- 要将 STRING 变量 string 和 INT2 数组变量 int2_array 传递到 Lua 脚本中。
- 将它们声明为 Input Variables(输入变量)后,即可在 Lua 脚本中以 DWInput["string"] 和 DWInput["int2_array"] 的形式访问它们。
输出
Lua 脚本的所有输出均通过 DWOutput 对象返回给触发器动作。它们可以是任何有效的数据类型,尽管 Lua 类型和数据类型之间的某些转换可能无效。
在 Execute Lua Script(执行 Lua 脚本)(执行 Lua 脚本)和 执行来自文件的 Lua 函数(执行来自文件的 Lua 函数)动作中,使用 Variables(变量)对话框声明输出。
声明这些输入后,即可在 Lua 脚本中以 DWOutput["variable_name"] 的形式访问它们。
例如:
- 要从 Lua 脚本返回 STRING 变量 string_out 和 INT2 数组变量 int2_array_out。
- 将它们声明为 Output Variables(输出变量)后,可以在 Lua 脚本中以 DWOutput["string_out"] 和 DWOutput["int2_array_out"] 的形式使用它们。
参数类型
常量
常量值可通过引号输入函数中。
DWOutput["status"],DWOutput["value"] = dw.variable.read("Local CPU 1","D[0]");
在上面的示例中,Local CPU 1(本地 CPU 1)和 D[0] 是 dw.variable.read Lua 函数的常量输入。
变量
可以在使用常量的情况下,将变量用作 Lua 函数的输入。它们可以是标量(单个)变量或数组。
local trigname = "LUA_Trigger";
local s,out = dw.trigger.execute(trigname,"subtrigger_echo",i);
DWOutput["o"] = {out["out1"],out["out2"],out["out3"]};
DWOutput["s"] = s;
在上面的示例中,变量 trigname 经过了声明并被用作 dw.trigger.execute 函数的输入。请注意,某些 Lua 函数需要特定的输入格式。
例如,上面的函数需要关联数组 i,其键值为预期子触发器输入的名称,例如 i["one"]。
类似地,输出数组具有值 out["out1"]、out["out2"] 和 out["out3"]。
有关更多信息,请参见下面的“子触发器输入和输出”。
请参阅特定 Lua 函数的文档以了解有关其输入和输出的更多信息。
有关 Lua 的基本概念和变量的概况,请参见 Lua 语言概念概况。
变量类型
支持将所有数据类型(INT1、UINT1、FLOAT4 等)作为 Lua 函数的数据类型,但不支持变量类型 BINARY、TIMESTAMP 和 STRUCT。
作为输入参数传递到 Lua 脚本的某些数据类型在作为输出参数传回时可能无法转换为其他数据类型。
例如,在 MESInterface IT 中,传递到 Lua 脚本的 BIT 数据类型在作为输出参数传回时只能是 BIT 数据类型。
Lua 将所有数值类型都视为双精度浮点数,这意味着其仅采用 53 位精度表示数字。因此,当与触发器动作连接时,如果使用大于 9,007,199,254,740,992 的 64 位整数,则会丢失精度。
数组
可通过以下方式访问作为输入变量之一传入的数组:
local my_inputs = DWInput["input"];
local i = {one=0,two=0,three=0};
i["one"]=my_inputs[1];
i["two"]=my_inputs[2];
i["three"]=my_inputs[3];
在上面的示例中,名为 input(输入)的数组被传递到 Lua 脚本中。首先使用 DWInput["input"] 在 Lua 中访问该数组,并将其设置为 Lua 变量 my_inputs。
然后可使用 my_inputs[1]、my_inputs[2] 和 my_inputs[3] 进行访问。
或者,我们也可以使用 DWInput["input"][1] 访问该数组的第一个索引。
请注意,在 Lua 中,第一个数组索引是 1,而不是 0。
另外,请谨记,Lua 是一种动态类型的语言。因此,应使用与输入数组的原始数据类型类似的输入变量类型。
有关 Lua 的基本概念的概况,请参见 Lua 语言概念概况。
子触发器输入和输出
子触发要求的格式与普通输入变量有所不同。每个子触发输入必须按名称声明。
例如,如果子触发器需要三个输入 "one"、"two" 和 "three",则 Lua 脚本必须显式创建一个数组,例如 "i",其数组引用为 i["one"]、i["two"] 和 i["three"]。
参见下面的脚本示例:
local my_inputs = DWInput["input"];
local i = {one=0,two=0,three=0};
i["one"]=my_inputs[1];
i["two"]=my_inputs[2];
i["three"]=my_inputs[3];
local s,out = dw.trigger.execute("LUA_Trigger","subtrigger_echo",i);
DWOutput["output"] = {out["out1"],out["out2"],out["out3"]};
DWOutput["s"] = s;
它还作为导出文件提供,可使用工作台下载该文件,然后将其导入您的节点中:
子触发器的输出也是如此。例如,必须通过 out["out1"]、out["out2"] 和 out["out3"] 访问 "out" 数组。