新聞中心

LabVIEW與MATLAB混合編程

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


評(píng)論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉