初出茅庐的小李博客之Modbus称重传感器调试记录
Modbus称重传感器调试记录
最近需要调试一个称重模块其接口是RS485接口,采用的是Modbus协议,今天就来记录一下调试的过程。
模块介绍
LJW-M01 数字模块是将电阻应变式称重传感器输出的模拟信号转换成数字信号的一种 AD 装换模块。内部集成了标定、滤波、置零、去皮等称重仪表的功能,可以直接连接电脑、PLC、组态屏等设备。它有两种数字通讯接口:RS232(LJW-M01A)和 RS485(LJWM01B)。LJW-M01 具有“高精度”、“小化”、“集成化”、“规模化”、“智化”、“低成本”、“高可靠性”、“强适应性”等特点,适用于工业控制、快递物流、仓储管理、新零售、垃圾回收等应用领域。以上内容来自传感器厂家的说明。
技术参数
我手上的型号是LJW-M01B也就是RS485接口,可以看到该模块在485通信模式下理论传输距离可以达到1000m,没有实际测试,这个距离还是很远的。
配套上位机
模块提供了丰富的标定调试功能、各种通讯模式和参数供用户使用。这些功能都可以通过 MODBUS 通讯来实现,但是编程较为复杂。为了方便使用,我们提供了《LJW-M01 用户配置工具》软件,来标定和配置这些参数。这个上位机是厂家提供的集成了常见的控制指令以及参数配置功能,对开发调试人员来说非常有帮助。当然要想利用好这个软件一定要先了解Modbus协议,也要对相应的寄存器比较熟悉。
软件界面
串口配置区
串口配置区用于配置电脑和数字模块使用的通讯参数。本软件使用的是 MODBUS-RTU 协议,需要配置的通讯参数有:“端口号”、“波特率”、“校验”和“通讯地址”。其中“端口号”需要根据实际连接电脑哪个串口来配置,其他参数则需要根据模块内部的参数来配置,要和模块设置的一致。上面截图可以看到我的USB转485工具占用的是COM5接口,波特率采用的就是默认的波特率38400bps,校验采用偶校验,通信地址这里是1可以连接通信,这应该是没有被修改过的地址,当然也可以在上位机进行修改设置,因为Modbus协议可以一个主机对多个从机进行通信,这个地址也就是从机的地址,由于我也仅仅连接1个设备用来获取它的重量,所以这里就采用默认值不对其进行任何修改。
如果不知道模块的通讯参数,则需要使用“自适应”功能。操作方是:勾选“自适应”选项后打开串口,然后再给模块上电。模块就会使用默认通讯参数(38400 波特率,偶校验,通讯地址为 1)和软件通讯。此时就可以在系统参数页面查看和配置模块的通讯参数。这个自适应功能还是很不错的,因为有很多时候我们对一个485传感器进行了设置我们并没有记住它的参数情况下我们就无法在跟其通信了。
标定参数
传感器在生产时,由传感器生产厂设置了默认的标定参数,用户可以修改这些参数来满足应用的需求。如果需要改回默认参数,点击单个参数中间的“《”即可恢复这个参数的默认值,点击“默认”按钮可以恢复全部参数。恢复参数后,需点击“保存参数”按钮保存。这里我仅仅是查看一下标定参数在没有搞清楚其参数是什么含义之前选择默认参数一般是比较稳妥的方式。这里也可以大概看出一点信息,比如分度值是1,小数点位数是2位,满量程是300g,重力加速度的值是9.8采用的滤波强度是2。
满量程含义以及作用
决定了毛重的最大值,当重量大于满量程 + 9×分度值时状态字中的超载标志就置为 1,此时用户系统应做出相应的报警提示,避免压坏秤体。
重力加速度含义以及作用
重力加速度为用户当地的重力加速度,此数值在使用重力加速度修正功能时才被存储,平时不能修改,也不参与重量数值的计算。
滤波模式含义以及作用
现在固定为滑动滤波。
将来会陆续增加动物秤、动态模式等别的滤波模式
滤波强度
滤波强度越大重量数值越稳定,但是加载反应越慢
开机置零范围含义
单位为 FULL%,例如满量程为 500kg,开机置零范围为 20,那么开机置零的范围值就是±100kg,模块重新上电后,如果毛重小于±100kg,模块就把该重量作为零点,输出毛重为 0。
手动置零范围含义
单位为 FULL%,它影响着置零命令能否成功。如果当前毛重(相对于开机零点)小于手动置零范围值时,置零命令有效,模块把当前毛重作为零点,输出毛重为 0
这些参数脑子有个印象即可,需要用到的时候再来阅读即可。
上位机读取测试
打开上位机进行连接后,先手动点击去皮,其实就是把当前测量的结果清零,这个去皮指令能否生效取决于手动置零范围,由上面的描述可以知道手动清零的范围是4单位是g也就是说4给范围以内都可以手动去皮操作,而且手动去皮操作是可以执行成功的。
这是用手按下的测试结果,可能这个结果在没有进行标定前结果是有误差的,我们重点放在这个值是如何拿到的。
这里就需要先了解一下它的Modbus手册了。
通过阅读手册我们可以得到一些信息,就是重量信息应该在保持寄存器中获取。继续查阅手册来看读取寄存器用什么功能码。
功能码表
涉及到读的操作有读离散量,这里我们首先关心的是读取重量,那我们重点关注的功能码应该是0x04 或者是0x03,再或者是0x23,至于究竟是哪个我们现在还不得而知仍需要查阅手册。
在这里插入图片描述
继续查阅手册可以看到手册中对保持寄存器的描述通过读取输入寄存器可以获得模块的重量数据和状态。
如何理解毛重皮重和净重
毛重,皮重和净重为模块当前的对应“重量数值”。“重量数值”为对应重量不包括小数点的数值(小数点位数需要从状态标志 1 获取)。例如毛重为 21kg,小数点为 2 位,那么毛重的重量数据值就是 2100;净重为 123kg,小数
点为 3 位,那么净重的重量数值就是 123000。
其实就是都不同地址得到不同的重量数据,数据是带0的,至于带几个零要取决于传感器的设定,我们最开始的标定参数设置里面有个2位小数点,就意味着你都回来的数据按照单位来说后面有两位小数,比如读回来的是12345其实对应的克数应该是123.45克。
“重量数值”为 32bit 补码占两个字,高字在前。这句话的含金量非常高,这里说明读回来的数据是按照补码的形式存储的,补码也是计算机中使用的存储方式,这里我就不在解释了,如果大家想了解补码的细节大家可以查看我之前的文章我应该详细的讲述过补码的存储。
其他命令比较多这里不一一列举 重点看一下上位机如何获取重量信息这里我使用串口监视工具来查看一下上位机发送了什么命令。
第一步先打开置零命令
此时上位机显示的值就是0.00克,小数值是2位。
抓包分析来看,ID是01,功能码是04,读18个寄存器,每个寄存器是2个字节,也就是读取了36个字节数据
寄存器0:0000
寄存器1:0000
寄存器2:0000
寄存器3:0000
寄存器4:0000
寄存器5:0000
寄存器6:1203 十六进制0x1203 状态寄存器1
寄存器7:9000 十六进制0x9000 状态寄存器2
寄存器8:0000
寄存器9:0000
寄存器10:0000
寄存器11:0000
寄存器12:0000
寄存器13:0000
寄存器14:0000
寄存器15:0000
寄存器16:0000
寄存器17:0000
置零指令抓包分析
ID:01 功能码05 地址0x0009 数据是 0xFF00 校验和是0x5C 38
获取重量
如图所示上位机读取到稳定的重量是2.24g,
寄存器0-1:0x000000E0 对应十进制是 224 也就是224 对应的重量值是2.24g 毛重
寄存器2-3:0x00000000 对应十进制是0 也就是皮重是0
寄存器4-5:0x000000E0 对应十进制是224 也就是对应净重是2.24克。
同理锁定毛重,跟锁定净重都是224,也就是2.24g
毛重内码,皮重内码、以及净重内码同理。
抓包分析完毕实际测试:
这里我采用普通的串口调试助手来对其进行设置,01 是ID 04都输入寄存器 00 00 是开始地址 00 12意味着读取18个字节0x12是十六机制数据 结尾加上Modbus的CRC16 校验和 70 07 这里跟抓包工具也一致证明我们组包没有问题。
01 04 00 00 00 12 70 07
返回的数据是 01 是ID 04是功能码 数据长度是24也就是 十进制的36个字节 一个寄存器是2个字节 读取是18个寄存器返回的是36个字节,最后是CRC校验,这里由于我没有进行置零操作看到重量不一致。
01 04 24 00 00 00 6D 00 00 00 00 00 00 00 6D 12 02 80 00 00 00 00 6D 00 00 00 6D 00 00 08 85 00 00 00 00 00 00 08 85 B3 31
不太理解04功能码的可以参考下面这个表格
发送一个05指令先进行清零操作
05指令的格式如下
写单个线圈指令
01 05 00 09 FF 00 5C 38
之后再来读重量
00 98 十六进制对应十进制152 对应克重是1.52克 00 97 应该是误差1.51克
再用实际上位机来测试看结果
1.35克 可以认为测试结果是正确
调试完毕。
调试注意事项:
1、波特率选对
2、默认偶校验不选不能通信 尤其是打开关闭过串口助手后
3、去皮跟毛重净重的操作要注意先后顺序否则相同物体测试出来结果不同
00 97 应该是误差1.51克
[外链图片转存中…(img-wRuErIJB-1741532994369)]
再用实际上位机来测试看结果
[外链图片转存中…(img-QZzxwbZP-1741532994369)]
1.35克 可以认为测试结果是正确
调试完毕。
调试注意事项:
1、波特率选对
2、默认偶校验不选不能通信 尤其是打开关闭过串口助手后
3、去皮跟毛重净重的操作要注意先后顺序否则相同物体测试出来结果不同
接下里就是要用STM32来编写主机代码给其进行通信 把重量实时显示在屏幕上,感兴趣的小伙伴可以关注我哦。本次文章写的比较混乱可能对于不了解Modbus的小伙伴不太友好,大家如果想要学习Modbus相关协议可以点在看关注后后台找我要资料哦