• OneNET麒麟座应用开发之六:与气体质量流量控制器通讯


    气体质量流量控制器,简称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查看最后的显示结果如何。显示数据更新正确,如下图:

     

    至此,我们完成了读取气体质量流量控制器的数据测试。

  • 相关阅读:
    在一组降序排列的数组中插入一个数据,插入后,数组中数据依然按降序排列
    轮播图无限滚动
    微软雅黑的Unicode码和英文名
    javascript中的this
    javascript构造函数及原型对象
    object.prototype.call
    Array.prototype.forEach数组遍历
    键盘event.which属性
    Object.prototype.toString()
    parseInt()解析整数与parsetFloat()解析浮点数
  • 原文地址:https://www.cnblogs.com/foxclever/p/6891763.html
Copyright © 2020-2023  润新知