多传感器探测数组数据实时采集方法

文档序号:6576818阅读:292来源:国知局
专利名称:多传感器探测数组数据实时采集方法
技术领域
本发明涉及一种数据实时采集算法设计,尤其是一种多传感器探测数组数据 实时采集方法。
背景技术
在大气传输实验中,要求用软件准确无误的获取多传感器探测数组测试系统 的采样数据。而此测试系统是由16个探测模块构成,每个模块是由8行8列共 64个传感器组成的探测数组,共有1024个探测单元。各个模块的连接和控制如 附图一所示。对于每个模块,其上面的64个探测器都可以通过单片机进行寻址。 然后依照单片机输出给模拟开关的控制信号,选通对应模块,使该模块的数据能 够通过模拟开关送入数据采集卡,最后送入计算机进行处理。
在实验中遇到的主要难点是数组模块的输出信号是模拟信号,所以必须进 行A/D转换,才能将信号录入计算机。基于此,采用PC104接口数据采集卡。 PC104接口的最大瓶颈是重复长时间使用时传输速率低,而实验的数据采集信息 量大,采集速度和实时性要求高,采集时间较长,且数据采集具有不可重复性, 并要求保证数据的完整性,显然PC104接口难以满足实验要求。如果不能实时、 高速、准确而又完整的获取实验中的数据信息,就会给大气传输特性的研究造成 非常大的误差,甚至会造成整个实验前功尽弃。

发明内容
本发明的目的是提供一种多传感器探测数组数据实时采集方法,通过采用 Microsoft Visual C#2005平台在计算机中的编程,以解决采用PC104采集卡所导 致的数据传输速率无法满足实验数据传输速率要求的问题。
为了达到上述目的,本发明所采用的技术方案为
一种多传感器探测数组数据实时采集方法,其特征在于采用Microsoft Visual C#2005平台在计算机中进行编程,通过编程后的计算机对数据采集卡及 单片机进行控制;编程时采用线程池技术,在程序的数据采集线程中创建线程池, 控制线程、绘图线程在线程池创建的次线程中运行;
所述数据采集进程中,设置一个数据HFIFO缓冲区指针,所述缓冲区大小为8192个字节;当总线上出现数据时,首先将接收到的数据帧放入HFIFO缓冲 区;所述缓冲区分为5种状态
0 表示HFIFO空;
1 表示HFIFO非空但不到半满;
2 表示HFIFO达到或超过半满,但未到全满;
3 表示HFIFO全满; 其它数值 表示未知状态,
当数据未达到缓冲区大小的一半时,即状态0和1:此时不产生数据采集事 件,数据将驻留在HFIFO缓冲区中,数据采集线程等待;
当数据达到或超过缓冲区大小的一半但未全满即状态2:进程将先判断一下
HFIFO状态,若为半满,就读4096个数;超过半满,但未全满,此时读数分2 次,先将前4096个数读出,再将后面的数据全部读出,即读空HFIFO;
当HFIFO全满即状态3:此时数据采集进程只要读空HFIFO或达到用户指 定的个数就可返回,读数也分2次,先将前4096个数读出,再读空HFIFO;
其它数值表未知状态,不应该出现;
所述数据卡采集到的数据优先保存,并以二进制形式直接保存进文件-, 绘图线程分为第一绘图线程、第二绘图线程;
状态2时进入第一绘图线程,在绘图时要求先判断一下HFIFO状态,若为 半满,就读前4帧即4096个像素,然后立刻返回,进行绘图,绘图时只绘出第 一帧,最后保存;
状态3时进入第二绘图线程,读满8帧即8192个像素,然后立刻返回,进
行绘图,绘图时也只绘出第一帧,最后保存。
状态2时分两批读数的优点在于以下两方面:第一,縮短了一次读数的时间;
第二,低字节的数据读完后,为HFIFO腾出了空间,以便总线板中接收到的数
据帧继续放入HFIFO缓冲区,数据不易丢失,保证了数据的完整性。
状态3即为数据溢出的临界状态,为保证既有数据的有效性,系统设计了数 据冗余,即使数据少量溢出,因为数据快速转移仍然可以保证数据可有效恢复。 经测试,系统可在100K速率下得到完整数据。
由于测试系统是由16个探测模块构成传感器探测数组。要对多路参数进行 检测和控制,为了降低整个系统的复杂度,实现数据采集的实时性和完整性。需要数据采集控制软件具有多任务并行的能力,即设计多个线程,并且由于完成的 任务不同,各线程的设计也不尽相同。本发明软件平台采用Micro公司的 Microsoft Visual C# 2005,该平台具有接口友好、功能强大、资源丰富等优点, 完全面向对象的编程和消息处理。软件共设计包括数据采集线程、控制线程、绘 图线程,程序运行中最多时会出现三个线程并行运行的可能。
由于数据采集的要求高,为保证大量数据的完整性,数据采集线程优先级高 于控制线程,并能保证纠错恢复功能,还可满足采集过程的高速要求和中断要求。
由于多传感器探测系统采样数据信息量大、采集时间较长或不受时间限制, 不便于存储和实时传输。软件设计中将采集到的数据并不驻留在内存中而是在第 一时间以二进制的形式直接保存进檔,这就解决了长时间数据采集的问题。
本发明采用Microsoft Visual C# 2005平台设计了事件触发与实时多任务相
结合的控制方式在实验开始前的空闲阶段,主线程运行,数据采集线程等待。
实验开始后,主线程在低优先级下继续运行,数据采集线程转入高优先级运行。 在数据采集算法设计中采用事件触发方式。并充分利用数据采集卡提供的缓存 器,对数据进行分时,集中传递,减少计算机与外设通行的次数。以实现实验中 数据采集的实时性控制,并使采集的数据具有高效性、完整性、高可靠性、实时 性等优点。


图1为探测模块控制图。
图2为数据采集线程流程图。 图3为绘图线程流程图。
具体实施例方式
一种多传感器探测数组数据实时采集算法设计方法,采用Microsoft Visual C#2005平台在计算机中进行编程,通过编程后的计算机对数据采集卡及单片机 进行控制;编程时采用线程池技术,在程序的数据采集线程中创建线程池,控制 线程、绘图线程在线程池创建的次线程中运行;所述数据卡采集到的数据优先保 存,并以二进制形式直接保存进文件。
所述数据采集线程中,设置一个数据HFIFO缓冲区指针,所述缓冲区大小 为8192个字节,所述缓冲区分为5种状态 0 表示HFIFO空;1 表示HFIFO非空但不到半满;
2 表示HFIFO达到或超过半满,但未到全满;
3 表示HFIFO全满;
其它数值 表示未知状态;
所述数据采集线程程序代码如下 unsafe void DataThread()
card.DisableAD();
card.ClearHFifo();
card.EnableAD(); try
while(state)
switch(card.GetHFifoStatus())
break; C3scl:
break; case2:
try
this.GatherData(l);
catch { break; C3se3: try
this.GatherData(2);
catch
break; default:
Console. WriteLine("test"); break;
catch(ThreadAbortException tae){ 一 〃 MessageBox.Show("采集结束,,,tae.Message,
〃 MessageBoxButtons.OK,MessageBoxIcon.Information); catch
MessageBox.Show("检查采集设备电源,电源可能未打开!!", "釆集设备无法工作!!",
MessageBox.Buttons.OK,MessageBoxIcon.Error); GatherThread.Abort();
所述数据采集线程程序代码中,DataThread()为数据采集线程函数, GetHFifoStatus()为获得状态函数。
所述缓冲区为状态2和状态3时,事件返回后进入绘图线程,所述绘图线程
程序代码如下
unsafe void GatherData(int status)
int size=4096*status;
Intl6*p=stackalloc Intl6[size]; 〃8k
card.GatherHFifoData(p,(UInt32)status,8192);
bool bb二false;
if(bq)
bb=true; bq二false;
else
bb二false;
byte[ ] nData=this.MakeData(p,bb);〃DataIO.cs byte[,] picData=this.BufferData(nData); Bitmap bm=this.MakePic(picData); int y;
y=this.menuStripl .Size.Height; this.pictureBoxl .Image=bm; if(this.OnSaveData !=null)
{
this.OnSaveData(this,
new SaveDataEventArgs(new IntPtr(p),this.filName,status));20 所述GatherData()为绘图线程函数。
所述数据保存程序如下
unsafe protected void SaveData(object sender,SaveDataEventArgs e) 〃资料
保存
Intl6*p=(Intl6*)e.ResultAddr;
String fn=this.myDir+@ "\"+e.FileName
Console. WriteLine(e.Status);
try
Filelnfo fi=new Filelnfo(fn); using(FileStream fs=fi.Open(FileMode.Append,
FileAccess.Write))
using(Bingary Writer bw=new Binary Writer(fs)) for(int i=0;i<4096*e.Status;i++) bw,Write(p[i]);
catch(Exception ex)
Console.WriteLine(ex.Message);
所述SaveData()函数为数据保存函数,所述SaveData()函数中将采集到的数
据以二进制形式直接保存到路径为e.FileName的文件中。
在Microsoft Visual C# 2005多线程程序中,使用数据采集线程创建、显示并
运行用户接口,在次线程中运行其它的对时间要求很高的操作(如DAQ)。
Microsoft Visual C# 2005平台提供了两种在Windows的次线程中运行代码的高
级机制,分别是线程池(thread pools)和异歩定时器(asynchronous timers)。
线程池适用于需要连续地执行多次或在循环中执行的任务,而异歩定时器适 用于在固定时间间隔内执行的任务。
由于试验中参数的采集和总线数据的收发是首要的任务,需要连续地执行。
8因此,编程时采用线程池技术,在程序的主线程(数据采集线程)中创建线程池, 控制线程、绘图线程都在线程池创建的次线程中运行。具体程序中设置了数据采 集线程函数DataThread(),获得状态函数GetHFifoStatus()。在获取HFIFO状态中, 用了4个"Case: break;"语句来判断状态,从而进行循环。
当进入状态2和3时,事件返回后便进入绘图线程,软件只设置GatherData() 为绘图线程函数。线程空闲时则进行图像的播放,数据优先保存,SaveData()为 数据保存函数。SaveData()函数中将采集到的数据以二进制形式直接保存到路径 为e.FileName的文件中。程序设计时采用直接指标方式,提高了传输数据的效 率。
权利要求
1、一种多传感器探测数组数据实时采集方法,其特征在于采用MicrosoftVisual C#2005平台在计算机中进行编程,通过编程后的计算机对数据采集卡及单片机进行控制;编程时采用线程池技术,在程序的数据采集线程中创建线程池,控制线程、绘图线程在线程池创建的次线程中运行;所述数据采集进程中,设置一个数据HFIFO缓冲区指针,所述缓冲区大小为8192个字节;当总线上出现数据时,首先将接收到的数据帧放入HFIFO缓冲区;所述缓冲区分为5种状态0 表示HFIFO空;1 表示HFIFO非空但不到半满;2 表示HFIFO达到或超过半满,但未到全满;3 表示HFIFO全满;其它数值 表示未知状态,当数据未达到缓冲区大小的一半时,即状态0和1此时不产生数据采集事件,数据将驻留在HFIFO缓冲区中,数据采集线程等待;当数据达到或超过缓冲区大小的一半但未全满即状态2进程将先判断一下HFIFO状态,若为半满,就读4096个数;超过半满,但未全满,此时读数分2次,先将前4096个数读出,再将后面的数据全部读出,即读空HFIFO;当HFIFO全满即状态3此时数据采集进程只要读空HFIFO或达到用户指定的个数就可返回,读数也分2次,先将前4096个数读出,再读空HFIFO;其它数值表未知状态,不应该出现;所述数据卡采集到的数据优先保存,并以二进制形式直接保存进文件;绘图线程分为第一绘图线程、第二绘图线程;状态2时进入第一绘图线程,在绘图时要求先判断一下HFIFO状态,若为半满,就读前4帧即4096个像素,然后立刻返回,进行绘图,绘图时只绘出第一帧,最后保存;状态3时进入第二绘图线程,读满8帧即8192个像素,然后立刻返回,进行绘图,绘图时也只绘出第一帧,最后保存。
全文摘要
本发明涉及一种多传感器探测数组数据实时采集方法,采用Microsoft VisualC#2005平台在计算机中进行编程,通过编程后的计算机对数据采集卡及单片机进行控制;编程时采用线程池技术,在程序的数据采集线程中创建线程池,控制线程、绘图线程在线程池创建的次线程中运行;所述数据卡采集到的数据优先保存,并以二进制形式直接保存进文件。本发明充分利用数据采集卡提供的缓存器,对数据进行分时·集中传递,减少计算机与外设通行的次数。以实现实验中数据采集的实时性控制,并使采集的数据具有高效性、完整性、高可靠性、实时性等优点。
文档编号G06F3/05GK101488074SQ20091011625
公开日2009年7月22日 申请日期2009年2月26日 优先权日2009年2月26日
发明者枫 何, 侯再红, 刘洁群, 毅 吴 申请人:中国科学院安徽光学精密机械研究所
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1