这个问题是基于我之前提出的有关类似主题的问题:Lua: Working with Bit32 Library to Change States of I/O's。我正在尝试使用Lua程序,当PLC改变给定地址处的线圈状态(仅使用两个地址)时,它会触发另一台设备的反应。我有一些代码与我之前的主题完全相同。但这与实际所做的代码有关,而与bit32库无关。通常我会运行我在Linux IDE中无法理解的代码并慢慢进行更改,直到我最终能理解它为止。但这产生了一些我无法理解的奇怪反应。
代码示例:
local unitId = 1
local funcCodes = {
readCoil = 1,
readInput = 2,
readHoldingReg = 3,
readInputReg = 4,
writeCoil = 5,
presetSingleReg = 6,
writeMultipleCoils = 15,
presetMultipleReg = 16
}
local function toTwoByte(value)
return string.char(value / 255, value % 255)
end
local coil = 1
local function readCoil(s, coil)
local req = toTwoByte(0) .. toTwoByte(0) .. toTwoByte(6) .. string.char(unitId, funcCodes.readCoil) .. toTwoByte(coil - 1) .. toTwoByte(1)
s:write(req) --(s is the address of the I/O module)
local res = s:read(10)
return res:byte(10) == 1 -- returns true or false if the 10th bit is ==1 I think??? Please confirm
end
设置local req
的行是我真正无法理解的部分。由于我之前的帖子,我完全理解toTwoByte
函数,并且很快就刷新了比特&字节操作(顺便说一下真的很棒)。但是这个特殊的字符串是造成这种混乱的原因。如果我在lua.org的演示中运行它,我会收到错误“lua number没有整数表示”。如果我将它分成以下内容,我会返回代表这些数字的ascii字符(我知道string.char
返回给定数字的ascii表示)。如果我在我的Linux IDE中运行它,它会显示一堆盒子,每个盒子包含四个数字;两个在另外两个之上。现在很难区分所有框及其内容,因为它们是重叠的。
我知道有一个我可以使用的modbus库。但我更愿意理解这一点,因为我对编程很新。
为什么我从Windows vs Linux收到不同的返回结果?
当此点构建到I / O模块时,该字符串“local req
”的外观如何。我不明白这个req
变量如何转换为包含用于读/写给定线圈或寄存器的所有信息的正确字符串。
如果有人需要更好的示例或有其他问题我需要回答,请告诉我。
干杯!
ETA:这是Modbus TCP / IP协议,而不是RTU。遗憾。