1. Modbus RTU协议深度解析
1.1 协议架构与通信原理
Modbus RTU协议采用主从式通信架构,这种设计在工业自动化领域具有显著优势。主站(Master)负责发起所有通信请求,从站(Slave)则被动响应。在实际工业场景中,一个主站可以轮询多个从站设备,典型应用包括PLC与传感器网络、HMI与现场设备等。
协议帧结构采用紧凑的二进制格式:
- 地址字段(1字节):范围1-247,0为广播地址(实际使用较少)
- 功能码(1字节):决定操作类型,如03功能码对应读取保持寄存器
- 数据区(N字节):根据功能码变化,最大长度252字节
- CRC校验(2字节):采用Modbus标准多项式0xA001
关键提示:工业现场必须确保所有设备的波特率、数据位、停止位和校验位设置完全一致,这是通信成功的基础条件。
1.2 寄存器类型详解
Modbus协议定义了四种寄存器区域,每种都有特定用途:
| 寄存器类型 | 前缀 | 地址范围 | 读写特性 | 典型应用 |
|---|---|---|---|---|
| 线圈寄存器 | 0x | 00001-09999 | 读写 | 继电器控制、开关量输出 |
| 离散输入 | 1x | 10001-19999 | 只读 | 按钮状态、传感器开关量输入 |
| 输入寄存器 | 3x | 30001-39999 | 只读 | 模拟量输入、传感器读数 |
| 保持寄存器 | 4x | 40001-49999 | 读写 | 参数设置、设备配置 |
实际编程时需注意地址偏移问题:协议层使用0-based地址,而多数PLC编程软件采用1-based地址。例如,要读取PLC中地址为40001的保持寄存器,实际发送的协议地址应为0。
1.3 CRC校验算法实现
Modbus RTU的CRC-16校验采用以下算法(C#实现):
csharp复制public static ushort CalculateCrc(byte[] data)
{
ushort crc = 0xFFFF;
for (int pos = 0; pos < data.Length; pos++)
{
