Lua:使用Modbus TCP / IP协议

时间:2015-07-01 21:25:13

标签: lua modbus

这个问题是基于我之前提出的有关类似主题的问题: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。遗憾。

0 个答案:

没有答案