Modbus RTU 与 Modbus TCP 协议
协议概述
Modbus是一种串行通信协议,由Modicon(现在的施耐德电气)于1979年发布。 它已成为工业电子设备之间通信的事实标准,广泛应用于PLC、仪表、传感器等设备。
Modbus 变体
- Modbus RTU:基于RS485/RS232串行通信,二进制编码,高效紧凑
- Modbus TCP:基于以太网TCP/IP,Modbus RTU帧封装在TCP包中
- Modbus ASCII:基于串行通信,ASCII编码,可读性强但效率低
数据模型
Modbus协议定义了四种标准数据表,通过功能码访问:
| 数据表类型 | 功能码(读) | 功能码(写) | 数据类型 |
|---|---|---|---|
| 线圈(Coils) | 01 | 05, 15 | 位(0/1) |
| 离散输入(Discrete Inputs) | 02 | 只读 | 位(0/1) |
| 保持寄存器(Holding Registers) | 03 | 06, 16 | 16位字 |
| 输入寄存器(Input Registers) | 04 | 只读 | 16位字 |
Modbus RTU 帧结构
┌──────────┬──────────┬──────────┬──────────┬──────────┬──────────┐
│ 地址域 │ 功能码 │ 数据域 │ 校验域 │ │ │
│ 1字节 │ 1字节 │ N字节 │ 2字节 │ │ │
└──────────┴──────────┴──────────┴──────────┴──────────┴──────────┘
│ │ │ │
│ │ │ └─ CRC16校验(低字节在前)
│ │ └─ 寄存器地址、数量、数据值等
│ └─ 01-0F(十进制),定义操作类型
└─ 从站地址(01-247),00为广播地址地址偏移问题
⚠️ 常见陷阱
Modbus地址存在偏移问题,不同厂商使用不同的地址约定:
- PLC地址:通常从1开始(如40001)
- 协议地址:通常从0开始(如0x0000)
- 文档标注:需要确认是PLC地址还是协议地址
- 实际配置:注意是否需要±1的偏移
通信时序
Modbus RTU 时序要求
- 帧间隔:≥3.5字符时间(约4ms @9600bps)
- 响应超时:通常100ms-1s,可配置
- 字符间隔:≤1.5字符时间,否则认为帧结束
- 轮询间隔:建议≥50ms,避免总线冲突
常见问题与排查
问题:无响应(No Response)
可能原因:
- 从站地址错误
- 通信参数不匹配(波特率、数据位、停止位、校验位)
- 功能码不支持
- 寄存器地址错误
解决方法:核对从站地址、通信参数、功能码和寄存器地址
问题:异常响应(Exception Response)
可能原因:
- 功能码不支持(异常码01)
- 寄存器地址越界(异常码02)
- 数据值无效(异常码03)
- 从站忙(异常码06)
解决方法:根据异常码定位问题,检查设备手册
问题:CRC校验错误
可能原因:
- 通信干扰
- 线缆质量差
- 终端电阻问题
- 接地不良
解决方法:检查RS485布线、终端电阻、屏蔽接地
常见问题 FAQ
Q: Modbus RTU和Modbus TCP可以混用吗?
A: 可以。通过Modbus网关可以实现RTU和TCP之间的协议转换。主站使用TCP,网关转换为RTU与从站通信。
Q: Modbus最大支持多少个寄存器?
A: 理论上,每种数据表最多65536个地址(0-65535)。但实际设备支持的寄存器数量取决于设备能力。
Q: 如何提高Modbus通信效率?
A: 使用批量读写功能码(15、16)、减少轮询间隔、提高波特率、使用Modbus TCP替代RTU、优化主站轮询策略。
Q: Modbus通信距离可以很远吗?
A: Modbus RTU基于RS485,最大距离1200米。Modbus TCP基于以太网,最大距离100米(可通过交换机扩展)。
Q: Modbus安全性如何?
A: Modbus协议本身没有安全机制(无认证、无加密)。在工业网络中需要通过防火墙、VPN、网络隔离等措施保障安全。
Q: 如何选择Modbus主站软件?
A: 根据需求选择:调试用Modbus Poll、开发用开源库(如libmodbus)、集成用商业软件。考虑协议支持、功能完整性、易用性。