用DLL實(shí)現自動(dòng)測試存儲數據的糾錯處理
在進(jìn)行文件存儲的過(guò)程中,因為某些因素可能會(huì )導致個(gè)別傳感器沒(méi)有返回信號,此時(shí)直接存儲必然會(huì )導致測量結果文件的數據混亂。為解決此問(wèn)題,本文提出通過(guò)調用DLL對測量結果的合理性進(jìn)行檢驗和處理。該研究可以有效避免發(fā)生大數據量下測量結果文件中的數據錯位現象,使得測試系統在獲得傳感信號同時(shí),還具有識別錯誤信號并進(jìn)行自動(dòng)處理的功能,提高了系統的可靠性。
2 LabVIEW與DLL接口技術(shù)
美國NI公司開(kāi)發(fā)的LabVIEW是一種功能強大的圖形化編程語(yǔ)言[3,4],用之來(lái)實(shí)現計算機對可編程儀器的控制[5],可以很大程度地提高編程效率。此外,由于LabVIEW所提供的圖標功能是有限的,實(shí)際系統中仍然有某些功能是無(wú)法或難以實(shí)現的。針對此問(wèn)題,LabVIEW提供了調用Windows動(dòng)態(tài)鏈接庫(DLL)函數的功能。從而可以彌補其自身的不足,實(shí)現更多、更強大的功能。
動(dòng)態(tài)鏈接庫(Dynamic Link Library, DLL)是基于Windows程序設計的一個(gè)非常重要的組成部分。當應用程序被裝入內存并開(kāi)始運行時(shí),在Windows的管理下,在應用程序與相應的DLL之間建立鏈接關(guān)系。當要執行DLL中的函數時(shí),根據鏈接產(chǎn)生重定位信息,Windows轉去執行DLL中相應的函數代碼。因而,DLL是一個(gè)位于應用程序外部的過(guò)程庫,它可以從應用程序中調用,在運行時(shí)被動(dòng)態(tài)鏈接,。DLL的編制與具體的編程語(yǔ)言及編譯器無(wú)關(guān),只要遵守DLL的開(kāi)發(fā)規范和編程策略,并安排正確的調用接口,不管用何種編程語(yǔ)言編制的DLL都具有調用性。
3 測量返回結果的存儲和錯位問(wèn)題
通過(guò)在LabVIEW中開(kāi)發(fā)測試控制軟件,可以控制光纖光柵測量?jì)x器按預定程序自動(dòng)執行測量工作。在計算機控制軟件中發(fā)出遠程測量命令“:MEAS:ARR:POW:WAV?”[6]后,儀器返回的結果如圖1所示,其中的第一個(gè)值為返回波長(cháng)的個(gè)數,后面為相應的光纖光柵反射波長(cháng)值。在所有光柵傳感器都完好且能返回傳感數據的情況下,可以直接將測量結果保存分析。測量結果文件如圖2所示,每行測量結果包括進(jìn)行測量的日期、時(shí)間,峰值波長(cháng)個(gè)數及各個(gè)返回峰值波長(cháng)值。

在保存的EXCEL文件中,每次測量結果存為一行,執行一次測量,存入一行數據,每列數據對應一個(gè)光柵傳感器。但在實(shí)際工程應用中,由于某些因素可能使得其中某個(gè)光柵傳感器沒(méi)有返回傳感信號,此時(shí)若將測量返回結果直接寫(xiě)入EXCEL文件的一行中,就會(huì )使該光柵之后的數據錯位,不能對應其應該所處的列,尤其在數據量眾多的情況下,更會(huì )造成測量結果的混亂,如圖3所示。為解決此問(wèn)題,需對每次返回的測量結果進(jìn)行分析,若出現上述情況,則在無(wú)信號光柵位置數據補零。

4 利用DLL實(shí)現對返回數據的合理性檢驗和自動(dòng)處理
為實(shí)現對測量數據的檢驗和處理,在VC++6.0編程環(huán)境下開(kāi)發(fā)Win32 DLL。一個(gè)完整的DLL項目需要模塊定義文件,用戶(hù)程序頭文件和C++源程序文件。模板定義文件名后綴為def,是由一個(gè)或多個(gè)用于描述DLL屬性的語(yǔ)句組成的文本文件。在模板定義文件中,LIBRARY聲明庫文件名check;EXPORTS聲明中列出了DLL中輸出函數的名稱(chēng)modifyResult,如下所示:

頭文件中包含用戶(hù)所要輸出的所有函數,每個(gè)輸出函數前都要有關(guān)鍵字_declspec (dllexport)。頭文件是可選的,若用戶(hù)把其內容放在源程序文件中,作為源程序的一部分,則可省去頭文件。

源程序文件對modifyResult函數進(jìn)行實(shí)現。該函數的三個(gè)參數的含義分別是:previousData數組存放每個(gè)光纖光柵傳感器的上次測量結果;maxDifference數組存放每個(gè)傳感器本次測量結果與其上次測量結果允許的最大差值;currentData存放本次測量結果。對于第i個(gè)數據,如果|currentData-previousData|>maxDifference,則認為其是第i+1個(gè)傳感器返回的數據,第i個(gè)傳感器沒(méi)有返回數據,應該在該位置補0,主要算法如下:


在LabVIEW中,用戶(hù)對DLL的調用,可通過(guò)LabVIEW提供的調用庫函數[7](Call Library Function)來(lái)實(shí)現。對CLF節點(diǎn)的配置情況如圖4所示,在所顯示的對話(huà)框中輸入庫文件名、所調用函數名、調用規程以及函數的返回類(lèi)型、所有輸入參數及其數據類(lèi)型。
在配置好CLF節點(diǎn)后,即可在LabVIEW程序中進(jìn)行直接應用。圖5所示為由測試儀器串口通信→字符串轉換→調用CLF節點(diǎn)處理數據→文件存儲的測量結果的完整處理過(guò)程。在所有光纖光柵傳感器都完好的情況下,由串口通信模塊讀出的結果在轉換為數值型數據后可以直接存儲或顯示。然而若返回波長(cháng)數N小于初始個(gè)數N0,則說(shuō)明有傳感器無(wú)返回數據,此時(shí)可以通過(guò)調用庫函數CLF節點(diǎn)調用包含有處理函數的DLL,對返回數據進(jìn)行檢驗處理,在無(wú)返回信號光柵相應位置補零,從而保證后續數據與其正確位置的對應,然后再進(jìn)入文件存儲或顯示模塊。

5結論
本文的創(chuàng )新點(diǎn)在于通過(guò)CLF節點(diǎn)調用DLL,對通過(guò)LabVIEW獲取的多波長(cháng)計測量結果進(jìn)行分析處理,避免發(fā)生大數據量下測量結果文件中的數據錯位現象。由于DLL只有在程序執行時(shí)才將代碼載入內存,并且多個(gè)程序使用相同的DLL時(shí),內存中只裝載一次,所以在LabVIEW開(kāi)發(fā)中使用DLL,可以使代碼更簡(jiǎn)潔,內存資源的使用更經(jīng)濟。用戶(hù)只要編寫(xiě)一次DLL,就可以多次調用。實(shí)驗證明:這種方法簡(jiǎn)單、方便、可滿(mǎn)足測試要求。
評論