ModbusRTU通信报文分析

欢迎交流学习上位机和工业软件相关的QQ群聊: 1009652195
1.ModbusRTU通信格式说明

1.1 通用报文帧格式
①从站地址
跟哪个设备进行通信
②功能码
要做什么
③数据部分

  • 读取发送
  1. 开始地址
  2. 读取数量
  • 读取接收
  1. 字节计数
  2. 具体数据
  • 写入单发送
  1. 具体地址
  2. 写入数据
  • 写入单接收
  1. 具体地址
  2. 写入数据
  • 写入多发送
  1. 开始地址
  2. 写入数量
  3. 写入数据
  • 写入多接收
  1. 开始地址
  2. 写入数据

④校验部分

  • 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(校验码)
posted @ 2025-07-03 13:02  一切为了尚媛小姐  阅读(194)  评论(0)    收藏  举报