1

我正在使用具有一些 Lua 实现并在 BACnet 中通信的第三方设备。该文档非常简陋,没有为任何更高级的编程想法提供任何帮助。很简单,“这就是你设置变量的方式......”。所以,我只是想弄清楚,希望大家能提供帮助。

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

(这是 BACnet 的各种背景。) BACnet 中的变量都有 17 个“优先级”,即每个 BACnet 变量实际上是一个由 17 个值组成的列表,优先级 16 是默认值。因此,通常情况下,如果我说ME.MV12 = 23MV12 的优先级 16 设置为所需的值 23。

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

话虽如此,我需要使该变量名动态化,以便我可以根据其他一些代码设置我需要设置的任何值。我已经做了几次尝试。

这告诉我 object( 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 球,我几乎抓住了稻草。

4

2 回答 2

1

下划线可以是 Lua 标识符(变量和函数名)的一部分。它们只是变量名的一部分(就像字母一样),而不是像[and ]are 这样的特殊 Lua 运算符。

在表达式ME.MV12_PV[17]中,我们ME是一个具有一堆字段的对象,ME.MV12_PV是一个存储在该"MV12_PV"对象字段中的数组,并且ME.MV12_PV[17]是该数组中的第 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
于 2018-03-18T21:39:02.220 回答
0

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

也许您的系统将允许您写入一个名为“Relinquish Default”的 BACnet 属性。

于 2018-03-19T18:52:06.967 回答