2. Modbus基础

Modbus 是工业自动化领域应用最广泛的通信协议之一。它诞生于 1979 年,由 Modicon 公司(后被施耐德电气收购)为可编程逻辑控制器(PLC)设计,最初运行在 RS-232 串行链路上。由于协议简单、开放、易于实现,Modbus 逐渐从私有协议演变为事实上的工业通信标准,并被纳入 Modbus-IDA 组织维护的公开规范中。理解 Modbus 的起源与基本架构,是掌握其高可靠通信与异常处理机制的前提。

一、协议起源与设计哲学

Modbus 的核心设计思想是“简单优先”。它采用请求—应答模式,报文结构紧凑,功能码语义明确,不依赖复杂的会话层或表示层。这种极简设计带来两个直接好处:一是对硬件资源要求低,早期单片机即可实现;二是协议行为可预测,便于诊断和排障。正因如此,Modbus 在 PLC、变频器、仪表、传感器、网关等设备中经久不衰,并衍生出 Modbus RTU、Modbus ASCII、Modbus TCP 等多种传输形态。

关键认知:Modbus 只定义应用层报文(PDU),具体传输方式由下层链路决定。同一套功能码可以跑在串口上,也可以封装进 TCP/IP 报文,这正是它跨链路复用的基础。

二、主从架构与通信模型

Modbus 采用主从(Master-Slave)架构,也称客户端—服务器模型。主站发起请求,从站被动响应;从站之间不直接通信。每个从站拥有唯一地址(串行链路中为 1~247,0 为广播地址)。主站可以单播访问某个从站,也可以广播写入(从站不响应)。这种“一问一答”的模型决定了 Modbus 的时序特征:同一时刻总线上只能有一个主站发起事务,否则会产生冲突。

在 TCP/IP 链路中,主从概念对应为客户端与服务器。客户端发起连接并发送请求,服务器返回响应。由于 TCP 支持多连接,多个客户端可以同时访问同一服务器,但服务器内部仍需按请求逐个处理,避免寄存器访问竞争。

Modbus 主从架构与两类链路 主站 / 客户端 发起请求 · 轮询 · 超时重试 串行链路(RTU / ASCII) RS-232 / RS-485 · 半双工总线 从站地址 1~247 · CRC/LRC 校验 同一时刻仅一个主站发起事务 TCP/IP 链路(Modbus TCP) 以太网 · 端口 502 · 全双工 MBAP 报文头 + PDU 支持多客户端并发连接 从站 1 PLC / 变频器 / 仪表 从站 2 传感器 / 执行器 从站 N 网关 / 远程 IO 请求—应答模型:主站发起,从站响应;广播写入时从站不响应;TCP 链路支持多客户端并发

三、串行链路与 TCP/IP 链路对比

Modbus 的两种主流链路在物理层、报文封装和并发能力上差异明显。串行链路(RTU/ASCII)依赖 RS-485 或 RS-232,采用半双工总线,需要严格的主站轮询调度;TCP/IP 链路则运行在以太网上,使用 MBAP 报文头封装 PDU,天然支持多连接和更高速率。实际项目中,常通过串口服务器或网关将 RTU 设备接入 TCP 网络,形成混合拓扑。

对比维度 Modbus RTU / ASCII Modbus TCP
物理层 RS-232 / RS-485 以太网(10/100/1000M)
传输模式 半双工,主站轮询 全双工,客户端并发
报文封装 地址 + PDU + CRC/LRC MBAP 头 + PDU
从站标识 1 字节从站地址 MBAP 中的单元标识符
典型速率 9600~115200 bps 10/100 Mbps 及以上
并发能力 单主站,顺序轮询 多客户端并发连接
典型校验 CRC-16(RTU)/ LRC(ASCII) 由 TCP 校验和保障

四、常见应用场景与设备类型

Modbus 的应用场景覆盖流程工业、离散制造、能源管理和楼宇自动化。典型设备包括:PLC 与远程 IO 模块、变频器与伺服驱动器、智能电表与电力仪表、温湿度与压力传感器、阀门执行器、称重仪表、以及各类协议网关。在这些场景中,Modbus 通常承担“数据采集与控制下发”的角色,向上对接 SCADA、MES 或云平台,向下连接现场设备。

  • 流程工业:PLC 通过 RS-485 轮询多台流量计、温度变送器,采集 4~20mA 对应的寄存器值。
  • 能源管理:Modbus TCP 读取智能电表的电压、电流、功率、电能等寄存器,周期通常为 1~5 秒。
  • 楼宇自动化:网关将 BACnet 或 KNX 数据转换为 Modbus RTU,接入中央监控系统。
  • 设备集成:变频器通过 Modbus 接收启停、频率设定命令,并回传运行状态与故障码。

实践提示:在混合链路中,网关的“单元标识符”映射关系必须与现场从站地址一致,否则会出现“TCP 能连上但读不到数据”的典型问题。建议在调试阶段先用 Modbus Poll 或 mbpoll 逐点验证寄存器地址与数据类型。

五、常见误区与复盘要点

初学者最容易混淆的是“寄存器地址”与“协议报文地址”。例如,设备手册标注“40001”,实际报文中对应的起始地址是 0;标注“30001”对应输入寄存器地址 0。另一个误区是忽略字节序:32 位浮点数在 Modbus 中可能按高字在前或低字在前排列,需要根据设备手册配置。此外,串行链路中若轮询周期过短、从站响应慢,会引发超时和重试风暴,反而降低通信可靠性。

# 使用 mbpoll 读取 Modbus TCP 从站保持寄存器示例
# -a 单元标识符  -t 4 表示保持寄存器  -r 起始地址  -c 读取数量
mbpoll -a 1 -t 4 -r 0 -c 10 192.168.1.100

# 使用 modbus_cli 读取串行 RTU 设备
# /dev/ttyUSB0 9600 8N1,从站地址 2,读取输入寄存器 0~4
modbus_cli /dev/ttyUSB0 --baud 9600 --parity none --slave 2 \
  read input_registers 0 5

排障提醒:当通信异常时,先确认物理层(接线、终端电阻、波特率、校验位),再确认链路层(从站地址、超时时间),最后检查应用层(功能码、寄存器地址、数据类型)。顺序颠倒会导致大量无效排查。