百科知识

揭秘mv值到底代表啥意思啊

各位朋友大家好,我是从事嵌入式开发的程序员小哈。

近期接到了一个客户的需求,他们提供了一款温控仪表,希望我能开发一个软件来实时读取仪表的温度数据。今天,我将带领大家从零开始,详细探讨我是如何完成这个任务的。

当我们面对一个新的硬件模块时,首要任务是仔细研究其官方文档。这款温控仪表附带了一份详细的使用说明书,接下来我们将对其进行全面的了解。

首先,我们查看该模块使用说明手册中关于型号定义的部分,它由以下九个部分组成:

模块外壳上明确标注了具体的型号信息:

通过对比两者,我们可以得出以下结论:

① AI-部分标识仪表的型号,由此可知该模块的型号为AI-756P;

② SIZE部分表示仪表面板的尺寸规格,A对应的面板尺寸为96x96mm;

③ MIO部分说明仪表辅助输入(MIO)安装的模块规格:可以安装I4、K3、V等模块,N表示未安装;

④ OUTP部分描述仪表主输出安装的模块规格;

⑤ ALM部分说明仪表报警安装的规格;

⑥ AUX部分表示仪表辅助输出安装的模块规格;

⑦ COM部分说明仪表通讯安装的模块规格;

⑧ POWER部分表示仪表供电电源,此处未标注,表示采用100~240VAC电源;

⑨ 表示仪表扩展的分度表规格,若无则不写。

我们的最终目标是读取仪表的实时温度数据,因此需要了解如何与仪表进行数据通讯。

首先,我们使用USB转485线将上图中的COMM口的③④位置连接,A对A,B对B。

① ②位置连接220V电源供电。

⑱⑲⑳位置连接一个PT100用于测试。

这款仪表支持两种通信协议:一种是公司自有的通讯协议AIBUS,另一种是兼容的Modbus协议。

读操作: 地址代号+52H(82)+要读的参数代号+00+00+校验码

写操作: 地址代号+43H(67)+要写的参数代号+写入数低字节+写入数高字节+校验码

说明:

(1)地址代号:两个相同的字节,数值为(仪表地址+80H)

例如:仪表地址为10(16进制表示为0AH,0A+80H=8AH),因此该仪表的地址代号为:8AH 8AH。

(2)参数代号:相当于命令类型,由一个字节表示

(3)校验码

读指令校验码:参数代号*256+82+ADDR

写指令校验码:参数代号*256+67+写入的参数值+ADDR

计算得到的和与0xFFFF取余数,余数为2个字节,低字节在前,高字节在后。

测试指令:81 81 52 00 00 00 53 00

无论是读操作还是写操作,仪表都会返回以下10个字节数据:

测量值 PV+给定值 SV+输出值 MV 及报警状态+所读/写参数值+校验

说明:

(1)、PV、SV及读取的参数值均各占2个字节,是一个16位有符号补码的整数,低位字节在前,高位字节在后

(2)、返回校验码:为 PV+SV+(报警状态*256+MV)+参数值+ADDR 按整数加法相加后得到的余数。

注意:我手中的仪表型号为S7,经过官方确认,该型号的模块不支持自定义的AIBUS协议。

AI仪表采用RTU(二进制)模式,波特率必须设置为9600bit/S,无奇偶校验位,支持03H(读参数及数据)及06H(写单个参数)这两条指令。

读数据要求一次性读取4个字节数据,指令如下:

ADDR+03H+00+要读的参数代号+00+04+CRC 校验码

返回数据为:ADDR+03H+08H+测量值 PV 高位+测量值 PV 低位+给定值 SV 高位+SV 低位+报警状态+输出值 MV+所读参数值高位+所读参数值低位+CRC 校验码低位+CRC 校验码高位

例如可以发送:01 03 00 01 00 04 15 C9

写单个参数指令为:

ADDR+06H+00+要写的参数代号+要写入的数据高位+要写入数据低位+CRC 校验码

注意:仪表默认地址为0x01。

之前我们曾分享过基于Qt开发的Modbus程序,今天我们将在之前的代码基础上完成此次测试。

首先G众号【嵌入式从0到1】后台回复:Qt-Modbus 获取基础源码,然后我们将界面重新布局为如下效果:

这个程序是在串口事件中接收并处理数据,有时会出现串口数据分包的情况。

一帧数据接收不完整,我们就无法直接对接收到的数据进行解析,今天我们对程序进行优化。

我们借鉴之前分享的STM32串口数据接收方法——定时器法,当串口事件响应时,我们启动一个短时间的定时器,因为一帧数据包内的数据,即使分包了,包与包之间的时间间隔也很短,所以,在串口事件中,我们启动定时器,相当于让定时器重新计时,这样,当不能再接收到数据时,那么定时器的超时事件就会发生,我们在定时器超时的函数中,对接收的数据进行解析,这样就能够避免分包导致的数据不完整,具体实现如下:

我们在打开串口的事件函数中,定义一个串口接收事件的函数和一个定时器事件函数。

在串口接收函数中,我们启动定时器,相当于重置定时器。

此定时器的时间,根据需要和实际情况,尽量短。

在定时器超时函数中,我们关闭定时器,然后一次性读取所有的串口数据,进而对接收到的串口数据进行解析。

主要能拿到完整的串口数据,那么对数据的解析也就简单了,大家感兴趣的话,可以G众号后台回复:Qt-Modbus-2 ,获取本文测试工程源码及产品手册。

有了上面的介绍,剩下的参数代码的功能,小伙伴们可以自行尝试实现。

询问了官方,我用的AI-756P型号的仪表参考719P型号的仪表通信协议即可,我们要读取仪表的当前温度,即PV值,所以寄存器地址应该为0x02。

我们演示一下操作过程,可以看到,没有发生串口数据分包的现象。

今天主要分享一个小哈哥最近使用的仪表,让大家有个初步印象,万一哪天需要类似产品,自己找起来也有个方向。

另外就是分享一个,如果遇到Qt接收数据包不完整的情况怎么办?

好了,今天的文章内容到这里就结束了,希望对你有帮助,我们下一期见,记得给小哈哥点个赞,支持一下哈!~。