我們知道,不是所有的板卡等硬件都提供了LabVIEW庫。所以動態(tài)庫(DLL)是我們寫測控軟件繞不開的一個話題。本篇推送我們聊一聊什么是動態(tài)庫、它是怎么實現(xiàn)的、在LabVIEW里我們又如何使用它。
什么是動態(tài)庫? 動態(tài)庫全稱動態(tài)鏈接庫(Dynamic Link Library,DLL),?是一個包含函數和數據的模塊,它可以被其它應用程序或者DLL使用。
動態(tài)鏈接庫是怎么編寫的呢? 簡單來說就是通過dllexport標識出需要導出的函數和變量。 我們分別看一下C和C++編寫的動態(tài)庫代碼結構。
C語言編寫的動態(tài)鏈接庫代碼示例:
//CLib.h #ifndef C_LIB_H #define?C_LIB_H //需要導出的函數按照指定格式聲明 //extern?int?__declspec(dllexport)?exportFunction(type?para,?...); //通過DLL導出add函數 extern int __declspec(dllexport) add(int x,int y); #endif //CLib.c #include?"Clib.h" //add函數實現(xiàn) int add( int x, int y ) { return x + y; }
C++語言編寫的動態(tài)鏈接庫代碼示例:
?
//CplusplusLib.h #ifndef LIB_H #define LIB_H //需要導出的函數按照指定格式聲明 //extern?"C" int?__declspec(dllexport)?exportFunction(type?para,?...); //通過DLL導出add函數 extern "C" int __declspec(dllexport) add(int x, int y); #endif //CplusplusLib.cpp #include "CplusplusLib.h" //add函數實現(xiàn) int add( int x, int y ) { return x + y; }與C語言編寫的動態(tài)鏈接庫相比,不同的地方在于extern int “C” __declspec(dllexport) add(int x,int y) 這一導出語句,在C代碼中沒有”C” ,而在C++代碼中多了一個”C”。 原因是C++編譯器與C編譯器在對程序進行編譯的時候,對函數聲明的編譯會有所區(qū)別。加上”C”,是為了告訴C++編譯器,使用C編譯器的方式對這一個函數聲明進行編譯。這樣,在C程序調用C++寫的動態(tài)鏈接庫的時候,不會發(fā)生因為尋找不到對應的函數名(編譯后的)而發(fā)生Link錯誤。
LabVIEW如何調用動態(tài)庫?
我們以某品牌數據采集卡為例,說明一下如何使用動態(tài)庫。 安裝好驅動后,我們可以找到該品牌數據采集卡提供的動態(tài)庫函數和頭文件,D2K-Dask.dll和D2kDask.h。
方法1:直接調用 所謂直接調用,就是使用Call Library Function Node調用。這個VI位于Connectivity->Librarie&Executables分類下。 在程序框圖里放置Call Library Function Node,雙擊進行設置。在Library name or path中設置到動態(tài)庫文件,在Function name中選擇需要調用的函數(LabVIEW會自動解析出該動態(tài)庫導出的函數清單)。
例如我們選擇D2K_AI_VReadChannel函數。這里我們需要找到動態(tài)庫的文檔,按照文檔里提供的函數說明為CalDl Library Function Node設置好D2K_AI_VReadChannel函數的參數和返回值。
I16 __stdcall D2K_AI_VReadChannel (U16 CardNumber, U16 Channel, F64 *voltage)將Call Library Function設置對話框切換到Parameters標簽頁,設置好返回值和參數。error(return value)、cardNumber和channel都是值傳遞的參數,“Type”選擇Numeric,“Data type”選擇Unsigned 16-bit Interger,“Pass”選擇Value;voltage是指向F64類型數據的指針,“Type”選擇Numeric,“Data type”選擇8-byte Double,“Pass”選擇Pointer to Value。
?
?
設置好之后的Call Library Function Node類似下圖,在左、右側連接好對應參數即可調用D2K_AI_VReadChannel函數。
這個設置和調用過程,調用庫函數個數較少時還是可以接受的。如果庫函數的數量比較多,挨個設置很繁瑣也容易出錯。針對這種情況,LabVIEW有更好的方法,也就是我們要介紹的方法2。
方法2:動態(tài)庫封裝成VI庫 Tools->Import->Shared Library打開Import Shared Library工具。
Step1,打開Import Shared Library,選擇Create VIs for a shared library。
Step2,選擇動態(tài)庫文件和對應的頭文件。注意這里頭文件必須是C/C++規(guī)范的。
Step3,根據需要設置頭文件包含路徑和預處理定義。如果不需要,可以留空。
Step4,LabView自動識別出動態(tài)庫里可以封裝成VI導出的函數。
例如我們前面設置的D2K_AI_VReadChannel,這里自動識別出函數原型來了。
Step5,設置VI庫名稱和存放路徑。路徑建議使用默認路徑,放置在用戶庫里。
Step6,設置出錯處理方式。
Step7,設置各個導出函數(VI函數),一般可選擇使用默認設置。
Step8,LabVIEW給出一個即將要生成的VI庫的匯總信息。
Step9,生成中。
Step10,完成VI庫生成。
勾選“Open the generated library”可以打開生成的VI庫;勾選View the report可以查看有關所生成庫的報表。
打開剛才生成的VI庫,可以看到里面封裝了非常多的庫函數。這些庫函數如果按照方法1去挨個設置,顯然工作量是非常大的。
生成的動態(tài)函數VI庫怎么使用呢?
在程序框圖里找到User Libraries,里面就有剛才我們生成的D2K-DaskVI庫。
VIs下面列出了所有庫函數對應的VI,把你需要的拖放到程序框圖上,按照輸入輸出類型連接好就可以了。
比如D2K AI V Read Channel.vi,顯示Label、不勾選View as icon,如下圖,輸入輸出非常明了。
以上是C/C++動態(tài)鏈接庫的基本知識和LabVIEW中如何使用C/C++動態(tài)鏈接庫的方法介紹,希望能夠幫助到大家。
編輯:黃飛
?
評論