作者:刘洁群,何枫,吴毅,侯再红
1 引言
探测器阵列(Detector Arrays)测量系统中,为了精确测量一些光强信号,通常需要对传感器输出信号进行高速、高分辨率采样,并要求采集图像实时显示。从硬件要求来看,采用 的A/D 器件速率在800 MHz 以上,可实现数据的高速采集。同时,数据存储技术也正在不 断完善和提高,存储容量越来越大,在市场上已出现容量达1T byte 左右的硬盘。已有的 数据采集系统大多数采用基于PCI 总线的结构,但在对数据可靠性要求很高的情况下, 基于PCI 总线的数据采集系统的可靠性不能满足要求。保证数据的可靠性与完整性的同时, 实现数据的高速传输与实时显示成为设计该数据采集系统的关键所在。
目前对数据采集的研究较多,但对高速数据采集的算法相对较少,也有一些对高速、高 分辨率数据采集的算法,但这些算法大多采取数据压缩法,一般很难保证数据的完整性。 为此,本文在算法设计中提出了一种既能保证数据完整性与可靠性,又能实现高速大批量数 据的实时采集算法,从而解决此问题。
2 系统描述
在激光大气传输实验中,光强测量系统由多传感器探测阵列构成。传感器探测阵列共有1024 个探测单元。对于每个模块,信号通过模拟开关送入数据采集卡,由计算机进行处理。 在激光大气传输实验中,对测量系统的稳定性与可靠性要求极高。对数据采集软件的性能及 指标要求是:保证100Hz 帧频下,数据采集不丢帧,图像完整,无乱码。
从技术角度看,目前PCI 总线最大数据传输速率可达133MB/s ,相对较高,但基于PCI 总线的数据采集系统的可靠性不能满足要求,且100Hz 帧频在现有的数据采集系统中已不 算高。为此,实验中采用一种专门为嵌入式控制而定义的工业控制总线——PC104 总线。此 总线以“针”和“孔”形式层叠连接,即PC104 总线模块之间总线的连接是通过上层的针和下层 的孔相互咬和相连,这种层叠封装有极好的抗震性。此总线虽满足了可靠性的要求,然而它 的传输速率相对于PCI 总线却大打折扣,造成PC104 总线与PC 机之间的传输速率受到限制。
3 数据采集算法设计
针对以上情况,本着在实验中数据采集具有实时性和不可重复性,如果出现暂时性溢出, 应优先保证数据的整体完整性的原则。
本数据采集软件在设计中提出了缓冲区半满存储算法。此算法和现有数据采集系统中的 缓冲区算法、数据压缩算法相比,其最大优势在于采到的数据不易丢失,更能保证数据的完 整性,且大大提高了PC104 总线与PC 机之间的传输速率。
同时软件设计中使用实时多任务控制方式,并将采集到的数据以二进制的形式直接保存 进文件。这就不仅达到存储量大、数据传输效率高的目的,而且满足了图像实时传送的要求。
3.1 缓冲区半满存储算法
所谓缓冲区半满存储算法,就是在数据采集进程中,设置一个数据HFIFO 缓冲区指针。 缓冲区大小设置为8192 个字节。当PC104 总线上出现数据时,总线板中首先将接收到的数 据帧放入HFIFO 缓冲区。当HFIFO 达到半满时,就读出低位的4096 个字节的数据,读出 数据的同时,为HFIFO 腾出了空间,而总线板中接收到的数据帧继续放入HFIFO 缓冲区。 具体操作如下:
首先,将缓冲区分为以下 5 种状态:
状态 0 表HFIFO 空
状态1 表HFIFO 非空但不到半满
状态2 表HFIFO 达到或超过半满,但未到全满
状态3 表HFIFO 全满
状态4 其他数值 表未知状态,不应该出现
其次,对HFIFO 的状态进行判断:
a.当数据未达到缓冲区大小的一半时(即状态0 或状态1):此时返回,进行数据采 集。
b.当数据达到或超过缓冲区大小的一半但未到全满(即状态2):进程将先判断一下 HFIFO 状态,若为半满,就一次读出所有的4096 个字节的数据;若超过半满,但未全满, 此时只将低位4096 个字节的数据读出,原高位的数据前移,占据HFIFO 低位。再将读出的 所有数据直接保存到二进制文件中。
这里特别提出:由于多传感器探测系统采集时间较长或不受时间限制,软件设计中将采 集到的数据直接保存进文件,这就在存储工程中节省了大量的时间。另外,数据保存在二进 制文件中,能实现图像的实时显示。
c.当HFIFO 全满(即状态3):此时数据采集进程只要读空HFIFO 或达到用户指定的 个数就可返回。读数时分两批,先将低位的4096 个字节的数据读出,保存到二进制文件中;再将高位的数据全部读出,即读空HFIFO,紧接着前面的数据写入文件中。
分两批读数的优点在于以下两方面:1)缩短了一次读数的时间;2)低字节的数据读完 后,为HFIFO 腾出了空间,以便总线板中接收到的数据帧继续放入HFIFO 缓冲区,数据不 易丢失,保证了数据的完整性。
d.其他数值:表未知状态,不应该出现。在此不再详述。
3.2 多线程控制
由于测试系统是由多个探测模块构成传感器探测阵列。要对多路参数进行检测和控制, 为了降低整个系统的复杂度,实现图像实时传送,满足采集过程的高速要求和中断要求。还 要保证帧频达到或超过100Hz,需要数据采集控制软件具有多任务并行的能力,即设计多个 线程,并且由于完成的任务不同,各线程的设计也不尽相同。软件共设计包括数据采集线 程、控制线程、绘图线程,程序运行中最多时会出现几个线程并行运行的可能。为保证大量 数据的完整性以及纠错恢复功能,数据采集线程优先级高于控制线程。软件结构简图见图1。
如图 1 所示,HFIFO 缓冲区在状态2 时进入绘图线程1。
绘图线程 1:在绘图时要求先判断一下HFIFO 状态,若为半满,就读前4 帧即低位的 4096 个像素,然后立刻返回,进行绘图,绘图时只绘出第一帧,最后保存数据。 HFIFO 缓冲区在状态3 时进入绘图线程2。
绘图线程 2:读分两次读满8 帧即8192 个像素,然后立刻返回,进行绘图,绘图时也 只绘出第一帧,最后保存数据。绘图线程如图2 所示。
4 数据采集算法实现
本系统软件平台采用 Micro 公司的Microsoft Visual C# 2005,该平台具有界面友好、功 能强大、资源丰富等优点,完全面向对象的编程和消息处理。在典型的Microsoft Visual C# 2005 多线程程序中,使用主线程创建、显示并运行用户界面,在次线程中运行其它的对时 间要求很高的操作(如DAQ)。Microsoft Visual C# 2005 平台提供了两种在 Windows 的次线 程中运行代码的高级机制,分别是线程池(thread pools)和异步定时器(asynchronous timers)。
线程池适用于需要连续地执行多次或在循环中执行的任务,而异步定时器适用于在固定 时间间隔内执行的任务。由于试验中参数的采集和总线数据的收发是首要的任务,需要连续 地执行。因此,编程时采用线程池技术,在程序的主线程(数据采集线程)中创建线程池,控制线程、绘图线程都在线程池创建的次线程中运行。
具体程序中设置了数据采集线程函数 DataThread(),获得状态函数GetHFifoStatus()。在获 取HFIFO 状态中,用了4 个“Case: break;”语句来判断状态,从而进行循环。 当进入状态 2 和3 时,事件返回后便进入绘图线程,软件只设置GatherData()为绘图线 程函数。线程空闲时则进行图象的播放,数据优先保存,SaveData()为数据保存函数。
SaveData()函数中将采集到的数据以二进制形式直接保存到路径为:e.FileName 的文件中。 程序设计时采用直接指针方式,提高了传输数据的效率。
5 结语
本软件采用 Microsoft Visual C# 2005 开发平台,具有友好的用户界面,操作简单方便, 易于维护。该算法编程简单、计算量小、易于硬件实现,而且稳定性高;在使用过程中体现 了极强的实用性,满足了探测器阵列信号数据实时采集的要求。
实验证明:程序终端的显示窗口能实时显示采集到的激光光斑信息,能自动将其实时存 储到特定的文件夹内;并能随时回放上一次采集到的光信号的图像信息。如图3 所示: 实验中,本软件采集精度超过 50KHz,保证了所采数据的完整性与安全性,同时也验证了 本数据采集系统的无误传输及传输的实时性与高效性。
本文作者创新点:开创性的提出了缓冲区半满存储算法。将其与实时多任务控制方式相结合, 解决了实验中总线与计算机之间高速传输的矛盾,使数据采集具有可靠性、完整性、实时性 与高效性。
责任编辑:gt
全部0条评论
快来发表一下你的评论吧 !