关键词:故障诊断;数据采集;信号处理;多线程
1前言
旋转机械是大型企业生产的关键部件,现代化生产在功率、速度、机械性能、自动化水平、可靠性、安全性等方面对它提出了越来越高的要求。将故障诊断技术应用在旋转机械生产中,将有效的降低生产过程中的故障发生率,对于故障预防以及故障发生后的维修具有相当的指导意义。资料表明:在采用诊断技术后,生产事故率减少了75%,维修费用降低了25%~50%。大大的提高了企业的经济效益[1]。
旋转机械故障诊断与监测系统的开发涉及到传感器技术、数据采集处理与信号分析技术、故障机理的研究、诊断方法的研究等多方面的知识。可以说是一门跨学科,跨领域的综合系统的开发。而现在以TCP/IP模型为代表的迅猛发展的网络技术,为故障诊断系统注入了新鲜血液同时,也为故障诊断系统的设计者提出了新的要求。网络的加入使故障诊断系统从总体的工作模式设计,到数据的共享传输方式的选择,都产生了革命性的发展。因此在企业内部网Intranet下开发出一套完善、高效的故障诊断系统对企业效益的提高具有深远的意义。
2总体设计
故障诊断与监测系统经过了离线、单机版以及分布式诊断的发展过程。而分布式诊断又分为B/S、C/S两种工作模式。从灵活性、经济性、针对性、可靠性、安全性、推广度等等多方面考虑,可以说各种诊断模型都具有各自的特点。在企业内部Intranet下,考虑到系统的复杂功能要求、安全性、可靠性,以及现今国内分布式故障诊断系统的发展规模、发展程度,本套系统采用了C/S模式的诊断工作模型。机组运行数据经过现场计算机采集处理之后通过车间监控室的网络交换机接入企业内部网,传给各职能部门。这样,企业的管理决策和检修技术人员在办公室内就可以通过与网络连接的计算机及时的了解现场机组的运行状况,做出相应决策。同时通过企业内部网关设置,系统也可以将诊断系统延伸到Internet诊断节点中,这样既考虑了安全性,又达到了诊断系统的空间扩充。
3功能设计
C/S 模式下,易于设计出功能复杂,针对性、可靠性强的诊断、检测系统。其中服务器端运行于现场计算机,采用多线程技术,主要完成数据采集、状态监测、系统管理以及实现数据服务器功能,满足同时向多个客户端传输数据的要求。基本功能模块包括:数据采集、状态监测、趋势分析、系统管理和网络通讯等模块。客户端软件运行于各职能部门的计算机,具有网络通讯、状态监测和分析诊断等功能,基本功能模块包括:数据管理、状态监测、趋势分析、信号分析、故障诊断和网络通讯等。同样,客户端也可以同时连接多个服务器,实现企业内部的网状互连。达到故障监测诊断的面式结构。服务器、客户端具体功能如图1所示。
l 数据采集:与服务器的其它功能实现并行操作,完成温度、转速、振动以及间相数据的高速实时采集,并实现采集参数(如:灵敏度,上下限,衰减系数)的动态配置。具体内容见下文数据采集节。
l 状态监测:完成实时图以及峰峰图的动态显示。提供报警提示,以及报警数据的自动记录功能。
l 信号处理:利用Matlab C/C++数学函数库实现各种时域、频域的信号分析,包括:时域波形、FFT频谱、自功率谱、互功率谱、倒谱、全息谱、自相关分析、互相关分析、相干函数、时间谱阵、Wigner时频分布、滤波轴心轨迹和重构轴心轨迹、转速谱阵等等信号处理功能。
l 趋势分析:采用自回归分析方法进行趋势预测。根据其历史数据来推断缺陷的发展速度与趋势,其目的是为早期判定故障提供一个有效的手段。
l 故障诊断:系统诊断分为自动诊断和人机交互诊断两种方式。自动诊断利用振动信号的频谱结构识别故障,将诊断对象振动信号的频谱与标准故障样本的频谱进行比较,根据之间的相似程度得出诊断结论。人机交互诊断利用专业工作人员的经验,根据信号处理的分析结果,由人工选择故障征兆,依据最优诊断规则识别故障。诊断规则由实际诊断案例以及专家总结形成,经过基于广义粗糙集理论的约简处理产生,其中涵盖了亚异步、同步和超异步等三大类共32种常见故障。
l 网络通讯:网络服务器包括实时数据服务器,趋势分析数据服务器,历史文件数据服务器。客户端可以动态下载服务器文件列表,并显示在树控件中。整套通讯系统,在VisualC++环境下采用多线程技术与Socket编程相结合开发。具体内容见下文网络通讯与多线程一节
l 系统管理:此模块包括数据管理、安全管理、服务器管理三项功能。数据管理可以完成对历史数据的自动删除功能,以及实现正常数据保存天数、报警数据保存次数的设置;安全管理包括用户权限管理、密码管理、注册管理等等功能;服务器管理主要实现服务器IP地址,通讯端口的动态设置,服务器状态的实时管理等几项功能。根据数据库的规模,以及系统要求实现的功能,整个模块后台选择了Microsoft Access数据库统一管理。由于Access数据库是基于Microsoft Jet引擎建立的,所以在这里又选择了微软推出的用于在VisualC++中访问数据库文件的DAO技术,实现数据的快速访问与存取。
l 报表打印及联机帮助:系统根据监测模块可以自动完成报表的监测数据统计工作。同时利用信号分析模块的分析结果可产生图形化的分析报表。整个报表生成过程中大部分由系统自动完成,操作方便,直观。联机帮助系统,采用统一的RTF格式文件,经过Microsoft Help Workshop工具编译后生成。其中实现了主题查询、关键字索引等功能。帮助文件内容包括了系统信息、操作方法以及一些基本技术原理介绍。
整个系统采用了友好的用户界面,操作简便、直观,方式多样。其中集合了数据采集技术、多线程技术、Socket网络编程技术、数据库存取技术、COM技术。具有针对性强、功能完善等特点。下文将以数据采集、信号处理、网络通讯模块为例,讨论具体模块功能以及模块实现的技术细节。
4技术细节
(1)数据采集
随着数字技术快速发展,数据采集技术已向着并行、高速、大量存储、实时分析处理、集成化等方向发展。同时数据采集也是整个系统信息元工作的源头。通过这个部分模块,系统可以将采得的数据进行信号分析、趋势分析、故障诊断,并作为信息载体在整个Intranet中进行发布。整个系统采样硬件部分的具体配置如下:
l 传感器系统:充分利用机组已经配备的监测仪表和传感器系统,如Bently电涡流传感器、转速计和温度传感器等。
l 采样系统:本系统采用National Instruments (美国NI仪器公司,简称NI公司)的PCI总线E系列多功能DAQ数据采集板卡,采集卡型号为6071E。其提供了多达64路单端,32路差分模拟输入以及12位模拟输入精度等的优异性能。
l 现场计算机:采用性能可靠的工业控制计算机。
系统将传感器测得的转子径向振动、轴向振动、转速、键相和轴瓦温度等模拟信号,通过现场监测仪表的1-5V或4-20mA标准信号接口与现场工业计算机上的多通道高速A/D采样卡连接,这中间通过了信号抗干扰,功率缩放等步骤,将采集到的数据准确安全的送入现场工控机。采集系统具体硬件布置如图2所示。
工业生产过程中,现场条件恶劣,机器运转过程中产生的振动、温度信号受到了四周环境的影响。因而对故障信息的完全提取需要高的采样率的保证。只有这样才能将机器运转的特征如实的反映到监测系统中。同时,要做到故障的完全跟踪,对某一时刻采样信息的深入提取还是不够的,这还需要我们在整个时域中对机器运转进行广度监测。因此实时采集也成为了故障信息提取的决定因素之一。现代采集技术中,触发A/D转换有软件触发、定时器同步触发及外部触发三种方式。而数据的传输方式有软件查询、中断方式、DMA方式及FIFO方式[2]。以研华PCL1800采样卡为例,四种数据传输的速率比较如下:软件查询(10-20kHz);中断方式(10-30KHz);DMA方式(200KHz);FIFO方式(330KHz)。高速连续数据采集的情况下,考虑到整个系统的性价比后,我们利用6071E快速离散式DMA技术将定时器同步触发与FIFO数据传输方式相结合,使得处理器从DAQ板卡的事件中解放出来。实践证明,这种方法将大大提高系统的采样频率和数据的可靠性,同时也改善了WINDOWS环境下实时数据采集中整个系统的性能。
采样部分软件设计从整个系统的开发效率以及工作性能出发,利用NI公司提供的API函数:NI-DAQ Function,在Visual C++语言中进行高速的信号采集,使整个系统最高采样达到了1.25M/s的速度,为后续的开发分析奠定了基础。
(2)信号处理
系统信号处理部分采用C++与MathWorks公司推出的科学计算软件MATLAB完成。
MATLAB是MathWorks公司推出的功能强大的科学计算软件,具有高速的运算能力以及稳定安全的算法库,目前其在许多学科领域都得到了应用。其开放的软件体系为Matlab与其它工具语言的协同工作提供了可能。通过MEX文件,在Matlab环境中可以调用C、C++或Fortran语言编写的程序;MAT文件提供了Matlab与其它应用程序之间数据交换的途径;而Matlab ActiveX技术则实现了Matlab与其它应用程序之间客户机、服务器的工作模式,利用启动的Matlab进程,可以将Matlab作为一个计算引擎服务器,在其他程序中直接调用[3]。但以上三种方法具有一个共同的缺点,那就是他们的工作都脱离不了Matlab软件环境,这对于发布式的应用软件是一个致命的弱点。为克服这一缺点并提高数据处理或程序开发的效率,本套系统选择了Matlab 为C/C++语言提供的数学函数库接口。Matlab数学函数库提供了大量高效的数学函数,尤其在复杂矩阵计算处理方面更加出色。通过Matlab C/C++数学函数库,在C或C++程序中调用Matlab C/C++数学库函数。从整体性能上讲采用这种方式提高了算法设计速度,缩短程序开发周期,使开发方式灵活、独立,并且显著的提高了程序性能以及稳定性,保证了程序运行的健壮性。下面以一维快速Fourier变换为例,说明在C++环境中对Matlab C/C++数学库函数的调用方法。
#include "matlab.h"
/*
* 函数介绍:通过Matlab数学函数将输入数据进行傅立叶变换后输出
* 输入参数:double dDataIn 变换前输入数据
* 输出参数:double dDataOut 变换后输出数据
* 返回值 :无
*/
void CFuction::FFT(double dDataIn[], double dDataOut[], int iNum)
{
mlfEnterNewContext(0,0);//建立内存上下文
double *fpAbs;
mxArray *mxpArray=NULL;
mxArray *mxpFft=NULL;
mxArray *mxpAbs=NULL;
//建立阵列变量
mlfAssign(&mxpArray,mlfDoubleMatrix(iNum,1,dDataIn,NULL));//由输入数据构造阵列
mlfAssign(&mxpFft,mlfFft(mxpArray,NULL,NULL));//傅立叶计算
mlfAssign(&mxpAbs,mlfAbs(mxpFft));
//得到傅里叶变换后模值
fpAbs=mxGetPr(mxpAbs);//模值实部
for(i=0;i
{
dDataOut[i]=(*fpabs)/N;
fpAbs++;
}//end of if
mlfRestorePreviousContext(0,0);
//导入原内存上下文
mxDestroyArray(mxpAbs);//数组销毁
mxDestroyArray(mxpArray); //数组销毁
mxDestroyArray(mxpFft); //数组销毁
return;
}
图3为FFT频谱曲线图,是现场采样数据经过Matlab C/C++数学库函数处理后,在诊断系统中自动生成特征曲线图。
可见,采用这种技术对程序运行稳定性、结果正确性都提供了有利的保障。本系统通过C++语言与Matlab C/C++数学库函数的结合,在信号处理组件部分实现了时域波形、FFT频谱、自功率谱、互功率谱、倒谱、全息谱、自相关分析、互相关分析、相干函数、时间谱阵、Wigner时频分布、滤波轴心轨迹和重构轴心轨迹、转速谱阵等等信号处理分析。
(3)网络通讯与多线程
在Windows操作系统环境下,服务器软件有三种技术可以并发处理来自多个客户机的服务请求:多线程、消息驱动和循环处理。其中多线程编程最直接,32位的Windows操作系统提供了多任务的管理,这样,服务器端程序能够为每个请求服务的客户机创建一个或多个任务线程,以便同时处理多项任务。消息驱动和循环处理只需要一个线程,节省了多线程间上下文切换的CPU开销。同时它们也可以解决使用单任务线程同时处理多个客户机请求的问题。在消息驱动方式中,请求到来时,系统分发特定的消息,服务器捕捉到该消息后,触发消息响应程序;而在循环处理方式中,程序主动循环查询系统是否收到客户机的请求,为防止线程阻塞,可以采用异步I/O调用,以便同时进行其它的处理。但是循环处理和消息驱动两种方式在满足多任务的前提下,却破坏了程序执行的自然逻辑顺序。循环处理程序,为了及时响应客户机的请求,代码使用了异步接收和发送数据的办法,把长的传输间隔分成小的时间片,并且有人机交互时还要不停的查询键盘、鼠标等输入设备。这样就破坏了程序的自然的逻辑顺序。而消息驱动方式也无法预知消息出现的时间,同样也保证不了程序自然的逻辑结构,很难将代码实际运行的次序确定下来。根据故障诊断程序的多任务,大处理器、IO需求的特点,本系统采用并发式TCP方式作为服务器程序。首先建立各数据服务器的监听线程。这样一个处理客户机请求的线程在收到完整的请求前能够一直保持阻塞状态,而不必担心会妨碍对服务器其它模块运行的处理。同时各线程内部采用消息循环机制,实现用户请求的消息驱动。当收到请求后,监听线程立刻创建连接线程,为客户请求提供服务。同时监听线程阻塞返回,继续监听其它客户请求。连接线程完成客户服务后,自动关闭连接。这样就完成了一个用户请求循环。
在VisualC++环境中,线程内部如果需要提供消息驱动支持,那么必须启动用户界面线程,这里系统为历史数据服务器、实时数据服务器以及趋势分析服务器各建立了一个用户界面监听线程。建立线程同时将各线程界面隐藏,这样就实现了各服务器同时阻塞监听,而线程内部消息驱动的设计要求。
本系统网络传输部分采用Windows Sockets[4]规范编写。首先,客户机和服务器都创建一个套接字。接着服务器调用bind()函数给套接字分配一个公用的端口。这样客户机和服务器就能够使用同样的端口来表示服务器套接字。一旦客户机与服务器建立了连接,就能够使用send()函数向服务器发送数据、信息。同样服务器也能够使用send()和recv()函数来传递数据,直到完成通讯。最后调用closesocket( )来关闭套接字,完成信息传递。
5结束语
故障监测、诊断系统开发涉及到广阔的学科领域知识。本系统采用了外部程序接口完成了采样以及分析模块,并在通讯方面渗透了多线程以及网络编程技术,从而高效的开发出了一套功能强大的分布式监测、诊断系统。本系统已在石油企业中长期运行,性能以及稳定性都得到了检验。今后,可以建立监测、诊断系统标准,将各个诊断系统连接起来,最终形成统一的大规模故障监测、诊断网,指导工程生产。
参考文献
1 施圣康. 汽轮发电机组振动故障诊断技术的发展现状[J]. 动力工程,2001,21(4) :1295-1298
2 吴道虎,王绪军. 具有高可靠性的高速连续数据采集的设计与实施方法[J]. 电子技术应用,2002,6:13-15
3 刘志俭,潘献飞,连军想. Matlab外部程序接口[M]. 北京:科学出版社, 2002
4 汪濮阳. 因特网应用编程[M]. 北京:清华大学出版社, 2000