当前位置:网站首页 > 编程语言 > 正文

modbus报文解析在线工具(modbus报文怎么看)



首先我们得先知道,报文是什么。

以下摘自百度百科:

报文(message)是网络中交换与传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。

报文就是在通信过程中交换数据的载体,由指定格式的字节数组组成。

在ModbusRTU中,结构如下:

其中:


功能码

ModbusRTU常用的功能码有八个,如下表所示:

根据此表可以列出两个枚举类型,以便后续代码实现的使用:

接下来会逐一介绍不同功能码的具体使用格式。

CRC16校验算法

CRC16校验算法网上有很多,此处不作过多的解释,下面是CRC16的校验算法的代码实现:

01 —— 读线圈

线圈可以理解为开关,对应C#中的布尔量,只有开和关两种状态,可读可写。

报文格式如下:

打开两个仿真软件可以看到:

android hid报文_modbus

其中主站的请求报文为:01 01 00 00 00 0A BC 0D,从站的响应报文为:01 01 02 02 00 B8 9C;

首先从请求报文看起:

一个01是从站的站地址,即向1号从站发送请求;

第二个01为读线圈的功能码;

第三、四个字节,00 00是起始位,即从地址0开始读取;

第五、六个字节,00 0A是读取数量,换算为10进制为10,即读取10个地址;

最后两个字节为CRC16校验码,由前面六个字节计算得出。

接着看响应报文:

第一个01是从站的站地址,即响应的是1号从站;

第二个01为读线圈的功能码;

第三个字节为02,是数据区的长度,即此字节后面的两个字节都是数据;

第四、五个字节,02 00为读取的数据,换算为二进制为0010 0000 0000 0000。由于读取的是线圈,返回的值其实是一个个的布尔量,也就是位,所以需要换算为二进制才能看到确定的读数,上面的例子是从站的第二个地址,即地址1的值为1(true),所以可以看到,换算为二进制的头四个位表示的就是我们读取到的值,即0010,倒过来看就是地址0为0,地址1为1,地址2为0,地址3为0。之所以这里是两个字节,是因为读取的是十个地址,而每个地址的值都是一个位(bit)。由于一个字节只有八个位(bit),所以溢出的两个位就被存储到了新的字节里面。

最后两个字节为CRC16校验码,由前面五个字节计算得出。

了解到原理之后,就可以开始写代码了。

新建一个叫MessageGenerationModule的类,作为校验码计算的工具类,先写01的请求报文的生成方法:

然后是解析的方法:

使用控制台的主程序打印出最后的结果:

android hid报文_校验码_02

02 —— 读离散输入

离散输入同样是布尔量,只可读不可写。

报文格式如下:

与01功能码对比,可以发现,它们的报文格式是一模一样的。

再打开仿真软件查看一下读取报文:

android hid报文_c#_03

可以看到,请求的报文和响应的报文仅仅只有功能码和校验码不一样了。所以我们只需要修改一下刚刚的方法里的读写模式,即可生成正确的报文,并解析出正确的结果:

其余的代码均不修改,最后可以看到输出结果:

android hid报文_c#_04

03 —— 读保持型寄存器

保持型寄存器可以存储16位的无符号整数,32位的单精度浮点数,64位的双精度浮点数,所以解析时需要注意数据类型。

由于存储的最小的单位就是16位的整数,所以每个寄存器存储的值最少为两个字节。

报文格式如下:

报文格式其实与01、02一样,所以生成报文的方法都是一样的,但是由于读取的数据类型不同,需要修改解析的方法。先看看仿真器生成的报文:

android hid报文_android hid报文_05

可以看到,主站的请求报文确实只有功能码和校验码变了。不过可以发现从站响应的报文变长了很多,这是因为读取报文读取的是前十个地址的值,一个地址的整数值为两个字节,所以返回的时候的数据区就会有2x10个(即20个)字节,这也就是第三个字节(表示数据区字节数量的字节)为14(十进制为20)的原因。

所以我们也就不难拿到我们有值的地址1的值了,由前面的解释可以得知,数据区的第一、二个字节表示地址1,第三、四个字节表示地址2,也就是00 14,转换为可以得到值为20。

读取报文的方法只需要修改读取模式:

响应的报文:

而解析报文则需要修改为以下形式:

最后运行可以看到生成的请求报文和解析的结果都是正确的:

android hid报文_校验码_06

04 —— 读输入寄存器

输入寄存器与保持型寄存器基本相同,但是输入寄存器是只可读不可写的。

报文格式如下:

与前面也基本相同,再看看仿真器:

android hid报文_校验码_07

按照上面的方法修改一下读取模式和响应报文的数据以检验同样方法是否依然可行:

运行可以得到,结果正确:

android hid报文_android hid报文_08

读取单精度浮点数

通常ModbusRTU协议中传输的都是整数形式的数据,但是也有可能是单精度浮点数或者是双精度浮点数,这种时候就需要修改解析方法了。但是实际应用中,也有不少厂家会将浮点数乘到整数再进行传输,以减少寄存器的使用量,最后我们读取到这样的数据后,做一次简单的除法运算则可以得到正确的结果。比如有一个25.3℃的温度数据,从站将它乘以10得到253,然后主站通过ModbusRTU获取到的数据就是253,需要自行除以10才可以得到25.3。

以下以03为例,先看看仿真的报文:

android hid报文_串口通信_09

可以看到,请求是没有变化的,响应的报文的数据区依然是20个字节,这是因为一个寄存器最多只能存储16位的数据,如果是需要存储32位的单精度浮点数,则需要占用两个寄存器。所以如果设备寄存器数量不足,则需要尽量使用前面提到的乘成整数再存储的方式。

其中41 CA 66 66则为地址0和地址1存储的25.3这个值。

C#中的解析方法可参考下面进行修改:

运行结果如下:

android hid报文_android hid报文_10

需要注意的是,实际float的转换的高低字节和高低位顺序是有四种不同的情况的,这个需要根据实际情况进行调整,而其它的双精度浮点数之类的值,解析方法实现的思路都是一样的。


MessageGenerationModule类:

CheckSum类:

主程序:


本文介绍了ModbusRTU读取报文的格式及生成和解析,但是需要注意的是,前面介绍的都是标准的ModbusRTU格式的报文,实际应用中,依然存在非标的情况,这种时候就要根据实际情况来自行修正了。下一篇将继续介绍写入的报文。

到此这篇modbus报文解析在线工具(modbus报文怎么看)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!

版权声明


相关文章:

  • seat-tend翻译(seating翻译)2025-05-01 19:27:07
  • 安卓运行xp虚拟机(安卓运行虚拟win xp)2025-05-01 19:27:07
  • 验证码发送失败原因(验证码发送失败的原因)2025-05-01 19:27:07
  • 怎么用手机steam扫码支付(手机steam怎么扫二维码)2025-05-01 19:27:07
  • mt102报文(mt210报文用途)2025-05-01 19:27:07
  • 动态库存表的详细制作过程包括(动态库存表的详细制作过程包括什么)2025-05-01 19:27:07
  • py创建文件夹(py新建文件)2025-05-01 19:27:07
  • 打印机共享修复合集怎么设置(打印机共享错误怎么设置)2025-05-01 19:27:07
  • qq怎么扫描二维码登录账号(怎样用qq扫描二维码登录)2025-05-01 19:27:07
  • paas平台和saas平台区别(paas saas 区别)2025-05-01 19:27:07
  • 全屏图片