Skip to content

Modbus RTU 驱动

dc3-driver-modbus-rtu 把 Modbus RTU 从站设备接入 IoT DC3——通过串口连到从站,周期性读取线圈/寄存器值,并支持向线圈和保持寄存器写值的命令。

Modbus RTU 是 Modbus 协议的串行链路变体,跑在 RS-485/RS-232 总线上,是工业现场最常见的协议之一(PLC、电表、变频器、传感器大量在用)。它与 Modbus TCP 驱动的功能码、地址模型完全一致,区别只在于物理层:RTU 走串口(波特率、数据位、校验位等),而不是 IP/端口。本驱动作为 Modbus 主站(master),通过一个串口连到挂在同一条总线上的一台或多台从站,按位号上配置的功能码与地址采数、写值。

  • 驱动名 / codeModbus RTU Driver / ModbusRtuDriver
  • 类型DRIVER_CLIENT(主动连从站)

驱动配置(设备级 driver-attribute

接入一台 Modbus RTU 设备时,在设备上填这些属性。这些是串口参数,必须与从站的串口设置完全一致,否则连不上:

属性code类型默认值说明
PortportSTRING/dev/ttyUSB0串口名(如 /dev/ttyUSB0、COM3)
Baud RatebaudRateINT9600串口波特率(如 9600、19200、115200)
Data BitsdataBitsINT8数据位(7 或 8)
Stop BitsstopBitsINT1停止位(1 或 2)
ParityparityINT0校验位(0=无, 1=奇, 2=偶, 3=Mark, 4=Space)

位号配置(point-attribute

每个采集位号上填:

属性code类型默认值说明
Slave IDslaveIdINT1Modbus 从站单元号
Function CodefunctionCodeINT1读功能码 [1, 2, 3, 4]
OffsetoffsetINT0寄存器/线圈地址偏移

功能码决定读什么

读取用 01(线圈)/ 02(离散输入)/ 03(保持寄存器)/ 04(输入寄存器)。位号的数据类型(PointpointTypeFlag)要和功能码取回的数据宽度对得上——驱动按位号类型决定寄存器宽度:LONG→4 字节整型、FLOAT→4 字节浮点、DOUBLE→8 字节浮点,其余按 2 字节整型。

写命令配置(command-attribute

可写位号还需在写命令上填:

属性code类型默认值说明
Slave IDslaveIdINT1Modbus 从站单元号
Function CodefunctionCodeINT6写功能码 [5, 6, 15, 16]
OffsetoffsetINT0寄存器/线圈地址偏移
Value TemplatevalueTemplateSTRING${value}写值模板,用命令参数渲染

采集与健康

  • 采集周期:默认 cron 0/30 * * * * ?(每 30 秒读一轮)。
  • 健康/在线:设备健康检查默认 cron 0/15 * * * * ?,租约超时 45 秒——在线状态机制见设备

最小接入示例

把接在 /dev/ttyUSB0、波特率 9600、单元号 1 的一台 Modbus RTU 从站接进来:

  1. Modbus RTU Driver 创建设备,driver 属性填 port=/dev/ttyUSB0baudRate=9600dataBits=8stopBits=1parity=0
  2. 给设备绑定的物模型加一个温度位号pointTypeFlag=FLOATREAD_ONLY),point 属性填 slaveId=1functionCode=3offset=0
  3. 启动驱动,30 秒内就能在位号值里看到采集值。

易错点

串口参数错一项就连不上

portbaudRatedataBitsstopBitsparity 五项必须和从站串口设置逐一对上(RTU 不像 TCP 有握手协商,参数不匹配只会读到乱码或超时)。连续 3 次连接失败后驱动会进入 60 秒退避,期间设备一律按离线上报——修好串口参数或线缆后需等退避结束才会重连。

一条总线上的多台从站共用一个串口

RS-485 总线上可挂多台从站,它们共用同一个 port,由位号的 slaveId 区分。驱动对每台设备维护一条独立串口连接、按设备区分,所以请把同一条物理总线上的从站都用相同的 port,靠 slaveId 寻址,不要给每个从站配不同串口。

写命令只支持线圈和保持寄存器

写功能码默认 6,但驱动实际只处理 01(写线圈)与 03(写保持寄存器)两类目标;填 15/16 等其它写功能码会被忽略、写入失败。offset 与读取一样是协议层 0 基偏移,不是 40001 这种习惯写法。

延伸阅读

Released under the AGPL-3.0 License · 基于 AGPL-3.0 协议发布