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