首页 > 技术文章 > modbus协议数据格式

bliss- 2020-03-19 13:45 原文

---

说明:

modbus协议一般适用于一个主设备访问多个从设备的硬件开发环境,类似于zigbee网络中的一个路由器多个协调器的一对多模型。

modbus常用的寄存器类型为 3X 输入寄存器和 4X保持寄存器

从机3X 输入寄存器对主机来说是可读不可写状态,从机4X 保持寄存器对主机来说是可读可写状态

---

功能码含义

04:读取输入寄存器(3x)

03:读取保持寄存器(4x)

06:写入单个保持寄存器(4x)

16:写入多个保持寄存器(4x)

---

常用的数据格式:

主机读取从机输入寄存器数据格式:

数据实例:03 04 05 61 00 01 61 3A

分解:

03         04      05          61
modbus地址  功能码  寄存器地址高  寄存器地址低                   

00          01          61            3A
寄存器数量高  寄存器数量低  CRC校验码低位  CRC校验码高位

 

解释:

主机读取modbus地址为03的从机输入寄存器,从0x0561(十进制为1377)地址开始读取一个寄存器。

读取读取从机输入寄存器返回数据格式:

03         04    02   00 02   41   31
modbus地址 功能码 字节数 数据... CRC低 CRC高

-------

主机读取从机保持寄存器数据格式:

数据实例:03 03 15 1a 00 01 A0 23

分解:

03          03    15          1A                 
modbus地址  功能码  寄存器地址高   寄存器地址低  

00          01          A0    23
寄存器数量高  寄存器数量低  CRC低 CRC高

解释:

  主机读取modbus地址为03的从机保持寄存器,从0x151a(十进制为5402)地址开始读取一个寄存器。

读取读取从机保持寄存器返回数据格式:

03         03    02   00 02   40   45
modbus地址 功能码 字节数 数据... CRC低 CRC高

---

主机写入单个保持寄存器数据格式:

数据实例:03 06 15 1a 00 32 2C 36

分解:

03          06    15          1A 
modbus地址  功能码 寄存器地址高   寄存器地址低                   

00       32     2C    36
数据高    数据低  CRC低 CRC高

 

解释:

  主机写入modbus地址为03从机一个保持寄存器数据,从0x151a(十进制为5402)地址开始写入一个寄存器,写入数据为0x0032。

---

写入单个保持寄存器返回数据格式:

如果写入成功,返回数据和写入数据相同

 

主机写入多个保持寄存器数据格式:

数据实例:03 10 14 56 00 02 04 00 00 00 50 82 3D

分解:
03 10 14 56 modbus地址 功能码 寄存器地址高 寄存器地址低 00 02 04 00 00 00 50 寄存器数量高 寄存器数量低 字节数 数据 (从高到低依次) 82 3D CRC低 CRC高

 

解释:

  主机写入modbus地址为03从机两个保持寄存器数据,从0x1456(十进制为5206)地址开始写入两个寄存器,写入数据为0x0000、0x0050。

 

写入多个保持寄存器返回数据格式:

03         10   14         56 
modbus地址 功能码 寄存器地址高 寄存器地址低 
00 02 A5 CA 寄存器数据高 寄存器数量低 CRC低 CRC高

 

常用功能码:

数据类型 功能描述 功能码 功能码(Hex) 异常功能码(hex)
输入寄存器 读寄存器 04 0x04 0x84
保持寄存器 读寄存器     03 0x03 0x83
写寄存器 06 0x06 0x86
写寄存器 16 0x10 0x90

 

 

 

 

 

 

 

这个是我自己使用c代码模拟的modbus数据协议打包格式

链接:https://pan.baidu.com/s/1AAflWfiBEh6l6lTAiwwWEQ
提取码:11os

常用接口有:
//读取输入寄存器
int read_input_registers;
//读取保持寄存器
int read_hold_registers;
//写单个保持寄存器
int write_hold_register;
//写多个保持寄存器
int write_hold_registers;

 

推荐阅读