基于LABVIEW平臺的數據采集卡軟件設計
DLL的調用
在LABVIEW 中調用DLL時(shí),把編寫(xiě)好的DLL放在當前目錄或特定目錄下,然后根據應用程序的需要,確定參數個(gè)數和參數類(lèi)型及調用規則,在LABVIEW中正確地配置DLL 。首先從函數模板Function 中調用CLF 節點(diǎn),雙擊彈出設置對話(huà)框,如圖2所示。對話(huà)框中,第一個(gè)參數Library Name Path 填入需要調用的動(dòng)態(tài)鏈接庫文件的名字和路徑。第二個(gè)參數Function Name 是鏈接庫中要調用的函數名稱(chēng)。第三個(gè)參數為線(xiàn)程調用方式,在DLL只被一個(gè)線(xiàn)程調用的情況下,兩種調用方式都可選擇,但在多線(xiàn)程調用情況下,需注意選擇。Run in UI Thread 表示在用戶(hù)接口線(xiàn)路中調用,DLL 的執行期將等到用戶(hù)接口線(xiàn)程(即LABVIEW環(huán)境下的VI 應用程序) 執行DLL 的導出函數調用時(shí)才開(kāi)始;Run in any Thread 表示允許多個(gè)線(xiàn)程同時(shí)調用這個(gè)DLL。在編制DLL 過(guò)程中,充分考慮了線(xiàn)程保護的同步機制,如使用臨界區、互斥、信號量等,線(xiàn)程安全較為確定,那么可以選用Run in any Thread方式,這將有助于提高DLL調用的性能;反之,可選Run in UI Thread。第四個(gè)參數是對DLL的調用規則,可選擇C或stdcall,在此選擇stdcall。LABVIEW調用庫函數設置界面如圖3所示,其中Parameters項是對參數選項的設置,根據調用的函數,添加和設置相應的參數,參數名稱(chēng)、類(lèi)型和數據類(lèi)型,且要與被調用函數中的參數名相同。需要注意的是,當調用多個(gè)函數時(shí)要分別填寫(xiě)參數的個(gè)數和對應的類(lèi)型,而且在調用過(guò)程中應保持數據位的一致。由于LABVIEW中的數據類(lèi)型和不同編程語(yǔ)言對應的數據類(lèi)型在形式上有些不一致,因此需要知道它們是如何對應的。如:LABVIEW中I16表示有符號16位整型,對應C語(yǔ)言中的short型。
設置后,LABVIEW將自動(dòng)生成各參數的入口及出口狀態(tài),完成調用庫函數節點(diǎn)的配置。對于外部的編程和連線(xiàn),如Trigger.vi,如圖4所示。

圖3 LABVIEW調用庫函數設置界面

圖4 Trigger子VI程序框圖
DLL調用中的參數類(lèi)型匹配
在LABVIEW中調用動(dòng)態(tài)鏈接庫,難點(diǎn)在于參數類(lèi)型匹配。最常用的三種數據類(lèi)型是:數值類(lèi)型、字符串、數值型數組。設計中,將采集數據傳送到內存塊過(guò)程涉及到帶數組參數的函數調用,值得注意的是,LABVIEW 只支持 C 數據類(lèi)型中的數值型數組,調用含有數組參數函數時(shí),傳遞數組類(lèi)型“Array Format”要選擇“Array Data Pointer”。這個(gè)設置中還有其他兩個(gè)選項(Array Handle,Array Handle Pointer),這種帶有“Handle”的參數類(lèi)型都是表示LABVIEW定義的特殊類(lèi)型的,在第三方的DLL中不會(huì )使用到。按前述步驟設置好CLF節點(diǎn),連接外部輸入(采集數量size)和輸出(存放采集數據的數組)后,輸出沒(méi)有反應,檢查分析得知,數組參數作為輸出值時(shí),要為輸出的數組數據開(kāi)辟空間,將輸入數據的指針復制給輸出數組數據指針并傳給驅動(dòng)函數。在LABVIEW中開(kāi)辟數據空間的方法有兩種:
1.創(chuàng )建一個(gè)長(cháng)度滿(mǎn)足要求的數組,作為初始值傳遞給輸入參數,輸出數據就會(huì )被放置在輸入數組所在的內存空間內。
2.直接在參數配置面板上進(jìn)行設置。在 Minimum size 中寫(xiě)入一個(gè)固定的數值或選擇函數的其它數據參數,LABVIEW 就會(huì )按此大小為輸出數組開(kāi)辟空間。
詳細設置如表1所示。字符串的使用與數組非常類(lèi)似,實(shí)際上在C語(yǔ)言中字符串就是一個(gè)I8數組。
表1 調用含有數組參數函數舉例


圖5 采集波形顯示圖
此外,布爾類(lèi)型在DLL函數和LABVIEW VI之間傳遞沒(méi)有專(zhuān)有的數據類(lèi)型,需利用數值類(lèi)型來(lái)傳遞。輸入時(shí)先把布爾值轉變?yōu)閿抵?,傳遞給DLL函數;輸出時(shí)把數值轉為布爾值。對于所調用的DLL 庫函數的參數類(lèi)型,如果在配置框中找不到匹配的類(lèi)型,可以在Type 框中選Adapt to Type,表示編程時(shí)指定的LABVIEW數據類(lèi)型與DLL中參數類(lèi)型進(jìn)行自動(dòng)匹配。LABVIEW也定義了一些特有的數據類(lèi)型,例如復數類(lèi)型、LV布爾類(lèi)型。為了在動(dòng)態(tài)鏈接庫中能對這些類(lèi)型的數據進(jìn)行操作,在LABVIEW目錄中的extcode.h文件對LABVIEW的各種數據類(lèi)型進(jìn)行了定義。在編寫(xiě)動(dòng)態(tài)鏈接庫時(shí),通過(guò)引用該文件就可以在C代碼中對LABVIEW的這些獨有數據類(lèi)型進(jìn)行操作。
實(shí)驗與結論
程序設計采用循環(huán)順序執行結構,主要設置三個(gè)調用動(dòng)態(tài)鏈接庫節點(diǎn)。循環(huán)順序執行結構中包括三幀,第一幀調用Config函數進(jìn)行數據采集卡的初始化;第二幀循環(huán)調用datatrans函數采集數據至內存,并用波形圖顯示出來(lái);第三幀調用deviceshut函數釋放采集卡所占資源,程序結束。圖5是設計完成的采集卡軟件工作界面,圖中顯示了對系統采集參數、處理參數配置以及采集波形的顯示等,波形顯示了對正弦信號采集4096個(gè)有效數據點(diǎn)。
結果表明,數據卡的接口工作穩定,數據正確無(wú)誤,達到了設計的目標。上述方法成功實(shí)現了LABVIEW與采集卡驅動(dòng)程序的數據交換,進(jìn)而利用LABVIEW豐富的函數庫,能方便地實(shí)現采集卡的所有功能,搭建了以L(fǎng)ABVIEW為應用程序的數字采集處理系統。很明顯這種集成了VC++和LABVIEW圖形化編程語(yǔ)言各自?xún)?yōu)勢的采集處理系統不僅性?xún)r(jià)比高、通用性強、易于開(kāi)發(fā)、數據處理簡(jiǎn)單,且可以大大縮短開(kāi)發(fā)時(shí)間。采用CLF 技術(shù),充分利用已有的動(dòng)態(tài)鏈接程序庫,可大大增強LABVIEW 和底層硬件的通信能力。
評論