??? 摘? 要: 結合實例詳細介紹了LabVIEW通過ActvieX自動化技術與MATLAB進行混合編程" title="混合編程">混合編程,達到了利用MATLAB優(yōu)化算法庫" title="算法庫">算法庫的目的。將LabVIEW與MATLAB有機結合,是一條開發(fā)智能虛擬儀器的有效途徑。?
??? 關鍵詞: LabVIEW語言? MATLAB? ActiveX自動化? 虛擬儀器
?
??? LabVIEW建立在易于使用的圖形數據流編程語言——G語言上,大大簡化了過程控制和測試軟件的開發(fā)。MATLAB以其強大的科學計算功能、大量穩(wěn)定可靠的算法庫,已成為數學計算工具方面事實上的標準。但二者各有欠缺,利用混合編程可以相互補充。?
??? MATLAB是MathWorks公司開發(fā)的“演算紙”式的程序設計語言。它提供了強大的矩陣運算和圖形處理功能,編程效率高,幾乎在所有的工程計算領域都提供了準確、高效的工具箱。但MATLAB也有不足之處,例如界面開發(fā)能力較差,并且數據輸入、網絡通信、硬件控制等方面都比較繁瑣。?
??? 美國NI公司推出的LabVIEW語言是一種非常優(yōu)秀的面向對象的圖形化編程語言。LabVIEW是實驗室虛擬儀器集成環(huán)境(Laboratory Virtual Instrument Engineering Workbench)的簡稱,是一個開放型的開發(fā)環(huán)境,使用圖標代替文本代碼創(chuàng)建應用程序" title="應用程序">應用程序,擁有大量與其它應用程序通信的VI庫。例如LabVIEW使用自動化ActiveX、DDE和SQL,可與其它Windows應用程序集成;使用DataSocket技術、Web Server、TCP/IP和UDP網絡VIs,與遠程應用程序通信。在對硬件的支持方面,LabVIEW集成了與GPIB、VXI、PXI、RS-232/485、PLC和插入式數據采集設備等進行數據通信的全部功能。在LabVIEW下開發(fā)的程序稱為虛擬儀器VI(Virtual Instrument),因為其外形和操作可以模擬實際的儀器。在對各種算法的支持方面,LabVIEW的工具箱非常有限,這就限制了大型應用程序的快速開發(fā)。?
??? 鑒于LabVIEW和MATLAB的優(yōu)點,本文介紹了通過ActiveX技術,在LabVIEW(Ver6.1)中調用和操作MATLAB(Ver6.5)的方法,實現LabVIEW和MATLAB的混合編程,充分發(fā)揮兩者的優(yōu)勢。?
1 基本原理?
??? ActiveX自動化是基于組件對象模型COM(Component Object Model)的技術,允許應用程序或組件控制另一個應用程序或組件的運行,它包括自動化服務器和自動化控制器。MATLAB支持ActiveX自動化技術。通過使用MATLAB自動化服務器功能,可以在其它應用程序中執(zhí)行MATLAB命令,并與MATLAB的工作空間進行數據交換。因此可以借助這一特性,把LabVIEW與MATLAB結合,充分利用MATLAB提供的大量高效可靠的算法和LabVIEW的圖形化編程能力,混合開發(fā)出功能強大的應用軟件。?
2 應用舉例?
??? 在混合編程中,通常用LabVIEW設計用戶圖形界面,負責數據采集和網絡通信;MATLAB在后臺提供大型算法供LabVIEW調用。?
2.1 方法一:使用MATLAB Script節(jié)點?
??? 為了簡化調用過程,LabVIEW提供了MATLAB Script節(jié)點。LabVIEW使用ActiveX技術執(zhí)行該節(jié)點,啟動一個MATLAB進程。這樣用戶就可以很方便地在自己的LabVIEW應用程序中使用MATLAB,包括執(zhí)行MATLAB命令、使用功能豐富的各種工具箱,如神經網絡工具箱(Neural Network Toolbox)、優(yōu)化工具箱(Optimization Toolbox)。值得注意的是:LabVIEW與MATLAB之間的數據通信僅支持Real、RealVector、RealMatrix、Complex、VectorComplex、Matrix六種格式的數據,且必須根據具體情況進行選擇。?
??? 當開發(fā)涉及工業(yè)控制的應用程序時,常常由于控制參數的非線性變化,而無法建立合適的模型。對于此類問題,神經網絡提供了一條有效的解決途徑。?
??? 在LabVIEW開發(fā)環(huán)境下新建一個三層BP神經網絡的VI程序,程序框圖見圖1。網絡結構部分主要設置隱層(Hidelay)神經元的個數、傳遞函數" title="傳遞函數">傳遞函數(Transfer Function)以及網絡訓練算法(Algorithm)。經過樣本數據(Training Data)訓練過的網絡,即可進行仿真測試了。MATLAB腳本程序可以在MATLAB環(huán)境下調試,再使用MATLAB Script節(jié)點導入MATLAB腳本;也可以直接在MATLAB Script節(jié)點中編寫。位于Function>>Mathematics>>Formula模板中的MATLAB Script節(jié)點可以導入MATLAB腳本。圖1中的腳本程序使用CASE語句進行傳遞函數和訓練算法的選擇。MATLAB Script節(jié)點中神經網絡的輸入層和隱層之間的權值矩陣inweight應指定為RealMatrix,在LabVIEW中對應的數據類型是二維實數數組Net.IWeight。各變量數據類型見表1。?
?
?
?
??? 在此程序中,得到的BP網絡各層的權值矩陣、閾值向量和傳遞函數三類參數是非常有用的,它們決定了神經網絡的結構與特性。因此當神經網絡訓練好后,可以直接使用這些參數處理新的數據,得到預測值,而不必重新調用MATLAB。這樣程序的運行效率會更高。另一方面,將調試好的神經網絡VI創(chuàng)建成一個子VI,作為模塊保存,當需要更新網絡時,可以隨時調用。???
??? 雖然通過MATLAB Script節(jié)點進行通信比較易于實現,但以這種方式調用MATLAB時,在任務欄中將出現一個MATLAB圖標,單擊該圖標會打開MATLAB窗口,在其中可以任意輸入。通常,這會干擾前臺程序的運行,甚至造成程序的崩潰。另一方面,當MATLAB Script節(jié)點中的腳本執(zhí)行完后,MATLAB也不能自動關閉。?
2.2 方法二:使用ActiveX函數模板?
??? 在LabVIEW中使用引用(Refnum,也稱“參考”)作為某個對象的唯一標識符,對象可以是文件、設備、網絡連接等。由于引用是指向某一對象的臨時指針,因此它僅在對象被打開時有效,一旦對象被關閉,LabVIEW就會自動斷開連接。為了獲得對MATLAB更多的控制,可以在框圖程序中使用LabVIEW提供的相關子VI創(chuàng)建和獲取自動化對象,然后在代碼中調用對象擁有的方法和屬性。當不再需要對象時,可以隨時釋放。?
??? LabVIEW可以調用MATLAB(Ver6.5)ActiveX接口提供的8個方法和1個屬性:?
??? (1)BSTR Execute([in]BSTR Command):Execute方法調用MATLAB執(zhí)行一個合法的MATLAB命令,并將結果以字符串的形式輸出。其輸入參數Command為字符串類型變量,表示一個合法的MATLAB命令。?
??? (2)void GetFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in,out] SAFEARRAY(double)*pr,[in,out] SAFEARRAY(double)*pi):使用GetFullMatrix方法,LabVIEW從指定的MATLAB工作空間中獲取一維或二維數組。Name為數組名,Workspace標識包含數組的工作空間,其默認值是“base”。pr包含了所提取數組的實部,pi包含了所提取數組的虛部,它們在LabVIEW中為變體(Variant)數據類型。?
??? (3)void PutFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in] SAFEARRAY(double)*pr,[in] SAFEARRAY(double)*pi):此方法向指定的MATLAB工作空間中設置一維或二維數組。如果傳送的數據為實數型,pi也必須傳送,不過其內容可以為空。?
??? (4)BSTR GetCharArray([in] BSTR Name,[in]BSTR Workspace):此方法從指定的MATLAB工作空間中獲取字符數組。?
??? (5)void PutCharArray([in]BSTR Name,[in]BSTR Workspace, [in] BSTR charArray):此方法向指定的工作空間中的變量寫入一個字符數組。?
??? (6)void MinimizeCommandWindow( ):此方法使MATLAB窗口最小化。?
??? (7)void MaximizeCommandWindow( ):此方法使MATLAB窗口最大化。?
??? (8)void Quit():用于MATLAB退出。?
??? (9)屬性Visible:當Visible為1時,MATLAB窗口顯示在桌面上;當Visible為0時,隱含MATLAB窗口。?
??? 舉例說明:LabVIEW程序中有二維數組A、B,通過MATLAB計算表達式B=A.*3(即A的每個元素均乘以3),得到的結果保存在LabVIEW的數組B中,并顯示在前面板上。其中MATLAB Window為枚舉量,值為Invisible或Visible,目的是用于控制任務欄上是否出現MATLAB圖標。數組A為控制量,用于輸入二維數組數據。數組B為指示量,用于顯示經MATLAB計算后返回的結果??驁D程序見圖2。此程序較完整地描述了調用MATLAB過程的總體框架,至于復雜的算法可以在MATLAB中實現。?
?
?
??? 首先必須引用自動化對象。為此在LabVIEW的Controls>>ActiveX>>Automation Refnum模板中選擇自動化引用(Automation Refnum)控制量,將其放置在前面板上,設置控件的Visible屬性為False,從對象列表中選擇Matlab Application(Version6.5)Type Library Version1.0。這樣MATLAB的引用就添加到程序中,其對應的圖標為MLApp.DIMLApp。為了簡化訪問自動化服務器的過程,LabVIEW在其Function>> Communication>>ActiveX模板中提供了一組與ActiveX操作相關的子VI,其中Automation Open.vi打開引用,啟動MATLAB自動化服務器,并將引用傳遞給其它節(jié)點,如屬性節(jié)點(Property Node)、調用方法節(jié)點(Invoke Node)。程序中LabVIEW調用PutFullMatrix方法,將二維數組A通過參數pr傳到MATLAB的“base”工作空間。雖然A為雙精度浮點型數組,pr和pi的數據類型為變體(Variant),數據類型不同,但LabVIEW會自動將輸入數據的類型轉換為變體,以滿足輸入要求。程序中A為實數數組,無虛部,所以給pi賦空值。接著LabVIEW調用MLApp.DIMLApp提供的Execute 方法,向MATLAB傳送一條命令“B=A.*3”,于是MATLAB將數組A的每個元素與3相乘,計算后的結果保存在數組B中。再調用GetFullMatrix方法,從“base”工作空間中獲取數組B的實部。這里必須使用Variant to Data.vi,將變體類型的輸出轉化為LabVIEW中的二維數組。最后用Quit方法退出MATLAB,Automation Close.vi隨即斷開引用。運行程序,可以看到MATLAB一經啟動,任務欄上底圖標便立即消失,計算結果返回到LabVIEW的前面板上。這里僅介紹了ActiveX函數模板的基本使用以及調用MATLAB過程的總體框架,讀者可以根據需要進行擴充。?
2.3 兩種調用方法的比較?
??? (1)MATLAB Script節(jié)點具有多輸入、多輸出的特點,一次處理的信息量可以很大。MATLAB腳本可以先在MATLAB環(huán)境下調試,無誤后再導入到MATLAB Script節(jié)點中。MATLAB Script節(jié)點對輸入、輸出數據的類型有明確的要求。只有LabVIEW中的數據類型與MATLAB中的數據類型相匹配,才能進行數據傳輸。使用MATLAB Script節(jié)點的方法,快捷方便,但不利于較大的應用程序開發(fā)" title="程序開發(fā)">程序開發(fā)。當需要使用時,可將其模塊化,采用主程序動態(tài)加載。?
??? (2)使用ActiveX函數模板的方法,具有對MATLAB更強的控制能力。如隨時打開和關閉MATLAB,隱藏任務欄中的MATLAB圖標,與MATLAB進行字符數組傳輸,這些都是MATLAB Script節(jié)點所不具有的。使用ActiveX函數模板時,經常會遇到數據類型的轉換,尤其是變體(Variant)與其他類型的轉換。當調用大型算法時,必須明確輸入、輸出數據的具體類型,而且要盡量減少數據傳輸量和啟動MATLAB自動化服務器的次數。ActiveX函數模板,適于較大的應用程序開發(fā)。在LabVIEW的順序結構中,不提倡使用。原因是順序結構妨礙了作為LabVIEW優(yōu)點之一的程序并行運行機制,而且MATLAB自動化服務器啟動也需要一定時間,這會使整個程序不能及時處理其它的用戶操作。總之,兩種調用方法都有其自身的優(yōu)勢和不足。在開發(fā)一個大的復雜應用程序時,綜合不同的應用要求,合理選擇可以顯著提高開發(fā)效率。?
??? 采用虛擬儀器技術,通過LabVIEW構建測試儀器開發(fā)效率高、可維護性強;測試精度、穩(wěn)定性和可靠性能夠得到充分保證;具有很高的性價比,節(jié)省投資,便于設備更新和功能擴充。如果能利用MATLAB功能強大的算法庫,可望開發(fā)出更具智能化的虛擬儀器,將會在諸如故障診斷、專家系統(tǒng)、復雜過程控制等方面大有用武之地。?
參考文獻?
1 石博強, 趙德永. LABVIEW6.1編程技術實用教程.北京:?中國鐵道出版社,2002?
2 National Instruments Corporation. The Measurement and??Automation Catalog,2001?
3 National Instruments Corporation.The Interactive Encyclopedia?of Measurement and Automation,2002?
4 National Instruments Corporation. LabVIEW User Manual.??Part Number 320999C-01, 2000;(6)?
5 Howard Tsoi.How to Network Two PCs for Remote Data??Acquisition.National Instruments Application Note 118. www.?ni.com?
6 Travis, Jeffrey. LabVIEW for Everyone、Prentice-Hall,2001?