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月

Tags: