摘 要: 个人计算机加上一块数据采集卡就可成为研究和在线数据采集强有力的工具,本文在此基础上绍如何运用MFC开发小型的实时监控软件,同时总结了数据采集软件中经常运用的一些关键性技术。本系统在为一风速测量实验提供了技术支持,取得了良好的效果。 关键词:数据采集,数字滤波,MFC,多线程,双缓冲
一、 引言 本系统是一个实验监控系统,要求对隧道中各测试点进行数据采集,并以数字方式和曲线图方式实时显示数据,最终汇集成报表,以供实验完成后对数据进行分析。由于采用现成的工业组态监控软件,如美国的Intouch、台湾研华的Genie、北京恒力的Good-Helper等,会提高整个系统的成本,并且不能满足对实验系统对数据处理的特殊要求。鉴于上述原因,实验系统的开发采取了如下方式:硬件组态,软件自行设计。使得开发周期大大的缩短,整个系统的成本降到最低。
二、 硬件组态
 图1、硬件组态图
硬件是整个系统的基础,测点的有效数据都经过它提供给上位机软件使用。作好硬件组态是关键。要完成一个好的组态设计,就必须对实验情况作具体的分析。首先,测点的风速可以通过测量该点的差压测得,毕托管能很好的完成任务。其次是把毕托管送出的差压信号变换成电信号,这就需要利用压力传感器。在实际工程中应用的传感器既有电压输出的,也有电流输出的,而一般的数据采集卡都是采集电压信号,在条件允许的条件下,优先选取电压输出的传感器。但是在本系统中,测点的分布比较分散,超过了100m的范围,如果采用电压输出,到采集卡时,信号衰减很大,使得收集到的数据不准确;而电流信号在传输的过程中基本没有衰减,能传很长的距离。因此,系统选用电流输出的压力传感器。在电流进采集卡之前还应设立一端子板,利用250欧的精密电阻,把4~20mA的电流信号转换为1~5V的电压信号,供数据采集卡获取数据。最终完成的硬件设计如图1所示。
三、 软件设计 软件设计采用Vsual C++ 6.0为开发环境,利用MFC文档视图结构实现数据与显示的分离。考虑到系统是一实验数据采集系统,应该有数据的实时显示、数据的永久保存、数据的回放以供实验后期的分析等;把系统分为:数据文件保存模块,数字滤波模块,数据显示模块,数据回放模块,打印模块几大部分,具体实现如下。 1、 数据文件保存模块 保存模块完成数据的采集和永久保存,为实验研究提供数据支持。数据保存涉及到数据的采集,因为要连续不断的采集,就要求数据保存和对界面的显示操作都不影响数据的采集,因此最好使用一线程函数后台采集数据,把采集到的数据存在双缓冲中。所谓双缓冲就是:公用缓冲区由两个大小相同、且连续的子缓冲区组成,当线程函数从AD卡上读一个数据放入缓冲区,并将缓冲区指针加1,当两个子缓冲区全部填满后,将缓冲区指针归0,后读入的数据冲掉原来的数据。文档处理函数通过定时查询双缓冲中是否有一缓冲已满,如果满就读出缓冲区的数据,然后设置其状态为空,如果另以缓冲区已满时,这个缓冲区就开始接收采集的数据。把从缓冲区取得的数据送入显示模块实时显示,同时利用另一线程函数把这些数据用Cfile::Write函数写入文件中永久保存。其中线程函数如下: UINT DataAcquisitionThreadProc(LPVOID pParam) { ......//采集数据送入双缓冲中; } UINT DataSaveThreadProc(LPVOID pParam) { ......//保存数据至磁盘文件; } 只要缓冲区的大小设置的合适,就可避免缓冲区的溢出和数据的丢失。很好的完成工作
2、数据处理模块 数据保存模块保存的数据都是采集到的原始数据,其中必然包括采集过程中出现的干扰和噪声,如果不加任何处理就会使得实验所得到得数据不够准确,从而对实验分析产生误导,得不到正确得结果。因此,在数据处理模块中利用三个数字滤波器来减少非有效数据的成分。(1)中位值滤波器,其原理为:把对某通道连续采样n次的采样值按大小排队,取中间值位本次的采样值。这种滤波器能有效的克服因偶然因素引起的波动或者由于数据采集卡不稳定引起的误码等造成的脉冲干扰。(2)算术平均值滤波器,其原理为:连续采样n次相加的平均值作为本次的采样值。它对对随机干扰有作显著的抑制作用,但是n值不宜取得过大,过大了使得测量得精度下降,有用的数据也被过滤掉了。(3)加权递推平均值滤波,其原理为:利用公式可以如下表示出:

这三种滤波方法可以组合,形成复合滤波法。其中第一种,第二种分别和第三种组合,第一种和第二种不宜组合。实验中具体选择哪种组合方式,由实验员根据经验和数据处理的效果来决定。
3、 在线显示模块 显示模块主要完成从文档中提取当前数据,经过数字滤波器处理,显示在视窗中,供实验人员观测。通过对CWND类的继承,派生出两个显示类:数字类CDigitalDisplay,以数字变化的方式显示采集到的数据;棒图类CstickDisplay,以棒图显示采集到的数据。分别如图2、图3所示。由于实时显示要求不断的刷新屏幕来显示最新的数据,因此很容易造成屏幕的闪烁。可以采用下面的方式来消除此种影响,首先在内存中创建和屏幕兼容的设备描述符表,在其上绘图,然后贴到屏幕上去,就实现无闪显示。部分程序代码如下: memDC.CreateCompatibleDC(&dc) ;//创建一兼容dc的内存描述符表 memBitmap.CreateCompatibleBitmap(&dc, ntempClientWidth, ntempClientHight) ;//创建兼容的内存位图 oldBitmap = (CBitmap *)memDC.SelectObject(&memBitmap) ;//把内存位图选入内存设备描述符表 if (memDC.GetSafeHdc()!= NULL) { //把在把背景图原样贴到内存描述符表中去,m_dcClient为背景设备描述符表 memDC.StretchBlt(0, 0, ntempClientWidth, ntempClientHight, &m_dcClient, 0, 0,m_nClientWidth,m_nClientHeight,SRCCOPY) ; //把在客户区作图通过与背景图或运算的方式贴到内存描述符表中去,m_dcDraw是绘制图形的设备描述符表 memDC.StretchBlt(0, 0, ntempClientWidth, ntempClientHight, &m_dcDraw,0,0, m_nClientWidth,m_nClientHeight,SRCINVERT) ; // 把在内存描述符表中形成的最终图形原样贴到屏幕上,dc为与屏幕对应的设备描述符表 dc.BitBlt(0, 0, ntempClientWidth, ntempClientHight, &memDC, 0, 0, SRCCOPY) ; } memDC.SelectObject(oldBitmap) ; //删除内存描述符表中原有的位图 memBitmap.DeleteObject();//删除内存位图对象
 图2、数字显示方式

图3、棒图显示方式
4、数据回放模块 数据回放是指从磁盘文件中读取实验中采集到的数据,经滤波器输出到回放显示单元。该单元提供了两种显示方式:第一种,通过趋势曲线图显示某一点的变化情况,同时还可以任意切换32个通道,为实验在时间和空间上同时研究提供了可能。第二种,用报表的方式显示所有数据,可以了解到各测点的绝对数字,对实验进行定量的研究。具体是通过下面的函数实现: DrawCurve(PARAINFO *CurrentDataInfo, float *fpBuffer, int nBufferSize) { //取得客户区的设备描述符表 CclientDC ClientDC(this); .//通过ClientDC设备描述符表绘制曲线图 invalidate(); //显示在屏幕上 } 其中的PARAINFO提供了实验中所设定的参数信息。 报表是通过自己开发的一控件DataReportCtrl实现的。具体作法是在控制显示的函数中声明一对象调用调用CDataReportCtrl::DataShowReport(PARAINFO *CurrentDataInfo, float *fpBuffer, int nBufferSize)来完成的。
5、 打印模块 系统还要求以报表的方式和曲线图方式打印采集的数据,为此还设立了,实验结果同时要求能以传统的方式保存,以方便交流和研究,报表的打印和曲线图的打印是必不可少的。由于不同的打印机的分辨率不尽相同,如果采用MFC的所见即所得的方式不能很好的满足打印的要求,因此通过对MFC程序向导生成的打印函数进行修改,很好的完成了打印的功能。 1、 在OnBeginPrinting()中取得打印的机打印页面的大小和分辨率,然后读取磁盘文件的文件头信息,通过对文件头的分析,确定每一页需要打印的数据的个数,一共需要打印多少页等,接着设置pInfo->SetMinPage()和pInfo->SetMaxPage()。由于要处理报表、曲线图两种打印模式,所以程序中用Switch(m_nPrintMode)来分别处理。 2、 在OnPrepareDC()中通过对当前应打印的页码的分析,确定当前页打印的数据。同理用Switch(m_nPrintMode)来分别处理是打印报表还是曲线图。 3、 在OnPrint()中通过成员变量取得由打印预处理函数处理过的数据,利用Switch(m_nPrintMode)分别具体的在打印设备描述符表中绘制图形,从而完成打印任务。
四、 结束语 本系统经过测试,能在实验中良好的运行,缩短了整个实验的周期,为实验人员提供了帮助,减轻了他们的负担,取得了较好的经济效果。同时它对小型的检测系统的开发也同样具有借鉴作用。特别是不宜采用高成本的组态软件的时候,技术人员可以利用上面的开发经验,方便迅速的开发出经济实用的软件系统。
参考文献 [1]Jeff Prosise. MFC Window 程序设计 北京:清华大学出版社 [2]侯俊杰 深入浅出MFC 第二版.武汉:华东科技大学出版社 [3]姚志峰 基于Windows95的高速数据采集. 测控技术 1999年4期
|