新聞中心

EEPW首頁 > 測試測量 > 設(shè)計(jì)應(yīng)用 > 用DLL實(shí)現(xiàn)自動測試存儲數(shù)據(jù)的糾錯處理

用DLL實(shí)現(xiàn)自動測試存儲數(shù)據(jù)的糾錯處理

作者: 時(shí)間:2017-02-27 來源:網(wǎng)絡(luò) 收藏
光纖光柵傳感器具有波長編碼特性,不受光源功率波動和系統(tǒng)損耗的影響,因而在傳感領(lǐng)域得到了廣泛的應(yīng)用[1,2]。多波長計(jì)是一種能對光纖光反射波長進(jìn)行測試的儀器,可以實(shí)現(xiàn)對光柵傳感陣列的一次性測量,但其測量數(shù)據(jù)靠人工讀取,不便于實(shí)際應(yīng)用。采用LabVIEW儀器控制技術(shù)對多波長計(jì)串口進(jìn)行了開發(fā),通過在軟件中執(zhí)行遠(yuǎn)程命令控制儀器進(jìn)行測量,并將測量結(jié)果自動存入指定的EXCEL文件中。

在進(jìn)行文件存儲的過程中,因?yàn)槟承┮蛩乜赡軙?dǎo)致個(gè)別傳感器沒有返回信號,此時(shí)直接存儲必然會導(dǎo)致測量結(jié)果文件的數(shù)據(jù)混亂。為解決此問題,本文提出通過調(diào)用DLL對測量結(jié)果的合理性進(jìn)行檢驗(yàn)和處理。該研究可以有效避免發(fā)生大數(shù)據(jù)量下測量結(jié)果文件中的數(shù)據(jù)錯位現(xiàn)象,使得測試系統(tǒng)在獲得傳感信號同時(shí),還具有識別錯誤信號并進(jìn)行自動處理的功能,提高了系統(tǒng)的可靠性。

2 LabVIEW與DLL接口技術(shù)

美國NI公司開發(fā)的LabVIEW是一種功能強(qiáng)大的圖形化編程語言[3,4],用之來實(shí)現(xiàn)計(jì)算機(jī)對可編程儀器的控制[5],可以很大程度地提高編程效率。此外,由于LabVIEW所提供的圖標(biāo)功能是有限的,實(shí)際系統(tǒng)中仍然有某些功能是無法或難以實(shí)現(xiàn)的。針對此問題,LabVIEW提供了調(diào)用Windows動態(tài)鏈接庫(DLL)函數(shù)的功能。從而可以彌補(bǔ)其自身的不足,實(shí)現(xiàn)更多、更強(qiáng)大的功能。

動態(tài)鏈接庫(Dynamic Link Library, DLL)是基于Windows程序設(shè)計(jì)的一個(gè)非常重要的組成部分。當(dāng)應(yīng)用程序被裝入內(nèi)存并開始運(yùn)行時(shí),在Windows的管理下,在應(yīng)用程序與相應(yīng)的DLL之間建立鏈接關(guān)系。當(dāng)要執(zhí)行DLL中的函數(shù)時(shí),根據(jù)鏈接產(chǎn)生重定位信息,Windows轉(zhuǎn)去執(zhí)行DLL中相應(yīng)的函數(shù)代碼。因而,DLL是一個(gè)位于應(yīng)用程序外部的過程庫,它可以從應(yīng)用程序中調(diào)用,在運(yùn)行時(shí)被動態(tài)鏈接,。DLL的編制與具體的編程語言及編譯器無關(guān),只要遵守DLL的開發(fā)規(guī)范和編程策略,并安排正確的調(diào)用接口,不管用何種編程語言編制的DLL都具有調(diào)用性。

3 測量返回結(jié)果的存儲和錯位問題

通過在LabVIEW中開發(fā)測試控制軟件,可以控制光纖光柵測量儀器按預(yù)定程序自動執(zhí)行測量工作。在計(jì)算機(jī)控制軟件中發(fā)出遠(yuǎn)程測量命令“:MEAS:ARR:POW:WAV?”[6]后,儀器返回的結(jié)果如圖1所示,其中的第一個(gè)值為返回波長的個(gè)數(shù),后面為相應(yīng)的光纖光柵反射波長值。在所有光柵傳感器都完好且能返回傳感數(shù)據(jù)的情況下,可以直接將測量結(jié)果保存分析。測量結(jié)果文件如圖2所示,每行測量結(jié)果包括進(jìn)行測量的日期、時(shí)間,峰值波長個(gè)數(shù)及各個(gè)返回峰值波長值。




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



4 利用DLL實(shí)現(xiàn)對返回?cái)?shù)據(jù)的合理性檢驗(yàn)和自動處理

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



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



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





在LabVIEW中,用戶對DLL的調(diào)用,可通過LabVIEW提供的調(diào)用庫函數(shù)[7](Call Library Function)來實(shí)現(xiàn)。對CLF節(jié)點(diǎn)的配置情況如圖4所示,在所顯示的對話框中輸入庫文件名、所調(diào)用函數(shù)名、調(diào)用規(guī)程以及函數(shù)的返回類型、所有輸入?yún)?shù)及其數(shù)據(jù)類型。

在配置好CLF節(jié)點(diǎn)后,即可在LabVIEW程序中進(jìn)行直接應(yīng)用。圖5所示為由測試儀器串口通信→字符串轉(zhuǎn)換→調(diào)用CLF節(jié)點(diǎn)處理數(shù)據(jù)→文件存儲的測量結(jié)果的完整處理過程。在所有光纖光柵傳感器都完好的情況下,由串口通信模塊讀出的結(jié)果在轉(zhuǎn)換為數(shù)值型數(shù)據(jù)后可以直接存儲或顯示。然而若返回波長數(shù)N小于初始個(gè)數(shù)N0,則說明有傳感器無返回?cái)?shù)據(jù),此時(shí)可以通過調(diào)用庫函數(shù)CLF節(jié)點(diǎn)調(diào)用包含有處理函數(shù)的DLL,對返回?cái)?shù)據(jù)進(jìn)行檢驗(yàn)處理,在無返回信號光柵相應(yīng)位置補(bǔ)零,從而保證后續(xù)數(shù)據(jù)與其正確位置的對應(yīng),然后再進(jìn)入文件存儲或顯示模塊。



5結(jié)論

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


評論


技術(shù)專區(qū)

關(guān)閉