一、MODBUS RTU简介
MODBUS RTU(Remote Terminal Unit)是一种基于串行通信(RS-485/RS-232)的工业标准协议,采用二进制数据格式,具有高效、可靠的特点,广泛应用于PLC、传感器、变频器等工业设备。
1. 主要特点
-
通信方式:主从模式(Master/Slave)
-
传输介质:RS-485(推荐)/ RS-232
-
数据格式:二进制(HEX)
-
校验方式:CRC-16(循环冗余校验)
-
默认波特率:9600、19200、38400、115200等
-
最大从站地址:247(地址范围1~247,0为广播地址)
二、MODBUS RTU数据帧格式
1. 基本帧结构
字段 | 说明 | 长度(字节) |
---|---|---|
从站地址 | 设备地址(1~247) | 1 |
功能码 | 操作类型(读/写等) | 1 |
数据域 | 寄存器地址、数据等 | N |
CRC校验 | 循环冗余校验(低字节在前) | 2 |
2. 常用功能码
功能码 | 名称 | 操作 |
---|---|---|
01 | 读取线圈状态 | 读取单个/多个DO(0x/1x) |
02 | 读取输入状态 | 读取DI(1x) |
03 | 读取保持寄存器 | 读取多个AO(4x) |
04 | 读取输入寄存器 | 读取AI(3x) |
05 | 写单个线圈 | 控制单个DO(0x) |
06 | 写单个寄存器 | 写入单个AO(4x) |
10(0x10) | 写多个寄存器 | 写入多个AO(4x) |
三、MODBUS RTU通信示例
1. 读取保持寄存器(功能码03)
请求帧(Master → Slave):
[从站地址][功能码][起始地址高8位][起始地址低8位][寄存器数量高8位][寄存器数量低8位][CRC低8位][CRC高8位]
示例:读取从站地址1的保持寄存器40001(0x0000),读取1个寄存器
01 03 00 00 00 01 84 0A
解析:
-
01
:从站地址1 -
03
:功能码03(读保持寄存器) -
00 00
:寄存器地址0x0000(对应40001) -
00 01
:读取1个寄存器 -
84 0A
:CRC校验
响应帧(Slave → Master):
[从站地址][功能码][字节数][数据1高8位][数据1低8位][CRC低8位][CRC高8位]
示例:返回数据1234(0x04D2)
01 03 02 04 D2 B8 5F
解析:
-
01
:从站地址1 -
03
:功能码03 -
02
:返回2字节数据 -
04 D2
:数据0x04D2(十进制1234) -
B8 5F
:CRC校验
四、MODBUS RTU调试方法
1. 使用串口调试助手
-
连接设备:
-
使用USB转485转换器连接PC和设备
-
确保A/B线正确连接(A-A,B-B)
-
终端电阻(120Ω)在长距离通信时需启用
-
-
参数设置:
-
波特率:9600(默认)
-
数据位:8
-
停止位:1
-
校验位:无
-
-
发送MODBUS RTU指令:
-
输入16进制格式指令,如
01 03 00 00 00 01 84 0A
-
点击发送,观察返回数据
-
-
解析响应:
-
检查返回的CRC是否正确
-
解析数据域(如
04 D2
表示1234)
-
2. 使用MODBUS Poll(专业调试工具)
-
可自动计算CRC
-
支持多种功能码测试
-
提供数据解析和图表显示
五、CRC-16校验计算
MODBUS RTU采用CRC-16校验,计算步骤如下(C语言示例):
c
#include <stdint.h> uint16_t crc16(uint8_t *data, uint16_t length) { uint16_t crc = 0xFFFF; for (uint16_t i = 0; i < length; i++) { crc ^= data[i]; for (uint8_t j = 0; j < 8; j++) { if (crc & 0x0001) { crc >>= 1; crc ^= 0xA001; } else { crc >>= 1; } } } return crc; }
示例:
计算 01 03 00 00 00 01
的CRC:
c
uint8_t data[] = {0x01, 0x03, 0x00, 0x00, 0x00, 0x01}; uint16_t crc = crc16(data, 6); // 返回 0x840A(低字节在前:0A 84)
六、常见问题与解决方案
问题 | 可能原因 | 解决方案 |
---|---|---|
无响应 | 1. 接线错误(A/B反接) 2. 波特率不匹配 3. 从站地址错误 | 检查接线、波特率、地址 |
CRC校验错误 | 1. 数据损坏 2. 校验算法错误 | 检查通信线路,重新计算CRC |
返回异常码(错误响应) | 1. 功能码不支持 2. 寄存器不存在 | 检查设备文档,确认功能码和寄存器范围 |
七、总结
-
MODBUS RTU是工业自动化中最常用的串行通信协议之一。
-
数据帧包含 地址+功能码+数据+CRC,采用 16进制(HEX) 传输。
-
调试时需确保 波特率、数据位、停止位、校验位 一致。
-
CRC校验 是确保数据完整性的关键。
掌握MODBUS RTU协议,可以高效调试PLC、传感器、变频器等设备,适用于工业自动化、SCADA系统、能源监控等场景。 🚀