RS485 Modbus协议解析

    在工作中,当我们采集采用RS485主从式半双工通讯的传感器时,会接触到Modbus协议。有时我们手上没有实物,只能通过协议文档手册,编写完代码后,自己用RS485来模拟发送验证。下面就说说如何快速组装数值发送验证,以及解析数值。

标准Modbus协议结构如下:

主机发送读寄存器协议数据结构形式为:

设备地址           1字节

读寄存器命令   1字节

寄存器地址       2字节

读寄存器个数   2字节

CRC校验(低字节在前,高字节在后)   2字节

 

例(主机发送数据到传感器):01 03 00 12 00 02 64 0E

解析:

01    表示设备地址

03    表示读寄存器指令

00 12 表示寄存器的起始地址

00 02 表示读取两个寄存器

64 0E 表示CRC校验码

 

从机返回寄存器是数据结构形式为:

设备地址   1字节

读寄存器命令   1字节

读取字节个数   N字节

XX *N   N个所读取字节数据

CRC校验(低字节在前,高字节在后)

 

例(传感器发送回给主机):01 03 04 41 E6 28 F6 91 BE

解析:

01          表示设备地址

03          表示读寄存器指令

04          表示有四个16进制数据

41 E6 28 F6  表示传感器的有效数据

91 BE       表示CRC校验码

 

1.若厂家对传感器的数据存储采用标准单精度浮点数方式,则对于一串采集回来的16进制数据,要转成浮点数是比较麻烦的,可以看下先用科学计数法方式存储计算:

方式1:如解析上述的返回值41 E6 28 F6

计算 41 E6 28 F6 (采用科学计数法方式存储计算)

转为二进制:01000001111001100010100011110110‬

红色’0’:表示符号位,1为负,0为正

10000011:表示指数位,转为十进制为2^0+2^1+2^7=131 131-127=4 说明指数位为4

则表示为((1.11001100010100011110110)*2^4)=11100. 1100010100011110110=

2^2+2^3+2^4. 2^-1+2^-2+..=28.77

41 E6 28 F6 转为十进制为28.77

 

方式2:采用工具快速转换,如下图所示

有了该工具,想要自己模拟发送任意数值的modbus协议数据,也是非常方便的。

比如主机发送了01 03 00 12 00 02 64 0E 采集命令,想要模拟传感器数值为12.34

通过工具转换如下:

则可组装modbus协议数据为01 03 04 41 45 70 A4 , 对于后面两位crc校验可以采用如下工具,可以得到:

可知组装的完整mobdus协议数据为01 03 04 41 45 70 A4 DB A1

2.若厂家对传感器的数据处理是采用16进制转整数方式处理,就像如下图所示:

这种形式的16进制传感器数据,可以采用电脑的计算器快速计算得到。

如计算00 9B

16进制模拟负值,可以采用计算器

如模拟-50,计算器输入如下0-50

再点击计算器上的xor

则16进制FF CE 则表示负数-50

发布了11 篇原创文章 · 获赞 13 · 访问量 1661

猜你喜欢

转载自blog.csdn.net/Psyduck_ing/article/details/101309744