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