VC++与Matcom联合编程在火焰动态检测中的应用 联系客服

发布时间 : 星期日 文章VC++与Matcom联合编程在火焰动态检测中的应用更新完毕开始阅读58ee8d5458eef8c75fbfc77da26925c52cc59187

Application of the VC + + and the Matcom Joint Programming in Dynamically Detecting of Flame

Huang Yaosong, Liu Shi, Li Jie, Lei Jing

North China Electric Power University, School of Energy , Power and Mechanical Engineering, Beijing, China,102206

hys@ncepu.edu.cn

Abstract: Signal sampling and processing play a vital role in the industrial production and process monitoring. Based on the advantages, such as the high efficiency and speed of the code implementation in the VC++ programming language, and the significant advantages of the Matcom in the data processing and graphics plotting, an efficient application program that achieves the real-time signal sampling and representation of the dynamic features is created. The program is applied to the detection of flame conditions. The experimental results are in excellent agreement with the real situations, which the program is successful in monitoring the stability of the flame.

Keywords: Joint programming; VC++; Matcom; Real-time acquisition; Dynamic display; Flame detection

VC++与Matcom联合编程在火焰动态检测中的应用

黄耀松,刘 石,李 捷,雷 兢

华北电力大学,能源动力与机械工程学院,北京,中国,102206 hys@ncepu.edu.cn

【摘要】数据信号的实时采集和处理,对于工业生产、监控有重要意义。本文基于VC++在程序代码执行上效率高、速度快的优势与Matcom在数据处理和图形绘制上的巨大优势,联合编写了一个能够实时采集数据信号并将特征信号动态地显示在用户面前的应用程序。在此基础上,将程序应用于火焰燃烧状况的检测,完成对火焰燃烧状况的实时、动态监控,检测结果能较好地与实际情况相吻合。 【关键词】联合编程;VC++;Matcom;实时采集;动态显示;火焰检测

1 引言

在我国,据统计,截止到2009年底火力发电机组依然充当电力生产的主力军。但是火力发电存在一些比较突出的问题,就是其负荷变化和燃烧调整频繁,而且火力发电煤种变化较大,容易造成燃烧火焰状况不稳定甚至熄火。因此为避免由于燃烧不稳定而造成的损失,对炉膛内燃烧情况进行实时、动态的检测以评判火焰燃烧状况就显得尤为重要。为此,我们开发了一个应用程序,用以控制火焰检测装置,完成火焰信号采集、处理,并将处理结果以图形形式显示。火焰检测装置由火焰探头、光电转换器、数据采集卡及计算机等组成,火焰检测流程见图1。考虑到电厂运行人员需要对火焰信号进行实时检测,程序要求能实时采集火焰信号并能动态显示图形,以便电厂运行人

[1]

员能够通过图形信息及时了解锅炉火焰燃烧状况,确保安全生产。

为了达到以上要求,在程序设计时选择了C++语言来进行代码编写,并以VC++6.0为前台开发环境,因为VC++具有优秀的图形用户界面,并能与系统底层硬件交换数据,开发的独立可执行程序效率更高。但是VC++数值处理和图形显示上需要的编码工作量很大,不适合信号可视化要求。MATLAB具有强大的数据处理和图形绘制功能,但可惜的是执行效率太低,无法与数据采集卡相匹配。为此我们采用Matcom作为两者的桥梁,使其能发挥各自的优点,实现火焰信号动态采集、信号处理和可视化。

基金项目:国家自然科学基金(50736002);国家高技术研究发展计划项目(863)(2007AA05Z331)

火焰强 度信号 光电转换器 数据采集卡 计算机 时频 分析 火焰燃烧状况分析 Fig1. Flow chart of flame detection

图1 火焰检测流程

2 混合编译环境设置

2.1 Matcom介绍[2]

Matcom是MATHTOOLS公司开发的世界上第一个由MA TLAB 到C+ + 的编译开发软件平台(于http://www.mathtools.com处可以获取),它提供对MATLAB 程序文件(M 文件) 的解释执行和开发环境支持。利用它可将MATLAB 的源代码译成同等功能的C+ + 源代码。既保持了MATLAB 的优良算法,又保持了C+ + 的高执行效率。Matcom的C++矩阵库(Matrix Lib)提供了双精度级的计算精度,其矩阵类型可以为复数、实数、稀疏矩阵及n维矩阵。Matcom C++矩阵库中包含了MATLAB的大部的函数,这些函数涉及线性代数、多项式数学、信号处理和文件I/O等方面。另外,很重要的是Matcom 提供了很多类似MATLAB函数的图形库函数,可以方便绘制各种曲线及图像,特别是对于动态图形的绘制效果很好。

Matcom的安装挺简单,与普通的Windows程序安装过程类似,首先找到Matcom的安装文件,双击后,按照安装程序的提示,逐步完成中间的安装过程。安装Matcom前要求已经安装了VC++6.0,在安装快结束时Matcom安装程序会自动搜索本机上的VC++6.0编译器。

Matcom成功安装后,在“\\lib\\”下,可以找到使用Matcom C++矩阵库的头文件matlib.h和v4501v.lib文件,在Windows操作系统目录的system32目录下,可以找到使用Matcom C++矩阵库的动态链接库文件v4501v.dll。

2.2 编译环境设置

启动VC++6.0新建一个基于单文档的MFC AppWizard工程文件,文件名取为FDAQ。在工程文件的左侧工作区窗口中单击FileView标签,然后在Resource Files处单击右键选择Add Files to Folder…,将v4501v.lib加入到工程文件中。再选择菜单Project——Settings——C/C++,在Category中选Preprocessor项,将matlib.h的目录加到Additional include directories中。然后在需要到Matcom库函数的地方加入matlib.h头文件,就可以调用其提供的强大的库函数了。同时为了能够使用数据采集卡采集火焰

信号,需要给工程文件添加数据采集卡的动态链接库Adsapi32.lib,所用采集卡型号为研华USB-4716,动态链接库Adsapi32.lib集成了很多功能函数,通过调用这些函数可以实现火焰信号的采集,部分使用到的函数见表1。其添加的方法和v4501v.lib的相同,这里不再叙述。

Table 1. Parts of the using functions of DAQ card

表1本文用到的部分数据采集卡函数

函数名 功能

DRV_DeviceOpen 用于打开数据采集卡设备并返回设备句柄 DRV_DeviceClose 用于关闭数据采集卡设备并释放设备分配的资源 DRV_AIConfig 在设备句柄指向的设备上配置指定AI(Analog Input)通道(Channel)的电压输入范围

DRV_AIVoltageIn

在设备句柄指向的设备上,读取指定AI(Analog Input)通道的电压值

3 联合编程实现火焰燃烧状况检测

3.1 功能代码的编写[2-5]

在工程文件FDAQ中添加各功能函数,以实现数据采集及信号处理和可视化,部分函数介绍如下:

首先在FDAQView.cpp中添加数据采集及信号处理及绘图的初始化函数

void CFDAQView::OnInitialUpdate() {

CView::OnInitialUpdate();

// TODO: Add your specialized code here //and/or call the base class if(!isInitMatcom) {

initM(MATCOM_VERSION); isInitMatcom=1; m_h=winaxes(m_hWnd); this->m_hflag=1;

axesposition(10,10,100,100); title((CL(TM(\火焰检测时域图\xlabel((CL(TM(\时间\ylabel((CL(TM(\光强度\

set(m_h,(CL(TM(\ ); set(m_h,(CL(TM(\//采集卡参数配置 DWORD dwErrCde; ULONG lDevNum; long lDriverHandle; USHORT usChan; float fVoltage;

PT_AIVoltageIn ptAIVoltageIn; PT_AIConfig ptAIConfig; lDevNum = 0; // not sure usChan = 0; //打开设备

dwErrCde=DRV_DeviceOpen( lDevNum,&lDriverHandle );

if ( dwErrCde != SUCCESS ) {

ErrorHandler( dwErrCde ); printf(\ return ; }

ptAIConfig.DasChan = usChan; //channel: 0 ptAIConfig.DasGain = 0; // gain code: 0 dwErrCde = DRV_AIConfig(lDriverHandle, &ptAIConfig );

if ( dwErrCde != SUCCESS ) { ErrorStop(

&lDriverHandle,

dwErrCde );

return; }

ptAIVoltageIn.chan = 0; //usChan; //input channel

ptAIVoltageIn.gain = 0;

ptAIVoltageIn.TrigMode = 0; // 0: internal //trigger,1: external trigger

for(int i =0; i<16384; i++) { // 采集数据

ptAIVoltageIn.voltage =&fVoltage; //Voltage retrieved

dwErrCde=DRV_AIVoltageIn( lDriverHandle, &ptAIVoltageIn ); if ( dwErrCde != SUCCESS ) {

ErrorStop( &lDriverHandle, dwErrCde );

return;

}

Data[i] = (double)fVoltage; }

//关闭设备

dwErrCde=DRV_DeviceClose( &lDriverHandle ); if ( dwErrCde!=SUCCESS ) { ErrorStop(&lDriverHandle,

dwErrCde );

return; }

MessageBox(\完成数据采集\M_VECTOR(m_data,Data);

//在应用程序窗口上半部分绘制火焰强度时域图

m_hline=plot((CL(m_data),TM(\m_h1=winaxes(m_hWnd); Mm pos;

pos=(BR(240),240,200,200);

set(m_h1,TM(\Mm color; color=zeros(1,3);

color.r(1)=0;color.r(2)=0;color.r(3)=0; set(m_h,TM(\Mm Y;

Y=m_data-mean(m_data); Mm Y1;

//进行快速傅利叶变换 Y1=fft(Y,4096); Mm Pyy;

for(i=1;i<=257;i++)

{ Pyy(i)=Y1(i)*ctranspose(Y1(i))/4096; m_data1(i)=msqrt(Pyy(i)); } Mm f;

f=colon(0,256)*2000/4096;

//在应用程序窗口下半部分绘制火焰强度频域图 m_hline1=plot((CL(f),m_data1,TM(\title(CL(TM(\火焰检测频域图\xlabel(CL(TM(\ylabel(CL(TM(\幅值谱密度\

} }

其次添加实时采集数据并动态显示火焰信号的时域和频域图的功能函数。在工具栏上为该函数添加新按钮F,ID取为ID_CYC,然后通过ClassWizard来添加消息响应函数OnCyc()。代码如下:

void CFDAQView::OnCyc()

{

// TODO: Add your command handler code here if(this->isInitMatcom) {

if(HandleValid(m_h)&&HandleValid(m_h1)) {

if(m_scopeflag==0&&m_scopeflag1==0)

{

DWORD dwErrCde; ULONG lDevNum; long lDriverHandle; USHORT usChan; float fVoltage;

PT_AIVoltageIn ptAIVoltageIn; PT_AIConfig ptAIConfig; ……

//以上是数据采集卡配置 ……

if(m_nScopeTimerID<=0) { //实时采集数据

m_nScopeTimerID=SetTimer(1,10,NULL); }

m_scopeflag=1; m_scopeflag1=1; else

{ m_scopeflag=0; m_scopeflag1=0; }

}

} }

在上面的功能函数中SetTimer()函数的作用是每隔一定时间自动触发一次WM_TIMER消息,为此,通过ClassWizard为WM_TIMER消息添加消息响应函数OnTimer(),当程序运行到SetTimer()函数时会自动调用OnTimer()函数。在OnTimer()函数中添加代码就可以实现实时采集数据及动态显示图形,这里函数代码省略不写。

在动态绘制时域和频域图时,一般会出现图形窗口的剧烈闪烁,为了避免这种情况发生,程序采用set函数设置Matcom图形窗口数据缓冲区数据,利用drawnow函数强制Matcom图形窗口绘制缓冲区的数机扰动的存在,火焰辐射强度是时变的,其频谱分布可达到0~2000Hz。这种检测方法可以检测到探头所能接受到的范围内火焰频率的变化,受火焰位置变化的影响较小。当燃烧条件改变时闪烁频率也相应发生

据,图形闪烁的情况就不会存在了。

上面的HandleValid函数的功能是判断Matcom绘图句柄是否有效。在该FDAQ工程文件中,还可以添加OnSize函数用于保证绘制图形的大小能够跟随主窗口的变化而变化。以上所有程序均在Windows XP、VC++6.0和Matcom4.5下调试通过,所要要求的各项功能均能达到。

3.2 火焰燃烧状况检测原理[6-11]

火焰检测技术是伴随锅炉火焰探测和火灾预报而发展起来的一门学科。 它利用感光、感温传感器获取火焰燃烧产生的效应,从火焰辐射信息中提取特征信息,通过后处理,判知火焰的存在与否、火源的重叠状态、火焰的燃烧稳定情况或者灭火动作。

火焰在燃烧时都会发出热辐射,辐射光能火焰检测就是利用这个原理工作的。如果燃烧负荷、燃料的活性、燃烧与空气比、气流的紊流扩散、挥发份燃烧、火焰的传播与脉动等条件发生改变,都会使得火焰辐射的光谱频率与光强的随着改变,因此火焰在燃烧过程中着火过程最为复杂。火焰燃烧时光辐射的强度是波动的,即火焰辐射能量是在某一平均值上下变化闪烁,尤其是起燃和熄灭阶段。将火焰辐射能量分成“直流分量”、“交流分量”两部分,“直流分量”反映亮度,“交流分量”反映闪烁频率,辐射式火焰检测方法可以根据检测原理的不同,分为辐射强度检测和火焰频率检测两种方法。本文将这两种方法结合起来用以检测火焰燃烧状况。

辐射强度检测用于判断火焰存在与否,是通过利用探头接收火焰发出的辐射强度的大小来实现。因为火焰存在和熄灭时的辐射强度是不同的。要判断火焰是否存在,需要设定一个强度阈值。如果是在锅炉火焰中,初始燃烧区产生的红外辐射经光纤传输给检测器接收并经前置放大器放大,这个信号经过选频电路输入到火焰信号处理器(也称放大器)中。该选频网络电路允许信号处理器对不同类型燃料的火焰频率特性作出响应。放大的火焰信号与背景信号电平进行比较调节,当火焰信号强度超过背景电平时,说明有火焰存在。

频率法的检测原理是把光探头输出的强度信号进行滤波,取出交流分量,经整形后确定火焰闪烁频率,频率谱上的峰值定义为火焰的闪烁频率。由于各种随改变,同时反映出某些影响燃烧的内在因素与关联,所以通过对闪烁频谱的监测和分析可以反映燃烧的某些情况。火焰的闪烁频率也可作为火焰稳定性的一项指标。由于湍流涡旋团尺寸在空间的分布、各作用团