在Lua中调用/评估动态字​​符串的其他方法?

时间:2018-03-18 20:15:00

标签: lua bacnet

我正在使用第三方设备,它有一些Lua的实现,并在BACnet中进行通信。文档非常简洁,没有为任何更高级的编程思想提供任何帮助。它很简单,"这就是你设置变量的方式......"。所以,我想弄清楚,并希望你们都能提供帮助。

我需要为一些值设置一长串变量。我有一个用户数据' ME',有一堆名为MVXX的变量(例如 - MV21,MV98,MV56等)。

(这是BACnet的所有背景。)BACnet中的变量都有17个优先级',即每个BACnet变量实际上是一种17个值的列表,优先级16是默认值。所以,通常情况下,如果我说ME.MV12 = 23,那么将MV12的优先级-16设置为所需的值23.

但是,我需要设置优先级17.我可以在提供的Lua实现中执行此操作,方法是ME.MV12_PV[17] = 23。我可以通过索引PV来设置我想要的任何优先级。 (推论 - 什么是PV?什么是下划线?我如何得到这些对象?或者它们只是从Lua解释为后端C中的某个函数?)

所有这一切,我需要将变量名称设置为动态,以便我可以根据其他一些代码设置我需要设置的任何值。我做了几次尝试。

这告诉我对象(MV12_PV[17])不存在:

x = 12
ME["MV" .. x .. "_PV[17]"] = 23

但是这样可以正常工作,将优先级设置为16到23:

x = 12
ME["MV" .. x] = 23

我试图尝试某种我认为称为评估或评估的东西。但是,这只打印出function后跟一些随机的8位数字:

x = 12
test = assert(loadstring("MV" .. x .. "_PV[17] = 23"))
print(test) 

有任何帮助吗?道歉,如果我不清楚 - tbh,我远远落后于8球,我几乎抓住了稻草。

2 个答案:

答案 0 :(得分:1)

下划线可以是Lua标识符(变量和函数名称)的一部分。它们只是变量名称的一部分(就像字母一样)并且不是[]之类的特殊Lua运算符。

在表达式ME.MV12_PV[17]中,ME是一个包含大量字段的对象,ME.MV12_PV是存储在该对象的"MV12_PV"字段中的数组,ME.MV12_PV[17] 1}}是该数组中的第17个插槽。

如果你想动态访问字段,要知道的是在Lua中访问带点符号的字段相当于使用括号表示法并将字段名称作为字符串传递:

-- The following are all equivalent:
x.foo

x["foo"]

local fieldname = "foo"
x[fieldname]

所以在你的情况下你可能想尝试做这样的事情:

local n = 12
ME["MV"..n.."_PV"][17] = 23

答案 1 :(得分:0)

BACnet“可命令”对象(例如二进制输出,模拟输出,以及二进制值,模拟值和少数其他对象)实际上具有16个优先级(1-16)。您所指的“第17个”可能是“放弃默认值”,如果所有16个优先级都设置为NULL或“放弃”,则使用该值。

也许您的系统允许您写入名为“放弃默认”的BACnet属性。