MATLAB绘图窗嵌入.NET项目混合编程
2015-12-20王文斌剡昌锋刘朝阳
王文斌,剡昌锋+,刘朝阳,2,张 凯,3
(1.兰州理工大学 机电工程学院,甘肃 兰州730050;2.东南大学 机械工程学院,江苏 南京211189;3.大连理工大学 机械工程学院,辽宁 大连116024)
0 引 言
在许多研究和商用软件开发中,常会遇到C#.NET 与MATLAB混合编程的情况,即利用MATALB中提供的工具箱中函数和算法实现某些功能的编写,而主体软件和界面用VisualC#.NET 进行开发,并通过C#.NET 进行相关数据库操作等。这样既结合了C#编程人员与MATLAB编程人员共同开发软件,减少了算法的开发周期,提高了软件开发效率,加快了研究工作的进展,又起到算法保密作用。在MATLAB 与其它语言混编的方式方面,张良等[1]在VB.NET 环 境 中,利 用ActiveX 调 用MATLAB 的函数,并结合Access数据库开发了等离子体单粒子模拟程序;王海岗等[2]叙述了基于COM 技术的VC 与MATLAB混合编程的一般链接方法,并将其应用于图像处理中,得到较好的结果;P.Bisták[3]基于C#.NET 技术与Matlab/Simulink平台做了远程实验室控制系统的开发,并描述了其在液压系统与磁悬浮系统中的应用;焦纲领等[4]介绍了C#.NET 调用MATLAB 生成的COM 组件的混合编程过程;R.Bayindir等[5]基于C#.NET 与MATLAB,开发了一套用于分析串口和并口RCL 回路的训练工具;秦健等[6]将C#.NET 与MATLAB 混合编程应用于探空数据的处理,并以图形化显示的方式比较了不同厂家探空仪所得的各项数据;陈华杰等[7]将VC和MATLAB混合编程技术应用到开合成发孔径雷达 (SAR)图像分类平台中,实现SAR 图像分类算法的测试与评估;姚光强等[8]以地理信息系统中常用的空间插值分析为例,比较了C#与MATLAB混合编程的两种混编方式,其结论中称使用MATLAB COM Builder将M 语言文件编译成COM 组件供C#调用的方式要比C#使用MATLAB提供的自动化服务要更好。
尽管MATLAB与其它语言混合编程的应用很多,但是在调用MATLAB图窗时,会弹出一个单独的Figure窗,而不是嵌入在主体软件界面中,使得软件的融合性变差,用户体验不佳;吴焕瑞等[9]通过图片流的方式做到了图像的嵌入显示,但通过这种方式实现后就失去了MATLAB绘图窗口的工具使用功能。为此,本文在C#与MATLAB混编中,提出一种C#.NET 调用MATLAB 时将MATLAB绘图窗口 (Figure窗口)嵌入WinForm 的方法。并将此方法应用到汽轮发电机组的状态监测与故障诊断软件开发中,进行运行显示与结果分析。
1 C#.NET与MATLAB混编总体概述
MATLAB通过MATLAB Compiler发布其代码或产品如图1所示,通过MATLAB Bilder产品可以发布供特定编程环境调用的组件。其中,通过MATLAB Builder NE可以将MATLAB中编写的具有特定功能的*.m 文件编译成.NET 组件,供C#程序调用。
图1 MATLAB发布产品
在进行汽轮发电机组的状态监测与故障诊断软件开发中,用C#进行软件的主体开发,即用户操作界面、用户和文件管理、数据库操作等,充分利用C#高级开发语言带来的方便。而对现场采集的设备运行信号进行诸如幅值谱、功率谱以及自相关函数等频谱分析和相干分析的算法借助MATLAB,编写MATLAB 的.m 函数文件,并通过MATLAB发布工具生成.NET 组件。在运行过程中,数据传输和程序调用的流程如图2 所示。首先,用C#程序调用MATLAB发布的.NET 组件,并导入采集的时域信号数据。其 次,MCR (MATLAB component runtime)根 据所调用m 函数文件的功能,做出相应的回应,返回数值数据或者弹出MATALB绘图窗体 (Figure)。最后,若MCR返回数值数据则传输给C#程序做相关处理,而若是弹出可视的Figure窗,则C#通过调用Windows操作系统的窗口函数查询Figure窗体的句柄,将包含图谱结果的Figure窗体句柄返回并传给C#主程序的WPF用户控件,作为其的子窗体嵌入到主程序界面中。以此,操作人员可以做信号的监视、对比和后续的处理。
图2 数据传输和程序调用流程
2 C#项目调用MATLAB过程
本文研究的内容都是在MATLAB 2010a环境下发布.NET 组件,并在Visual Studio 2010C#环境中进行主界面开发和数据转换与调用。
2.1 从MATLAB环境生成.NET组件
MATLAB通过其内部开发工具MATLAB Bilder NE将编写的.m 文件编译成.NET 组件,此组件就可以像其它托管代码一样在C#.NET 中很方便的进行调用。从MATLAB生成.NET 组件的主要步骤如下:
(1)在MATLAB 中编写好特定功能的算法函数,以*.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 函数则可以都添加到此类中,也可以重新建一个类。
(5)点击生成按钮,生成C#.NET 环境中可以调用的dll组件文件。如果程序是将来要在没有安装MATLAB 的机子上运行,则需要在Package选项卡中添加MCR,点击打包按钮就可以将所需的程序集文件和MCR 引擎安装文件等打包在指定路径的.exe文件中,双击该.exe文件,就可以将所有文件解压出来。
2.2 C#项目调用MATLAB
从MATLAB生成.NET 组件成功后,在生成路径下的distrib文件夹中就包含了所需的扩展名为.dll的.NET组件,该类组件在C#中叫做程序集。得到了.dll程序集文件后,在C#项目中添加对其的引用,就可以实现对程序集内部方法的调用。主要步骤如下:
(1)用Visual Studio 2010创建好C#的Windows窗体应用程序。
(2)引用程序集文件。在所建项目中浏览添加前面MATLAB生成的.dll程序集文件和库文件MWArray.dll的引用。其中MWArray.dll文件起到C#调用Matlab引擎桥梁的作用,是此种混编方式中所必须的。C#中数据类型可以通过MWArray.dll实现同Matlab中数据类型的相互转换,该文件位于本机MATLAB 安装路径下的\toolbox\dotnetbuilder\bin\ [win32|Win64]\v2.0中。
(3)在项目中新建一个静态类,用来封装调用Matlab函数的方法。要在该类中添加如下两个引用:using Math-Works.MATLAB.NET.Arrays和using MathWorks.MATLA B.NET.Utility。
(4)在相应的事件处理程序中写入调用 (3)中方法的代码就可实现用MATLAB 函数进行运算,并可以接受函数返回的数据值。如果该函数的结果是在MATLAB 绘图窗口中,则会弹出一个独立于C#应用程序窗体的MATLAB绘图窗口。
3 将Figure嵌入WinForm 中
如果编写的m 函数在运行时,其结果要在MATLAB绘图窗口中显示,则通过C#程序调用组件中该函数时,就会弹出一个独立于C#应用程序窗体的由MCR 支持的MATLAB绘图 (Figure)窗口。为此,在C#的WinForm中添加一个WPF用户控件,该WPF控件界面中包含一个border控件。C#通过平台调用Win32API函数,将Figure窗口的句柄传给border控件的Child属性,从而实现整个Figure窗口嵌入Windows窗体设计界面中。
3.1 在WinForm 中添加一个WPF用户控件
(1)在所创建项目下需要嵌入MATLAB Figure窗口的Windows窗体设计界面中添加一个ElementHost控件,并设置好大小。
(2)在项目中添加一个 “用户控件 (WPF)”的新项,并设置好名称,本文采用其默认名称UserControl1.xaml。
(3)在UserControl1.xaml中添加一个WPF 的border控件,并设置Width 和Height与 (1)中ElementHost的大小一致。将UserControl和Grid 的大小也设为同样的大小。
(4)重新生成项目,并点击ElementHost控件右上角的智能标签,将 (2)和 (3)设置的UserControl1设置为其所承载的内容,使WPF 用户控件嵌入到Windows 界面中。
3.2 封装一个用于捕捉窗口句柄的类
为了将MATLAB绘图窗口嵌入WinForm 中,需通过C#调用Windows操作系统的窗口函数找到Figure窗体句柄,主要步骤及代码如下:
(1)在项目中添加一个用于捕捉窗体并设置窗体特性的类,名称可以为ControlHost,并且此类要继承自系统类HwndHost。
(2)在ControlHost类中添加以下几个引用:
using System.Windows.Interop;
using System.Runtime.InteropServices;
using System.Threading;
using System.Windows;
(3)捕捉窗体并设置窗体风格时需要用到的Win32 API函数主要有下面代码中所示:
(4)在ControlHost类中重写HwndHost的HandleRef BuildWindowCore方法,用来创建一个承载窗口,承载捕捉到的Figure窗口。最后将Figure窗口的句柄包装在一个托管对象中返回,该方法的代码如下:
3.3 在WinForm 应用程序中添加嵌入子窗体的代码
在应用程序的指定事件处理程序中写句柄传递的代码,将捕捉到的MATLAB 绘图窗口句柄传递给border控件的Child属性,作为其承载元素,实现Figure窗口间接地嵌入Windows窗体界面中。
4 程序设计示例
汽轮发电机组在电力生产中属于极其重要设备,起着举足轻重的作用,因此,其运行的稳定性和可靠性跟整个电力系统乃至整个国民经济稳定有着密切的关系。研究开发汽轮发电机组故障诊断专家系统,有助于准确高效地对汽轮发电机组故障进行诊断与预测,对于汽轮发电机组保持良好的工作状态具有重大的意义[10]。本文结合C#和SQL Server以及MATLAB 进行汽轮发电机组状态监测与故障诊断软件的综合开发,图3是软件主界面。
图3 汽轮发电机组故障诊断系统
软件中状态监测和信号分析两个模块均采用C#与MATLAB混合编程实现的。状态监测是对于汽轮机机组实现故障诊断的第一步,是故障诊断工作的重要基础。有效的状态监测在保证机组安全、稳定、高效运行和消除事故方面能发挥巨大的作用,本模块主要功能包括——前期处理模块 (包含时域波形、去直流分量、显示数据、求绝对值)、状态监测模块 (包括峰值、峰峰值、均值、均方根值、方差、标准差、峭度、波形因子、峰值因子、峭度、脉冲因子和裕度因子)和状态分析模块 (包括轴心轨迹图、极坐标图、频谱图、波德图)。链接好数据采集系统后,选择相应的分析功能,运行效果如图4所示。在该图中,峰值、峰峰值等以列表的方式显示其值,而时域波形图、轴心轨迹图等以图形化的方式显示,两者结合于同一界面,极大的方便了设备状态的监测与分析。
状态信号分析是用来实现对汽轮机组实时监测的信号进行分析的,并以图形界面的形式显示出来,以方便有关专家实时分析汽轮机的振动信号,并及时诊断其产生的故障,最终实现故障的修复。因此,在本模块中需要做出直观的状态信号分析平台的显示界面,并显示出汽轮机振动信号的分析图谱,主要进行信号的频谱分析及相干分析的图形化显示。运行效果如图5所示,从图中可以看出,汽轮机振动信号的分析图谱均实现图形化显示,使故障的诊断变得直观,快捷。
图4 状态监测界面
图5 状态信号分析平台界面
两模块的开发过程相类似,只是各自包含的MATLAB算法不同,主要开发过程如下:
(1)在MATLAB 中编写各个子功能的算法,并各自保存为*.m 文件,按照2.1的步骤生成.NET 组件Untitled1.dll。
(2)按照2.2中 (1)至 (3)的步骤建立起状态监测界面和状态信号分析平台界面,并设置好C#调用MATLAB的配置。其中,在 (3)中所建立的静态类为Get-Function.cs。
(3)以3.1与3.2 中的方式添加好窗体嵌入的程序,将子功能名称添加到一个Treeview 控件中,并在Treeview控件的双击事件中添加调用GetFunction的方法代码以及窗体传递代码。其中,状态监测模块中一些功能方法,如峰值,返回的是数值数据,则以合适的数据类型进行接收,并传递到文本框中,结果如图4所示。在图谱显示的功能调用中,要将Figure窗嵌入主界面中,主要代码如下:
GetFunction.Myfft1();//调用对应于Treeview 节点双击事件的图谱计算方法
ControlHost listControl=new ControlHost(400,350);
userControl11.border1.Child=listControl;
Application.DoEvents();
从图4和图5中可以看出,一个完整的MATLAB绘图窗体嵌入到了C#开发的各自界面中,MATLAB绘图窗体中的所有工具,如放大缩小、移到等,也都可以正常使用,这为状态监测和后续的信号处理工作都带来很大的方便。
另外,如果混编后的程序或软件要在没有安装相应版本的MATLAB与VisualStudio的计算机上运行,则需要安装 相 应 版 本 的 两 个 组 件:①安 装 .NET 框 架 (Microsoft.NET framework),以支持C#代码的编译;②安装MCR (MATLAB component runtime)以支持MATLAB程序的运行。
5 结束语
本文提出一种基于C#.NET与MATLAB 混编的Figure窗口嵌入WinForm 方法,通过汽轮发电机组的状态监测与故障诊断软件开发实例的验证,本文所提的方法能较好的将Figure窗口嵌入WinForm 中,增强了软件的融合性,方便了用户操作。另外,本文所提的方法还可以广泛用于各类用到C#调用MATLAB混编的科研与商业软件开发中,缩短开发周期,提高开发效率,降低人力成本。
[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 混合编程方法的研究和应用 [J].计算机工程与设计,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 混合编程在图像处理中的应用[J].计算机应用与软件,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). [焦纲领,邓建 辉,韩啸.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混合编程在探空数据对比中的应用 [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 图像分类中的应用 [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 技术的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 调用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).[王慧滨.基于规则和案例推理的汽轮发电机组故障诊断专家系统 [D].兰州:兰州理工大学,2014:1-2.]