APP下载

多传感器状态监测系统的多线程信息处理模型

2012-11-22徐建锋薛平贞

火炮发射与控制学报 2012年3期
关键词:线程数据处理故障诊断

杨 维,赵 维,徐建锋,薛平贞

(西北机电工程研究所,陕西 咸阳 712099)

随着人们对安全保障的日益重视,多传感器状态监测系统得到了越来越广泛的应用。通过对各类运行参数连续不断的采集,可以获得关键设备的运行状态,并实现自动报警和故障诊断[1-2]。状态监测系统的信息处理过程包括数据采集、显示输出和数据处理等多个任务,非常适合采用多线程技术[3-4]。不过,当采样频率较高、传感器数量较多时,如何合理的进行任务划分和设计多线程模型对系统的稳定性和执行效率有着十分重要的影响[5]。本文提出了一种针对多传感器状态监测系统的多线程信息处理模型,并基于VxWorks操作系统给出了该模型的具体实现。通过在某综合控制管理状态监测系统中的实际应用,验证了该模型的有效性和稳定性。

1 多传感器状态监测系统

图1给出了一个典型的多传感器状态监测系统的基本架构。其中,监测网络中存在几十甚至上百个传感器,用于监测不同的测点;数据采集模块通过监测网络可以接收各测点的运行参数,在收到运行参数之后,还需要进行显示输出、数据处理和故障诊断,经过处理的监测数据和诊断结果还要保存到数据库中。

考虑到以下因素,则该问题更加复杂:

1)在一些监测诊断系统中,希望报警点前后一段时间内的采样点越多越好,而在无报警时段内对采样点的数据密度没有过高的要求。

2)对于不同类型的运行参数,需要采用不同的数据压缩方法—缓变参数直接扩大采样点时间间隔进行重采样即可;非缓变参数则需要考虑参数变化的频率。

2 多线程信息处理模型

针对上述多传感器状态监测系统,设计了一个多线程信息处理模型。在该模型中,将需要完成的任务划分为主线程、数据采集线程、数据处理线程、故障诊断线程、显示输出线程和定时器,其信息处理流程如图2所示。

2.1 数据采集线程

在硬件条件许可的前提下,可以适当加大采样频率。特别是对于非稳态参数(如柴油机气缸压力参数),采样频率可能会大于50 MHz。为此,采用非阻塞异步通信方式接收来自多socket的监测数据,并将采集到监测数据送入预处理缓冲区。预处理缓冲区按不同参数划分为不同的单元,每个单元都有一个报警状态标识记录是否报警。如果某参数一直处于正常的阈值范围内,则该标识置于低位0(表示正常);如果某参数超出正常的阈值范围,即将该标识置为高位1(表示异常),同时记录报警时间T_Alarm;如果处于报警状态的参数重新回复到正常阈值范围内,则将该标识置为低位0,同时记录取消报警时间T_AlarmEnd。

当传感器数量较多且采样频率较高时,将会大大增加存储空间。为此,需要进一步考虑数据压缩。

2.2 数据处理线程

数据处理线程负责进一步处理预处理缓冲区中的数据。一旦预处理缓冲区中某个参数单元的缓冲区长度大于临界值,即将缓冲区内的数据送入交换区,然后向数据处理线程发送请求处理通知。数据处理线程收到该通知后,按顺序处理交换区中的数据:

1) 判断当前参数单元是否为报警状态,如果为非报警状态,则按参数类型进行数据压缩后存储到数据库中。

2) 如果处于报警状态,则将报警窗口(T_Alarm-TL

3) 无论是否压缩,转存至数据库之后,就要清空当前参数单元的交换区。

2.3 故障诊断线程

通过滑动诊断窗口,故障诊断线程实时对处于滑窗内的数据进行基于模式识别的故障匹配。当故障匹配的结果有逻辑冲突时,还需要进行基于决策融合的冲突消解,给出最终的诊断结果。

2.4 显示输出线程

显示输出线程负责在监控界面上以动态曲线、数字仪表等方式显示最近时刻的运行参数和故障诊断的结果。

2.5 定时器

定时器根据需要按固定时间间隔向各线程发送通知。譬如融合诊断线程和显示输出线程并不是一直处于工作状态,而是收到由定时器给出的通知信号量后才工作,待完成当前周期的任务后再自动“休眠”。

3 基于VxWorks的实现

基于VxWorks 5.5,实现了上述多线程信息处理模型。VxWorks 5.5是一个抢占式多任务实时操作系统,它只有一个进程,这个单一进程可以包括多个任务,并且这些多任务之间可以共享内存和其它资源。

3.1 任务创建

在VxWorks环境下,提供了一个taskSpawn函数用以创建任务并执行该任务的入口函数。可以在其usrAppInit函数中执行数据采集任务、数据处理任务、故障诊断任务、显示输出任务和定时器任务。程序代码如下:

int t_DataCollecting = taskSpawn(“DataCollecting”, 100, 0, 8192, (FUNCPTR)DataCollect_Func, 0, 1, 2, 3, 4 ,5, 6, 7, 8, 9); //创建数据采集任务

int t_DataProcessing = taskSpawn(“DataProcessing”, 100, 0, 8192, (FUNCPTR) DataProcessing_Func, 0, 1, 2, 3, 4 ,5, 6, 7, 8, 9); //创建数据处理任务

int t_FaultDiagns = taskSpawn(“FaultDiagns”, 100, 0, 8192, (FUNCPTR) FaultDiagns_Func, 0, 1, 2, 3, 4 ,5, 6, 7, 8, 9); //创建故障诊断任务

int t_Output = taskSpawn(“Output”, 100, 0, 8192, (FUNCPTR) Output_Func, 0, 1, 2, 3, 4 ,5, 6, 7, 8, 9); //创建显示输出任务

int t_Timer = taskSpawn(“Timer”, 100, 0, 8192, (FUNCPTR) Timer_Func, 0, 1, 2, 3, 4 ,5, 6, 7, 8, 9); //创建定时器任务

3.2 任务间的协调与通信

1) 基于临界区的数据保护

基于VxWorks下STL(标准模板库)中的vector类,定义了用于缓存接收数据的预处理缓冲区。其代码如下:

vectorRecvDatas; //定义预处理缓冲区

由于多任务之间可以共享内存,因此各任务均可以读写上面定义的RecvDatas。为了避免同时抢占共享资源,可以利用VxWorks提供的taskLock函数和taskUnlock函数实现数据保护。这两个函数一定是成对出现的,通过taskLock函数实现锁定,通过taskUnlock函数进行解锁,而在这两个函数之间的代码相当于临界区操作,避免产生冲突。其伪代码如下:

taskLock?();???//锁定

/******安全的数据操作********/

taskUnlock?();?//解锁

2) 基于二进制信号量的通知机制

数据处理任务、显示输出任务和故障诊断任务并非一直处于工作状态,而是收到通知后才执行相关任务,完成任务后又可以暂时处于“休眠”状态,直到收到下一个通知为止,如此周而复始。基于VxWorks提供的二进制信号量,可以实现上述通知机制。例如,关于定时通知显示输出任务刷屏,可以在usrAppInit函数中,可以先通过semBCreate创建一个名为sem_NotifyOutput的二进制信号量(用于定时通知显示)。在显示输出任务中的Output_Func函数中,其伪代码如下:

void Output()

{

for(;;)

{

semTake(sem_NotifyOutput);//占据通知显示信号量

refresh();//刷屏操作

}

}

而在定时器事件中,其伪代码描述如下:

output_Count++;//计数加1

if (output_Count % output_Interval == 0)

//若计数被显示时间间隔整除,则

{

semGive(sem_NotifyOutput);//释放通知显示信号量

}

上述代码中,Output函数的主体就是一个无条件的for循环,在其中首先通过semTake函数试图占据sem_NotifyOutput,若成功占据则执行refresh函数进行刷屏,否则一直等待。而在定时器事件中,output_Count一直递增,一旦output_Count被显示时间间隔output_Interval整除,则调用semGive函数释放sem_NotifyOutput。

3.3 非阻塞式异步数据接收

创建单一的数据采集线程,以非阻塞异步方式接收来自所有客户端的数据。在VxWorks中,提供了select函数实现非阻塞式异步数据接收。select函数可以监视文件描述符集合中某个文件描述符是否发生变化,当然也可以用于监视该文件描述符是否可读,一旦检测到有数据可读后才调用相关的recv函数接收数据。

为了记录所有客户端socket,定义了一个基于STL的socket向量。其代码如下:

vectorclient_Sockets;//定义客户端socket向量

而在数据采集任务的DataCollect_Func函数中,其伪代码如下:

void DataCollect_Func()

{

int i;

struct fd_set fds;//定义可读文件描述符集合

struct timeval timeout={2, 0};//定义select的超时时间为2s

for(;;)

{

FD_ZERO(&fds);//每次循环都要清空集合

for(i = 0; i < client_Sockets.size(); i++)

{

FD_SET(client_Sockets[i], &fds);

}//将client_Sockets中所有项添加到fds中

switch(select(FD_SETSIZE, &fds, NULL, NULL, &timeout))

{

case -1:

{

exit(-1);break;

}

case 0: break;

default:

{

for(i = 0; i < client_Sockets.size(); i++)

{

if (FD_ISSET(client_Sockets[i],&fds))//若可读

{

recv(client_Sockets[i], ….);//接收数据

}

}

}

}

}

4 实际应用

在某综合控制管理状态监测系统中,传感器总数为N个,这些传感器的采样频率分别为10 Hz、50 Hz和50 MHz不等。监测网络采用工业以太网和CAN总线,但并非所有传感器都直接接入监测网络,邻近测点的传感器可能通过共同的下位机(如单片机)接入监测网络。系统运行的硬件环境为:P4 1.4G、1G RAM、500G HD。

通过跟踪日志可知,在实际的使用过程中,CPU的平均使用率为45%,峰值使用率低于75%,且未发现死锁、错/漏报警等情况。表明系统任务划分合理,运行稳定。

5 结 论

对于多传感器状态监测系统而言,合理的进行任务划分和设计多线程信息处理模型非常重要,对系统的执行效率和稳定性影响很大。本文提出的多传感器状态监测系统的多线程信息处理模型包括数据采集线程、数据处理线程、故障诊断线程、显示输出线程和定时器等,具有一定通用性。在VxWorks下给出了该模型的具体实现。通过实际应用,表明该模型及其具体实现执行效率较高,且稳定性较好。

参考文献(References)

[1] 伍星,毛剑琳,迟毅林. 设备状态监测与诊断系统的概念模型[J]. 计算机工程, 2009, 35(12): 229-232.

WU Xing,MAO Jian-lin,CHI Yi-lin. Conceptual model for equipment condition monitoring and diagnosis system[J]. Computer Engineering,2009,35(12):229-232.(in Chinese)

[2] 毛宏宇,王丰贵,王文良,等. 基于数据流截获技术的仪器状态监测方案[J]. 计算机工程, 2010, 36(2): 241-243.

MAO Hong-yu,WANG Feng-gui,WANG Wen-liang, et al. Instruments status monitoring sc-heme based on data stream interception[J]. Computer Engineering, 2010,36(2):241-243.(in Chinese)

[3] 陈佐,杨秋伟,万新,等. 一种多线程负载均衡分析方法研究[J]. 计算机应用研究, 2011, 28(5): 1752-1755.

CHENG Zuo,YANG Qiu-wei,WAN Xin, et al. Research on analyzing load equilibrium of mult-i-threads[J]. Aplication Research of Computers, 2011, 28(5): 1752-1755.(in Chinese)

[4] 姚崇华,姜新红,程凌宇,等. 多线程应用中的定时器管理算法[J]. 计算机工程, 2010, 36(2): 75-77.

YAO Chong-hua, JANG Xin-hong,CHENG Ling-yu, et al. Timer management algorithm in multi-threads application[J]. Computer Engineering, 2010, 36(2): 75-77. (in Chinese)

[5] 戴大蒙. 基于非阻塞式Winsock 的多线程网络通信机制[J]. 计算机工程, 2006, 32(6): 137-139.

DAI Da-meng. Multi-threads communication Mechanism based on non-blocking I/O Wins-Ock[J]. Computer Engineering, 2006, 32(6): 137-139. (in Chinese)

猜你喜欢

线程数据处理故障诊断
实时操作系统mbedOS 互斥量调度机制剖析
认知诊断缺失数据处理方法的比较:零替换、多重插补与极大似然估计法*
基于包络解调原理的低转速滚动轴承故障诊断
基于低频功率数据处理的负荷分解方法
无人机测绘数据处理关键技术及运用
基于国产化环境的线程池模型研究与实现
数控机床电气系统的故障诊断与维修
基于MATLAB语言的物理实验数据处理探讨
基于量子万有引力搜索的SVM自驾故障诊断
江淮同悦纯电动汽车无倒档故障诊断与排除