李丹陽,朱 賽
(軍械工程學院電子與光學工程系,河北 石家莊 050003)
在雷達系統(tǒng)的性能檢測與故障診斷中,常常使用LabWindows/CVI進行檢測診斷程序的編寫,使用Matlab進行數(shù)據(jù)的分析處理。LabWindows/CVI是美國NI公司推出的面向測試領域的軟件開發(fā)平臺,包含豐富的控件資源和大量的儀器驅動?;谠撈脚_,可方便地進行儀器的控制和虛擬界面的開發(fā)。但對于當前的前沿數(shù)據(jù)處理方法,LabWindows/CVI卻缺少可直接調用的函數(shù)庫,增加了軟件開發(fā)的難度。Matlab是一種高效數(shù)值計算語言,包含各種高級數(shù)值計算工具包,基于Matlab可方便地開發(fā)各種數(shù)據(jù)處理算法,彌補了基于LabWindows/CVI的測試程序開發(fā)的不足。
LabWindows/CVI與Matlab的混合編程可以充分發(fā)揮兩者的優(yōu)點,以LabWindows/CVI完成儀器的操作和用戶界面的編寫,Matlab進行高級數(shù)據(jù)處理,提高測試診斷軟件編寫速度。本文介紹了LabWindows/CVI與Matlab混合編程的常用方法,在對各方法進行分析的基礎上,重點介紹了基于COM組件的LabWindows/CVI與Matlab混合編程技術。
LabWindows/CVI與Matlab的混合編程通常通過如下3種方式:
(1)間接操作Matlab。該方法是指通過一定途徑,在LabWindows/CVI中使用命令操作Matlab。主要有兩種方法:
1) 通過 Matlab Engine 方式[1]。Matlab Engine是指一組Matlab提供的接口函數(shù),支持C語言,可以在LabWindows/CVI中調用,實現(xiàn)對Matlab Engine的控制。
2)通過 ActiveX 控件方式[2]。在 LabWindows/CVI中通過ActiveX控件方式,可以創(chuàng)建Matlab的驅動器。通過驅動器內函數(shù),可以實現(xiàn)對Matlab的操作。
(2)使用Matlab自帶的函數(shù)庫[3]。Matlab中提供了可以供C/C++語言調用的C/C++數(shù)學函數(shù)庫,包含涉及到線形代數(shù)、數(shù)值分析、傅里葉變換、多項式計算、解微分方程等函數(shù),并且函數(shù)庫中提供了大量各種矩陣操作函數(shù),在LabWindows/CVI中可以直接使用這些函數(shù),實現(xiàn)在Matlab中進行矩陣運算功能。
(3)將Matlab文件轉化為中間文件。通過Matlab自帶的編譯器或工具,可以將m文件編譯成中間文件,供LabWindows/CVI調用。主要有兩種途徑:
1)用Matlab自帶的Matlab Compiler編譯器。使用Matlab Compiler編譯器可以將m文件轉換成C源代碼、動態(tài)鏈接庫、可執(zhí)行文件,這些文件可以在LabWindows/CVI編程中直接使用。
2)用 COM Builder工具[5]。COM Builder工具是Matlab自帶的COM組件生成工具,可以由m文件生成COM組件。COM組件在系統(tǒng)注冊后可以在LabWindows/CVI中使用。
間接操作Matlab的方法幾乎能利用Matlab全部功能,但是需要在機器上安裝Matlab軟件,而且執(zhí)行效率低;使用Matlab自帶的函數(shù)庫的方法只能使用Matlab提供的有限的數(shù)據(jù)計算函數(shù),不能充分發(fā)揮Matlab強大的計算能力;將Matlab文件轉換為中間文件,在LabWindows/CVI程序中調用,可以脫離Matlab環(huán)境運行,實現(xiàn)簡單,通用性強。
本文采用將Matlab文件轉化為中間文件的方法,利用Matlab中的COM Builder工具將數(shù)據(jù)處理函數(shù)生成COM組件,供LabWindows/CVI調用。
本文采用COM組件來實現(xiàn)LabWindows/CVI與Matla的混合編程,主要分為COM組件在Matlab中的生成和COM組件在LabWindows/CVI中的調用兩個步驟,其流程如圖1所示。
MathWorks公司在Matlab 6.5及其以后版本中推出了將Matlab中的M函數(shù)編譯為COM組件的工具COM Builder,它把Matlab開發(fā)的.m函數(shù)連同相關的支撐函數(shù)庫一起打包生成組件。生成的組件是進程內組建,以DLL形式存在,可以脫離Matlab環(huán)境獨立運行,在LabWindows/CVI中可以直接調用。
圖1 采用COM組件進行LabWindows/CVI與Matlab混合編程流程
本文使用Matlab 7.9.0進行COM組件的生成,其過程如下:
(1)設置Matlab Builder所使用的編譯器。在Matlab的命令窗口中輸入mbuild-setup和mexsetup命令,進行編譯器的設置。本文使用的編譯器是Microsoft Visual C/C++version 6.0。
(2)設置系統(tǒng)路徑。在我的電腦-屬性-高級-環(huán)境變量-用戶變量,分別選擇include、lib、path變量,如果變量不存在,新建變量。在變量值后添加:
其中Matlab為當前Matlab安裝路徑。
以上兩點只需要配置一次即可。
(3)啟動 Matlab Builder。啟動 Matlab Builder有兩種方法:1)在Matlab命令窗口中輸入deploytool命令;2)在Matlab窗口左下角選擇Start-Matlab-Matlab Builder EX-Deploment Tool。
(4)生成COM組件。在彈出的Deployment Project對話框中設置工程的名稱、路徑,在“Target”中選擇Generic COM Component。生成工程后,在Build下點擊Classes中的“Add Class”生成類,在生成的類下點擊“Add files”添加導出函數(shù)的m文件,點擊Shared Resource and Helper Files中的“Add files/directories”添加導出函數(shù)調用的內部函數(shù)的m文件或資源文件。添加完所需文件后,點擊“Builder”,生成COM組件。在當前工作目錄下生成一個與組件同名的文件夾,文件夾下有名為src和distrib兩個文件夾,sec文件夾中存放的為中間文件,distrib文件夾中存放的是動態(tài)鏈接庫(DLL)形式的COM組件。
(5)打包和分發(fā)組件。COM組件在生成時會自動注冊到系統(tǒng),可以在當前計算機上直接使用。如果在其他計算機上使用,必須在使用的計算機上注冊,注冊命令為“regsvr32組件名”。另外,需要一些支持文件,這些支持文件可以通過COM Builder的打包功能獲得。
在Deployment Tool中的Package下,可以通過“Add files/directories”添加打包文件;如果目標計算機上沒有安裝MCR,則通過“Add MCR”添加MCR。打包文件添加完畢后,點擊“Package”,會把發(fā)布該組件所需的所有文件打包到一個與工程同名的可執(zhí)行文件中。在目標計算機上運行該可執(zhí)行文件,可自動安裝MCR和注冊組件。
在LabWindows/CVI中可通過ActiveX控件調用生成組件,其步驟如下:在LabWindows/CVI軟件的菜單欄中選擇Tools-Create ActiveX Controller,彈出ActiveX Controller Wizard窗口,單擊Next后,LabWindows/CVI會自動搜索系統(tǒng)中注冊的組件,可在ActiveX Server列表中選擇生成的組件,點擊Next后,在Target.fp File中設置生成驅動的路徑及名稱,之后一直點擊 Next,可生成“*.c”、“*.h”、“*.fp”、“*.obj”、“*.sub”5 個文件,其中“*.fp”為驅動器文件。將“*.h”和“*.fp”文件加入工程,打開“*.fp”文件可以看到所包含的函數(shù),其中有新建對象、打開對象、激活對象、獲得和設置MW標志及m文件中定義的函數(shù)。這些函數(shù)可以直接在LabWindows/CVI編程中使用。函數(shù)在LabWindows/CVI中使用步驟如下:
(1)調用CA_InitActiveXThreadStyleFo-rCurrent Thread函數(shù),該函數(shù)將線程設為ActiveX線程方式。將其threadStyle參數(shù)設為COINIT_APARTMENTTH READED。
(2)調用新建對象函數(shù),此函數(shù)在“*.fp”中。該函數(shù)可以新建一個對象,并獲得該對象的句柄。
(3)參數(shù)轉換,在調用M中函數(shù)在“*.fp”對應的功能函數(shù)前,必須進行參數(shù)的轉換。因為m文件中函數(shù)生成COM組件,在LabWindows/CVI中生成驅動器函數(shù),其所有參數(shù)轉換為VARIANT類型,即通過該類型實現(xiàn)LabWindows/CVI與COM組件間數(shù)據(jù)的傳遞。VARIANT數(shù)據(jù)類型是所有未被顯式聲明為其他類型變量的數(shù)據(jù)類型,VARIANT是一種特殊的數(shù)據(jù)類型,除了定長String數(shù)據(jù)及用戶定義類型外,可以包含任何種類的數(shù)據(jù)。軟件編程中的其他類型數(shù)據(jù),可通過LabWindows/CVI中的數(shù)據(jù)轉換函數(shù)將其轉換為VARIANT類型。如整型數(shù)據(jù)intVal,將其轉換為VARIANT型變量varVal,可調用以下命令:
varVal=CA_VariantInt(intVal);
(4)調用功能函數(shù),函數(shù)中的Object Handle參數(shù)即為第(2)步中獲得的句柄,函數(shù)參數(shù)為第(3)步中通過轉換獲得的VARIANT型變量。
(5)將結果進行數(shù)據(jù)轉換,取出計算結果。函數(shù)計算結果也為VARIANT型數(shù)據(jù),必須通過數(shù)據(jù)轉換才能將結果轉換為相應的類型。如欲取出double型計算結果,調用命令:
CA_VariantGetDouble(&varVal,&dbVal),其 中varVal為函數(shù)返回的VARIANT型數(shù)據(jù),dbVal為轉換后的double型結果。
(6)清除VARIANT型變量,釋放空間。調用CA_VariantClear(&varVal)命令,其中varVal為要清除的VARIANT型變量。
(7)關閉對象句柄,釋放空間??赏ㄟ^調用CA_DiscardObjHandle(objHandle)命令完成,其中objHandle為要關閉的句柄。
為了驗證本文所述內容,使用上述方法進行經驗模態(tài)分解(EMD)的混合編程,即在Matlab中編寫EMD算法,并生產COM組件,在LabWindows/CVI中調用COM組件完成測試軟件中信號的EMD分解。步驟如下:
(1)編寫EMD算法的 m文件,有EMD_Tr.m、getIMF.m、GetPagebyPCHIP.m、judgeRule.m、getmax.m、getmin.m,其中EMD_Tr.m為導出函數(shù)的m文件,其余為內部函數(shù)的m文件。
(2)按2.1所述創(chuàng)建EMDCom工程,并完成工程的配置,生成COM組件EMDCom_1_0.dll,并打包生成EMDCom_pkg.exe。
(3)運行EMDCom_pkg.exe完成MCR的安裝和組件的注冊。
(4)按2.2所述生成組件驅動EMDCom.fp等文件,并將其添加到當前測試軟件工程中。
(5)在測試軟件工程中按2.2所述調用EMDCom.fp中函數(shù),其關鍵代碼如下:
圖2 基于混合編程的EMD分解軟件運行界面
其中cSig為原始信號數(shù)據(jù),sigLon為原始信號數(shù)據(jù)長度,mNum為分解層數(shù),mSig為原始信號矩陣,m IMF為分解結果矩陣,cIMF為分解后數(shù)據(jù)數(shù)組,分解后各層數(shù)據(jù)都依次存儲在cIMF中。
通過上述步驟,完成了LabWindows/CVI和Matlab混合編程的EMD算法實現(xiàn)軟件,軟件可脫離Matlab環(huán)境運行。軟件運行界面如圖2所示。
LabWindows/CVI與Matlab的混合編程方式有多種,但大都存在一定的局限性,不能充分發(fā)揮LabWindows/CVI與Matlab的優(yōu)點,限制了基于LabWindows/CVI測試軟件的開發(fā)效率。
基于COM組件的LabWindows/CVI與Matlab混合編程技術實現(xiàn)了LabWindows/CVI與Matlab的完美結合,充分發(fā)揮了LabWindows/CVI的測試軟件開發(fā)能力和Matlab的數(shù)據(jù)處理能力,為基于Matlab的算法研究和基于LabWindows/CVI的工程實現(xiàn)搭建了一座橋梁,提高了測試軟件的開發(fā)效率。
[1]鄭力新,周凱汀,龔勇,等.LabWindows/CVI對Matlab的引擎調用技術[J].華僑大學學報:自然科學版,2007,28(4):365-367.
[2]陳希林,肖明清.一種LabWindows/CVI與Matlab混合編程的實現(xiàn)方法[J].微計算機信息,2005,21(1):43-44.
[3]張燕,陳華.LabWindows/CVI與Matlab接口實現(xiàn)的幾種方法[J].工業(yè)控制計算機,2006(1):1-3.
[4]黃成亮,鄭賓,黃公亮.Matlab與LabWindows/CVI接口技術在自動機測試中的應用[J].自動化與儀器儀表,2010(5):58-59.
[5]吳小麗,丁維明,程力.Delphi動態(tài)調用Matlab COM組件實現(xiàn)二者混合編程[J].工業(yè)控制計算機,2011,24(3):1-3.
[6]張強,吳慶鳴,陳東,等.ActiveX在LabWindows/CVI中的創(chuàng)建與應用[J].機電工程技術,2006,35(5):64-66.