《电子技术应用》
您所在的位置:首页 > 嵌入式技术 > 设计应用 > 基于多串口的热量表系数修正软件的设计
基于多串口的热量表系数修正软件的设计
来源:微型机与应用2012年第18期
李世光1, 孟强强1, 桑志峰2,等
(1. 山东科技大学 信息与电气工程学院, 山东 青岛266590; 2. 青岛盘古电气有限公司,
摘要: 为了配合自主研发的超声波热量表的检定工作,依据公司制定的热量表红外通信协议,进行了热量表修正软件的设计。该软件实现了对热量表流量和温度系数的修正,进而提高了热量表的检定精度。在Visual CC++6.0平台下,通过MFC来创建应用程序框架,利用多线程串口通信类CnComm完成多线程之间的数据通信任务。通过发送控制命令和构造接收处理子程序来完成对串口数据的读写和显示。同时,利用ADO类对数据库进行访问,实现历史记录的查询功能。该软件经过实际检验,操作简单方便,通信可靠高效,达到了检定工作的要求标准。
Abstract:
Key words :

摘  要: 为了配合自主研发的超声波热量表的检定工作,依据公司制定的热量表红外通信协议,进行了热量表修正软件的设计。该软件实现了对热量表流量和温度系数的修正,进而提高了热量表的检定精度。在Visual CC++6.0平台下,通过MFC来创建应用程序框架,利用多线程串口通信类CnComm完成多线程之间的数据通信任务。通过发送控制命令和构造接收处理子程序来完成对串口数据的读写和显示。同时,利用ADO类对数据库进行访问,实现历史记录的查询功能。该软件经过实际检验,操作简单方便,通信可靠高效,达到了检定工作的要求标准。
关键词: 红外通信;多串口Visual C++;系数修正

    目前,热量表检定装置在我国的发展还不是很成熟,大多数热量表检定装置还没有完全实现计算机自动控制,特别是在一些关键功能方面,国内的热量表检定装置及其检定方法的科学性和自动化程度都有待提高,主要表现在两个方面:一是缺少光电通信接口;二是缺乏对热量表仪表系数的自动修正能力[1]。例如进行热量表流量检定时,无论是质量法还是标准表法都需要人工读取被检定表的流量参数,通过与热量表检定装置的标准值进行比较,确定其是否在规定误差范围内, 从而做出检定结果[2]。其检定过程存在的缺点是:易于引入读数和计算偏差,使检定结论不准确;人工读数导致检定时间长,检定效率低,检定自动化程度低;在热量表检定不合格时,无法及时根据误差自动修正仪表的流量系数,使热量表的后续工作量较大。为了避免检定过程中人为因素对检定结果造成的影响,减少热量表检定的后续工作量及提高热量表的检定效率,配合热量表检定系统设计了热量表系数修正软件。
1 热量表红外通信电路
    目前,热量表的通信方式主要有三种形式:(1)M_BUS通信,用于远程读取热量表数据的总线标准;(2)红外通信,采用红外发送接收管,进行近距离的通信,主要应用于手持红外设备对热量表进行近距离抄表;(3)RS-485通信,利用一对双绞线,实现平衡发送和差分接收,硬件简单,成本低廉,多站互联较为方便,工业应用成熟[3]。比较三种通信方式,公司研发的热量表采用了前两种通信方式,即M_BUS通信和红外通信。而热量表系数修正软件正是以红外通信为基础来实现的。下面简单介绍所设计的超声波热量表的红外通信电路。
    超声波热量表选用红外发射二极管EL351430和红外接收二极管PT-BP351420来构成红外通信电路,如图1所示。红外发射电路由一个510 Ω的电阻和EL351430红外发射二极管组成,通过单片机MSP430的P1.4(HW_TXD)发送数据;在红外接收部分,利用红外一体化接收二极管PT-BP351420接收红外脉冲信号,经放大、滤波和检波等处理,解调成二进制电信号,然后通过P1.3(HW_RXD)进入单片机MSP430。

2 系数修正软件设计方案
    VC++由于功能强大和应用灵活,同时具有图形界面友好、系统资源丰富、操作配置方便、运行速度较快等特点;而串口通信具有实现简单、使用灵活方便、数据传输可靠等优点,因而用VC++编制串口实时控制软件十分方便[4]。在检定超声波热量表时,为了缩短检定时间,提高检定效率,该软件一次需要与多块热量表进行串口数据通信,从而需要开辟多个串口,完成多串口的读写命令又会涉及到多线程串口的操作。因为此时程序需要循环检测串口的事件状态,当串口出现收发事件时,必须立即进行串口的读写操作。若将这些循环检测操作放在主线程中,将使主线程执行速度变慢,程序的效率降低[5]。该系数修正软件利用多线程串口通信库CnComm来解决多线程串口通信问题,从而提高了计算机执行程序的能力以及软件运行和执行的效率,并通过ADO类对数据库进行访问,实现热量表检定数据的记录保存。软件工作流程图如图2所示。

3 系数修正软件程序设计
    利用VC++ 6.0的MFC创建一个单文档的应用程序框架,添加相应的按钮、编辑框、静态文本框等控件创建应用程序的人机交互界面。将所用的CGridCtrl类、CnComm类和Ado类的文件包含到应用程序中,并在所应用的类中包含它们的头文件。
3.1初始化串口
    初始化主要对串口参数进行设置,包括使用的端口、通信波特率、数据位数、奇偶校验、起始/停止位数等参数。设置好参数后,就可以打开串口,准备进行数据传输。软件根据被检定的表数确定打开的串口数目,并设置串口的工作状态和波特率等参数。程序中添加读取检定热量表的表号并打开相应的串口及设置参数的代码如下:
    void CHeatMeterView::OnButtonOpen()
    {
    for(intm_nActivePos=0;
    m_nActivePos<m_Number;m_nActivePos++)
//获取被检定热量表的实际数目
  {
    nPort= m_Pos[m_nActivePos]+10;
                  //得到串口号,+10表示从COM11开始    if(Comm_[nPort].IsOpen()) Comm_[nPort].Close();
                                 //关闭已被打开的串口    
    Comm_[nPort].SetOption( Comm_[nPort].GetOption() | Cn-    Comm::EN_RX_BUFFER| CnComm::EN_TX_BUFFER);
                                      //设置串口参数        Comm_[nPort].Open(nPort,"1200,E,8,1");
    Comm_[nPort].SetWnd(this->GetSafeHwnd());
                     //设定需要监视串口数据接收的窗口
             }
    }
3.2信息帧的发送处理
    在发送信息帧控制命令的各子程序中编写相应的热量表控制命令。由于信息帧发送过程中可能出现误码或其他外界干扰,容易造成信息帧发送失败,为了提高信息帧发送的成功率,每次发送信息帧控制命令后自动启动超时定时器,用于计算发送数据后的超时,若控制命令连续三次发送超时,主站没有得到从站的响应,则关闭超时定时器,退出本次控制命令的发送,同时提示检定人员通信失败的表号。各个控制命令的发送基本一致,下面以检定启动控制命令为例来说明,其程序代码如下:
    void CHeatMeterView::OnButtonStart()
    {
    if (m_bSerialPortOpened==TRUE && m_Number>0)
                //确认有被测热量表和相应的串口已打开
        {
        m_nActivePos = 0;                           //第一组表位
            StartTest(m_nActivePos);    
                      //发送检定启动控制命令的子程序
        }
    }
3.3 信息帧的接收处理
    当主站成功发送控制命令后,从站将按照已制定的红外通信协议给予响应。串口接收数据采用事件驱动的方式。当串口有数据进入接收缓冲区时,程序将执行ON_MESSAGE(ON_COM_RECEIVE, OnReceive)事件。在程序中,该事件的函数名称是OnReceive(OnReceive(WPARAM wParam, LPARAM lParam))。在该函数中,首先判断信息帧是否出现数据长度、控制码、数据标识和偶校验等错误,如果没有错误,则读取接收缓冲区有效的数据字节存放到所定义的数组内,然后解析报文内容,做出相应的应答;否则自动放弃该信息帧,不予响应。在此仅给出数据帧接收处理函数OnReceive()中检定启动控制命令响应信息帧的处理,其程序代码如下:
    LRESULT CHeatMeterView::OnReceive(WPARAM wParam,        LPARAM lParam)
    {
        if (wParam  == Comm_[nPort].GetPort())
              {    
          if(firstdata_addr<=511)
               {
                m_usDataNmbr = Comm_[nPort].Read(&m_
            ReceiveBuf
            [firstdata_addr], 512);//读取串口缓冲区信息帧
             }
         else
           firstdata_addr=0;
             }
    ……
         BYTE KeyCRT;       //检定启动的控制码
          KeyCRT = m_ReceiveBuf[nStart+9];
    if (0xA3== KeyCRT)              //是否为检定启动响应           {
    if(m_nActivePos!=m_Number - 1)
                                                  //下一个表位            {
              m_nActivePos++;
              Sleep(SleepTime);
              StartTest(m_nActivePos);
                          //发送检定启动控制命令
        }
    else
          MessageBox("通信全部成功!);
         }
……
    }
3.4 Ado类对数据库的访问

 


    在热量表的检定过程中,检定人员容易出现忘记将某个流量点数据清零的情况,导致下一个流量点的检定数据不准确。补救的方法就是把检定过的流量点再重新检定一遍,这样不仅增加检定人员的工作量,降低热量表的检定效率,而且极易造成热量表检定结果和修正系数的不准确,严重影响热量表出厂的合格率。为此,建立一个Access数据库来记录热量表每个检定流量点的相关数据。其优点是:(1)当检定人员误操作后,可以及时从数据库中恢复某一检定过的流量点记录的相关数据,不需要检定人员再重新操作; (2)可以作为研究和改进热量表检定和系数修正的重要数据依据。
4 软件运行情况分析介绍
4.1 软件总体概况

    该系数修正软件利用热量表的红外通信功能,通过USB型光电读写头与热量表的主控制器进行串口数据通信。在热量表的流量检定中,配合热量表的流量检定系统来读取热量表的流量基准值和测量结束值,并根据有关公式计算相应的误差和流量修正系数,从而真正实现热量表检定和仪表系数修正工作的一次性完成。不仅使热量表检定工作效率得到显著的提高,而且使热量表的批量检定成为可能。软件的人机界面如图3所示。
4.2 软件的信息帧发送和接收
    该系数修正软件具有良好的人机交互界面,信息帧控制命令的发送都是通过单击按钮来实现的,并且发送成功与失败都有相关的提示界面,便于检定人员获知相关操作是否完成。对于接收到的信息帧,软件会自动判断接收到信息帧的有效性和正确性,经过相关的数据处理后显示在人机交互界面上,便于检定人员可以直观地查看检定热量表的相关数据。在热量表某一检定流量点中,软件读取、显示及计算相关误差的界面如图4所示。


4.3 软件的数据记录保存与查询
    每完成一个流量点的数据读取和计算相关误差后,检定人员可以点击保存数据按钮对数据记录进行保存,每条记录将按照所创建的数据库格式进行存储,记录包括表位号、表号、管径、被测流量点、温度、基准值、测量结束值、实际值、误差、修正系数等,便于以后的数据查询和恢复操作。
    该系数修正软件在国内热量表检定装置及其检定方法的科学性和自动化程度不断提高的环境下应运而生,进行了多次改进和调试,在实际运行中也取得了比较理想的效果。在公司半年多的使用中,软件运行良好,操作简单,使用方便,通信可靠高效,不但节省了人力,减少了检定人员的工作量,而且大大提高了检定的科学性、可靠性和正确性,使超声波热量表检定提高到了一个新水平。
参考文献
[1] 吴伟龙.热能表新型自动检定方法的研究[J].中国计量,2009(6):67-68.
[2] 刘剑,刘俊承.热量表自动检定系统设计[J].现代电力,2011,28(5):72-75.
[3] 张旭. 城镇供热计量与管理系统的研究与设计[D].山东:山东科技大学,2011.
[4] 曹西征,郭立红.基于VC++的红外相机串口通软件设计[J].微计算机信息,2007,23(4):289-
290.
[5] 刘书智.Visual C++串口通信与工程应用实践[M].北京:中国铁道出版社, 2011.

此内容为AET网站原创,未经授权禁止转载。