專利名稱:多傳感器探測數(shù)組數(shù)據(jù)實(shí)時采集方法
技術(shù)領(lǐng)域:
本發(fā)明涉及一種數(shù)據(jù)實(shí)時采集算法設(shè)計,尤其是一種多傳感器探測數(shù)組數(shù)據(jù) 實(shí)時采集方法。
背景技術(shù):
在大氣傳輸實(shí)驗(yàn)中,要求用軟件準(zhǔn)確無誤的獲取多傳感器探測數(shù)組測試系統(tǒng) 的采樣數(shù)據(jù)。而此測試系統(tǒng)是由16個探測模塊構(gòu)成,每個模塊是由8行8列共 64個傳感器組成的探測數(shù)組,共有1024個探測單元。各個模塊的連接和控制如 附圖一所示。對于每個模塊,其上面的64個探測器都可以通過單片機(jī)進(jìn)行尋址。 然后依照單片機(jī)輸出給模擬開關(guān)的控制信號,選通對應(yīng)模塊,使該模塊的數(shù)據(jù)能 夠通過模擬開關(guān)送入數(shù)據(jù)采集卡,最后送入計算機(jī)進(jìn)行處理。
在實(shí)驗(yàn)中遇到的主要難點(diǎn)是數(shù)組模塊的輸出信號是模擬信號,所以必須進(jìn) 行A/D轉(zhuǎn)換,才能將信號錄入計算機(jī)?;诖?,采用PC104接口數(shù)據(jù)采集卡。 PC104接口的最大瓶頸是重復(fù)長時間使用時傳輸速率低,而實(shí)驗(yàn)的數(shù)據(jù)采集信息 量大,采集速度和實(shí)時性要求高,采集時間較長,且數(shù)據(jù)采集具有不可重復(fù)性, 并要求保證數(shù)據(jù)的完整性,顯然PC104接口難以滿足實(shí)驗(yàn)要求。如果不能實(shí)時、 高速、準(zhǔn)確而又完整的獲取實(shí)驗(yàn)中的數(shù)據(jù)信息,就會給大氣傳輸特性的研究造成 非常大的誤差,甚至?xí)斐烧麄€實(shí)驗(yàn)前功盡棄。
發(fā)明內(nèi)容
本發(fā)明的目的是提供一種多傳感器探測數(shù)組數(shù)據(jù)實(shí)時采集方法,通過采用 Microsoft Visual C#2005平臺在計算機(jī)中的編程,以解決采用PC104采集卡所導(dǎo) 致的數(shù)據(jù)傳輸速率無法滿足實(shí)驗(yàn)數(shù)據(jù)傳輸速率要求的問題。
為了達(dá)到上述目的,本發(fā)明所采用的技術(shù)方案為
一種多傳感器探測數(shù)組數(shù)據(jù)實(shí)時采集方法,其特征在于采用Microsoft Visual C#2005平臺在計算機(jī)中進(jìn)行編程,通過編程后的計算機(jī)對數(shù)據(jù)采集卡及 單片機(jī)進(jìn)行控制;編程時采用線程池技術(shù),在程序的數(shù)據(jù)采集線程中創(chuàng)建線程池, 控制線程、繪圖線程在線程池創(chuàng)建的次線程中運(yùn)行;
所述數(shù)據(jù)采集進(jìn)程中,設(shè)置一個數(shù)據(jù)HFIFO緩沖區(qū)指針,所述緩沖區(qū)大小為8192個字節(jié);當(dāng)總線上出現(xiàn)數(shù)據(jù)時,首先將接收到的數(shù)據(jù)幀放入HFIFO緩沖 區(qū);所述緩沖區(qū)分為5種狀態(tài)
0 表示HFIFO空;
1 表示HFIFO非空但不到半滿;
2 表示HFIFO達(dá)到或超過半滿,但未到全滿;
3 表示HFIFO全滿; 其它數(shù)值 表示未知狀態(tài),
當(dāng)數(shù)據(jù)未達(dá)到緩沖區(qū)大小的一半時,即狀態(tài)0和1:此時不產(chǎn)生數(shù)據(jù)采集事 件,數(shù)據(jù)將駐留在HFIFO緩沖區(qū)中,數(shù)據(jù)采集線程等待;
當(dāng)數(shù)據(jù)達(dá)到或超過緩沖區(qū)大小的一半但未全滿即狀態(tài)2:進(jìn)程將先判斷一下
HFIFO狀態(tài),若為半滿,就讀4096個數(shù);超過半滿,但未全滿,此時讀數(shù)分2 次,先將前4096個數(shù)讀出,再將后面的數(shù)據(jù)全部讀出,即讀空HFIFO;
當(dāng)HFIFO全滿即狀態(tài)3:此時數(shù)據(jù)采集進(jìn)程只要讀空HFIFO或達(dá)到用戶指 定的個數(shù)就可返回,讀數(shù)也分2次,先將前4096個數(shù)讀出,再讀空HFIFO;
其它數(shù)值表未知狀態(tài),不應(yīng)該出現(xiàn);
所述數(shù)據(jù)卡采集到的數(shù)據(jù)優(yōu)先保存,并以二進(jìn)制形式直接保存進(jìn)文件-, 繪圖線程分為第一繪圖線程、第二繪圖線程;
狀態(tài)2時進(jìn)入第一繪圖線程,在繪圖時要求先判斷一下HFIFO狀態(tài),若為 半滿,就讀前4幀即4096個像素,然后立刻返回,進(jìn)行繪圖,繪圖時只繪出第 一幀,最后保存;
狀態(tài)3時進(jìn)入第二繪圖線程,讀滿8幀即8192個像素,然后立刻返回,進(jìn)
行繪圖,繪圖時也只繪出第一幀,最后保存。
狀態(tài)2時分兩批讀數(shù)的優(yōu)點(diǎn)在于以下兩方面:第一,縮短了一次讀數(shù)的時間;
第二,低字節(jié)的數(shù)據(jù)讀完后,為HFIFO騰出了空間,以便總線板中接收到的數(shù)
據(jù)幀繼續(xù)放入HFIFO緩沖區(qū),數(shù)據(jù)不易丟失,保證了數(shù)據(jù)的完整性。
狀態(tài)3即為數(shù)據(jù)溢出的臨界狀態(tài),為保證既有數(shù)據(jù)的有效性,系統(tǒng)設(shè)計了數(shù) 據(jù)冗余,即使數(shù)據(jù)少量溢出,因?yàn)閿?shù)據(jù)快速轉(zhuǎn)移仍然可以保證數(shù)據(jù)可有效恢復(fù)。 經(jīng)測試,系統(tǒng)可在100K速率下得到完整數(shù)據(jù)。
由于測試系統(tǒng)是由16個探測模塊構(gòu)成傳感器探測數(shù)組。要對多路參數(shù)進(jìn)行 檢測和控制,為了降低整個系統(tǒng)的復(fù)雜度,實(shí)現(xiàn)數(shù)據(jù)采集的實(shí)時性和完整性。需要數(shù)據(jù)采集控制軟件具有多任務(wù)并行的能力,即設(shè)計多個線程,并且由于完成的 任務(wù)不同,各線程的設(shè)計也不盡相同。本發(fā)明軟件平臺采用Micro公司的 Microsoft Visual C# 2005,該平臺具有接口友好、功能強(qiáng)大、資源豐富等優(yōu)點(diǎn), 完全面向?qū)ο蟮木幊毯拖⑻幚怼\浖苍O(shè)計包括數(shù)據(jù)采集線程、控制線程、繪 圖線程,程序運(yùn)行中最多時會出現(xiàn)三個線程并行運(yùn)行的可能。
由于數(shù)據(jù)采集的要求高,為保證大量數(shù)據(jù)的完整性,數(shù)據(jù)采集線程優(yōu)先級高 于控制線程,并能保證糾錯恢復(fù)功能,還可滿足采集過程的高速要求和中斷要求。
由于多傳感器探測系統(tǒng)采樣數(shù)據(jù)信息量大、采集時間較長或不受時間限制, 不便于存儲和實(shí)時傳輸。軟件設(shè)計中將采集到的數(shù)據(jù)并不駐留在內(nèi)存中而是在第 一時間以二進(jìn)制的形式直接保存進(jìn)檔,這就解決了長時間數(shù)據(jù)采集的問題。
本發(fā)明采用Microsoft Visual C# 2005平臺設(shè)計了事件觸發(fā)與實(shí)時多任務(wù)相
結(jié)合的控制方式在實(shí)驗(yàn)開始前的空閑階段,主線程運(yùn)行,數(shù)據(jù)采集線程等待。
實(shí)驗(yàn)開始后,主線程在低優(yōu)先級下繼續(xù)運(yùn)行,數(shù)據(jù)采集線程轉(zhuǎn)入高優(yōu)先級運(yùn)行。 在數(shù)據(jù)采集算法設(shè)計中采用事件觸發(fā)方式。并充分利用數(shù)據(jù)采集卡提供的緩存 器,對數(shù)據(jù)進(jìn)行分時,集中傳遞,減少計算機(jī)與外設(shè)通行的次數(shù)。以實(shí)現(xiàn)實(shí)驗(yàn)中 數(shù)據(jù)采集的實(shí)時性控制,并使采集的數(shù)據(jù)具有高效性、完整性、高可靠性、實(shí)時 性等優(yōu)點(diǎn)。
圖1為探測模塊控制圖。
圖2為數(shù)據(jù)采集線程流程圖。 圖3為繪圖線程流程圖。
具體實(shí)施例方式
一種多傳感器探測數(shù)組數(shù)據(jù)實(shí)時采集算法設(shè)計方法,采用Microsoft Visual C#2005平臺在計算機(jī)中進(jìn)行編程,通過編程后的計算機(jī)對數(shù)據(jù)采集卡及單片機(jī) 進(jìn)行控制;編程時采用線程池技術(shù),在程序的數(shù)據(jù)采集線程中創(chuàng)建線程池,控制 線程、繪圖線程在線程池創(chuàng)建的次線程中運(yùn)行;所述數(shù)據(jù)卡采集到的數(shù)據(jù)優(yōu)先保 存,并以二進(jìn)制形式直接保存進(jìn)文件。
所述數(shù)據(jù)采集線程中,設(shè)置一個數(shù)據(jù)HFIFO緩沖區(qū)指針,所述緩沖區(qū)大小 為8192個字節(jié),所述緩沖區(qū)分為5種狀態(tài) 0 表示HFIFO空;1 表示HFIFO非空但不到半滿;
2 表示HFIFO達(dá)到或超過半滿,但未到全滿;
3 表示HFIFO全滿;
其它數(shù)值 表示未知狀態(tài);
所述數(shù)據(jù)采集線程程序代碼如下 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("采集結(jié)束,,,tae.Message,
〃 MessageBoxButtons.OK,MessageBoxIcon.Information); catch
MessageBox.Show("檢查采集設(shè)備電源,電源可能未打開!!", "釆集設(shè)備無法工作!!",
MessageBox.Buttons.OK,MessageBoxIcon.Error); GatherThread.Abort();
所述數(shù)據(jù)采集線程程序代碼中,DataThread()為數(shù)據(jù)采集線程函數(shù), GetHFifoStatus()為獲得狀態(tài)函數(shù)。
所述緩沖區(qū)為狀態(tài)2和狀態(tài)3時,事件返回后進(jìn)入繪圖線程,所述繪圖線程
程序代碼如下
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()為繪圖線程函數(shù)。
所述數(shù)據(jù)保存程序如下
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()函數(shù)為數(shù)據(jù)保存函數(shù),所述SaveData()函數(shù)中將采集到的數(shù)
據(jù)以二進(jìn)制形式直接保存到路徑為e.FileName的文件中。
在Microsoft Visual C# 2005多線程程序中,使用數(shù)據(jù)采集線程創(chuàng)建、顯示并
運(yùn)行用戶接口,在次線程中運(yùn)行其它的對時間要求很高的操作(如DAQ)。
Microsoft Visual C# 2005平臺提供了兩種在Windows的次線程中運(yùn)行代碼的高
級機(jī)制,分別是線程池(thread pools)和異歩定時器(asynchronous timers)。
線程池適用于需要連續(xù)地執(zhí)行多次或在循環(huán)中執(zhí)行的任務(wù),而異歩定時器適 用于在固定時間間隔內(nèi)執(zhí)行的任務(wù)。
由于試驗(yàn)中參數(shù)的采集和總線數(shù)據(jù)的收發(fā)是首要的任務(wù),需要連續(xù)地執(zhí)行。
8因此,編程時采用線程池技術(shù),在程序的主線程(數(shù)據(jù)采集線程)中創(chuàng)建線程池, 控制線程、繪圖線程都在線程池創(chuàng)建的次線程中運(yùn)行。具體程序中設(shè)置了數(shù)據(jù)采 集線程函數(shù)DataThread(),獲得狀態(tài)函數(shù)GetHFifoStatus()。在獲取HFIFO狀態(tài)中, 用了4個"Case: break;"語句來判斷狀態(tài),從而進(jìn)行循環(huán)。
當(dāng)進(jìn)入狀態(tài)2和3時,事件返回后便進(jìn)入繪圖線程,軟件只設(shè)置GatherData() 為繪圖線程函數(shù)。線程空閑時則進(jìn)行圖像的播放,數(shù)據(jù)優(yōu)先保存,SaveData()為 數(shù)據(jù)保存函數(shù)。SaveData()函數(shù)中將采集到的數(shù)據(jù)以二進(jìn)制形式直接保存到路徑 為e.FileName的文件中。程序設(shè)計時采用直接指標(biāo)方式,提高了傳輸數(shù)據(jù)的效 率。
權(quán)利要求
1、一種多傳感器探測數(shù)組數(shù)據(jù)實(shí)時采集方法,其特征在于采用MicrosoftVisual C#2005平臺在計算機(jī)中進(jìn)行編程,通過編程后的計算機(jī)對數(shù)據(jù)采集卡及單片機(jī)進(jìn)行控制;編程時采用線程池技術(shù),在程序的數(shù)據(jù)采集線程中創(chuàng)建線程池,控制線程、繪圖線程在線程池創(chuàng)建的次線程中運(yùn)行;所述數(shù)據(jù)采集進(jìn)程中,設(shè)置一個數(shù)據(jù)HFIFO緩沖區(qū)指針,所述緩沖區(qū)大小為8192個字節(jié);當(dāng)總線上出現(xiàn)數(shù)據(jù)時,首先將接收到的數(shù)據(jù)幀放入HFIFO緩沖區(qū);所述緩沖區(qū)分為5種狀態(tài)0 表示HFIFO空;1 表示HFIFO非空但不到半滿;2 表示HFIFO達(dá)到或超過半滿,但未到全滿;3 表示HFIFO全滿;其它數(shù)值 表示未知狀態(tài),當(dāng)數(shù)據(jù)未達(dá)到緩沖區(qū)大小的一半時,即狀態(tài)0和1此時不產(chǎn)生數(shù)據(jù)采集事件,數(shù)據(jù)將駐留在HFIFO緩沖區(qū)中,數(shù)據(jù)采集線程等待;當(dāng)數(shù)據(jù)達(dá)到或超過緩沖區(qū)大小的一半但未全滿即狀態(tài)2進(jìn)程將先判斷一下HFIFO狀態(tài),若為半滿,就讀4096個數(shù);超過半滿,但未全滿,此時讀數(shù)分2次,先將前4096個數(shù)讀出,再將后面的數(shù)據(jù)全部讀出,即讀空HFIFO;當(dāng)HFIFO全滿即狀態(tài)3此時數(shù)據(jù)采集進(jìn)程只要讀空HFIFO或達(dá)到用戶指定的個數(shù)就可返回,讀數(shù)也分2次,先將前4096個數(shù)讀出,再讀空HFIFO;其它數(shù)值表未知狀態(tài),不應(yīng)該出現(xiàn);所述數(shù)據(jù)卡采集到的數(shù)據(jù)優(yōu)先保存,并以二進(jìn)制形式直接保存進(jìn)文件;繪圖線程分為第一繪圖線程、第二繪圖線程;狀態(tài)2時進(jìn)入第一繪圖線程,在繪圖時要求先判斷一下HFIFO狀態(tài),若為半滿,就讀前4幀即4096個像素,然后立刻返回,進(jìn)行繪圖,繪圖時只繪出第一幀,最后保存;狀態(tài)3時進(jìn)入第二繪圖線程,讀滿8幀即8192個像素,然后立刻返回,進(jìn)行繪圖,繪圖時也只繪出第一幀,最后保存。
全文摘要
本發(fā)明涉及一種多傳感器探測數(shù)組數(shù)據(jù)實(shí)時采集方法,采用Microsoft VisualC#2005平臺在計算機(jī)中進(jìn)行編程,通過編程后的計算機(jī)對數(shù)據(jù)采集卡及單片機(jī)進(jìn)行控制;編程時采用線程池技術(shù),在程序的數(shù)據(jù)采集線程中創(chuàng)建線程池,控制線程、繪圖線程在線程池創(chuàng)建的次線程中運(yùn)行;所述數(shù)據(jù)卡采集到的數(shù)據(jù)優(yōu)先保存,并以二進(jìn)制形式直接保存進(jìn)文件。本發(fā)明充分利用數(shù)據(jù)采集卡提供的緩存器,對數(shù)據(jù)進(jìn)行分時·集中傳遞,減少計算機(jī)與外設(shè)通行的次數(shù)。以實(shí)現(xiàn)實(shí)驗(yàn)中數(shù)據(jù)采集的實(shí)時性控制,并使采集的數(shù)據(jù)具有高效性、完整性、高可靠性、實(shí)時性等優(yōu)點(diǎn)。
文檔編號G06F3/05GK101488074SQ20091011625
公開日2009年7月22日 申請日期2009年2月26日 優(yōu)先權(quán)日2009年2月26日
發(fā)明者楓 何, 侯再紅, 劉潔群, 毅 吳 申請人:中國科學(xué)院安徽光學(xué)精密機(jī)械研究所