文章参考modbus协议详解
主机对从机读数据操作
2、 主机发送报文格式如下:
从站地址 功能码 起始(高) 起始(低) 数量(高) 数量(低) 校验
0x01 0x03 0x00 0x01 0x00 0x01 0xD5 0xCA
0x01:从机的地址
0x03:查询功能,读取从机寄存器的数据
0x00 0x01: 代表读取的起始寄存器地址.说明从0x0001开始读取.
0x00 0x01: 查询的寄存器数量为0x0001个 Modbus把数据存放在寄存器中,通过查询寄存器来得到不同变量的值,一个寄存器地址对应2字节数据; 寄存器地址对应着从机实际的存储地址
0xD5 0xCA: 循环冗余校验 CRC
从机回复报文格式如下:
| 从站地址 | 功能码 | 字节计数 | 字节1 |字节2 | 校验 |
| 0x01 | 0x03| 0x02| 0x01 | 0x00| 0x17| 0xF8 0x4A |
含义:
0x01:从机的地址
0x03:查询功能,读取从机寄存器的数据
0x02: 返回字节数为2个 一个寄存器2个字节
0x00 0x17:寄存器的值是0017
0xF8 0x4A: 循环冗余校验 CRC
主机对从机写数据操作
主机发送报文格式如下:
从站地址 功能码 数据地址(高) 数据地址(低) 数据(高) 数据(低) 校验
0x01 0x06 0x00 0x01 0x00 0x17 0x98 0x04
含义:
0x01:从机的地址
0x06:修改功能,修改从机寄存器的数据
0x00 0x01: 代表修改的起始寄存器地址.说明修改0x0000-0x0001的存储内容
0x00 0x17: 要修改的数据值为0017
0x98 0x04: 循环冗余校验 CRC
从机回复报文格式如下:
从站地址 功能码 数据地址(高) 数据地址(低) 数据(高) 数据(低) 校验
0x01 0x06 0x00 0x01 0x00 0x17 0x98 0x04
含义:
0x01:从机的地址
0x06:修改功能,修改从机寄存器的数据
0x00 0x01: 代表修改的起始寄存器地址.说明是0x0000
0x00 0x17:修改的值为0017
0x98 0x04: 循环冗余校验 CRC
实战
03 查询遥测数据:
查询 1 号机传感器 寄存器值 (16 进制)
地址 功能码 起始高位 起始低位 长度高位 长度低位 CRC16(低) CRC6(高)
01 03 00 09 00 06 CRC16L CRC16H
应答:字节数 = 请求寄存器长度*2
地址 功能码 字节数 数据1高8位 数据1低8位 ......数据 N CRC16(低) CRC6(高)
01 03 N Data1H Data1L ...... DataN CRC16L CRC16H
02 查询遥信数据:
查询 1 号机传感器 寄存器值 (16 进制)
地址 功能码 起始高位 起始低位 长度高位 长度低位 CRC16(低) CRC6(高)
01 02 00 40 00 0A CRC16L CRC16H
应答:字节数 = (请求寄存器长度+8)/8
地址 功能码 字节数 数据1高8位 数据1低8位 ......数据 N CRC16(低) CRC6(高)
01 02 N Data1H Data1L ...... DataN CRC16L CRC16H
配置发送报文1:
(发送省略器件地址)
03 00 0A 00 01
回复报文
01 03 02 00 07 F9 86
配置发送报文2:
03 00 12 00 01
回复报文
01 03 02 00 03 F8 45
配置发送报文3:
02 00 40 00 01
01 02 01 00 01 88 78