---
说明:
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;