ModbusRTU通信报文分析
欢迎交流学习上位机和工业软件相关的QQ群聊: 1009652195
1.ModbusRTU通信格式说明
1.1 通用报文帧格式
①从站地址
跟哪个设备进行通信
②功能码
要做什么
③数据部分
- 读取发送
- 开始地址
- 读取数量
- 读取接收
- 字节计数
- 具体数据
- 写入单发送
- 具体地址
- 写入数据
- 写入单接收
- 具体地址
- 写入数据
- 写入多发送
- 开始地址
- 写入数量
- 写入数据
- 写入多接收
- 开始地址
- 写入数据
④校验部分
- CRC16
1.2 校验部分
①这里的校验和串口的奇/偶/无校验没有关系
②为什么要有校验? -> 保证数据的准确
③校验的本质是什么? -> 校验的本质就是一种算法
2.[01H功能码读取输出线圈]
发送报文格式: 从站地址+功能码+开始线圈地址+线圈数量+CRC
接收报文格式: 从站地址+功能码+字节计数+数据+CRC
读取输出线圈测试: 读取1号站点从10开始的20个线圈的值[都为十六进制,一个字节表示八个位]
发送报文(TX): 01 01 00 0A 00 14 1C 07
01(从站地址) 01(读取输出线圈) 00(自动补全) 0A(从10开始) 00(自动补全) 14(数量为16+4=20) 1C 07(校验码)
接收报文(RX): 01 01 03 03 00 00 CC 4E
01(从站地址) 01(读取输出线圈) 03(20个位至少需要3个字节才能容纳) 03(11【二进制】为03【十六进制】) 00 00 CC 4E(校验码)
3.[02H功能码读取输入线圈]
发送报文格式: 从站地址+功能码+开始线圈地址+线圈数量+CRC
接收报文格式: 从站地址+功能码+字节数量+数据+CRC
读取输入线圈测试: 读取5号占点从20开始的10个线圈
发送报文(TX): 05 02 00 14 00 0A B9 8D
05(从站地址) 02(读取输入线圈) 00 14(开始线圈地址为16+4=20) 00 0A(线圈数量为10) B9 8D(校验码)
接收报文(RX): 05 02 02 03 00 48 88
05(从站地址) 02(读取输入线圈) 02(10个位需要字节数量为2) 03(数据11(二进制)=3(十六进制)) 00 48 88(校验码)
4.[03H功能码读取输出寄存器]
发送报文格式: 从站地址+功能码+开始寄存器地址+寄存器数量+CRC
接收报文格式: 从站地址+功能码+字节数量+数据+CRC
读取输出寄存器测试: 读取2号站点从10开始的4个寄存器
发送报文: 02 03 00 0A 00 04 64 38
02(从站地址) 03(读取输出寄存器) 00 0A(开始寄存器地址从10开始) 00 04(寄存器数量为4) 64 38(校验码)
接收报文: 02 03 08 00 01 00 02 00 03 00 04 02 50
02(从站地址) 03(读取输出寄存器) 08(4个寄存器为8字节) 00 01 00 02 00 03 00 04(数据) 02 50(校验码)
5.[04H功能码读取输入寄存器]
发送报文格式: 从站地址+功能码+开始寄存器地址+寄存器数量+CRC
接收报文格式: 从站地址+功能码+字节数+数据+CRC
读取输入寄存器测试: 读取2号站点从10开始4个寄存器
发送报文: 02 04 00 0A 00 04 D1 F8
02(从站地址) 04(读取输入寄存器) 00 0A(开始寄存器地址) 00 04(寄存器数量) D1 F8(校验码)
接收报文: 02 04 08 00 01 00 02 00 03 00 04 B3 8A
02(从站地址) 04(读取输入寄存器) 08(4个寄存器为8字节) 00 01 00 02 00 03 00 04(数据) B3 8A(校验码)
6.[05H功能码写入单个线圈]
发送报文格式: 从站地址+功能码+线圈地址+线圈值+CRC
接收报文格式: 从站地址+功能码+线圈地址+线圈值+CRC
写入单个线圈测试: 将2号站点的05地址置位(写入1)[置位写入1->"FF 00",复位写入0->"00 00"]
发送报文: 02 05 00 05 FF 00 9C 08
02(从站地址) 05(写入单个线圈) 00 05(线圈地址为05) FF 00(置位) 9C 08(校验码)
接收报文: 02 05 00 05 FF 00 9C 08
02(从站地址) 05(写入单个线圈) 00 05(线圈地址为05) FF 00(置位) 9C 08(校验码)
7.[06H功能码写入单个寄存器]
发送报文格式: 从站地址+功能码+寄存器地址+寄存器值+CRC
接收报文格式: 从站地址+功能码+寄存器地址+寄存器值+CRC
写入单个寄存器测试: 将5号站点10地址写入123
发送报文: 05 06 00 0A 00 7B E8 6F
05(从站地址) 06(写入单个寄存器) 00 0A(寄存器地址为10) 00 7B(寄存器值为123) E8 6F(校验码)
接收报文: 05 06 00 0A 00 7B E8 6F
05(从站地址) 06(写入单个寄存器) 00 0A(寄存器地址为10) 00 7B(寄存器值为123) E8 6F(校验码)
8.[0FH功能码写入多个线圈]
发送报文格式: 从站地址+功能码+起始线圈地址+数量+字节计数(不补零)+数据(不补零)+CRC
发送报文格式: 从站地址+功能码+起始线圈地址+数量+CRC
写入多个线圈测试: 将1号站点从1开始的5个线圈写入True True False True False[置位写入1->"FF 00",复位写入0->"00 00"]
发送报文: 01 0F 00 01 00 05 01 16 D3 58
01(从站地址) 0F(写入多个线圈) 00 01(起始线圈地址) 00 05(线圈数量) 01(字节计数) 16(数据为22) D3 58(校验码)
接收报文: 01 0F 00 01 00 05 C4 08
01(从站地址) 0F(写入多个线圈) 00 01(起始线圈地址) 00 05(线圈数量) C4 08(校验码)
9.[10H功能码写入多个寄存器]
发送报文格式: 从站地址+功能码+起始寄存器地址+寄存器数量+字节计数(不补零)+数据+CRC
接收报文格式: 从站地址+功能码+起始寄存器地址+寄存器数量+CRC
写入多个寄存器测试: 将1号站点从10开始的5个寄存器分别写入01 02 03 04 05
发送报文: 01 10 00 0A 00 05 0A 00 01 00 02 00 03 00 04 00 05 E0 60
01(从站地址) 10(写入多个寄存器) 00 0A(起始寄存器地址为10) 00 05(寄存器数量为5个) 0A(字节计数为10) 00 01 00 02 00 03 00 04 00 05(数据) E0 60(校验码)
接收报文: 01 10 00 0A 00 05 20 08
01(从站地址) 10(写入多个寄存器) 00 0A(起始寄存器地址为10) 00 05(寄存器数量为5个) 20 08(校验码)

浙公网安备 33010602011771号