在工作中,当我们采集采用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