王文斌,剡昌鋒+,劉朝陽,2,張 凱,3
(1.蘭州理工大學 機電工程學院,甘肅 蘭州730050;2.東南大學 機械工程學院,江蘇 南京211189;3.大連理工大學 機械工程學院,遼寧 大連116024)
在許多研究和商用軟件開發(fā)中,常會遇到C#.NET 與MATLAB混合編程的情況,即利用MATALB中提供的工具箱中函數(shù)和算法實現(xiàn)某些功能的編寫,而主體軟件和界面用VisualC#.NET 進行開發(fā),并通過C#.NET 進行相關(guān)數(shù)據(jù)庫操作等。這樣既結(jié)合了C#編程人員與MATLAB編程人員共同開發(fā)軟件,減少了算法的開發(fā)周期,提高了軟件開發(fā)效率,加快了研究工作的進展,又起到算法保密作用。在MATLAB 與其它語言混編的方式方面,張良等[1]在VB.NET 環(huán) 境 中,利 用ActiveX 調(diào) 用MATLAB 的函數(shù),并結(jié)合Access數(shù)據(jù)庫開發(fā)了等離子體單粒子模擬程序;王海崗等[2]敘述了基于COM 技術(shù)的VC 與MATLAB混合編程的一般鏈接方法,并將其應(yīng)用于圖像處理中,得到較好的結(jié)果;P.Bisták[3]基于C#.NET 技術(shù)與Matlab/Simulink平臺做了遠程實驗室控制系統(tǒng)的開發(fā),并描述了其在液壓系統(tǒng)與磁懸浮系統(tǒng)中的應(yīng)用;焦綱領(lǐng)等[4]介紹了C#.NET 調(diào)用MATLAB 生成的COM 組件的混合編程過程;R.Bayindir等[5]基于C#.NET 與MATLAB,開發(fā)了一套用于分析串口和并口RCL 回路的訓練工具;秦健等[6]將C#.NET 與MATLAB 混合編程應(yīng)用于探空數(shù)據(jù)的處理,并以圖形化顯示的方式比較了不同廠家探空儀所得的各項數(shù)據(jù);陳華杰等[7]將VC和MATLAB混合編程技術(shù)應(yīng)用到開合成發(fā)孔徑雷達 (SAR)圖像分類平臺中,實現(xiàn)SAR 圖像分類算法的測試與評估;姚光強等[8]以地理信息系統(tǒng)中常用的空間插值分析為例,比較了C#與MATLAB混合編程的兩種混編方式,其結(jié)論中稱使用MATLAB COM Builder將M 語言文件編譯成COM 組件供C#調(diào)用的方式要比C#使用MATLAB提供的自動化服務(wù)要更好。
盡管MATLAB與其它語言混合編程的應(yīng)用很多,但是在調(diào)用MATLAB圖窗時,會彈出一個單獨的Figure窗,而不是嵌入在主體軟件界面中,使得軟件的融合性變差,用戶體驗不佳;吳煥瑞等[9]通過圖片流的方式做到了圖像的嵌入顯示,但通過這種方式實現(xiàn)后就失去了MATLAB繪圖窗口的工具使用功能。為此,本文在C#與MATLAB混編中,提出一種C#.NET 調(diào)用MATLAB 時將MATLAB繪圖窗口 (Figure窗口)嵌入WinForm 的方法。并將此方法應(yīng)用到汽輪發(fā)電機組的狀態(tài)監(jiān)測與故障診斷軟件開發(fā)中,進行運行顯示與結(jié)果分析。
MATLAB通過MATLAB Compiler發(fā)布其代碼或產(chǎn)品如圖1所示,通過MATLAB Bilder產(chǎn)品可以發(fā)布供特定編程環(huán)境調(diào)用的組件。其中,通過MATLAB Builder NE可以將MATLAB中編寫的具有特定功能的*.m 文件編譯成.NET 組件,供C#程序調(diào)用。
圖1 MATLAB發(fā)布產(chǎn)品
在進行汽輪發(fā)電機組的狀態(tài)監(jiān)測與故障診斷軟件開發(fā)中,用C#進行軟件的主體開發(fā),即用戶操作界面、用戶和文件管理、數(shù)據(jù)庫操作等,充分利用C#高級開發(fā)語言帶來的方便。而對現(xiàn)場采集的設(shè)備運行信號進行諸如幅值譜、功率譜以及自相關(guān)函數(shù)等頻譜分析和相干分析的算法借助MATLAB,編寫MATLAB 的.m 函數(shù)文件,并通過MATLAB發(fā)布工具生成.NET 組件。在運行過程中,數(shù)據(jù)傳輸和程序調(diào)用的流程如圖2 所示。首先,用C#程序調(diào)用MATLAB發(fā)布的.NET 組件,并導入采集的時域信號數(shù)據(jù)。其 次,MCR (MATLAB component runtime)根 據(jù)所調(diào)用m 函數(shù)文件的功能,做出相應(yīng)的回應(yīng),返回數(shù)值數(shù)據(jù)或者彈出MATALB繪圖窗體 (Figure)。最后,若MCR返回數(shù)值數(shù)據(jù)則傳輸給C#程序做相關(guān)處理,而若是彈出可視的Figure窗,則C#通過調(diào)用Windows操作系統(tǒng)的窗口函數(shù)查詢Figure窗體的句柄,將包含圖譜結(jié)果的Figure窗體句柄返回并傳給C#主程序的WPF用戶控件,作為其的子窗體嵌入到主程序界面中。以此,操作人員可以做信號的監(jiān)視、對比和后續(xù)的處理。
圖2 數(shù)據(jù)傳輸和程序調(diào)用流程
本文研究的內(nèi)容都是在MATLAB 2010a環(huán)境下發(fā)布.NET 組件,并在Visual Studio 2010C#環(huán)境中進行主界面開發(fā)和數(shù)據(jù)轉(zhuǎn)換與調(diào)用。
MATLAB通過其內(nèi)部開發(fā)工具MATLAB Bilder NE將編寫的.m 文件編譯成.NET 組件,此組件就可以像其它托管代碼一樣在C#.NET 中很方便的進行調(diào)用。從MATLAB生成.NET 組件的主要步驟如下:
(1)在MATLAB 中編寫好特定功能的算法函數(shù),以*.m 格式保存到指定路徑,并確保程序能在MATLAB 中成功運行。
(2)在MATLAB的Command Window 里輸入deployment命令,按回車即可彈出部署工程對話框 “Deployment Project”。
(3)在Deployment Project對話框的Name中輸入要生成的程序集文件的名稱,在Location中選擇程序集輸出路徑,在Type中選擇生成程序集的類型,選擇.NET Assembly,點確定后進入Deployment Tool窗口中。
(4)點擊 [Add class]添加一個類,并在該類下add files中添加好之前保存好的*.m 文件作為該類的方法,如果有多個m 函數(shù)則可以都添加到此類中,也可以重新建一個類。
(5)點擊生成按鈕,生成C#.NET 環(huán)境中可以調(diào)用的dll組件文件。如果程序是將來要在沒有安裝MATLAB 的機子上運行,則需要在Package選項卡中添加MCR,點擊打包按鈕就可以將所需的程序集文件和MCR 引擎安裝文件等打包在指定路徑的.exe文件中,雙擊該.exe文件,就可以將所有文件解壓出來。
從MATLAB生成.NET 組件成功后,在生成路徑下的distrib文件夾中就包含了所需的擴展名為.dll的.NET組件,該類組件在C#中叫做程序集。得到了.dll程序集文件后,在C#項目中添加對其的引用,就可以實現(xiàn)對程序集內(nèi)部方法的調(diào)用。主要步驟如下:
(1)用Visual Studio 2010創(chuàng)建好C#的Windows窗體應(yīng)用程序。
(2)引用程序集文件。在所建項目中瀏覽添加前面MATLAB生成的.dll程序集文件和庫文件MWArray.dll的引用。其中MWArray.dll文件起到C#調(diào)用Matlab引擎橋梁的作用,是此種混編方式中所必須的。C#中數(shù)據(jù)類型可以通過MWArray.dll實現(xiàn)同Matlab中數(shù)據(jù)類型的相互轉(zhuǎn)換,該文件位于本機MATLAB 安裝路徑下的\toolbox\dotnetbuilder\bin\ [win32|Win64]\v2.0中。
(3)在項目中新建一個靜態(tài)類,用來封裝調(diào)用Matlab函數(shù)的方法。要在該類中添加如下兩個引用:using Math-Works.MATLAB.NET.Arrays和using MathWorks.MATLA B.NET.Utility。
(4)在相應(yīng)的事件處理程序中寫入調(diào)用 (3)中方法的代碼就可實現(xiàn)用MATLAB 函數(shù)進行運算,并可以接受函數(shù)返回的數(shù)據(jù)值。如果該函數(shù)的結(jié)果是在MATLAB 繪圖窗口中,則會彈出一個獨立于C#應(yīng)用程序窗體的MATLAB繪圖窗口。
如果編寫的m 函數(shù)在運行時,其結(jié)果要在MATLAB繪圖窗口中顯示,則通過C#程序調(diào)用組件中該函數(shù)時,就會彈出一個獨立于C#應(yīng)用程序窗體的由MCR 支持的MATLAB繪圖 (Figure)窗口。為此,在C#的WinForm中添加一個WPF用戶控件,該WPF控件界面中包含一個border控件。C#通過平臺調(diào)用Win32API函數(shù),將Figure窗口的句柄傳給border控件的Child屬性,從而實現(xiàn)整個Figure窗口嵌入Windows窗體設(shè)計界面中。
(1)在所創(chuàng)建項目下需要嵌入MATLAB Figure窗口的Windows窗體設(shè)計界面中添加一個ElementHost控件,并設(shè)置好大小。
(2)在項目中添加一個 “用戶控件 (WPF)”的新項,并設(shè)置好名稱,本文采用其默認名稱UserControl1.xaml。
(3)在UserControl1.xaml中添加一個WPF 的border控件,并設(shè)置Width 和Height與 (1)中ElementHost的大小一致。將UserControl和Grid 的大小也設(shè)為同樣的大小。
(4)重新生成項目,并點擊ElementHost控件右上角的智能標簽,將 (2)和 (3)設(shè)置的UserControl1設(shè)置為其所承載的內(nèi)容,使WPF 用戶控件嵌入到Windows 界面中。
為了將MATLAB繪圖窗口嵌入WinForm 中,需通過C#調(diào)用Windows操作系統(tǒng)的窗口函數(shù)找到Figure窗體句柄,主要步驟及代碼如下:
(1)在項目中添加一個用于捕捉窗體并設(shè)置窗體特性的類,名稱可以為ControlHost,并且此類要繼承自系統(tǒng)類HwndHost。
(2)在ControlHost類中添加以下幾個引用:
using System.Windows.Interop;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows;
(3)捕捉窗體并設(shè)置窗體風格時需要用到的Win32 API函數(shù)主要有下面代碼中所示:
(4)在ControlHost類中重寫HwndHost的HandleRef BuildWindowCore方法,用來創(chuàng)建一個承載窗口,承載捕捉到的Figure窗口。最后將Figure窗口的句柄包裝在一個托管對象中返回,該方法的代碼如下:
在應(yīng)用程序的指定事件處理程序中寫句柄傳遞的代碼,將捕捉到的MATLAB 繪圖窗口句柄傳遞給border控件的Child屬性,作為其承載元素,實現(xiàn)Figure窗口間接地嵌入Windows窗體界面中。
汽輪發(fā)電機組在電力生產(chǎn)中屬于極其重要設(shè)備,起著舉足輕重的作用,因此,其運行的穩(wěn)定性和可靠性跟整個電力系統(tǒng)乃至整個國民經(jīng)濟穩(wěn)定有著密切的關(guān)系。研究開發(fā)汽輪發(fā)電機組故障診斷專家系統(tǒng),有助于準確高效地對汽輪發(fā)電機組故障進行診斷與預(yù)測,對于汽輪發(fā)電機組保持良好的工作狀態(tài)具有重大的意義[10]。本文結(jié)合C#和SQL Server以及MATLAB 進行汽輪發(fā)電機組狀態(tài)監(jiān)測與故障診斷軟件的綜合開發(fā),圖3是軟件主界面。
圖3 汽輪發(fā)電機組故障診斷系統(tǒng)
軟件中狀態(tài)監(jiān)測和信號分析兩個模塊均采用C#與MATLAB混合編程實現(xiàn)的。狀態(tài)監(jiān)測是對于汽輪機機組實現(xiàn)故障診斷的第一步,是故障診斷工作的重要基礎(chǔ)。有效的狀態(tài)監(jiān)測在保證機組安全、穩(wěn)定、高效運行和消除事故方面能發(fā)揮巨大的作用,本模塊主要功能包括——前期處理模塊 (包含時域波形、去直流分量、顯示數(shù)據(jù)、求絕對值)、狀態(tài)監(jiān)測模塊 (包括峰值、峰峰值、均值、均方根值、方差、標準差、峭度、波形因子、峰值因子、峭度、脈沖因子和裕度因子)和狀態(tài)分析模塊 (包括軸心軌跡圖、極坐標圖、頻譜圖、波德圖)。鏈接好數(shù)據(jù)采集系統(tǒng)后,選擇相應(yīng)的分析功能,運行效果如圖4所示。在該圖中,峰值、峰峰值等以列表的方式顯示其值,而時域波形圖、軸心軌跡圖等以圖形化的方式顯示,兩者結(jié)合于同一界面,極大的方便了設(shè)備狀態(tài)的監(jiān)測與分析。
狀態(tài)信號分析是用來實現(xiàn)對汽輪機組實時監(jiān)測的信號進行分析的,并以圖形界面的形式顯示出來,以方便有關(guān)專家實時分析汽輪機的振動信號,并及時診斷其產(chǎn)生的故障,最終實現(xiàn)故障的修復。因此,在本模塊中需要做出直觀的狀態(tài)信號分析平臺的顯示界面,并顯示出汽輪機振動信號的分析圖譜,主要進行信號的頻譜分析及相干分析的圖形化顯示。運行效果如圖5所示,從圖中可以看出,汽輪機振動信號的分析圖譜均實現(xiàn)圖形化顯示,使故障的診斷變得直觀,快捷。
圖4 狀態(tài)監(jiān)測界面
圖5 狀態(tài)信號分析平臺界面
兩模塊的開發(fā)過程相類似,只是各自包含的MATLAB算法不同,主要開發(fā)過程如下:
(1)在MATLAB 中編寫各個子功能的算法,并各自保存為*.m 文件,按照2.1的步驟生成.NET 組件Untitled1.dll。
(2)按照2.2中 (1)至 (3)的步驟建立起狀態(tài)監(jiān)測界面和狀態(tài)信號分析平臺界面,并設(shè)置好C#調(diào)用MATLAB的配置。其中,在 (3)中所建立的靜態(tài)類為Get-Function.cs。
(3)以3.1與3.2 中的方式添加好窗體嵌入的程序,將子功能名稱添加到一個Treeview 控件中,并在Treeview控件的雙擊事件中添加調(diào)用GetFunction的方法代碼以及窗體傳遞代碼。其中,狀態(tài)監(jiān)測模塊中一些功能方法,如峰值,返回的是數(shù)值數(shù)據(jù),則以合適的數(shù)據(jù)類型進行接收,并傳遞到文本框中,結(jié)果如圖4所示。在圖譜顯示的功能調(diào)用中,要將Figure窗嵌入主界面中,主要代碼如下:
GetFunction.Myfft1();//調(diào)用對應(yīng)于Treeview 節(jié)點雙擊事件的圖譜計算方法
ControlHost listControl=new ControlHost(400,350);
userControl11.border1.Child=listControl;
Application.DoEvents();
從圖4和圖5中可以看出,一個完整的MATLAB繪圖窗體嵌入到了C#開發(fā)的各自界面中,MATLAB繪圖窗體中的所有工具,如放大縮小、移到等,也都可以正常使用,這為狀態(tài)監(jiān)測和后續(xù)的信號處理工作都帶來很大的方便。
另外,如果混編后的程序或軟件要在沒有安裝相應(yīng)版本的MATLAB與VisualStudio的計算機上運行,則需要安裝 相 應(yīng) 版 本 的 兩 個 組 件:①安 裝 .NET 框 架 (Microsoft.NET framework),以支持C#代碼的編譯;②安裝MCR (MATLAB component runtime)以支持MATLAB程序的運行。
本文提出一種基于C#.NET與MATLAB 混編的Figure窗口嵌入WinForm 方法,通過汽輪發(fā)電機組的狀態(tài)監(jiān)測與故障診斷軟件開發(fā)實例的驗證,本文所提的方法能較好的將Figure窗口嵌入WinForm 中,增強了軟件的融合性,方便了用戶操作。另外,本文所提的方法還可以廣泛用于各類用到C#調(diào)用MATLAB混編的科研與商業(yè)軟件開發(fā)中,縮短開發(fā)周期,提高開發(fā)效率,降低人力成本。
[1]ZHANG Liang,HE Yexi.Research and application of hybrid programming with Matlab,Access and VB.NET [J].Computer Engineering and Design,2009,30 (5):1232-1235 (in Chinese).[張良,何也熙.Matlab、Access和VB.NET 混合編程方法的研究和應(yīng)用 [J].計算機工程與設(shè)計,2009,30(5):1232-1235.]
[2]WANG Haigang,ZHANG Kunyu,ZHANG Yanjia,et al.Aplication of mixed programing With VC and MATLAB in image processing [J].Computer Applications and Software,2012,29 (1):273-275 (in Chinese). [王海崗,張坤宇,張雁佳,等.VC 與MATLAB 混合編程在圖像處理中的應(yīng)用[J].計算機應(yīng)用與軟件,2012,29 (1):273-275.]
[3]Bistak P.Advanced remote laboratory for control systems based on Matlab and.NET platform [C]//IEEE 11th International Conference on Emerging eLearning Technologies and Applications.IEEE,2013:35-39.
[4]JIAO Gangling,DENG Jianhui,HAN Xiao.Hybrid programming of VisualC#.NET and MATLAB [J].Journal of Naval Aeronautical and Astronautical University,2008,23 (1):109-111 (in Chinese). [焦綱領(lǐng),鄧建 輝,韓嘯.MATLAB與Visual C#.NET 混合編程 [J].海軍航空工程學院工程學報,2008,23 (1):109-111.]
[5]QIN Jian,WANG Ping,TU Xuewei,et al.Application of integrated programming between C#.NET and MATLAB in atmosphere sounding data contrast[J].Meteorological,Hydrologicaland Marine Instruments,2009 (2):56-62 (in Chinese).[秦鍵,王萍,涂雪偉,等.C#.NET 與MATLAB混合編程在探空數(shù)據(jù)對比中的應(yīng)用 [J].氣象水文海洋儀器,2009 (2):56-62.]
[6]Bayindir R,Kaplan O,Can C.C#.NET and MATLAB based simulation program for basic electrical circuits[C]//International Aegean Conference on Electrical Machines and Power Electronics and Electromotion Joint Conference.IEEE,2011:430-435.
[7]CHEN Huajie,SHI Junfeng,LIN Yuesong.VC\ Matlab mixed programming based on COM and its application in SAR image classification [J].Journal of Mechanical & Electrical Engineering,2011,28 (11):1377-1381 (in Chinese).[陳華杰,史俊峰,林岳松.基于COM 的VC/Matlab混合編程及其在SAR 圖像分類中的應(yīng)用 [J].機電工程,2011,28 (11):1377-1381.]
[8]YAO Guangqiang,CHEN Liping.Integrated programming between C#and Matlab based on component object model[J].Computer Engineering,2008,34 (14):87-89 (in Chinese).[姚光強,陳立平.基于COM 技術(shù)的C#與Matlab混合編程[J].計算機工程,2008,34 (14):87-89.]
[9]WU Huanrui,CHE Zihui.C#.NET calling Matlab on hybrid programming [J].Computer Study,2010 (4):93-94 (in Chinese).[吳煥瑞,車紫輝.C#.NET 調(diào)用Matlab進行混合編程 [J].電腦學習,2010 (4):93-94.]
[10]WANG Huibin.Fault diagnostic expert system of turbine generator sets based on rule reasoning and case reasoning [D].Lanzhou:Lanzhou University,2014:1-2 (in Chinese).[王慧濱.基于規(guī)則和案例推理的汽輪發(fā)電機組故障診斷專家系統(tǒng) [D].蘭州:蘭州理工大學,2014:1-2.]