APP下载

一种改进型多线程机制在数据采集系统中的应用

2019-08-13王嘉范蟠果毛恒

计算技术与自动化 2019年4期
关键词:数据采集

王嘉 范蟠果 毛恒

摘   要:为缓解数据采集实时性要求较高和数据处理延时较大之间的矛盾,研究了LabWindows/CVI软件开发环境下的多线程机制和相关的数据保护机制。并对传统数据采集多线程机制进行改进,除了为数据采集任务创建线程外,单独为每一路数据通道创建独立的线程用以处理该通道数据。实验结果表明:改进后的多线程机制更加适合数据处理耗时较长、数据通道多、实时性要求严格的系统,能显著提高系统实时性和软件运行效率。

关键词:LabWindows/CVI;多线程;数据采集;数据通道

中图分类号:TP29                                                 文獻标识码:A

Application of an Improved Multithreading Mechanism

in Data Acquisition System

WANG Jia?覮,FAN Pan-guo,MAO Heng

(Northwestern Polytechnical University,Xi'an,Shaanxi 710072,China)

Abstract:In order to alleviate the contradiction between high real-time requirement of data acquisition and large data processing delay,the multithreading mechanism and related data protection mechanism in LabWindows/CVI environment are studied. For the purpose of improvement,in addition to creating threads for data acquisition tasks,separate threads are created for each data channel to process the channel data. The experimental results show that the improved multi-threading mechanism is more suitable for systems with long data processing time,multiple data channels and strict real-time requirements,and can significantly improve the real-time performance of the system and the efficiency of software operation.

Key words:LabWindows/CVI;multi-threading;data acquisition;data channel

随着计算机技术和测控技术的快速发展,在工程应用中,多任务并行能力已成为衡量测控软件性能的重要标准之一。而计算机中的多线程技术特别适用于实时性强的多任务系统[1],在测控软件中运用多线程机制,可以同步并行完成多个任务,从而提高软件的运行效率和系统的响应速度。在本文中将传统多通道数据采集系统的多线程机制进行改进,有效缓解了数据采集实时性要求较高和数据处理延时较大之间的矛盾,确保了两者的同步性。

1   LabWindows/CVI多线程技术

多线程技术基于操作系统的时间片轮转调度机制,使多个任务在宏观上并行执行。在典型应用多线程的LabWindows/CVI程序中,开发者使用主线程来创建用户界面并响应其动作,而使用辅助线程来进行其它时间要求严格的操作[2],如数据采集、实时监控等,极大提高了CPU使用率和程序的运行效率。LabWindows/CVI中有两种设计线程的方法,分别是线程池技术和异步定时器技术。线程池适合于不连续地执行若干次或者在循环内执行的任务,而异步定时器适用于按照固定时间间隔执行的任务[3]。

为了避免线程竞争引发的逻辑错误,在CVI中有三种保护数据的机制,分别是线程锁、线程安全变量和线程安全队列[4]。

1.1   线程池机制

线程池是一种多线程处理形式,其通过主线程中创建,而辅助线程在线程池中创建和管理[5]。线程池的目的是使得线程可以重复调用,即执行完一个任务后该线程可以继续执行其他任务而不是被注销。用户可以自由创建新的线程池或删除现有线程池,进而通过这些线程池管理不同的辅助线程。

当系统需要同时处理多个任务时,用户通过调用库函数,将欲执行的函数传递到某线程池,该线程池就会将该函数分配到一个线程中去执行,这个函数被称为线程函数[6]。通过这个过程,用户将不同的任务分配到不同的线程执行,从而实现多任务并行。

1.2   异步定时器机制

异步定时器通过调用Windows的多媒体定时器,按照设定的时间间隔执行回调函数。其回调函数按照严格的时间间隔执行,非常适用于按照固定时间间隔执行的任务[8]。与同步定时器相比,异步定时器使用独立线程,定时精度不受其他线程或用户界面操作影响,确保了定时器事件的实时性和可靠性[1]。

1.3   数据保护机制

线程安全队列是一种在线程间安全传输数据的数据保护机制,通常用于大批量数据传输。线程安全队列内部采用了锁策略,有效避免了线程间的冲突、数据错误、死锁等情况的出现[7]。由于数据安全队列采用FIFO工作模式[8],读、写线程可以同时对其进行操作,既保证了数据传输是安全可靠的,又提高了数据传输速度,非常适合数据采集系统。

2   多通道数据采集系统

某型飞机供电参数测试系统需要对多个节点的电气信息进行采集,并按照《GJB5189-2003飞机供电特性参数测试方法》所规定的测试方法处理数据并进行显示和保存。由于数据通路较多,测试算法复杂,单线程以及传统多线程方案在此并不适用。为此,本文基于LabWindows/CVI软件开发环境,设计了一种运行效率更高的多线程机制,并选用多通道同步数据采集卡、串口扩展卡以及工控机作为硬件平台设计测试系统,仅使用一个USB口即可实现16路数字/模拟通道的测试。

2.1   系统介绍

该测试系统的测试对象为测试节点,其分为数字和模拟两型。数字测试节点以固定时间间隔通过串口发送定量数据,而模拟测试节点通过数据采集卡进行A/D采样,工控机通过多路选择开关切换测试节点类型和以及控制对应测试通道的启停(数字、模拟节点均为16个),所有通道的数据流都通过一个USB口输入工控机,由测试系统上位机进行处理,系统结构如图1所示。

2.2   传统方案

传统数据采集系统的程序一般可归为以下三种工作模式,但它们并不适合通道数多、数据量大或者有复杂数据处理算法的系统,下面对它们简单介绍。

1)单线程系统

使用单线程编程方法编写程序时,整个应用程序只使用一条主线程,当使用者对用户界面进行操作时,CPU可能会因为响应这些动作而影响数据采集和数据处理,也可能由于CPU始终得不到释放导致用户界面无响应,这都是不允许发生的,该方案只适合简单的数据采集/处理系统。

2)双线程系统

作为传统单线程模式的改进,除主线程用以响应用户动作外可再设置一条辅助线程用以轮询采集和处理各个通道的数据。但在数据处理耗时远大于数据采集耗时的情况下,若将这两个任务放在同一线程运行,可能会因数据处理任务耗时过长,致使数据采集任务无法按时执行,从而导致数据缓存区覆盖,严重影响测试结果。

3)拥有独立数据采集线程、数据处理线程的系统

该方案是在第二种方案的基础上加以改进,除主线程外,为数据采集任务和数据处理任务分别创建单独的线程,该方案确保了系统的可靠性和响应速度。但该型供电参数测试系统数据通路多、所涉及的数据处理算法复杂,若在一条数据处理线程中完成所有通道的数据处理会使该线程的单次执行时长远大于数据采集线程,又由于数据采集线程的优先级必须高于数据处理线程,数据处理线程会频繁被数据采集线程阻塞。因此该方案在线程调度方面耗费资源过多,数据处理线程的执行效率低下。

2.3   系统特点

考虑到上述问题,在该系统中使用主线程创建、显示并运行用户界面,使用异步定时器为数据采集任务创建线程,确保其按照严格的时间间隔执行(在此设为0.1 s,读取的数据量与数字/模拟节点0.1 s写入工控机USB缓冲区的量相当,确保缓冲区内数据不会溢出),保证了数据采集的实时性;并单独为每一路数据通道创建一条独立的线程和一组对应的安全队列,使得在数据采集线程从USB缓存区读取数据的同时,所有通道的数据处理线程能同步接收数据采集线程读取的数据,并对其进行解包、处理和显示;另外还有一路高优先级辅助线程用以监测所有数据处理线程,确保缓冲区中所有通道的数据都解析完成后,数据处理任务才停止运行(所有数据处理线程才被释放),进而转向下一测试阶段,线程间工作原理如图2所示。

3   线程代码实现

下面对线程的具体代码实现进行介绍,因为所有数据流都通过工控机的特定USB口传入,因此采集线程读取数据的对象是USB缓存区。

3.1   数据采集线程

以下为数据采集辅助线程回调函数中,关于数据采集的代码,该辅助线程通过异步定时器创建,为了确保系统可靠性,数据采集线程拥有最高的优先级。

for(i=0;i<16;i++) /*16通道*/

{

/*每隔0.1s一个测试节点往缓存写入points个字节数据,points为变量*/

for(j=0;j

{

/*从USB缓冲区读取数据*/

ByteRead1=ComRdByte(ComName[i]);

ReadBuffer1[i][J]=ByteRead1;

}

/*每读完一通道就将数据写入对应安全队列*/

CmtWriteTSQData(queueHandle[i],&ReadBuffer1[i][0],points,0,NULL);

}

}

3.2   数据处理线程

該系统共有16条类似的数据处理线程与16路数据通道相对应,这些线程通过线程池创建,拥有相同的优先级。

int CVICALLBACK UnpackThread1(void *functionData)

{

/*unpack_flag1为线程运行/停止标志*/

while(unpack_flag1)

{

/*确保安全队列中有数据可读才進入数据处理过程*/

CmtGetTSQAttribute(queueHandle1,ATTR_TSQ_ITEMS_IN_QUEUE,&queue_item);

if(queue_item> 0)

{

/*从对应通道的安全队列取出数据,根据测试算法要求,每次取出一定量的数据进行处理*/

item_num = CmtReadTSQData(queueHandle1,ReadBuffer2,set_points,TSQ_INFINITE_TIMEOUT,0);

if(item_num>= 0)

{

for(j=0;j

{

/*将从安全队列读出的数据存入该线程的缓存中,供数据处理使用*/

ByteRead2=ReadBuffer2[J];

UnpackBuffer[J]=ByteRead2;

}

/*进行数据解包、处理、储存和实时显示的代码,在此省略*/

……

}

}

else

{

stop_count++;

/*当安全队列一段时间无数据可读时停止该线程运行*/

if(stop_count>10)

unpack_flag1 = 0;

}

}

return 0;

}

3.3   停止线程

由于每一通道的数据处理进程彼此独立,其处理进度难免存在差异,有必要单独设置一个停止线程对所有数据处理线程进行监控。当数据采集任务完成后,系统必须等待所有通道的数据都被处理完再切换至下一测试阶段(此时才释放所有辅助线程),否则可能导致数据丢失。具体实现方法为设置停止线程优先级高于数据处理线程,并持续对16条数据处理线程的运行标志位进行检测,当所有标志位都为0时即可释放包括停止线程自身在内的所有辅助线程。

4   结   论

在硬件相同的情况下,按照本文2.2节中第三方案编写程序,与本文设计的多线程程序相比较,具体实验内容如下:在20 kHz的采样率下,使用四路通道连续采集峰峰值为1 V、频率为50 Hz的正弦波信号60 s,并进行相关数据处理操作,查看数据处理完成进度(在程序中体现为所显示的数据长度,60 s共采集到60*20*1000=1200000个数据点)。其中图3截自本文2.2节中第三方案编制的程序,图4截自本文提出的多线程机制程序,可见传统多线程程序虽然保证了系统可靠性,但应用于复杂数据采集系统时线程间协同性较低,整体运行效率不高;提出的多线程机制充分发挥了计算机硬件资源的性能,在硬件支持的条件下基本可以实现数据采集和数据处理同步执行。

多线程技术在 Windows系统中已经被成熟运用[9],将其引入大数据量、实时性要求高的测控软件具有很多优势和工程应用价值。将传统数据采集系统的多线程机制进行改进,提高了测试的实时性和系统资源利用率,并且通过安全队列保证了数据在软件内部传递的安全性,确保了测试的准确性。该型测试系统已在实际生产中应用,取得了良好的效果。

参考文献

[1]    单体强,陈雷,张万发. LabWindows/CVI多线程技术的应用研究[J]. 电子设计工程,2012,20(15):52—54.

[2]    马青亮,周伦彬,鲍芳. Lab Windows/CVI的多线程机制在虚拟数字存储示波器中的应用[J]. 中国测试,2008,34(1):60—62.

[3]    张惊雷,王鑫,ZHANG Jing-lei,等. 基于LabWindows/CVI异步定时的多通道数据采集[J]. 测控技术,2014,33(2):100—102.

[4]    杨秋虎. LabWindows/CVI多线程技术的应用[J]. 电子科技,2015,28(3):19.

[5]    张伟,刘大伟. 队列与多线程技术在交通监控系统通信软件中的应用[J]. 上海船舶运输科学研究所学报,2009,32(1):50—54.

[6]    杨东升,王高峰. 多线程技术在虚拟仪器开发软件LabWindows/CVI中的实现[J]. 电测与仪表,2005,42(3):39—41.

[7]    张毅刚. 虚拟仪器软件开发环境[M]. 北京:机械工业出版社,2002.

[8]    程照宇,盛文,雷晓勇,等. 多线程技术在虚拟数字信号分析仪中的应用[J]. 中国测试,2008,34(1):74—76.

[9]    周炎涛. Windows中的多线程编程技术和实现[J]. 计算技术与自动化,2002,21(3):109—116.

猜你喜欢

数据采集
Web网络大数据分类系统的设计与改进
CAN总线通信技术在电梯监控系统中的应用
基于大型嵌入式系统的污水检测系统设计
基于AVR单片机的SPI接口设计与实现
CS5463在植栽用电子镇流器老化监控系统中的应用
大数据时代高校数据管理的思考
基于广播模式的数据实时采集与处理系统
通用Web表单数据采集系统的设计与实现
基于开源系统的综合业务数据采集系统的开发研究
大数据时代的管理会计