《電子技術應用》
您所在的位置:首頁 > 測試測量 > 設計應用 > 基于LABVIEW平臺的數(shù)據(jù)采集卡軟件設計
基于LABVIEW平臺的數(shù)據(jù)采集卡軟件設計
摘要: 由于采用數(shù)據(jù)流模型,,LABVIEW可以自動規(guī)劃多線程任務,,可充分利用PC系統(tǒng)處理器的處理能力,,從而提高模塊的采集效率。本文基于LABVIEW開發(fā)環(huán)境,,以庫函數(shù)節(jié)點的調用方式及結構,實現(xiàn)了一種中頻數(shù)據(jù)采集與處理卡軟件的設計,。
Abstract:
Key words :

  引言

  作為專業(yè)測控領域的軟件開發(fā)平臺,,LABVIEW內含豐富的數(shù)據(jù)采集、數(shù)據(jù)信號分析以及功能強大的DAQ助手,,搭建數(shù)據(jù)采集系統(tǒng)更為輕松,,便于硬件設計人員直接對硬件的操控展開設計。此外,,它可通過DLL,、CIN節(jié)點、ActiveX,、.NET或MATLAB腳本節(jié)點等技術,,實現(xiàn)與其它編程語言混合編程,通過調用外部驅動代碼使它與設備的連接變得非常容易,。由于采用數(shù)據(jù)流模型,,LABVIEW可以自動規(guī)劃多線程任務,可充分利用PC系統(tǒng)處理器的處理能力,,從而提高模塊的采集效率,。本文基于LABVIEW開發(fā)環(huán)境,以庫函數(shù)節(jié)點的調用方式及結構,,實現(xiàn)了一種中頻數(shù)據(jù)采集與處理卡軟件的設計,。

  數(shù)據(jù)采集卡軟件結構

  采集卡軟件是基于PC的數(shù)據(jù)采集系統(tǒng)重要組成部分,它與硬件形成一個完整的數(shù)據(jù)采集,、分析和顯示系統(tǒng),,軟件分為上層應用程序和驅動程序。上層應用程序用以完成數(shù)據(jù)的分析,、存儲和顯示等,。驅動程序則可直接對數(shù)據(jù)采集硬件的寄存器編程,管理數(shù)據(jù)采集硬件的操作并把它和處理器中斷,、DMA和內存這些計算機資源結合在一起。

  驅動程序隱藏了復雜的硬件底層編程細節(jié),,為用戶提供容易理解的接口,。NI公司為基于NI數(shù)據(jù)采集設備的數(shù)據(jù)采集系統(tǒng)提供了相應的接口驅動及VI函數(shù) (VI,Virtual Instrument),。對于一些不常見的硬件設備或用戶研發(fā)的硬件設備,,NI沒有提供合適的驅動。但是,,如前所述,,LABVIEW還提供了很多其它的通信接口,,包括調用庫函數(shù)節(jié)點(Call Library Function Node, CLF)、代碼接口節(jié)點(Code Interface Node, CIN),、TCP/IP,、Data Socket、OPC,、共享變量,、DDE和.NET等。通過這些通信接口,,LABVIEW能夠實現(xiàn)與任何設備的通信,。值得留意的是LABVIEW具有調用庫函數(shù)節(jié)點和代碼接口節(jié)點兩種方法,可以結合C語言的編程靈活性和LABVIEW G語言的直觀便捷特點,,大幅提高LABVIEW對用戶數(shù)據(jù)采集卡的軟件設計支持,。可進一步利用LABVIEW豐富的數(shù)據(jù)分析資源,,節(jié)約系統(tǒng)開發(fā)成本,。

  LABVIEW提供的數(shù)據(jù)采集卡的常用驅動方式有兩種,調用C語言源代碼方式(CIN方式),,以及調用動態(tài)鏈接庫方式(CLF方式),。

  CIN方式是實現(xiàn)LABVIEW與C語言混合編程的一種媒介,CIN通過輸入,、輸出端口實現(xiàn)兩種語言之間的數(shù)據(jù)傳遞,。輸入、輸出端口的個數(shù)可由設計者根據(jù)實際需要確定,,當LABVIEW的程序運行到CIN節(jié)點時,,數(shù)據(jù)由CIN的輸入端口傳遞給C源代碼圖標,程序轉去執(zhí)行C源代碼,,代碼執(zhí)行完后,,執(zhí)行的數(shù)據(jù)結果由CIN輸出端口返回至LABVIEW。

  CLF是一種動態(tài)鏈接庫(DLL)的調用方式,。DLL是一種應用程序在運行時與庫文件連接起來的技術,,在WINDOWS的管理下,應用程序與對應DLL之間建立鏈接關系,,根據(jù)鏈接產生的重定位信息,,轉去執(zhí)行DLL中相應的代碼。LABVIEW中,,可通過CLF(調用路徑為Function>>Advanced>>Call Library Function)功能模塊實現(xiàn)調用,。

  調用CIN節(jié)點需要有C語言編程的支持,它能夠將代碼集成在VI中作為單獨的一個VI發(fā)布,CIN 支持的參數(shù)類型比DLL 函數(shù)多,,可使用LABVIEW 定義的任何參數(shù)類型,,但制作CIN的過程復雜得多。使用這種方法的缺點是在數(shù)據(jù)采集過程中不能實時地進行數(shù)據(jù)的顯示,,只能在數(shù)據(jù)全部采集結束后再一起顯示所采集的全部數(shù)據(jù),,這樣在需要較高執(zhí)行效率的場合就不適用。其次由于CIN節(jié)點在制作數(shù)據(jù)采集卡的驅動時,,需要提供采集卡的硬件參數(shù),,需編制對硬件設備進行底層操作的庫函數(shù),對于不清楚函數(shù)內核的程序員不適用,。相比CIN方式,,CLF方式更加簡單易學,開發(fā)者只需要熟悉DLL中的各個函數(shù)功能以及函數(shù)的參數(shù)及類型,,在本文設計中,,擬采用CLF方式實現(xiàn)驅動程序的調用。

  基于CLF方式的采集卡軟件設計

  本文所涉及的軟件控制對象是一款中頻數(shù)據(jù)采集與處理卡,,具有14位A/D精度,,最高采樣頻率為105MHz,4路模擬量輸入,,提供高精度中頻信號數(shù)字化,、多通道、多模式數(shù)字下變頻(DDC)等數(shù)字處理,,軟件結構詳見圖1,。

采集卡的軟件結構

圖1 采集卡的軟件結構

  LABVIEW應用程序分為用戶界面和圖標代碼,通過搭建和調用子VI編寫主體程序,,各VI利用LABVIEW的CLF技術調用動態(tài)鏈接庫中的驅動函數(shù),,實現(xiàn)與硬件設備的數(shù)據(jù)交換。子VI將基本的驅動函數(shù)進行功能封裝,。一個完整的LABVIEW應用程序通常由若干個子VI及其外部編程連線構成,,VI的層級結構設計是設計虛擬儀器驅動程序的核心,各VI分別為組成驅動程序的模塊化子程序,。設計中,,動態(tài)鏈接庫由VC編寫,調用底層的驅動函數(shù)與設備通信,。軟件包括兩類子VI函數(shù)集合,,一類是低層組件VI集合,分為若干個獨立的軟件功能模塊,,每個模塊負責控制儀器的某項特殊功能,這類VI是儀器驅動程序的基礎;另一類為高層應用VI集合,,應用VI通過調用合適的組件VI以實現(xiàn)最通常的儀器設置和測量任務,。顯然,就驅動程序開發(fā)而言,,能否根據(jù)硬件特性成功構建組件VI集合是關鍵所在,。VI層次結構如圖2所示。

 

VI的層級結構

圖2 VI的層級結構

  如圖所示,,按功能有兩個高層應用子VI集合:Config.vi,,Config DDC.vi,這兩個子VI又分別調用低層組件子VI來完成特定的設置,、配置任務,。Config.vi完成采集卡的常規(guī)配置,例如對采集卡單次采集數(shù)量,、FIFO滿深度,、寄存器(硬件通道、時鐘,、觸發(fā),、采集方式、采集模式等的控制)設置,、采集卡的狀態(tài)查詢等,;Config DDC.vi完成DDC的所有配置工作,包括對DDC的模式,、抽取率,、輸出格式、本振頻率,、本振相位,、增益、CFIR濾波參數(shù),、PFIR濾波參數(shù)等的設置,,從而實現(xiàn)DDC的數(shù)字IQ分離、抽取,、數(shù)字濾波,、重采樣、多級增益調節(jié),、多種調制方式的解調等功能,。其余低層組件VI實現(xiàn)設備的打開關閉、數(shù)據(jù)從數(shù)據(jù)采集卡到主機內存的傳送,、數(shù)據(jù)保存等,。無論應用子VI或組件子VI均為獨立可執(zhí)行程序,,實現(xiàn)特定功能,各VI函數(shù)作為提供給用戶進行系統(tǒng)應用開發(fā)所需的各類操作,。采用該結構,,能夠使用戶在運行時修改虛擬儀器系統(tǒng)的運行邏輯與人機界面,可立即執(zhí)行,,因此在用戶需要改變需求的情況下能迅速適配,,數(shù)據(jù)采集卡具有可重構的特點,用戶也不必去關心硬件的實現(xiàn)細節(jié),。

  DLL的調用

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

LABVIEW調用庫函數(shù)設置界面

圖3 LABVIEW調用庫函數(shù)設置界面

  設置后,LABVIEW將自動生成各參數(shù)的入口及出口狀態(tài),,完成調用庫函數(shù)節(jié)點的配置,。對于外部的編程和連線,如Trigger.vi,,如圖4所示,。

Trigger子VI程序框圖

圖4 Trigger子VI程序框圖

  DLL調用中的參數(shù)類型匹配

  在LABVIEW中調用動態(tài)鏈接庫,難點在于參數(shù)類型匹配,。最常用的三種數(shù)據(jù)類型是:數(shù)值類型,、字符串、數(shù)值型數(shù)組,。設計中,,將采集數(shù)據(jù)傳送到內存塊過程涉及到帶數(shù)組參數(shù)的函數(shù)調用,值得注意的是,,LABVIEW 只支持 C 數(shù)據(jù)類型中的數(shù)值型數(shù)組,,調用含有數(shù)組參數(shù)函數(shù)時,傳遞數(shù)組類型“Array Format”要選擇“Array Data Pointer”,。這個設置中還有其他兩個選項(Array Handle,,Array Handle Pointer),這種帶有“Handle”的參數(shù)類型都是表示LABVIEW定義的特殊類型的,,在第三方的DLL中不會使用到,。按前述步驟設置好CLF節(jié)點,連接外部輸入(采集數(shù)量size)和輸出(存放采集數(shù)據(jù)的數(shù)組)后,,輸出沒有反應,,檢查分析得知,,數(shù)組參數(shù)作為輸出值時,要為輸出的數(shù)組數(shù)據(jù)開辟空間,,將輸入數(shù)據(jù)的指針復制給輸出數(shù)組數(shù)據(jù)指針并傳給驅動函數(shù),。在LABVIEW中開辟數(shù)據(jù)空間的方法有兩種:

 

  1.創(chuàng)建一個長度滿足要求的數(shù)組,作為初始值傳遞給輸入?yún)?shù),,輸出數(shù)據(jù)就會被放置在輸入數(shù)組所在的內存空間內,。

  2.直接在參數(shù)配置面板上進行設置。在 Minimum size 中寫入一個固定的數(shù)值或選擇函數(shù)的其它數(shù)據(jù)參數(shù),,LABVIEW 就會按此大小為輸出數(shù)組開辟空間,。

  詳細設置如表1所示。字符串的使用與數(shù)組非常類似,,實際上在C語言中字符串就是一個I8數(shù)組,。

表1 調用含有數(shù)組參數(shù)函數(shù)舉例

調用含有數(shù)組參數(shù)函數(shù)舉例

  此外,布爾類型在DLL函數(shù)和LABVIEW VI之間傳遞沒有專有的數(shù)據(jù)類型,,需利用數(shù)值類型來傳遞,。輸入時先把布爾值轉變?yōu)閿?shù)值,傳遞給DLL函數(shù),;輸出時把數(shù)值轉為布爾值,。對于所調用的DLL 庫函數(shù)的參數(shù)類型,如果在配置框中找不到匹配的類型,,可以在Type 框中選Adapt to Type,,表示編程時指定的LABVIEW數(shù)據(jù)類型與DLL中參數(shù)類型進行自動匹配。LABVIEW也定義了一些特有的數(shù)據(jù)類型,,例如復數(shù)類型,、LV布爾類型。為了在動態(tài)鏈接庫中能對這些類型的數(shù)據(jù)進行操作,,在LABVIEW目錄中的extcode.h文件對LABVIEW的各種數(shù)據(jù)類型進行了定義,。在編寫動態(tài)鏈接庫時,通過引用該文件就可以在C代碼中對LABVIEW的這些獨有數(shù)據(jù)類型進行操作,。

  實驗與結論

  程序設計采用循環(huán)順序執(zhí)行結構,,主要設置三個調用動態(tài)鏈接庫節(jié)點。循環(huán)順序執(zhí)行結構中包括三幀,,第一幀調用Config函數(shù)進行數(shù)據(jù)采集卡的初始化,;第二幀循環(huán)調用datatrans函數(shù)采集數(shù)據(jù)至內存,并用波形圖顯示出來,;第三幀調用deviceshut函數(shù)釋放采集卡所占資源,,程序結束。圖5是設計完成的采集卡軟件工作界面,,圖中顯示了對系統(tǒng)采集參數(shù),、處理參數(shù)配置以及采集波形的顯示等,,波形顯示了對正弦信號采集4096個有效數(shù)據(jù)點。

采集波形顯示圖

圖5 采集波形顯示圖

  結果表明,,數(shù)據(jù)卡的接口工作穩(wěn)定,,數(shù)據(jù)正確無誤,達到了設計的目標,。上述方法成功實現(xiàn)了LABVIEW與采集卡驅動程序的數(shù)據(jù)交換,,進而利用LABVIEW豐富的函數(shù)庫,能方便地實現(xiàn)采集卡的所有功能,,搭建了以LABVIEW為應用程序的數(shù)字采集處理系統(tǒng),。很明顯這種集成了VC++和LABVIEW圖形化編程語言各自優(yōu)勢的采集處理系統(tǒng)不僅性價比高、通用性強,、易于開發(fā)、數(shù)據(jù)處理簡單,,且可以大大縮短開發(fā)時間,。采用CLF 技術,充分利用已有的動態(tài)鏈接程序庫,,可大大增強LABVIEW 和底層硬件的通信能力,。

此內容為AET網(wǎng)站原創(chuàng),未經(jīng)授權禁止轉載,。