作者:劉潔群,何楓,吳毅,侯再紅
1 引言
探測器陣列(Detector Arrays)測量系統(tǒng)中,為了精確測量一些光強(qiáng)信號,通常需要對傳感器輸出信號進(jìn)行高速、高分辨率采樣,并要求采集圖像實(shí)時(shí)顯示。從硬件要求來看,采用 的A/D 器件速率在800 MHz 以上,可實(shí)現(xiàn)數(shù)據(jù)的高速采集。同時(shí),數(shù)據(jù)存儲技術(shù)也正在不 斷完善和提高,存儲容量越來越大,在市場上已出現(xiàn)容量達(dá)1T byte 左右的硬盤。已有的 數(shù)據(jù)采集系統(tǒng)大多數(shù)采用基于PCI 總線的結(jié)構(gòu),但在對數(shù)據(jù)可靠性要求很高的情況下, 基于PCI 總線的數(shù)據(jù)采集系統(tǒng)的可靠性不能滿足要求。保證數(shù)據(jù)的可靠性與完整性的同時(shí), 實(shí)現(xiàn)數(shù)據(jù)的高速傳輸與實(shí)時(shí)顯示成為設(shè)計(jì)該數(shù)據(jù)采集系統(tǒng)的關(guān)鍵所在。
目前對數(shù)據(jù)采集的研究較多,但對高速數(shù)據(jù)采集的算法相對較少,也有一些對高速、高 分辨率數(shù)據(jù)采集的算法,但這些算法大多采取數(shù)據(jù)壓縮法,一般很難保證數(shù)據(jù)的完整性。 為此,本文在算法設(shè)計(jì)中提出了一種既能保證數(shù)據(jù)完整性與可靠性,又能實(shí)現(xiàn)高速大批量數(shù) 據(jù)的實(shí)時(shí)采集算法,從而解決此問題。
2 系統(tǒng)描述
在激光大氣傳輸實(shí)驗(yàn)中,光強(qiáng)測量系統(tǒng)由多傳感器探測陣列構(gòu)成。傳感器探測陣列共有1024 個(gè)探測單元。對于每個(gè)模塊,信號通過模擬開關(guān)送入數(shù)據(jù)采集卡,由計(jì)算機(jī)進(jìn)行處理。 在激光大氣傳輸實(shí)驗(yàn)中,對測量系統(tǒng)的穩(wěn)定性與可靠性要求極高。對數(shù)據(jù)采集軟件的性能及 指標(biāo)要求是:保證100Hz 幀頻下,數(shù)據(jù)采集不丟幀,圖像完整,無亂碼。
從技術(shù)角度看,目前PCI 總線最大數(shù)據(jù)傳輸速率可達(dá)133MB/s ,相對較高,但基于PCI 總線的數(shù)據(jù)采集系統(tǒng)的可靠性不能滿足要求,且100Hz 幀頻在現(xiàn)有的數(shù)據(jù)采集系統(tǒng)中已不 算高。為此,實(shí)驗(yàn)中采用一種專門為嵌入式控制而定義的工業(yè)控制總線——PC104 總線。此 總線以“針”和“孔”形式層疊連接,即PC104 總線模塊之間總線的連接是通過上層的針和下層 的孔相互咬和相連,這種層疊封裝有極好的抗震性。此總線雖滿足了可靠性的要求,然而它 的傳輸速率相對于PCI 總線卻大打折扣,造成PC104 總線與PC 機(jī)之間的傳輸速率受到限制。
3 數(shù)據(jù)采集算法設(shè)計(jì)
針對以上情況,本著在實(shí)驗(yàn)中數(shù)據(jù)采集具有實(shí)時(shí)性和不可重復(fù)性,如果出現(xiàn)暫時(shí)性溢出, 應(yīng)優(yōu)先保證數(shù)據(jù)的整體完整性的原則。
本數(shù)據(jù)采集軟件在設(shè)計(jì)中提出了緩沖區(qū)半滿存儲算法。此算法和現(xiàn)有數(shù)據(jù)采集系統(tǒng)中的 緩沖區(qū)算法、數(shù)據(jù)壓縮算法相比,其最大優(yōu)勢在于采到的數(shù)據(jù)不易丟失,更能保證數(shù)據(jù)的完 整性,且大大提高了PC104 總線與PC 機(jī)之間的傳輸速率。
同時(shí)軟件設(shè)計(jì)中使用實(shí)時(shí)多任務(wù)控制方式,并將采集到的數(shù)據(jù)以二進(jìn)制的形式直接保存 進(jìn)文件。這就不僅達(dá)到存儲量大、數(shù)據(jù)傳輸效率高的目的,而且滿足了圖像實(shí)時(shí)傳送的要求。
3.1 緩沖區(qū)半滿存儲算法
所謂緩沖區(qū)半滿存儲算法,就是在數(shù)據(jù)采集進(jìn)程中,設(shè)置一個(gè)數(shù)據(jù)HFIFO 緩沖區(qū)指針。 緩沖區(qū)大小設(shè)置為8192 個(gè)字節(jié)。當(dāng)PC104 總線上出現(xiàn)數(shù)據(jù)時(shí),總線板中首先將接收到的數(shù) 據(jù)幀放入HFIFO 緩沖區(qū)。當(dāng)HFIFO 達(dá)到半滿時(shí),就讀出低位的4096 個(gè)字節(jié)的數(shù)據(jù),讀出 數(shù)據(jù)的同時(shí),為HFIFO 騰出了空間,而總線板中接收到的數(shù)據(jù)幀繼續(xù)放入HFIFO 緩沖區(qū)。 具體操作如下:
首先,將緩沖區(qū)分為以下 5 種狀態(tài):
狀態(tài) 0 表HFIFO 空
狀態(tài)1 表HFIFO 非空但不到半滿
狀態(tài)2 表HFIFO 達(dá)到或超過半滿,但未到全滿
狀態(tài)3 表HFIFO 全滿
狀態(tài)4 其他數(shù)值 表未知狀態(tài),不應(yīng)該出現(xiàn)
其次,對HFIFO 的狀態(tài)進(jìn)行判斷:
a.當(dāng)數(shù)據(jù)未達(dá)到緩沖區(qū)大小的一半時(shí)(即狀態(tài)0 或狀態(tài)1):此時(shí)返回,進(jìn)行數(shù)據(jù)采 集。
b.當(dāng)數(shù)據(jù)達(dá)到或超過緩沖區(qū)大小的一半但未到全滿(即狀態(tài)2):進(jìn)程將先判斷一下 HFIFO 狀態(tài),若為半滿,就一次讀出所有的4096 個(gè)字節(jié)的數(shù)據(jù);若超過半滿,但未全滿, 此時(shí)只將低位4096 個(gè)字節(jié)的數(shù)據(jù)讀出,原高位的數(shù)據(jù)前移,占據(jù)HFIFO 低位。再將讀出的 所有數(shù)據(jù)直接保存到二進(jìn)制文件中。
這里特別提出:由于多傳感器探測系統(tǒng)采集時(shí)間較長或不受時(shí)間限制,軟件設(shè)計(jì)中將采 集到的數(shù)據(jù)直接保存進(jìn)文件,這就在存儲工程中節(jié)省了大量的時(shí)間。另外,數(shù)據(jù)保存在二進(jìn) 制文件中,能實(shí)現(xiàn)圖像的實(shí)時(shí)顯示。
c.當(dāng)HFIFO 全滿(即狀態(tài)3):此時(shí)數(shù)據(jù)采集進(jìn)程只要讀空HFIFO 或達(dá)到用戶指定的 個(gè)數(shù)就可返回。讀數(shù)時(shí)分兩批,先將低位的4096 個(gè)字節(jié)的數(shù)據(jù)讀出,保存到二進(jìn)制文件中;再將高位的數(shù)據(jù)全部讀出,即讀空HFIFO,緊接著前面的數(shù)據(jù)寫入文件中。
分兩批讀數(shù)的優(yōu)點(diǎn)在于以下兩方面:1)縮短了一次讀數(shù)的時(shí)間;2)低字節(jié)的數(shù)據(jù)讀完 后,為HFIFO 騰出了空間,以便總線板中接收到的數(shù)據(jù)幀繼續(xù)放入HFIFO 緩沖區(qū),數(shù)據(jù)不 易丟失,保證了數(shù)據(jù)的完整性。
d.其他數(shù)值:表未知狀態(tài),不應(yīng)該出現(xiàn)。在此不再詳述。
3.2 多線程控制
由于測試系統(tǒng)是由多個(gè)探測模塊構(gòu)成傳感器探測陣列。要對多路參數(shù)進(jìn)行檢測和控制, 為了降低整個(gè)系統(tǒng)的復(fù)雜度,實(shí)現(xiàn)圖像實(shí)時(shí)傳送,滿足采集過程的高速要求和中斷要求。還 要保證幀頻達(dá)到或超過100Hz,需要數(shù)據(jù)采集控制軟件具有多任務(wù)并行的能力,即設(shè)計(jì)多個(gè) 線程,并且由于完成的任務(wù)不同,各線程的設(shè)計(jì)也不盡相同。軟件共設(shè)計(jì)包括數(shù)據(jù)采集線 程、控制線程、繪圖線程,程序運(yùn)行中最多時(shí)會出現(xiàn)幾個(gè)線程并行運(yùn)行的可能。為保證大量 數(shù)據(jù)的完整性以及糾錯(cuò)恢復(fù)功能,數(shù)據(jù)采集線程優(yōu)先級高于控制線程。軟件結(jié)構(gòu)簡圖見圖1。
如圖 1 所示,HFIFO 緩沖區(qū)在狀態(tài)2 時(shí)進(jìn)入繪圖線程1。
繪圖線程 1:在繪圖時(shí)要求先判斷一下HFIFO 狀態(tài),若為半滿,就讀前4 幀即低位的 4096 個(gè)像素,然后立刻返回,進(jìn)行繪圖,繪圖時(shí)只繪出第一幀,最后保存數(shù)據(jù)。 HFIFO 緩沖區(qū)在狀態(tài)3 時(shí)進(jìn)入繪圖線程2。
繪圖線程 2:讀分兩次讀滿8 幀即8192 個(gè)像素,然后立刻返回,進(jìn)行繪圖,繪圖時(shí)也 只繪出第一幀,最后保存數(shù)據(jù)。繪圖線程如圖2 所示。
4 數(shù)據(jù)采集算法實(shí)現(xiàn)
本系統(tǒng)軟件平臺采用 Micro 公司的Microsoft Visual C# 2005,該平臺具有界面友好、功 能強(qiáng)大、資源豐富等優(yōu)點(diǎn),完全面向?qū)ο蟮?a target="_blank">編程和消息處理。在典型的Microsoft Visual C# 2005 多線程程序中,使用主線程創(chuàng)建、顯示并運(yùn)行用戶界面,在次線程中運(yùn)行其它的對時(shí) 間要求很高的操作(如DAQ)。Microsoft Visual C# 2005 平臺提供了兩種在 Windows 的次線 程中運(yùn)行代碼的高級機(jī)制,分別是線程池(thread pools)和異步定時(shí)器(asynchronous timers)。
線程池適用于需要連續(xù)地執(zhí)行多次或在循環(huán)中執(zhí)行的任務(wù),而異步定時(shí)器適用于在固定 時(shí)間間隔內(nèi)執(zhí)行的任務(wù)。由于試驗(yàn)中參數(shù)的采集和總線數(shù)據(jù)的收發(fā)是首要的任務(wù),需要連續(xù) 地執(zhí)行。因此,編程時(shí)采用線程池技術(shù),在程序的主線程(數(shù)據(jù)采集線程)中創(chuàng)建線程池,控制線程、繪圖線程都在線程池創(chuàng)建的次線程中運(yùn)行。
具體程序中設(shè)置了數(shù)據(jù)采集線程函數(shù) DataThread(),獲得狀態(tài)函數(shù)GetHFifoStatus()。在獲 取HFIFO 狀態(tài)中,用了4 個(gè)“Case: break;”語句來判斷狀態(tài),從而進(jìn)行循環(huán)。 當(dāng)進(jìn)入狀態(tài) 2 和3 時(shí),事件返回后便進(jìn)入繪圖線程,軟件只設(shè)置GatherData()為繪圖線 程函數(shù)。線程空閑時(shí)則進(jìn)行圖象的播放,數(shù)據(jù)優(yōu)先保存,SaveData()為數(shù)據(jù)保存函數(shù)。
SaveData()函數(shù)中將采集到的數(shù)據(jù)以二進(jìn)制形式直接保存到路徑為:e.FileName 的文件中。 程序設(shè)計(jì)時(shí)采用直接指針方式,提高了傳輸數(shù)據(jù)的效率。
5 結(jié)語
本軟件采用 Microsoft Visual C# 2005 開發(fā)平臺,具有友好的用戶界面,操作簡單方便, 易于維護(hù)。該算法編程簡單、計(jì)算量小、易于硬件實(shí)現(xiàn),而且穩(wěn)定性高;在使用過程中體現(xiàn) 了極強(qiáng)的實(shí)用性,滿足了探測器陣列信號數(shù)據(jù)實(shí)時(shí)采集的要求。
實(shí)驗(yàn)證明:程序終端的顯示窗口能實(shí)時(shí)顯示采集到的激光光斑信息,能自動(dòng)將其實(shí)時(shí)存 儲到特定的文件夾內(nèi);并能隨時(shí)回放上一次采集到的光信號的圖像信息。如圖3 所示: 實(shí)驗(yàn)中,本軟件采集精度超過 50KHz,保證了所采數(shù)據(jù)的完整性與安全性,同時(shí)也驗(yàn)證了 本數(shù)據(jù)采集系統(tǒng)的無誤傳輸及傳輸?shù)膶?shí)時(shí)性與高效性。
本文作者創(chuàng)新點(diǎn):開創(chuàng)性的提出了緩沖區(qū)半滿存儲算法。將其與實(shí)時(shí)多任務(wù)控制方式相結(jié)合, 解決了實(shí)驗(yàn)中總線與計(jì)算機(jī)之間高速傳輸?shù)拿?,使?shù)據(jù)采集具有可靠性、完整性、實(shí)時(shí)性 與高效性。
責(zé)任編輯:gt
-
傳感器
+關(guān)注
關(guān)注
2552文章
51288瀏覽量
755148 -
探測器
+關(guān)注
關(guān)注
14文章
2648瀏覽量
73128 -
總線
+關(guān)注
關(guān)注
10文章
2894瀏覽量
88218
發(fā)布評論請先 登錄
相關(guān)推薦
評論