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