跳到主要内容

Modbus 辅助函数

编解码器自动解析值

某些编解码器会自动解析协议响应并将类型化数值附加到消息。这些值可以在 on_receive() 中通过 message:get_value(id)message.values_json 获取,无需编写任何 Lua 解析代码

Modbus RTU 编解码器

当选择 modbus_rtu 编解码器时,响应会自动与先前的请求关联并解析为数值:

功能码数值 ID 格式数值类型备注
0x01 读取线圈 (Coils)modbus_rtu_{slave}:coil_{address}布尔值每个线圈一个值
0x02 读取离散输入modbus_rtu_{slave}:discrete_{address}布尔值每个输入一个值
0x03 读取保持寄存器modbus_rtu_{slave}:holding_{40001+addr}uint16Modbus 4xxxx 惯例
0x04 读取输入寄存器modbus_rtu_{slave}:input_{30001+addr}uint16Modbus 3xxxx 惯例
0x05 写单个线圈modbus_rtu_{slave}:coil_{address}布尔值来自响应的回传 (Echo)
0x06 写单个寄存器modbus_rtu_{slave}:holding_{40001+addr}uint16来自响应的回传
  • {slave} 是 Modbus 从站地址(十进制)
  • {address} 是从 0 开始的寄存器/线圈地址(十进制)
  • 仅当编解码器可以将响应与先前的请求匹配时,才会解析数值
  • 整数/浮点值可以在 UI 的图表中可视化

Modbus TCP 编解码器

与 RTU 相同,但使用 modbus_tcp 前缀,并从 MBAP 报头获取单元 ID (Unit ID):

功能码数值 ID 格式数值类型
0x01 读取线圈modbus_tcp_{unit}:coil_{address}布尔值
0x02 读取离散输入modbus_tcp_{unit}:discrete_{address}布尔值
0x03 读取保持寄存器modbus_tcp_{unit}:holding_{40001+addr}uint16
0x04 读取输入寄存器modbus_tcp_{unit}:input_{30001+addr}uint16
0x05 写单个线圈modbus_tcp_{unit}:coil_{address}布尔值
0x06 写单个寄存器modbus_tcp_{unit}:holding_{40001+addr}uint16

在 Lua 中访问自动解析的值

function on_receive()
-- 通过 ID 获取特定的寄存器值
local temp = message:get_value("modbus_rtu_1:holding_40001")
if temp then
log("info", "温度寄存器: " .. tostring(temp))
end

-- 获取所有值的 JSON 格式以便检查
local json = message.values_json
if json then
log("info", "所有数值: " .. json)
end
return false
end

自动解析的值与通过 message:add_int_value()message:add_float_value() 等手动添加的值共存。使用 Lua 可以合并或转换自动解析的 uint16 寄存器为更有意义的值(例如,将两个寄存器合并为一个 32 位浮点数)。

Modbus RTU 辅助函数

所有 RTU 函数在成功时返回 true,失败时返回 false。无效参数会引发 Lua 运行时错误。 所有函数均接受一个可选的尾随参数 connection_id (默认: 0)。

函数参数
modbus_rtu_read_coils(slave, start, qty, delay, connection_id)slave: 0-255, start: 0-65535, qty: 1-2000, delay: ms
modbus_rtu_read_discrete_inputs(slave, start, qty, delay, connection_id)slave: 0-255, start: 0-65535, qty: 1-2000, delay: ms
modbus_rtu_read_holding_registers(slave, start, qty, delay, connection_id)slave: 0-255, start: 0-65535, qty: 1-125, delay: ms
modbus_rtu_read_input_registers(slave, start, qty, delay, connection_id)slave: 0-255, start: 0-65535, qty: 1-125, delay: ms
modbus_rtu_write_single_coil(slave, addr, value, delay, connection_id)slave: 0-255, addr: 0-65535, value: 布尔值, delay: ms
modbus_rtu_write_single_register(slave, addr, value, delay, connection_id)slave: 0-255, addr: 0-65535, value: 0-65535, delay: ms
modbus_rtu_write_multiple_coils(slave, start, values_table, delay, connection_id)slave: 0-255, start: 0-65535, values_table: 布尔数组 (1-2000), delay: ms
modbus_rtu_write_multiple_registers(slave, start, values_table, delay, connection_id)slave: 0-255, start: 0-65535, values_table: 整数数组 (1-125, 每个 0-65535), delay: ms

Modbus TCP 辅助函数

与 RTU 相同,但没有 slave 参数(单元 ID 在 MBAP 报头中)。全部返回 true/false。 所有函数均接受一个可选的尾随参数 connection_id (默认: 0)。

函数参数
modbus_tcp_read_coils(start, qty, delay, connection_id)start: 0-65535, qty: 1-2000, delay: ms
modbus_tcp_read_discrete_inputs(start, qty, delay, connection_id)start: 0-65535, qty: 1-2000, delay: ms
modbus_tcp_read_holding_registers(start, qty, delay, connection_id)start: 0-65535, qty: 1-125, delay: ms
modbus_tcp_read_input_registers(start, qty, delay, connection_id)start: 0-65535, qty: 1-125, delay: ms
modbus_tcp_write_single_coil(addr, value, delay, connection_id)addr: 0-65535, value: 布尔值, delay: ms
modbus_tcp_write_single_register(addr, value, delay, connection_id)addr: 0-65535, value: 0-65535, delay: ms
modbus_tcp_write_multiple_coils(start, values_table, delay, connection_id)start: 0-65535, values_table: 布尔数组 (1-2000), delay: ms
modbus_tcp_write_multiple_registers(start, values_table, delay, connection_id)start: 0-65535, values_table: 整数数组 (1-125, 每个 0-65535), delay: ms