现在网上有很多类似的文章、其实这一篇也借鉴了很多其他博主的文章。
写这篇文章的重点是在于解析功能和报文、对Modbus这个协议并不会做很多介绍。
好了,我们开始吧。
常用的功能码其实也没多少、我也就按照大小逐个介绍吧。
1、01X 读取一组逻辑线圈的当前状态(ON/OFF)
请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
响应:MBAP 功能码 数据长度 数据(一个地址的数据为1位)
发送包

byte[0] byte[1] 00 02 为消息号,随便指定,服务器返回的数据的前两个字和这个一样
byte[2] byte[3] 00 00 为modbus标识,强制为0即可
byte[4] byte[5] 00 06 值在06 之后所有字节的个数,大家也可以数一数哈
byte[6] 01 为站号、随便指定。
byte[7] 01 为功能码(这个是决定了要干什么事)
byte[8] byte[9] 00 00为起始地址,比如我们我们想读地址0的数据就为00,读1000地址为03 E8
byte[10] byte[11] 00 80为指定读取数据的长度,跟地址规则一样
回包

注:bit是一直到127的 因为图片太大无法截到
byte[0] byte[1] 消息号,我们之前写发送指令的时候,是多少,这里就是多少。
byte[2] byte[3] 同上
byte[4] byte[5] 指后面的字节数
byte[6] 站号
byte[7] 功能码
byte[8] 指示在byte[8]后面的字节数量 在byte[8]后面就是真实数据
byte[9] 到结尾都是我们读取到的数据 因为字节是8位所以是16(0-127所占了128个bit 128/8 得出16)
列子:
读5个线圈状态
发送:00 00 00 00 00 06 01 01 00 00 00 05
接收:00 00 00 00 00 04 01 01 01 1F
2、0x02 读取一组开关输入的当前状态(ON/OFF)
请求:MBAP 功能码 起始地址H 起始地址L 数量H 数量L(共12字节)
响应:MBAP 功能码 数据长度 数据(长度:9+ceil(数量/8))
发送包

其实大家自己看与0x01是基本一样的。只是多了个Bit Count这一个
Bit Count所代表的意思就是 读取十个数据。
回包

跟
Wireshark解析Modbus报文功能码

最低0.47元/天 解锁文章
4886

被折叠的 条评论
为什么被折叠?



