5分钟掌握MODBUS报文:从帧结构到实战调试全解析
一、MODBUS RTU的基本结构
MODBUS RTU报文由 设备地址 + 功能码 + 数据 + CRC校验 组成,用16进制表示。
01 设备地址
MODBUS设备地址范围1-247,0是广播地址。
02 功能码
其中最常使用的是前四个功能码,01读取线圈,02读取离散输入,03读取保持寄存器,04读取输入寄存器。在实际工程应用中,像阀门、传感器使用表较多,阀门涉及到控制会使用到功能码01,;涉及到开关到位,故障等反馈就会使用到功能码02;像采集液位,流量,压力等传感器数据会使用到功能码03。
03 数据址
Modbus数据一般是以16进制反馈,以字节形式响应数据量及其存储内容;响应的内容以一个字节为单位,比如00代表一个字节,00 00代表两个字节的数据即一个保持寄存器;一个保持寄存器代表两个字节,如果是32位浮点数的数值则占用两个保持寄存器。在01,02功能码的反馈中,数据量就比较小,以位为单位计算占用的字节数量,如果是8位以下则响应1个字节,以此类推。
04 CRC校验
CRC校验的核心目的是检测数据传输过程中是否出错(如干扰、丢包、篡改)。就像快递包裹的“防伪码”,接收方通过重新计算CRC,验证数据是否完整。MODBUS使用 CRC-16校验算法;具体算法可以使用在线CRC计算器来完成,输入站地址+功能码+起始地址+数据,选择算法CRC-16/MODBUS,进制设置为16进制HEX,在得出的结果中,将其反转得到最终的校验码。比如计算结果为0A84,交换高低位字节得到 84 0A为最终校验码。
二 MODBUS RTU地址类型
MODBUS有4种数据类型,对应不同地址范围:
三 MODBUS 起始地址
MODBUS协议规定:所有地址在报文中均以“偏移量0”表示,与文档中的地址(如40001)相差一个固定偏移。
例如:
关键规则:
文档中的地址(如40001) 转换为报文中的起始地址时,需减去偏移量。
例如:40001 → 40001 - 40001 = 0 → 报文中的地址为 00 00。
30001 → 30001 - 30001 = 0 → 报文中的地址为 00 00。
四 Modbus报文解读
01 设备功能码01示例解读
示例报文:
主站请求:01 01 00 00 00 04 3D C6
含义:读取设备1(01)的线圈地址0(00 00),共读取4个线圈状态(00 04)。
从站响应:01 01 01 05 8D C6
含义:返回设备1(01)的4个线圈状态,二进制值为00000101(即第1、3线圈为ON)。
详细解读如下:
02 功能码02示例解读
示例报文:
主站请求:02 02 00 03 00 03 B8 39
含义:读取设备2(02)的离散输入起始地址3(00 03),共读取3个输入状态。
从站响应:02 02 01 06 38 3D
含义:返回设备2(02)的3个输入状态,二进制值为00000110(由于起始地址00 03,也就是起始地址第一位为10004,所以实际上是10005,10006被触发)
详细解读如下:
03 功能码03示例解读
示例报文:
主站请求:03 03 00 0A 00 02 64 3E
含义:读取设备3(03)的保持寄存器地址10(00 0A),共读取2个寄存器。
从站响应:03 03 04 00 64 01 F4 F8 6D
含义:返回设备3(03)的2个寄存器值:0064(100)和01F4(500)。
详细解读如下:
04 功能码04示例解读
示例报文:
主站请求:04 04 00 02 00 01 71 CB
含义:读取设备4(04)的输入寄存器地址2(00 02),共读取1个寄存器。
从站响应:04 04 02 02 58 B9 8B
含义:返回设备4(04)的寄存器值0258(600)。
详细解读如下:
05 错误的反馈信息
错误标志:功能码 + 0x80(如03错误 → 83)。
错误代码:01:非法功能码(不支持的操作)。02:非法数据地址(地址不存在)。03:非法数据值(数据超出范围)。
错误响应示例:
主站请求:01 03 00 FF 00 01 84 0A(非法地址)。
从站响应:01 83 02 00 00(功能码83表示错误,错误码02表示非法地址)。
五 MODBUS测试工具报文读取
01 打开测试软件(这里使用ModScan)
02
软件数据读取
切换到“显示数据”,设置为二进制,方便读取相应线圈的状态及实际地址。
在这里切换到“显示流量”,设置为2进制,方便读取报文内容。
这里以读取线圈为例,读取寄存器和读取离散输入类似,这里就不在详细解释。
2025年04月