技術(shù)頻道

娓娓工業(yè)
您現(xiàn)在的位置: 中國(guó)傳動(dòng)網(wǎng) > 技術(shù)頻道 > 應(yīng)用方案 > 動(dòng)態(tài)鏈接庫(kù)在LabVIEW中的高級(jí)應(yīng)用

動(dòng)態(tài)鏈接庫(kù)在LabVIEW中的高級(jí)應(yīng)用

時(shí)間:2008-08-25 15:03:00來(lái)源:ronggang

導(dǎo)語(yǔ):?LabVIEW中的提供了調(diào)用共享庫(kù)函數(shù)的接口,但是一些現(xiàn)成的函數(shù)庫(kù)卻因?yàn)榻涌趨?shù)類(lèi)型不同而不能在LabVIEW中使用。利用重新編寫(xiě)動(dòng)態(tài)鏈接庫(kù)的方法可以建立舊函數(shù)庫(kù)與LabVIEW聯(lián)系的通道,提高現(xiàn)有資源的利用率
摘 要:LabVIEW中的提供了調(diào)用共享庫(kù)函數(shù)的接口,但是一些現(xiàn)成的函數(shù)庫(kù)卻因?yàn)榻涌趨?shù)類(lèi)型不同而不能在LabVIEW中使用。利用重新編寫(xiě)動(dòng)態(tài)鏈接庫(kù)的方法可以建立舊函數(shù)庫(kù)與LabVIEW聯(lián)系的通道,提高現(xiàn)有資源的利用率。本文以SDK2000圖像采集卡為例,介紹具體的實(shí)現(xiàn)過(guò)程。 關(guān)鍵字:LabVIEW;動(dòng)態(tài)鏈接庫(kù);CLF節(jié)點(diǎn) 1. 引言   實(shí)驗(yàn)室虛擬儀器工作平臺(tái)是美國(guó)國(guó)家儀器公司研制的一種通用程序開(kāi)發(fā)系統(tǒng),以其強(qiáng)大的數(shù)據(jù)采集、數(shù)據(jù)處理、數(shù)據(jù)分析和儀器控制功能在現(xiàn)代測(cè)控領(lǐng)域中得到了廣泛的應(yīng)用。NI公司在推出LabVIEW語(yǔ)言同時(shí),也推出了一系列的數(shù)據(jù)采集卡,但實(shí)際應(yīng)用中往往會(huì)用到第三方廠家生產(chǎn)DAQ卡,在這種情況下就需要使用LabVIEW提供的外部程序接口。   LabVIEW的“調(diào)用函數(shù)庫(kù)節(jié)點(diǎn)(CLF節(jié)點(diǎn))”提供了調(diào)用標(biāo)準(zhǔn)函數(shù)和用戶自定義函數(shù)的通用方法,對(duì)于LabVIEW不支持的硬件設(shè)備大部分采用這種方法進(jìn)行驅(qū)動(dòng)。但是CLF節(jié)點(diǎn)也存在不足,使用中遇到最多的問(wèn)題是參數(shù)類(lèi)型不匹配。使用重寫(xiě)動(dòng)態(tài)鏈接庫(kù)的方法,一方面可以兼容舊函數(shù)庫(kù)的參數(shù)類(lèi)型,另一方發(fā)面可以獲得LabVIEW提供的高級(jí)函數(shù)庫(kù)應(yīng)用。以下以SDK2000圖像采集卡為例,介紹重寫(xiě)函數(shù)庫(kù)的基本原理和程序編寫(xiě)過(guò)程。 2. 實(shí)現(xiàn)方案及方案論證   SDK2000圖像采集卡提供的Visual C++ IDE 程序開(kāi)發(fā)包包含了外部程序調(diào)用的共享函數(shù)庫(kù),但是有些函數(shù)不能直接用CLF節(jié)點(diǎn)進(jìn)行調(diào)用。主要有兩個(gè)原因:庫(kù)函數(shù)的參數(shù)類(lèi)型與LabVIEW不兼容;圖形化語(yǔ)言對(duì)于一些底層操作不易實(shí)現(xiàn)。SDK2000圖像采集卡提供的庫(kù)函數(shù)含有LabVIEW不支持的數(shù)據(jù)類(lèi)型,并且很多函數(shù)涉及到一些底層操作,如文件讀取和內(nèi)存管理。為了正確調(diào)用函數(shù)并返回有效數(shù)據(jù),解決這兩個(gè)問(wèn)題是關(guān)鍵。   LabVIEW僅提供最基本的數(shù)據(jù)類(lèi)型,雖然可以在CLF節(jié)點(diǎn)參數(shù)設(shè)置中選擇“Adapt toType”,但只能夠傳遞LabVIEW內(nèi)部使用的參數(shù)類(lèi)型而已,而共享庫(kù)函數(shù)使用上百種非標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型。參數(shù)類(lèi)型不匹配可分為兩種情況:   ● 非標(biāo)準(zhǔn)數(shù)據(jù)類(lèi)型定義。很多程序和函數(shù)用到一些非標(biāo)準(zhǔn)的類(lèi)型定義,例如它們常常用char、short和long的類(lèi)型定義代替Windows API使用的BYTE、WORD和DWORD。這種情況下要正確調(diào)用這些程序和函數(shù),必須找到這些參數(shù)在LabVIEW中同等的數(shù)據(jù)類(lèi)型。   ● 以結(jié)構(gòu)或者類(lèi)作為參數(shù)。一些程序和函數(shù)使用結(jié)構(gòu)或者類(lèi)作為參數(shù),但是LabVIEW并不能夠識(shí)別這些參數(shù)的數(shù)據(jù)結(jié)構(gòu)。為了正確調(diào)用這些庫(kù)函數(shù),LabVIEW提供了兩種解決辦法:使用CIN節(jié)點(diǎn)或者重寫(xiě)函數(shù)庫(kù)對(duì)這些函數(shù)進(jìn)行重新封裝,使這些函數(shù)的輸入輸出參數(shù)能夠符合LabVIEW的標(biāo)準(zhǔn)。   SDK2000提供的共享函數(shù)庫(kù)使用了很多LabVIEW不支持的參數(shù)類(lèi)型,如RECT、VIDEOSTREAMINFO等。為了正確調(diào)用這些函數(shù),必須用CIN節(jié)點(diǎn)或者重寫(xiě)函數(shù)庫(kù)的方法對(duì)這些函數(shù)進(jìn)行重新封裝。相對(duì)而言,重新編寫(xiě)動(dòng)態(tài)鏈接庫(kù)方法比使用CIN節(jié)點(diǎn)更為常用。因?yàn)镃IN代碼直接嵌入到VI程序代碼里,對(duì)于編程器的限制比較高,所以一般不采用CIN節(jié)點(diǎn)。   重新編寫(xiě)動(dòng)態(tài)鏈接庫(kù)的另一個(gè)原因,是為了獲得LabVIEW提供的高級(jí)函數(shù)庫(kù)應(yīng)用。LabVIEW提供了在代碼開(kāi)發(fā)環(huán)境下的高級(jí)函數(shù)庫(kù),這些函數(shù)是針對(duì)于LabVIEW使用的數(shù)據(jù)類(lèi)型,如下面所介紹的NumericArrayResize()函數(shù)。NumericArrayResize()函數(shù)用于動(dòng)態(tài)改變數(shù)組的大小,不過(guò)只適合于LabVIEW使用的數(shù)組結(jié)構(gòu)。LabVIEW高級(jí)函數(shù)庫(kù)還包含了一些底層操作,如文件讀寫(xiě)與內(nèi)存分配等等,不存在參數(shù)類(lèi)型不同和底層操作困難的問(wèn)題。 3. 軟件編程   由于需要重寫(xiě)的函數(shù)比較多,這里僅以重寫(xiě)保存DIB圖像數(shù)據(jù)函數(shù)為例,說(shuō)明重寫(xiě)函數(shù)庫(kù)的編寫(xiě)過(guò)程。新函數(shù)GetDib()對(duì)原函數(shù)DSStream_GetCurrentDib()進(jìn)行了封裝,其作用是向原函數(shù)傳遞有效參數(shù)并返回LabVIEW能識(shí)別的數(shù)據(jù)。使用的編程環(huán)境為Visual C++6.0。   第一步:分析目標(biāo)函數(shù)的參數(shù)類(lèi)型   SDK2000開(kāi)發(fā)包中對(duì)獲得當(dāng)前圖像的DIB數(shù)據(jù)函數(shù)的聲明為:   HRESULT DSStream_GetCurrentDib(int iCardID,BYTE* pBuffer,long* pSize)   pBuffer指向預(yù)分配的內(nèi)存,值為NULL時(shí),pSize得到保存圖像需要的內(nèi)存大小,若pBuffer不為NULL,函數(shù)將DIB圖像數(shù)據(jù)保存到從pBuffer開(kāi)始,長(zhǎng)度為(*pSize)的內(nèi)存區(qū)域。CLF節(jié)點(diǎn)不能直接調(diào)用該函數(shù),因?yàn)長(zhǎng)abVIEW編程環(huán)境下沒(méi)有提供內(nèi)存管理機(jī)制,并且CLF節(jié)點(diǎn)不能把指向預(yù)分配內(nèi)存的指針傳遞給該函數(shù),所以必須對(duì)這個(gè)函數(shù)進(jìn)行重新封裝。   圖像的DIB數(shù)據(jù)是非數(shù)字型的數(shù)據(jù),為了返回LabVIEW能夠識(shí)別的數(shù)據(jù),可以選擇字符串或者單字節(jié)數(shù)組作為數(shù)據(jù)的載體,但是由于數(shù)據(jù)中包含了十進(jìn)制的0,所以只能用單字節(jié)數(shù)組作為載體,并且為了能夠動(dòng)態(tài)改變數(shù)組的大小,必須以數(shù)組的句柄作為傳遞參數(shù)。因?yàn)樵贚abVIEW提供的高級(jí)函數(shù)庫(kù)中,所有改變數(shù)組、字符串大小的函數(shù)都是針對(duì)于句柄進(jìn)行的。   第二步:編寫(xiě)動(dòng)態(tài)鏈接庫(kù)   在VC中使用MFC Application(dll)建立一個(gè)名字為MySDK2000的工程,然后在MySDK2000.cpp中鍵入以下代碼:   typedef struct  ?。?int32 dimSize;   uInt8 elt[1];   } TD1;//TD1的數(shù)據(jù)結(jié)構(gòu)能被LabVIEW和新鏈接庫(kù)識(shí)別   typedef TD1 **TD1Hdl;   extern "C" __declspec(dllexport) long GetDib(TD1Hdl BitMapinfo)//BitMapinfo為數(shù)組的句柄  ?。?long pp=0;   hr=DSStream_GetCurrentDib(m_iCardID, NULL, &pp);//得到保存圖像需要的內(nèi)存大小   if (NumericArrayResize(uB,1L,(UHandle*)&BitMapinfo,pp))//改變數(shù)組物理大小   return 0;   (*BitMapinfo)->dimSize = pp;//改變數(shù)組大小的標(biāo)志   BYTE* lpdst; // 指向緩存DIB圖像的指針   lpdst = (*BitMapinfo)->elt;   hr=DSStream_GetCurrentDib(m_iCardID, lpdst, &pp);//將當(dāng)前圖像的DIB數(shù)據(jù)保存到內(nèi)存中   BITMAPINFO* pInfo = (BITMAPINFO*)lpdst;//位圖文件頭指針   return pInfo->bmiHeader.biSize;//返回位圖信息頭的數(shù)據(jù)長(zhǎng)度  ?。?   編寫(xiě)過(guò)程的幾點(diǎn)說(shuō)明:   ● 為了正確使用LabVIEW中的數(shù)據(jù)類(lèi)型,必須在MySDK2000.cpp中手工加上#include “extcode.h”的聲明。頭文件”extcode.h”中定義了CIN和外部子程序所用到的基本數(shù)據(jù)類(lèi)型和許多函數(shù)等,用以解決某些常量和數(shù)據(jù)類(lèi)型與系統(tǒng)頭文件的沖突。   ● 為了能夠在VC中調(diào)用LabVIEW的函數(shù)庫(kù),必須把CINTools目錄下LabVIEW.lib包含在工程里。使用NumericArrayResize()函數(shù)用以動(dòng)態(tài)改變數(shù)組的長(zhǎng)度,它的功能和WIN32函數(shù)LocalAlloc()具有相似的功能。它的函數(shù)聲明如下:   MgErr NumericArrayResize(int32 typeCode, int32 numDims,   UHandle *dataHP,int32 totalNewSize);   ● 如果內(nèi)存分配失敗,函數(shù)返回錯(cuò)誤代碼。如果成功,還須修改數(shù)組結(jié)構(gòu)中的dimSize,因?yàn)榇撕瘮?shù)不能自動(dòng)修改此值。   其它代碼的編寫(xiě)類(lèi)似于VC環(huán)境下的開(kāi)發(fā)。代碼完成后,構(gòu)件并產(chǎn)生最終的目標(biāo)文件MySDK2000.dll。   第三步:在LabVIEW中調(diào)用動(dòng)態(tài)鏈接庫(kù)   配置CLF節(jié)點(diǎn)的各項(xiàng)參數(shù)。第一個(gè)選項(xiàng)為函數(shù)庫(kù)文件名和路徑,選擇剛才編譯的文件MySDK2000.dll;第二個(gè)選項(xiàng)為函數(shù)名,選擇GetDib;第三項(xiàng)設(shè)置返回和傳遞參數(shù)。具體設(shè)置如下表:
  其它選項(xiàng)保持默認(rèn)設(shè)置。程序框圖如下:
  為了弄清楚CLF運(yùn)行時(shí)傳遞參數(shù)和返回參數(shù)的原型,可以在CLF節(jié)點(diǎn)上右鍵彈出菜單中選擇“Creat.c File…”,然后在文本編程環(huán)境下察看它的參數(shù)原型。這些參數(shù)原型其實(shí)就是LabVIEW使用到的數(shù)據(jù)結(jié)構(gòu),如上面說(shuō)看到的數(shù)組結(jié)構(gòu)TD1,TD1為L(zhǎng)abVIEW一維數(shù)組的數(shù)據(jù)結(jié)構(gòu)。 4. 結(jié)論   通過(guò)對(duì)原有函數(shù)的封裝,函數(shù)將圖像卡采集的DIB數(shù)據(jù)以數(shù)組形式返回給LabVIEW,LabVIEW將對(duì)這些數(shù)據(jù)進(jìn)行進(jìn)一步的處理,如二值化、邊緣分析等等。實(shí)踐證明,通過(guò)重寫(xiě)動(dòng)態(tài)鏈接庫(kù)的方法,第三方DAQ設(shè)備可以更協(xié)調(diào)地使用于LabVIEW開(kāi)發(fā)環(huán)境中。 參考文獻(xiàn)   [1]. Using External Code in LabVIEW,National Instruments Corporation,2001.   [2]. David J.Kruglinski,著,潘愛(ài)民 王國(guó)印,譯. Visual C++ 技術(shù)內(nèi)幕(第五版)[M].北京:清華大學(xué)出版社,2002.   [3]. 楊樂(lè)平,李海濤,等. LabVIEW高級(jí)程序設(shè)計(jì)[M]. 北京:清華大學(xué)出版社,2003.   [4]. 林康紅,唐海峰,奉玲,等. 動(dòng)態(tài)鏈接庫(kù)DLL在虛擬儀器中的應(yīng)用[J].計(jì)算機(jī)應(yīng)用,2002,5:56-57.   [5]. 陶以政,潘振顯.怎樣在LabVIEW中調(diào)用Win32動(dòng)態(tài)鏈接庫(kù)[J].計(jì)算機(jī)應(yīng)用,2000,20(6):72-73.   [6]. 張輝,郁凱元,龍濤,等.基于LabVIEW軟件的動(dòng)態(tài)鏈接庫(kù)和數(shù)據(jù)采集[J].儀表技術(shù),2002,6:36-37.

標(biāo)簽:

點(diǎn)贊

分享到:

上一篇:Labview中遠(yuǎn)程數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)

下一篇:微能WIN-V63矢量控制變頻器在...

中國(guó)傳動(dòng)網(wǎng)版權(quán)與免責(zé)聲明:凡本網(wǎng)注明[來(lái)源:中國(guó)傳動(dòng)網(wǎng)]的所有文字、圖片、音視和視頻文件,版權(quán)均為中國(guó)傳動(dòng)網(wǎng)(www.treenowplaneincome.com)獨(dú)家所有。如需轉(zhuǎn)載請(qǐng)與0755-82949061聯(lián)系。任何媒體、網(wǎng)站或個(gè)人轉(zhuǎn)載使用時(shí)須注明來(lái)源“中國(guó)傳動(dòng)網(wǎng)”,違反者本網(wǎng)將追究其法律責(zé)任。

本網(wǎng)轉(zhuǎn)載并注明其他來(lái)源的稿件,均來(lái)自互聯(lián)網(wǎng)或業(yè)內(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuǎn)載請(qǐng)保留稿件來(lái)源及作者,禁止擅自篡改,違者自負(fù)版權(quán)法律責(zé)任。

網(wǎng)站簡(jiǎn)介|會(huì)員服務(wù)|聯(lián)系方式|幫助信息|版權(quán)信息|網(wǎng)站地圖|友情鏈接|法律支持|意見(jiàn)反饋|sitemap

中國(guó)傳動(dòng)網(wǎng)-工業(yè)自動(dòng)化與智能制造的全媒體“互聯(lián)網(wǎng)+”創(chuàng)新服務(wù)平臺(tái)

網(wǎng)站客服服務(wù)咨詢采購(gòu)咨詢媒體合作

Chuandong.com Copyright ?2005 - 2024 ,All Rights Reserved 版權(quán)所有 粵ICP備 14004826號(hào) | 營(yíng)業(yè)執(zhí)照證書(shū) | 不良信息舉報(bào)中心 | 粵公網(wǎng)安備 44030402000946號(hào)