LabVIEW是一種圖形化編程語言,具有簡單易學(xué)、形象直觀的特點。同時,LabVIEW作為一種通用的、完善的高級編程語言,具有強大的外部接口能力,可以實現(xiàn)LabVIEW與C、Basic、Matlab等編程語言,甚至與外部應(yīng)用軟件(如Word、Excel等)之間的通信,達(dá)到代碼復(fù)用及提高開發(fā)效率的目的。通過動態(tài)連接庫DLL文件實現(xiàn)LabVIEW中與外部程序的接口技術(shù),是最常用的一種方式,通過這種技術(shù)可以編寫出功能更加強大的應(yīng)用軟件。 相對于其它編程語言,在LabVIEW中調(diào)用DLL文件是比較簡單的。下面通過一個例子說明在LabVIEW平臺中調(diào)用DLL文件的編程方法。 調(diào)用DLL例子 本例調(diào)用C語言編寫的DLL文件“MyDll.dll”里的函數(shù)“MyFunc”,其函數(shù)聲明原型如圖1所示: 該函數(shù)實現(xiàn)的功能為,產(chǎn)生一個初始值為x0、間隔為deltx、長度為length的一維數(shù)組y,并給出該數(shù)組的最后一個值lastData和函數(shù)的運行狀態(tài)信息status。從函數(shù)的聲明中可以看出,該函數(shù)中數(shù)據(jù)類型涉及到了“double”類型、“int”類型和“char”類型(對應(yīng)LabVIEW的字符串型),在參數(shù)傳遞中也涉及到了值傳遞(x0、deltx、length)和指針(y、lastData、status)傳遞方式,較為復(fù)雜。為便于理解,圖2給出了該函數(shù)的C語言實現(xiàn)代碼。 該例調(diào)用DLL函數(shù)后程序運行前面板如圖3所示,在前面板上放置了3個輸入型控件和3個顯示型控件,分別對應(yīng)“MyFunc”函數(shù)的6個參數(shù)。當(dāng)改變參數(shù)x0、deltx或length的值時,程序?qū)崟r顯示出y、lastData、status的值。 圖3 調(diào)用DLL的參數(shù)傳遞測試的前面板 程序框圖如圖4所示,在參數(shù)x0、deltx或length的值改變事件中調(diào)用DLL文件“MyDll.dll”里的“MyFunc”函數(shù)計算y、lastData、status的值。 該例能否正確運行,關(guān)鍵在于在調(diào)用庫函數(shù)的配置對話框中,對該函數(shù)的輸入輸出參數(shù)進(jìn)行正確配置。從該函數(shù)的原型聲明中可以看出,該函數(shù)的調(diào)用規(guī)范上,本例需設(shè)置為“C”調(diào)用方式,如圖5所示。 在調(diào)用庫函數(shù)“參數(shù)”選項卡中,“MyFunc”函數(shù)本身返回值為“void”,所以,其返回類型設(shè)置為空即可。對其它6個參數(shù)設(shè)置如下: l x0:“類型”設(shè)為“數(shù)值”;“數(shù)據(jù)類型”設(shè)為“8字節(jié)雙精度”選項;“傳遞”設(shè)為“值”; l deltx:同x0設(shè)置; l length:“類型”設(shè)為“數(shù)值”;“數(shù)據(jù)類型”設(shè)為“有符號32位整型”選項;“傳遞”設(shè)為“值”; l y:該參數(shù)為指向“double”的指針類型,對應(yīng)LabVIEW的一維數(shù)組。所以,“類型”設(shè)為“數(shù)組”;“維數(shù)”設(shè)為1;“數(shù)據(jù)類型”設(shè)為“8字節(jié)雙精度”;“數(shù)組格式”設(shè)為“數(shù)組數(shù)據(jù)指針”;最小尺寸設(shè)為“<None>”; l lastData:該參數(shù)在C語言中聲明為“double &lastData”,為引用傳遞方式,對應(yīng)LabVIEW中指向“double”類型的指針方式。所以,“類型”設(shè)為“數(shù)值”;“數(shù)據(jù)類型”設(shè)為“8字節(jié)雙精度”;“傳遞”設(shè)為“指針”; l status:該參數(shù)在C語言中聲明為“Char* status”,即指向字符的指針,實際對應(yīng)LabVIEW的字符串方式。所以,“類型”設(shè)為“字符串”;“字符串格式”設(shè)為“C字符串指針”;最小尺寸設(shè)為“<None>”。 參數(shù)正確配置后,在圖4程序框圖中,需要說明的是,對于參數(shù)y和status,由于在本質(zhì)上都是一維數(shù)組,且參數(shù)設(shè)置的最小尺寸本例都設(shè)為了“<None>”,所以需在程序框圖中顯式的預(yù)先分配一段不小于函數(shù)中需要的內(nèi)存大小的空間。另外,從“MyFunc”函數(shù)的C語言實現(xiàn)代碼中也可以看出,對于這兩個參數(shù),“MyFunc”函數(shù)中并沒有分配新的內(nèi)存空間,而是直接利用了外部傳入的參數(shù)地址來進(jìn)行對這兩個參數(shù)的讀或?qū)懖僮鳌1纠校?/font>y參數(shù)使用了“初始化數(shù)組”函數(shù)生成了一個初始值為0、長度為“length”的雙精度一維數(shù)組連接到該參數(shù)作為內(nèi)存的初始化,status參數(shù)使用了字符串常量連接到該參數(shù)作為內(nèi)存的初始化。當(dāng)然,對這兩個參數(shù),也可以在庫函數(shù)的配置對話框中直接指明其需要的大小,如對于y參數(shù),最小尺寸可以設(shè)為“length”的值,對于status參數(shù),最小尺寸可以設(shè)為具體的值,如512,這樣設(shè)置以后,在程序框圖中就可以不必對這兩個參數(shù)作代碼的初始化了。 結(jié)論 由上面的例子可以看出,LabVIEW中調(diào)用動態(tài)連接庫DLL文件中函數(shù)的編程并不復(fù)雜,關(guān)鍵是要知道被調(diào)用函數(shù)的名稱,并且保證輸入、輸出參數(shù)的順序及數(shù)據(jù)類型要配置正確即可。 備注 大家如果有興趣的話可以加關(guān)注并私信回復(fù):LabVIEW001,則可獲得該文章的DLL文件及LabVIEW原程序下載鏈接。歡迎加關(guān)注,共同交流。 |
|