气体质量流量控制器,简称MFC,通常用于在各种检测中,计量气体的流量。在我们的大气环境数据采集站中,要让气流保持稳定,这样才能准确的获取PM25的数据。
我们采用的气体质量流量控制器具备串口通讯功能,采集流量信号并更具设定数据自动调节流量。我们采用的质量流量控制器如下:
1、协议描述
该类型的质量流量控制器采用RS232 ASCII通讯协议,协议的格式非常简单,如下图所示:
其中,:是起始字符。len1, len2 是指包括节点地址在内的信息的字节数长度, 即基本信息的长度+1。node1, node2是目标设备的节点地址。data1, data2,具体信息。CR是结束字符。
除了起始字符和结束字符外,其他的全部字节都会按1个字节转化为2个16进制表示的ASCII码字符。如:0x2A会被转化为0x32和0x41两个ASCII码字符。
对于发送错误信息的报文有一定的区别,如下图:
其长度是固定的,与正确状态下的信息格式略有差别。
2、硬件设计
因为采用的是串口通讯,所以硬件的连接比较简单。麒麟座上的USART1(PA9:USART1_TX,PA10:USART1_RX)端口已经引到了J2端子排的J2_6和J2_5,所以我们就是用这一接口。如下图所示:
但是由于OneNET麒麟座山是TTL电平,而质量流量控制器是RS232的接口,所以我们还需要一个用于电平转换的摸块,我们平时就是使用一种如下图的TLL转RS232的接口模块,这次也使用它。
至此,硬件连接就不会有问题了。
3、软件设计
接下来我们看看软件方面的设计,在开始具体的软件设计之前,我们看一看流量控制器中具体的参数存储地址和没操作命令。
(1)操作命令
命令字符串是以ASCII码表示的二进制字符串。质量流量控制器具有9种命令,我们并不需要用到其中的全部命令,具体如下图所示:
(2)数据类型与地址
该种类型的气体质量流量计拥有将近300个参数可供读或者写,但我们通常用不到这么多,我们只考虑其中的几个参数:
- 流量测量值,地址为205,浮点类型。
- 流量设定值,地址为206,浮点类型。
- IO状态,地址为86,字节型数据。
- 控制模式,地址为12,字节型数据。
气体质量流量控制器的参数数据类型有5种,分别为:字符型、整型、浮点型、长整型以及字符型,如下图:
有了以上这些准备我们就可以开始编写程序了。首先我们编写一个串口发送数据的通用函数:
//数据发送 void SendData(uint8_t *txData,uint16_t length) { uint16_t i; for(i=0;i<length;i++) { //传送寄存器不为空,等待传送结束 while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET) { } // 写一个字节到对应的串口传送数据寄存器 USART_SendData(USART1, txData[i]); } }
(3)读取状态信息
我们之所以要单独对状态信息编写操作程序,是因为它的报文格式与读取其他参数有一定的区别,如下图:
/*获取状态*/ void GetMFCStatus(uint8_t status,uint8_t index) { uint8_t txBuf[8]; txBuf[0]=':'; txBuf[1]=0x04; txBuf[2]=0x0A; txBuf[3]=0x00; txBuf[4]=status; txBuf[5]=index txBuf[6]=0x0D; txBuf[7]=0x0A; SendData(txBuf,8); }
(4)写数据
接下来我们来看看如何写数据,主要用于设置各种参数值,对于我们来说设置流量设定值是必须的,具体报文格式如下:
/*读取参数值*/ void SetMFCParaValue(uint8_t *data,uint16_t length,uint8_t command,uint8_t processNum,uint8_t paraType) { uint8_t txBuf[20]; uint16_t index=6; txBuf[0]=':'; txBuf[1]=0x04+(uint8_t)length; txBuf[2]=0x0A; txBuf[3]=command; txBuf[4]=0x80+processNum; txBuf[5]=paraType; for(int i=0;i<length;i++) { txBuf[i+6]=data[i]; } txBuf[6+length]=0x0D; txBuf[6+length+1]=0x0A; SendData(txBuf,length+8); }
(5)读数据
接下来我们来看看如何读取数据,主要用于获取各种参数值,对于我们来说读取流量测量值是必须的,具体报文格式如下:
/*读取参数值*/ void GetMFCParaValue(uint8_t processNum,uint8_t paraType,uint8_t paraNum,uint8_t strLength) { uint8_t txBuf[11]; txBuf[0]=':'; txBuf[1]=0x07; txBuf[2]=0x0A; txBuf[3]=0x04; txBuf[4]=0x80+processNum; txBuf[5]=paraType; txBuf[6]=processNum&0x7F; txBuf[7]=paraNum; txBuf[8]=strLength; txBuf[9]=0x0D; txBuf[10]=0x0A; SendData(txBuf,11); }
4、结果展示
我们在完成上述编写后编译下装,并上传到OneNET查看最后的显示结果如何。显示数据更新正确,如下图:
至此,我们完成了读取气体质量流量控制器的数据测试。