新聞中心

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

用DLL實(shí)現(xiàn)自動(dòng)測(cè)試存儲(chǔ)數(shù)據(jù)的糾錯(cuò)處理

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

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

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

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

動(dòng)態(tài)鏈接庫(kù)(Dynamic Link Library, DLL)是基于Windows程序設(shè)計(jì)的一個(gè)非常重要的組成部分。當(dāng)應(yīng)用程序被裝入內(nèi)存并開(kā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)用程序外部的過(guò)程庫(kù),它可以從應(yīng)用程序中調(diào)用,在運(yùn)行時(shí)被動(dòng)態(tài)鏈接,。DLL的編制與具體的編程語(yǔ)言及編譯器無(wú)關(guān),只要遵守DLL的開(kāi)發(fā)規(guī)范和編程策略,并安排正確的調(diào)用接口,不管用何種編程語(yǔ)言編制的DLL都具有調(diào)用性。

3 測(cè)量返回結(jié)果的存儲(chǔ)和錯(cuò)位問(wèn)題

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




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



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

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



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



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





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

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



5結(jié)論

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


評(píng)論


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

關(guān)閉