Modbus RTU协议解析

news/2024/11/23 20:11:43/

1.Modbus RTU一般是通过RS485/RS232物理接口采用的数据通信协议。

2.报文格式

主站询问报文格式
byte[0]byte[1]byte[2] byte[3]byte[4] byte[5]byte[n] byte[n+1]
站号功能码起始地址寄存器数量/线圈个数校验码
从站响应报文格式
byte[0]byte[1]byte[2] byte[3] byte[4]...byte[n] byte[n+1]
站号功能码响应字节个数数据校验码

 根据功能码的不同报文格式略有差别,主站询问格式前6个字节固定不变“1字节站号+1字节功能码+2字节起始地址+2字节寄存器/线圈数量+...+2字节校验码”,从站响应格式前3个字节固定不变“1字节站号+1字节功能码+1字节长度+...+2字节校验码

3.功能码01报文解析

Rx:000004-01 01 00 00 00 0A BC 0D

主站询问报文格式
byte[0] byte[1]byte[2] byte[3]byte[4] byte[5]byte[6] byte[7]
010100 0000 0ABC 0D
站号1功能码01起始地址010个线圈数量校验码

从站号1的起始地址0处读取连续10个线圈的开关量

Tx:000005-01 01 02 30 00 AD FC

从站响应报文格式
byte[0] byte[1]byte[2] byte[3] byte[4]byte[5] byte[6]
01010230 00AD FC
站号1功能码012个字节长度2个字节开关量校验码

从站响应数据30 00,转为二进制为0011 0000/0000 0000,2字节分别逆序排列0000 1100/0000 0000,因此返回的10个开关量数据为00001100

4.功能码03报文解析

Rx:000000-01 03 00 00 00 0A C5 CD

主站询问报文格式
byte[0] byte[1]byte[2] byte[3]byte[4] byte[5]byte[6] byte[7]
010300 0000 0AC5 CD
站号1功能码03起始地址010个寄存器数量校验码

主站向从站1号的起始地址0请求读取连续10个寄存器的数据

Tx:000001-01 03 14 00 00 00 17 00 00 00 2D 00 00 00 00 00 11 00 00 00 00 00 00 71 BF

从站响应报文格式
byte[0] byte[1]byte[2] byte[3] byte[4]...byte[23] byte[24]
01031400 00 00 17 00 00 00 2D 00 00 00 00 00 11 00 00 00 00 00 0071 BF
站号1功能码0320个字节长度20个字节寄存器数据校验码

从站1号响应20个字节的数据,00 00 00 17 00 00 00 2D 00 00 00 00 00 11 00 00 00 00 00 00,对应10进制:0 23 0 45 0 0 17 0 0 0

4.功能码10报文解析

Rx:000002-01 10 00 00 00 0A 14 00 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A 5C 8F

主站询问报文格式
byte[0] byte[1]byte[2] byte[3]byte[4] byte[5]byte[6]byte[7] byte[8]..byte[27] byte[28]
011000 0000 0A1400 01 00 02 00 03 00 04 00 05 00 06 00 07 00 08 00 09 00 0A5C 8F
站号1功能码10起始地址010个寄存器数量20个字节长度批量写入的20字节数据校验码

主站向从站1号的起始地址0处开始连续的10个寄存器,批量写入20个字节的数据 

Tx:000003-01 10 00 00 00 0A 40 0E

从站响应报文格式
byte[0] byte[1]byte[2] byte[3]  byte[4] byte[5]byte[6] byte[7]
011000 0000 0A40 0E
站号1功能码10起始地址0写入寄存器的个数校验码

从站1号响应报文,与询问报文前6个字节保持一致。

5.功能码04报文解析

Rx:000004-01 04 00 00 00 0A 70 0D

主站询问报文格式
byte[0] byte[1]byte[2] byte[3]byte[4] byte[5]byte[6] byte[7]
010400 0000 0A70 0D
站号1功能码04起始地址010个保持寄存器数量校验码

主站向从站1号的起始地址0处开始读取连续10个保持寄存器的值 

Tx:000005-01 04 14 00 00 00 04 00 00 00 08 00 05 00 00 00 09 00 00 00 00 00 00 40 C4

从站响应报文格式
byte[0] byte[1]byte[2] byte[3] byte[4]..byte[23] byte[24]
01041400 00 00 04 00 00 00 08 00 05 00 00 00 09 00 00 00 00 00 0040 C4
站号1功能码0420个字节的数据读取的20字节数据校验码

从站响应20个字节的数据,对应10进制:0 4 0 8 5 0 9 0 0 0 

6.功能码02报文解析

Rx:000000-01 02 00 00 00 0A F8 0D

主站询问报文格式
byte[0] byte[1]byte[2] byte[3]byte[4] byte[5]byte[6] byte[7]
010200 0000 0AF8 0D
站号1功能码02起始地址010个离散量校验码

主站向从站1号的起始地址0出开始请求读取10个离散量 

Tx:000001-01 02 02 56 01 47 D8

从站响应报文格式
byte[0] byte[1]byte[2] byte[3] byte[4]byte[5] byte[6]
01020256 0147 D8
站号1功能码02字节长度响应的数据校验码

从站响应2个字节数据56 01,翻译为二进制 0101 0110/0000 0001,字节分别逆序排列0110101010


http://www.ppmy.cn/news/172381.html

相关文章

Java003——编写和运行第一个Java程序HelloWorld

一、使用记事本创建Java并运行 1.1、设置文件显示后缀名 目的是为了方便查看文件类型 1.2、创建一个HelloWorld.java文件 java程序文件都是以.java后缀结尾的 1.3、编写Java程序 编写一下程序,并保存 public class HelloWorld {public static void main(Strin…

【C++】海量数据处理面试题(位图和布隆过滤器)

都是大厂面试题哦~ 文章目录 一.位图面试题 1.给定100亿个整数,设计算法找到只出现一次的整数 2.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集? 3.1个文件有100亿个int,1G内…

07 Redis的缓存过期淘汰策略

常见面试题 生产上你们你们的redis内存设置多少?如何配置、修改redis的内存大小如果内存满了你怎么办redis清理内存的方式?定期删除和惰性删除了解过吗redis缓存淘汰策略redis的LRU了解过吗 Redis内存满了怎么办 redis默认内存多少?在哪里查看?如何…

微星b450迫机炮主板,省电

AMD主板开启PBO方法: 开机的时候不停按DEL进入bios,然后按F7进入高级菜单, 进入OC点击在cpu特征或者Advanced CPU Configuration(高级cpu配置)里面,一般在这两个地方选项里面 备注:有的bios版本…

微星武士 76 评测

微星武士 76 游戏本现已上架,搭载 i7-12700H RTX 3060,配备 17.3 英寸屏幕,首发 8799 元。 微星武士 76更多使用感受和评价:http://www.adiannao.cn/dy 屏幕方面,这款游戏本搭载了 17.3 英寸 IPS 大屏,108…

微星B450M迫击炮MAX开启CPU虚拟化功能

最近配了一台新的电脑,主板为微星(MSI)B450M MORTAR MAX。 然后用这台电脑装了VMware Workstation Pro 15.5,配置完Ubuntu18.04后发现,无法启动虚拟机。提示AMD-V技术不可用。 原来微星这款主板没有开启开启CPU虚拟化…

微星冲锋坦克Pro GP76 2022款评测

i7-12800HX共16核心(8个性能大核8个效率小核)24线程,至高睿频4.8GHz,三级缓存25M,不管是3D游戏大作还是高负荷多任务处理,均能体验运行。满足至巅性能需求。RTX3080Ti独显至高可实现175W满血输出&#xff0…