论文部分内容阅读
摘 要:介绍了高压密相气力输送实验系统的结构,由于实验系统硬件的改造,必须修改软件系统——数据采集系统,才能满足实验需求。鉴于原有的“高压密相气力输送监控系统”配置和使用不是很方便,总结其优点和不足,使用Visual C++ 6.0 和 Visual Basic 6.0 混合编程的方法,按照软件工程的思想,重新编写了数据采集系统——“高压密相气力输送数据采集程序”。详细给出了程序的体系结构和设计流程。通过实际应用,该系统性能稳定,操作简单,其参数监视、存储和控制功能完全达到密相气力输送实验的设计要求,有力地支撑了高压密相气力输送实验的顺利进行。
关键词:密相 气力输送 混合编程 数据采集系统
一、引言
气力输送是利用气体的能量来进行粉粒状散装物料连续输送的输运技术。高压密相气力输送是大规模高效干煤粉加压气化的关键技术之一。用于输送的气体可以是N2、CO2或合成气,这些输送气体有各自的优点和缺陷,适用于不同的应用场合。东南大学自主研发了一套输送压力可达4 MPa、输送固气比可达600 kg·m-3的高压密相气力输送实验装置,主要用于密相气力输送的实验研究。原来的高压密相气力输送实验台是以N2作输送气,现已进行改造,以CO2作输送气,输送参数测点布置发生变化,新增几个温度测点,重新制作电路调理信号采集机箱,实验台的硬件系统已经做了大的改动,因此,很有必要重新编写软件系统——数据采集系统。
二、密相气力输送实验系统简介
以CO2为输送介质的高压密相气力输送实验系统如图1所示。整个系统主要包括供气装置、风量(充压风、流化风、补充风)调节装置、储料罐(1#,2#)、电子秤、压力表、输送管路、差压计、电路调理信号采集机箱、A /D转换器以及计算机数据采集系统等。气瓶中的CO2经过适当加热,顺利流出汇集于汇流排,之后经过减压器减压,进入一段管道经电加热带加热后进入缓冲罐,然后,作为输送介质的高压CO2自缓冲罐,分成充压风、流化风,经流量计和调节阀进入发送罐,驱动煤粉从发送罐经输送管路进入接收罐。两个储料罐间连接有一路可切换的输送管道,调节切换阀门可使两个储料罐互为供煤发送罐和接收罐。固体质量流率由储料罐1#上的3个高精度箔式电子秤共同称量,压力、压差采用精密压力、压差传感器测量,流化风、充压风和补充风采用AM-1521Q型金属管转子流量计计量,温度采用Pt100热电阻温度计测量。这些传感器信号通过电路调理信号采集机箱,经A /D转换输入计算机数据采集系统进行记录和处理。
图1 以CO2为输送介质的高压密相气力输送实验系统
三、密相气力输送数据采集系统
高压密相气力输送数据采集系统由数据采集、参数显示、PID控制和文件格式转化四个模块组成,在实验过程中,通过系统界面可以即时了解各参数情况并据此调节各参数。PID控制则根据设定值自动调节总风量阀门的开度,以维持1# 或2# 高压储料罐的压力稳定,避免出现意外。
1.程序的体系结构。数据采集系统基础。数据采集(DAQ),是指从传感器和其它待测设备等模拟和数字被测单元中自动采集或产生信息的过程。数据采集系统是结合基于计算机的测量软硬件产品来实现灵活的、用户自定义的测量系统。通常,必须在数据采集设备采集之前调制传感器信号,包括對其进行增益或衰减和隔离等。被采集数据是已被转换为电信号的各种物理量,如温度、压力、流量等,可以是模拟量,也可以是数字量。数据采集系统框图。通常,从被采集信号的检测到送入计算机,并由计算机进行实时显示或分析处理,需要经过以下几步:
1.1传感器:将被测信号转换为与之有对应关系的电压或电流信号,如热电阻温度计将温度量转换电压信号,光栅将位移量转换为电脉冲等。
1.2采集机箱(信号调理电路):数据采集卡只能接受一定范围的信号,传感器输出的信号一般比较小,需要经信号调理电路放大才能进入数据采集卡。反之,信号太大时,必须经过衰减才能进入数据采集卡。
1.3数据采集卡:信号进入计算机的通道,可以对信号进行调整放大,光电耦合,模数转换等,然后送入计算机,不同的采集卡具有不同通道数目、采样速度、分辨率、输入范围等。
1.4监控计算机:对数据采集卡输入的数据进行处理,然后显示、打印等,并向数据采集卡输出控制信号。当然这些功能的需要通过编写数据采集程序才能完成。
2.数据采集的步骤。(1) 将数据采集卡插入监控计算机的主板扩展槽中。将卡插入扩展槽后,安装驱动程序可以使计算机操作系统识别采集卡,用户程序可以使用相应的地址、中断号等。本文用到的数据采集卡是由东南大学开发的AD64-2000数据采集卡,附带驱动程序。(2) 将传感器与数据采集机箱连接好,并将采集机箱连接到监控计算机。(3) 启动数据采集程序,控制数据采集卡来实现数据输入、输出,从而监控被控系统。
3.Visual Basic和Visual C++ 混合编程。Visual Basic 是一种可视化的、面向对象和采用事件驱动方式的结构化高级程序设计语言,可用于开发 Windows 环境下的各类应用程序。它简单易学、效率高,且功能强大可以与 Windows 专业开发工具SDK相媲美。Visual C++是一个功能强大的可视化软件开发工具。Visual C++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment, IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和其他资源。Windows提供的DLL文件中包含了允许基于Windows的程序在Windows环境下操作的许多函数和资源。它们向运行于Windows操作系统下的程序提供代码、数据或函数。程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。采用VB与VC的混合编程,可以用VC编写底层的各种操作,例如内存的操作、IO端口的操作等,再用VB快速开发出漂亮的界面以及外围处理程序。一般来说,VB和VC共同编程有3种方式:一种是VC生成DLL,在VB中调用DLL;一种是VC生成ActiveX控件(.ocx),在VB中插入;还有一种是在VC中生成ActiveX Automation服务器,在VB中调用。第一种方法对VC编程的要求最低,而且应用DLL也有很多好处。因此,笔者采用第一种方法。DLL文件定义的函数分为内部函数和导出函数,其中导出函数供其它程序模块调用,这里需要供VB调用。通常可以有下面几种方法导出函数: 3.1传统的方法。即编写模块定义文件(.DEF),并在,其中的 EXPORT 部分指定要输入的函数或者变量。
3.2以命令行方式,对链接程序 LINK 指定 /EXPORT 命令行参数,输出有关函数。
3.3使用 VC 中定义的关键字 _declspec (dllexport)。这几种方法中,最好采用第三种,方便好用;其次是第一种,如果按顺序号输出,调用效率会高些;最次是第二种。但是,笔者实际使用时发现第三种方法导出的函数在VB中无法调用,因此采用第一种方法。
4.数据采集程序设计。设计原则。参照而不抄袭“高压密相气力输送监控系统”的界面、功能,本着界面简洁、美观大方,功能模块化、可扩展性和操作友好、方便实用的原则设计。设计及开发顺序。首先,用VC++ 6.0完成与硬件(数据采集卡AD64-2000)密切关联的动态链接库(DLL)的设计,完成接口定义并构思其与VB 6.0 程序的连接,用一个简单的VB 6.0程序来调用DLL 中所提供的函数进而完成对数据采集卡的控制,测试DLL的性能;接着,设计完成图形界面的核心功能(监控信息主界面,配置文件管理界面等)并构思其他信息的显示方式;然后,完成数据库的设计。最后,进行三者的拼接。实际编写程序的过程,上述三者是交替进行的,DLL接口定义会影响图形界面的核心功能及其信息显示,图形界面的显示及其配置文件管理等又会影响数据库的结构,因此三者需要相互参照、调整和改进,经过不断的调试磨合才能实现无缝拼接,保证采集程序的连贯性和系统性。设计过程。“高压密相气力输送数据采集程序” 涉及的功能有:读取数据采集卡模拟量和开关量数据、各种配置文件、保存数据、参数图表实时显示、PID控制、DBF文件到XLS文件格式转化等。程序总框架图如下:
图2程序总框架示意图
读取数据采集卡模拟量和开关量数据。读取数据采集卡模拟量和开关量数据需要直接操作硬件(数据采集卡),因此,采用VC++ 6.0 编写动态链接库(ReadAD.dll),通过硬件驱动取得A/D转换后的数字量信号。在构思ReadAD.dll的对外接口时,首先考虑要初始化数据采集卡,设置模拟量通道和开关量通道总数,取得所有通道的数据,然后可以方便地根据通道号参数取得相应的某一通道的数据。程序流程如图3所示:
图3 ReadAD.dll 取得通道数据流程图
将读取的数据转化为相应的工程示值。数据采集的第一步:读取数据采集卡,已经完成。接下来需要将这些数据(以下简称AD码)转化为相应的工程示值。(1) 通道参数配置表。通道参数配置表是程序的核心配置文件,影响到程序的灵活性和可扩展性,涉及到程序核心数据结构的设计。该表的结构如下:
图4 通道参数配置
第一列:序号,显示采集系统有物理量信号的通道个数,此列不可编辑,只是在此方便统计有多少个通道。注意:打勾选中的通道为高速通道。第二列:通道号,数据采集箱通道插孔编号,与数据采集卡数据通道编号一致。此列数据是ReadAD.dll读取数据的通道标识,决定取得的是哪一个通道的AD码。第三列:显示名称,程序主界面每个数据前面说明文字的一部分,也是低速采集DBF数据文件的字段名,可以使用汉字但某些汉字不能做DBF数据文件的字段名,可能導致写DBF数据文件失败,因此,建议使用字母和数字组合,遵循一般程序设计中变量命名规则。第四列:意义,说明通道号对应的物理量信号的含义,也是程序主界面每个数据前面说明文字的鼠标弹出说明(ToolTipText)。特别注意:这里的文字中带有三种标识符:①“#”,表示气体体积流量,这些通道数据需要用来求气体质量流量,以便实时显示用了多少气体;②“*”,表示储料罐压力,这些通道数据用于电动调节阀自动控制调节收料罐压力,并决定以哪个参数做被控对象;③“+”,表示储料罐荷重信号,这些通道数据需要加和以求出总重。这三种标识符在某一 “意义”文字中出现的位置和个数不限,但不可以多种同时存在, 如“充压风#流量#**++”,程序会以三种方法处理这一数据,导致混乱,影响采集数据的正确性,甚至可能导致程序出错。第五列:单位,物理量信号的单位,程序主界面每个数据前面说明文字的一部分。第六列:传感器输出信号范围,进入数据采集箱通道的传感器输出电信号的范围,这里的单位并不重要(只是为了显示),程序代码读取配置时是以“-”为分隔符取得“-”号两端的数据(传感器输出电信号上限和下限值),忽略后面的单位。第七列:量程,传感器的测量范围,程序中的处理方法同第六列。第八列:分段线性化,传感器是否输出线性信号,若是,则此列数据文字中以“*”标识即可;若不是,则此列数据为分段线性化表INI文件名,且这些文件必须放在程序当前目录下的“配置文件”文件夹中。分段线性化表INI文件的内容来源于传感器校验单,程序提供了图形界面——“分段线性化表”窗体,可以修改此文件。第九列:备注,说明文字,用于说明相应通道的传感器,也可以是其他任何文字,这里可以随便输入,但是长度不能超过32个汉字或64个字母(数字),超过的部分将被截去。第十列:工程零点修正,在采集到的数据转换为工程示值后,将工程示值减去此列的值,以便修正传感器零点问题。注意:传感器零点偏高,此列值为正;反之,为负。
5.AD码转化为相应的工程示值。AD码是数据采集卡经A/D转换把传感器输出的模拟量信号转换为数字量信号后由ReadAD.dll读取到的原始数字量值,它并不能反映传感器所测量的物理量的大小,需要转化为相应的工程示值,才能直观地反映所测量物理量的大小。如何开发一个通用算法将AD码转化为相应的工程示值呢?首先,需要弄清楚传感器输出信号、AD码、工程示值三者的具体情况以及它们之间的联系。
三者具体情况:
(1) 传感器输出信号是传感器输出的电流或电压信号,一般为标准信号: 0~20mA,4~20mA,0~5V,1~5V。 (2) AD码是A/D转换器将传感器输出的电流或电压信号转换成的数字量,是一个整数,不同的A/D转换器其数值范围也不同,对于一个12位的A/D转换器,其范围为:0~4095(212-1=4095)。
(3) 工程示值是反映某个工程物理量大小的值,对于不同的物理量不同的传感器,量程也不同,量程下限一般为零,量程上限是传感器能测量的最大值。
它们之间的联系:
1) 传感器输出信号(电流或电压值)与AD码之间是线性对应关系,假设传感器输出信号范围:A~B V,则由线性关系计算可得到相应的AD码范围是:MAX_ADCODE×A/B ~ MAX_ADCODE(MAX_ADCODE表示AD码最大值)。
2) 传感器输出信号与工程示值之间不一定是线性对应关系,比如:浮子流量计输出电流与气体流量不是线性的,厂家标定流量计时给出了一个表格,列出了几个典型刻度下输出电流对应的气体流量值,表中未列出的可以线性插值得到。
(3) AD码与工程示值之间也不一定是线性对应关系,这个由上述两点可以推断出。
接着,可以将转换分两种情况进行——线性关系转换和非线性关系转换。
(1) 求出与传感器输出信号最小值对应的AD码下限:min_AD = MAX_ADCODE * Sensor.Min / Sensor.Max,其中Sensor.Min、Sensor.Max为传感器输出信号最小值和最大值。
(2) 求出采集到的AD码所占的份额:系数A = (采集到的AD码 - AD码下限)/ (AD码上限 - AD码下限)。
(3) 求出工程示值。对于线性关系信号,可以直接得到工程示值,公式:工程示值 = 量程下限 + 系数A × (量程上限 - 量程下限)。对于非线性关系信号要麻烦一些,要用到分段线性化方法。它的基本原理是把输入信号分成若干段,在每一段上都可以认为是输入和输出之间存在着线性的关系,对于这些量而言,在整个量程范围内是非线性的,但是就输入的某一个局部范围之内,其输出和输入可以近似的认为是线性关系。理论证明,只要段的间距足够的小,分段的数量足够的多,对于任何连续函数,在误差允许的范围内,都可以用分段线性化来处理。但是在实际的应用中,分段的数量不宜太多,往往根据测量精度的实际要求,权衡使用分段的数量。
公式:假设在输入x分成n段:X1,X2,X3,…….,Xn,输出y分别对应于:Y1,Y2,Y3,……,Yn,则输出的计算公式如表1所示[8]:
表1 分段线性化方法输出的计算公式
根据上述分段线性化原理和厂家标定流量计时给出的表格(下称分段线性化表),因为给出的是输出电流对应的气体流量值,所以,第一步要根据传感器输出信号与AD码之间的线性关系,由采集到的AD码计算得到传感器输出信号(求上表中的输入);第二步再根据这个计算得到的传感器输出信号和分段线性化原理得到工程示值(求上表中的输出)。
对于本程序而言,分段线性化表对传感器输出信号的分段并不完整,比如传感器最小输出信号为4mA,表格中只给出了5.615mA对应的流量。因此,具体应用上述分段线性化原理需要对分段线性化表进行延伸:判断传感器最小输出信号与分段线性化表中最小电流之间的关系以及传感器最大输出信号与分段线性化表中最大电流之间的关系,即向两端的延伸。设theAV 为采集到的传感器输出信号(电流或电压值),YY为相应的工程示值。X1 ~ Xn 为分段线性化表中传感器输出信号数据,X0,Xm 为传感器输出最小值和最大值。Y1 ~ Yn 為分段线性化表中工程示值数据,Y0,Ym 为工程示值最小值和最大值。
(1)求采集到的传感器输出信号。传感器输出信号=传感器最小输出信号+采集到的AD码所占的份额×(传感器最大输出信号-传感器最小输出信号),即theAV = Sensor.Min +系数A * (Sensor.Max - Sensor.Min)。
(2)应用分段线性化原理求相应的工程示值。根据表1所示原理,判断 theAV 数值的范围,分几种情况得到工程示值,同时也可以得到采集到的工程示值占整个工程量程的份额。这段程序的逻辑框图如下图5所示:
(a)总图
图5求非线性关系信号工程示值逻辑框图
(3) 显示工程示值。
界面参数的显示是数据采集程序的一个重要部分,如何使参数显示简单明了、条理清晰并具有很好的灵活性,需要考虑多方面的问题:比如,参数的显示顺序、参数显示在界面的位置,等。程序主界面示意图如图6所示:
图 6 高压密相气力输送数据采集程序主界面示意图
上图界面中,初始时右边留有一些空隙,用来显示工程示值参数。启动采集系统后,右边的空隙由类似列表格式的参数填充。显示参数是根据通道参数配置表所列的数据动态生成的,如:显示的参数个数由所使用的通道数确定、显示的说明文字由通道参数配置表第三列数据确定,但需要注意的是最后两个参数(Wz和ΔWz)是程序中内定的,若要修改必须修改程序源代码!
6.显示实时曲线。为了实时监测一些数据参数并直观地表示其在一段时间内的变化趋势,绘制实时曲线是一个不错的方法。因此,笔者特意开发了一个“实时曲线控件”。由于参数较多(大约31个),各个参数数值的范围不一,类型也各不相同,同时,界面区域本身的大小也有限,所以,考虑在界面上一次最多同时显示三个参数的实时曲线,即在窗体中只使用三个“实时曲线控件”,再用动态循环的方式让所有参数曲线可以轮流显示,第一次单击一个参数的说明文字(如Qcy(m^3/h))则用第一个“实时曲线控件”绘制这个参数的数据曲线(曲线垂直方向坐标值的范围由具体参数的工程量程决定),第二次单击一个参数的说明文字则使用第二个“实时曲线控件”,第三次单击则用第三个“实时曲线控件”,第四次单击则清除第一个“实时曲线控件”的内容,重新将其初始化并用新的数据绘制新的曲线,如此循环,无论多少个参数都可以一一绘制出实时曲线。上述的实时曲线显示方法,充分考虑了程序的灵活性,在程序界面直观性、功能强大性和代码编写实现的容易性之间找到了一个相对的平衡点,这可以说是编写程序的一个重要原则。同时,为了使实时曲线显示更加灵活,每一个“实时曲线控件”都做成了一个类似“窗体”的结构,有标题栏,可以在主界面内随意移动,也可以独立关闭,如图7所示。 图 7 显示实时曲线的程序主界面
7.保存数据文件。数据采集系统的一个最主要的目的就是取得数据文件,因此,将采集到的数据保存为文件是数据采集程序的一个不可或缺的功能。保存数据文件,可以直接通过写文件的方式实现,也可以通过数据库实现。直接写文件可能速度跟不上,而且可能容易出现未知错误;使用数据库,可以让程序执行效率更高、结构更合理。目前,绝大多数的数据库参考书都介绍了ODBC的手工配置方法,或者介绍了如何在代码中进行ODBC配置。但这两种方法都有一定的局限性:不是当程序最终完成并分发到用户手中后,还需要为用户配置ODBC,显得既麻烦又不符合专业软件的要求;就是得编写复杂的更改操作系统注册表文件的程序,十分烦琐。因此,笔者使用无需配置数据源的方法连接数据库,进而使用数据库保存数据文件。无“数据源”连接,意义不是不需要数据源,否则连接无从谈起,而是不需要配置注册数据源所进行的连接。ODBC(Open DataBase Connectivity,开放式数据库连接)是用于连接不同数据源的标准编程语言接口。许多文章中介绍,在实现ODBC时,必须首先配置ODBC环境,进行数据源的注册,然后才能在对数据库编程时,对数据源进行连接、访问和操作,并提供了用PB或VB等语言工具实现数据源注册的具体方法。这些方法不但复杂烦琐,而且由于参数内容不一,配置时令人感觉无所适从,不宜把握。因此,笔者使用ADO组件——Microsoft ActiveX Data Objects (ADO)连接数据库。
在VB程序中使用ADO组件,首先在工程中添加引用,在可用的引用列表中选中 Microsoft ActiveX Data Objects 2.5 Library。然后再编写相关代码。在实际编程过程中使用ADO的一个典型的存取数据的步骤为: (1)连接数据源;(2)打开记录集对象;(3)使用记录集;4)断开连接[10]。在用VC++6.0 编写的动态链接库ReadAD.dll中也使用了ADO组件来写DBF数据文件,方法是类似的,只是某些具体细节有点变化。
8.DBF格式转XLS。在保存数据文件时,数据源使用的是“Microsoft Visual FoxPro Driver”,因此,写出的DBF文件用Microsoft Visual FoxPro 6.0或其他DBF数据文件浏览器可以打开,但是,用Excel打开时是乱码,无法正常查看。有时候用Excel处理文件比用FoxPro处理要方便一些,这时候就需要将DBF数据文件转化为Excel可以编辑处理的文件——.xls 格式的文件。因此,笔者另外编写了一个小程序实现.dbf格式到.xls格式的转化。
三、结语
参考原有程序,使用Visual C++ 6.0 和 Visual Basic 6.0 混合编程的方法,按照软件工程的思想,编写了“高压密相气力输送数据采集程序”。程序设计条理清晰,界面友好,配置和使用方便;采用通用算法,适用性好;功能较完善,且源代码合理细化各部分功能,模块独立性强。实验进行过程中,发现“高压密相气力输送数据采集程序”也有不足之處,如由于硬件所限,无法对实验的参数实现高频采样;实验环境恶劣时,监控系统会受干扰等。尽管如此, 监控系统参数监视、存储和控制功能完全达到密相气力输送实验的设计要求,并有力地支撑了高压密相气力输送实验的顺利进行。
关键词:密相 气力输送 混合编程 数据采集系统
一、引言
气力输送是利用气体的能量来进行粉粒状散装物料连续输送的输运技术。高压密相气力输送是大规模高效干煤粉加压气化的关键技术之一。用于输送的气体可以是N2、CO2或合成气,这些输送气体有各自的优点和缺陷,适用于不同的应用场合。东南大学自主研发了一套输送压力可达4 MPa、输送固气比可达600 kg·m-3的高压密相气力输送实验装置,主要用于密相气力输送的实验研究。原来的高压密相气力输送实验台是以N2作输送气,现已进行改造,以CO2作输送气,输送参数测点布置发生变化,新增几个温度测点,重新制作电路调理信号采集机箱,实验台的硬件系统已经做了大的改动,因此,很有必要重新编写软件系统——数据采集系统。
二、密相气力输送实验系统简介
以CO2为输送介质的高压密相气力输送实验系统如图1所示。整个系统主要包括供气装置、风量(充压风、流化风、补充风)调节装置、储料罐(1#,2#)、电子秤、压力表、输送管路、差压计、电路调理信号采集机箱、A /D转换器以及计算机数据采集系统等。气瓶中的CO2经过适当加热,顺利流出汇集于汇流排,之后经过减压器减压,进入一段管道经电加热带加热后进入缓冲罐,然后,作为输送介质的高压CO2自缓冲罐,分成充压风、流化风,经流量计和调节阀进入发送罐,驱动煤粉从发送罐经输送管路进入接收罐。两个储料罐间连接有一路可切换的输送管道,调节切换阀门可使两个储料罐互为供煤发送罐和接收罐。固体质量流率由储料罐1#上的3个高精度箔式电子秤共同称量,压力、压差采用精密压力、压差传感器测量,流化风、充压风和补充风采用AM-1521Q型金属管转子流量计计量,温度采用Pt100热电阻温度计测量。这些传感器信号通过电路调理信号采集机箱,经A /D转换输入计算机数据采集系统进行记录和处理。
图1 以CO2为输送介质的高压密相气力输送实验系统
三、密相气力输送数据采集系统
高压密相气力输送数据采集系统由数据采集、参数显示、PID控制和文件格式转化四个模块组成,在实验过程中,通过系统界面可以即时了解各参数情况并据此调节各参数。PID控制则根据设定值自动调节总风量阀门的开度,以维持1# 或2# 高压储料罐的压力稳定,避免出现意外。
1.程序的体系结构。数据采集系统基础。数据采集(DAQ),是指从传感器和其它待测设备等模拟和数字被测单元中自动采集或产生信息的过程。数据采集系统是结合基于计算机的测量软硬件产品来实现灵活的、用户自定义的测量系统。通常,必须在数据采集设备采集之前调制传感器信号,包括對其进行增益或衰减和隔离等。被采集数据是已被转换为电信号的各种物理量,如温度、压力、流量等,可以是模拟量,也可以是数字量。数据采集系统框图。通常,从被采集信号的检测到送入计算机,并由计算机进行实时显示或分析处理,需要经过以下几步:
1.1传感器:将被测信号转换为与之有对应关系的电压或电流信号,如热电阻温度计将温度量转换电压信号,光栅将位移量转换为电脉冲等。
1.2采集机箱(信号调理电路):数据采集卡只能接受一定范围的信号,传感器输出的信号一般比较小,需要经信号调理电路放大才能进入数据采集卡。反之,信号太大时,必须经过衰减才能进入数据采集卡。
1.3数据采集卡:信号进入计算机的通道,可以对信号进行调整放大,光电耦合,模数转换等,然后送入计算机,不同的采集卡具有不同通道数目、采样速度、分辨率、输入范围等。
1.4监控计算机:对数据采集卡输入的数据进行处理,然后显示、打印等,并向数据采集卡输出控制信号。当然这些功能的需要通过编写数据采集程序才能完成。
2.数据采集的步骤。(1) 将数据采集卡插入监控计算机的主板扩展槽中。将卡插入扩展槽后,安装驱动程序可以使计算机操作系统识别采集卡,用户程序可以使用相应的地址、中断号等。本文用到的数据采集卡是由东南大学开发的AD64-2000数据采集卡,附带驱动程序。(2) 将传感器与数据采集机箱连接好,并将采集机箱连接到监控计算机。(3) 启动数据采集程序,控制数据采集卡来实现数据输入、输出,从而监控被控系统。
3.Visual Basic和Visual C++ 混合编程。Visual Basic 是一种可视化的、面向对象和采用事件驱动方式的结构化高级程序设计语言,可用于开发 Windows 环境下的各类应用程序。它简单易学、效率高,且功能强大可以与 Windows 专业开发工具SDK相媲美。Visual C++是一个功能强大的可视化软件开发工具。Visual C++6.0不仅是一个C++编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment, IDE)。Visual C++6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。动态链接库文件,是一种可执行文件,它允许程序共享执行特殊任务所必需的代码和其他资源。Windows提供的DLL文件中包含了允许基于Windows的程序在Windows环境下操作的许多函数和资源。它们向运行于Windows操作系统下的程序提供代码、数据或函数。程序可根据DLL文件中的指令打开、启用、查询、禁用和关闭驱动程序。采用VB与VC的混合编程,可以用VC编写底层的各种操作,例如内存的操作、IO端口的操作等,再用VB快速开发出漂亮的界面以及外围处理程序。一般来说,VB和VC共同编程有3种方式:一种是VC生成DLL,在VB中调用DLL;一种是VC生成ActiveX控件(.ocx),在VB中插入;还有一种是在VC中生成ActiveX Automation服务器,在VB中调用。第一种方法对VC编程的要求最低,而且应用DLL也有很多好处。因此,笔者采用第一种方法。DLL文件定义的函数分为内部函数和导出函数,其中导出函数供其它程序模块调用,这里需要供VB调用。通常可以有下面几种方法导出函数: 3.1传统的方法。即编写模块定义文件(.DEF),并在,其中的 EXPORT 部分指定要输入的函数或者变量。
3.2以命令行方式,对链接程序 LINK 指定 /EXPORT 命令行参数,输出有关函数。
3.3使用 VC 中定义的关键字 _declspec (dllexport)。这几种方法中,最好采用第三种,方便好用;其次是第一种,如果按顺序号输出,调用效率会高些;最次是第二种。但是,笔者实际使用时发现第三种方法导出的函数在VB中无法调用,因此采用第一种方法。
4.数据采集程序设计。设计原则。参照而不抄袭“高压密相气力输送监控系统”的界面、功能,本着界面简洁、美观大方,功能模块化、可扩展性和操作友好、方便实用的原则设计。设计及开发顺序。首先,用VC++ 6.0完成与硬件(数据采集卡AD64-2000)密切关联的动态链接库(DLL)的设计,完成接口定义并构思其与VB 6.0 程序的连接,用一个简单的VB 6.0程序来调用DLL 中所提供的函数进而完成对数据采集卡的控制,测试DLL的性能;接着,设计完成图形界面的核心功能(监控信息主界面,配置文件管理界面等)并构思其他信息的显示方式;然后,完成数据库的设计。最后,进行三者的拼接。实际编写程序的过程,上述三者是交替进行的,DLL接口定义会影响图形界面的核心功能及其信息显示,图形界面的显示及其配置文件管理等又会影响数据库的结构,因此三者需要相互参照、调整和改进,经过不断的调试磨合才能实现无缝拼接,保证采集程序的连贯性和系统性。设计过程。“高压密相气力输送数据采集程序” 涉及的功能有:读取数据采集卡模拟量和开关量数据、各种配置文件、保存数据、参数图表实时显示、PID控制、DBF文件到XLS文件格式转化等。程序总框架图如下:
图2程序总框架示意图
读取数据采集卡模拟量和开关量数据。读取数据采集卡模拟量和开关量数据需要直接操作硬件(数据采集卡),因此,采用VC++ 6.0 编写动态链接库(ReadAD.dll),通过硬件驱动取得A/D转换后的数字量信号。在构思ReadAD.dll的对外接口时,首先考虑要初始化数据采集卡,设置模拟量通道和开关量通道总数,取得所有通道的数据,然后可以方便地根据通道号参数取得相应的某一通道的数据。程序流程如图3所示:
图3 ReadAD.dll 取得通道数据流程图
将读取的数据转化为相应的工程示值。数据采集的第一步:读取数据采集卡,已经完成。接下来需要将这些数据(以下简称AD码)转化为相应的工程示值。(1) 通道参数配置表。通道参数配置表是程序的核心配置文件,影响到程序的灵活性和可扩展性,涉及到程序核心数据结构的设计。该表的结构如下:
图4 通道参数配置
第一列:序号,显示采集系统有物理量信号的通道个数,此列不可编辑,只是在此方便统计有多少个通道。注意:打勾选中的通道为高速通道。第二列:通道号,数据采集箱通道插孔编号,与数据采集卡数据通道编号一致。此列数据是ReadAD.dll读取数据的通道标识,决定取得的是哪一个通道的AD码。第三列:显示名称,程序主界面每个数据前面说明文字的一部分,也是低速采集DBF数据文件的字段名,可以使用汉字但某些汉字不能做DBF数据文件的字段名,可能導致写DBF数据文件失败,因此,建议使用字母和数字组合,遵循一般程序设计中变量命名规则。第四列:意义,说明通道号对应的物理量信号的含义,也是程序主界面每个数据前面说明文字的鼠标弹出说明(ToolTipText)。特别注意:这里的文字中带有三种标识符:①“#”,表示气体体积流量,这些通道数据需要用来求气体质量流量,以便实时显示用了多少气体;②“*”,表示储料罐压力,这些通道数据用于电动调节阀自动控制调节收料罐压力,并决定以哪个参数做被控对象;③“+”,表示储料罐荷重信号,这些通道数据需要加和以求出总重。这三种标识符在某一 “意义”文字中出现的位置和个数不限,但不可以多种同时存在, 如“充压风#流量#**++”,程序会以三种方法处理这一数据,导致混乱,影响采集数据的正确性,甚至可能导致程序出错。第五列:单位,物理量信号的单位,程序主界面每个数据前面说明文字的一部分。第六列:传感器输出信号范围,进入数据采集箱通道的传感器输出电信号的范围,这里的单位并不重要(只是为了显示),程序代码读取配置时是以“-”为分隔符取得“-”号两端的数据(传感器输出电信号上限和下限值),忽略后面的单位。第七列:量程,传感器的测量范围,程序中的处理方法同第六列。第八列:分段线性化,传感器是否输出线性信号,若是,则此列数据文字中以“*”标识即可;若不是,则此列数据为分段线性化表INI文件名,且这些文件必须放在程序当前目录下的“配置文件”文件夹中。分段线性化表INI文件的内容来源于传感器校验单,程序提供了图形界面——“分段线性化表”窗体,可以修改此文件。第九列:备注,说明文字,用于说明相应通道的传感器,也可以是其他任何文字,这里可以随便输入,但是长度不能超过32个汉字或64个字母(数字),超过的部分将被截去。第十列:工程零点修正,在采集到的数据转换为工程示值后,将工程示值减去此列的值,以便修正传感器零点问题。注意:传感器零点偏高,此列值为正;反之,为负。
5.AD码转化为相应的工程示值。AD码是数据采集卡经A/D转换把传感器输出的模拟量信号转换为数字量信号后由ReadAD.dll读取到的原始数字量值,它并不能反映传感器所测量的物理量的大小,需要转化为相应的工程示值,才能直观地反映所测量物理量的大小。如何开发一个通用算法将AD码转化为相应的工程示值呢?首先,需要弄清楚传感器输出信号、AD码、工程示值三者的具体情况以及它们之间的联系。
三者具体情况:
(1) 传感器输出信号是传感器输出的电流或电压信号,一般为标准信号: 0~20mA,4~20mA,0~5V,1~5V。 (2) AD码是A/D转换器将传感器输出的电流或电压信号转换成的数字量,是一个整数,不同的A/D转换器其数值范围也不同,对于一个12位的A/D转换器,其范围为:0~4095(212-1=4095)。
(3) 工程示值是反映某个工程物理量大小的值,对于不同的物理量不同的传感器,量程也不同,量程下限一般为零,量程上限是传感器能测量的最大值。
它们之间的联系:
1) 传感器输出信号(电流或电压值)与AD码之间是线性对应关系,假设传感器输出信号范围:A~B V,则由线性关系计算可得到相应的AD码范围是:MAX_ADCODE×A/B ~ MAX_ADCODE(MAX_ADCODE表示AD码最大值)。
2) 传感器输出信号与工程示值之间不一定是线性对应关系,比如:浮子流量计输出电流与气体流量不是线性的,厂家标定流量计时给出了一个表格,列出了几个典型刻度下输出电流对应的气体流量值,表中未列出的可以线性插值得到。
(3) AD码与工程示值之间也不一定是线性对应关系,这个由上述两点可以推断出。
接着,可以将转换分两种情况进行——线性关系转换和非线性关系转换。
(1) 求出与传感器输出信号最小值对应的AD码下限:min_AD = MAX_ADCODE * Sensor.Min / Sensor.Max,其中Sensor.Min、Sensor.Max为传感器输出信号最小值和最大值。
(2) 求出采集到的AD码所占的份额:系数A = (采集到的AD码 - AD码下限)/ (AD码上限 - AD码下限)。
(3) 求出工程示值。对于线性关系信号,可以直接得到工程示值,公式:工程示值 = 量程下限 + 系数A × (量程上限 - 量程下限)。对于非线性关系信号要麻烦一些,要用到分段线性化方法。它的基本原理是把输入信号分成若干段,在每一段上都可以认为是输入和输出之间存在着线性的关系,对于这些量而言,在整个量程范围内是非线性的,但是就输入的某一个局部范围之内,其输出和输入可以近似的认为是线性关系。理论证明,只要段的间距足够的小,分段的数量足够的多,对于任何连续函数,在误差允许的范围内,都可以用分段线性化来处理。但是在实际的应用中,分段的数量不宜太多,往往根据测量精度的实际要求,权衡使用分段的数量。
公式:假设在输入x分成n段:X1,X2,X3,…….,Xn,输出y分别对应于:Y1,Y2,Y3,……,Yn,则输出的计算公式如表1所示[8]:
表1 分段线性化方法输出的计算公式
根据上述分段线性化原理和厂家标定流量计时给出的表格(下称分段线性化表),因为给出的是输出电流对应的气体流量值,所以,第一步要根据传感器输出信号与AD码之间的线性关系,由采集到的AD码计算得到传感器输出信号(求上表中的输入);第二步再根据这个计算得到的传感器输出信号和分段线性化原理得到工程示值(求上表中的输出)。
对于本程序而言,分段线性化表对传感器输出信号的分段并不完整,比如传感器最小输出信号为4mA,表格中只给出了5.615mA对应的流量。因此,具体应用上述分段线性化原理需要对分段线性化表进行延伸:判断传感器最小输出信号与分段线性化表中最小电流之间的关系以及传感器最大输出信号与分段线性化表中最大电流之间的关系,即向两端的延伸。设theAV 为采集到的传感器输出信号(电流或电压值),YY为相应的工程示值。X1 ~ Xn 为分段线性化表中传感器输出信号数据,X0,Xm 为传感器输出最小值和最大值。Y1 ~ Yn 為分段线性化表中工程示值数据,Y0,Ym 为工程示值最小值和最大值。
(1)求采集到的传感器输出信号。传感器输出信号=传感器最小输出信号+采集到的AD码所占的份额×(传感器最大输出信号-传感器最小输出信号),即theAV = Sensor.Min +系数A * (Sensor.Max - Sensor.Min)。
(2)应用分段线性化原理求相应的工程示值。根据表1所示原理,判断 theAV 数值的范围,分几种情况得到工程示值,同时也可以得到采集到的工程示值占整个工程量程的份额。这段程序的逻辑框图如下图5所示:
(a)总图
图5求非线性关系信号工程示值逻辑框图
(3) 显示工程示值。
界面参数的显示是数据采集程序的一个重要部分,如何使参数显示简单明了、条理清晰并具有很好的灵活性,需要考虑多方面的问题:比如,参数的显示顺序、参数显示在界面的位置,等。程序主界面示意图如图6所示:
图 6 高压密相气力输送数据采集程序主界面示意图
上图界面中,初始时右边留有一些空隙,用来显示工程示值参数。启动采集系统后,右边的空隙由类似列表格式的参数填充。显示参数是根据通道参数配置表所列的数据动态生成的,如:显示的参数个数由所使用的通道数确定、显示的说明文字由通道参数配置表第三列数据确定,但需要注意的是最后两个参数(Wz和ΔWz)是程序中内定的,若要修改必须修改程序源代码!
6.显示实时曲线。为了实时监测一些数据参数并直观地表示其在一段时间内的变化趋势,绘制实时曲线是一个不错的方法。因此,笔者特意开发了一个“实时曲线控件”。由于参数较多(大约31个),各个参数数值的范围不一,类型也各不相同,同时,界面区域本身的大小也有限,所以,考虑在界面上一次最多同时显示三个参数的实时曲线,即在窗体中只使用三个“实时曲线控件”,再用动态循环的方式让所有参数曲线可以轮流显示,第一次单击一个参数的说明文字(如Qcy(m^3/h))则用第一个“实时曲线控件”绘制这个参数的数据曲线(曲线垂直方向坐标值的范围由具体参数的工程量程决定),第二次单击一个参数的说明文字则使用第二个“实时曲线控件”,第三次单击则用第三个“实时曲线控件”,第四次单击则清除第一个“实时曲线控件”的内容,重新将其初始化并用新的数据绘制新的曲线,如此循环,无论多少个参数都可以一一绘制出实时曲线。上述的实时曲线显示方法,充分考虑了程序的灵活性,在程序界面直观性、功能强大性和代码编写实现的容易性之间找到了一个相对的平衡点,这可以说是编写程序的一个重要原则。同时,为了使实时曲线显示更加灵活,每一个“实时曲线控件”都做成了一个类似“窗体”的结构,有标题栏,可以在主界面内随意移动,也可以独立关闭,如图7所示。 图 7 显示实时曲线的程序主界面
7.保存数据文件。数据采集系统的一个最主要的目的就是取得数据文件,因此,将采集到的数据保存为文件是数据采集程序的一个不可或缺的功能。保存数据文件,可以直接通过写文件的方式实现,也可以通过数据库实现。直接写文件可能速度跟不上,而且可能容易出现未知错误;使用数据库,可以让程序执行效率更高、结构更合理。目前,绝大多数的数据库参考书都介绍了ODBC的手工配置方法,或者介绍了如何在代码中进行ODBC配置。但这两种方法都有一定的局限性:不是当程序最终完成并分发到用户手中后,还需要为用户配置ODBC,显得既麻烦又不符合专业软件的要求;就是得编写复杂的更改操作系统注册表文件的程序,十分烦琐。因此,笔者使用无需配置数据源的方法连接数据库,进而使用数据库保存数据文件。无“数据源”连接,意义不是不需要数据源,否则连接无从谈起,而是不需要配置注册数据源所进行的连接。ODBC(Open DataBase Connectivity,开放式数据库连接)是用于连接不同数据源的标准编程语言接口。许多文章中介绍,在实现ODBC时,必须首先配置ODBC环境,进行数据源的注册,然后才能在对数据库编程时,对数据源进行连接、访问和操作,并提供了用PB或VB等语言工具实现数据源注册的具体方法。这些方法不但复杂烦琐,而且由于参数内容不一,配置时令人感觉无所适从,不宜把握。因此,笔者使用ADO组件——Microsoft ActiveX Data Objects (ADO)连接数据库。
在VB程序中使用ADO组件,首先在工程中添加引用,在可用的引用列表中选中 Microsoft ActiveX Data Objects 2.5 Library。然后再编写相关代码。在实际编程过程中使用ADO的一个典型的存取数据的步骤为: (1)连接数据源;(2)打开记录集对象;(3)使用记录集;4)断开连接[10]。在用VC++6.0 编写的动态链接库ReadAD.dll中也使用了ADO组件来写DBF数据文件,方法是类似的,只是某些具体细节有点变化。
8.DBF格式转XLS。在保存数据文件时,数据源使用的是“Microsoft Visual FoxPro Driver”,因此,写出的DBF文件用Microsoft Visual FoxPro 6.0或其他DBF数据文件浏览器可以打开,但是,用Excel打开时是乱码,无法正常查看。有时候用Excel处理文件比用FoxPro处理要方便一些,这时候就需要将DBF数据文件转化为Excel可以编辑处理的文件——.xls 格式的文件。因此,笔者另外编写了一个小程序实现.dbf格式到.xls格式的转化。
三、结语
参考原有程序,使用Visual C++ 6.0 和 Visual Basic 6.0 混合编程的方法,按照软件工程的思想,编写了“高压密相气力输送数据采集程序”。程序设计条理清晰,界面友好,配置和使用方便;采用通用算法,适用性好;功能较完善,且源代码合理细化各部分功能,模块独立性强。实验进行过程中,发现“高压密相气力输送数据采集程序”也有不足之處,如由于硬件所限,无法对实验的参数实现高频采样;实验环境恶劣时,监控系统会受干扰等。尽管如此, 监控系统参数监视、存储和控制功能完全达到密相气力输送实验的设计要求,并有力地支撑了高压密相气力输送实验的顺利进行。