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} | uint16 | Modbus 4xxxx 惯例 |
| 0x04 读取输入寄存器 | modbus_rtu_{slave}:input_{30001+addr} | uint16 | Modbus 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 |