基于COM的MATLAB与C__NET混合编程的实现与应用

基于COM的MATLAB与C__NET混合编程的实现与应用
基于COM的MATLAB与C__NET混合编程的实现与应用

第20卷第4期2006年7月

山东理工大学学报(自然科学版)

Journal of Shandong University of Technology(Sci&Tech)

Vol.20No.4

J ul.2006

文章编号:1672-6197(2006)04-0026-04

基于COM的MA TL AB与

C#.N E T混合编程的实现与应用

赵士伟,赵明波,陈 平

(山东理工大学计算机科学与技术学院,山东淄博255049)

摘 要:介绍了一种基于COM组件的MA TL AB与C#.N ET混合编程的实现方法.论述了MA TL AB中COM组件的编程、利用COM Builder开发COM组件、组件的注册以及在C#.

N ET中接口、调用的方法,并给出了在数据采集中曲线拟和的实例.

关键词:COM;MA TLAB;C#.N ET;混合编程

中图分类号:TP311.11文献标识码:A

Implementation and application of MAT LAB&C#.NET

integrated programming based on COM

ZHAO Shi2wei,ZHAO Ming2bo,C H EN Ping

(School of Computer Science and Technology,Shandong University of Technology,Zibo255049,China)

Abstract:A met hod of MA TLAB/C#.N ET integrated p rogramming based on COM is in2 t roduced.The following techniques are demo nstrated in detail,including programming wit h COM in MA TL AB,developing COM component s wit h COM Builder,registering COM com2 ponent and how to use COM in C#.N ET.An example of data gat hering is given.

K ey w ords:COM;MA TL AB;C#.N ET;hybrid p rogramming

MATLAB是MathWorks公司于1982年推出的一种功能强大、效率高、交互性好的数值计算和可视化计算机高级语言,它集数值计算、信号处理和图形分析等功能于一体,被称为演算纸式的语言[1].它强大的功能为各领域的应用提供了基础,已经从最初的“矩阵实验室”渗透到科学与工程计算的多个领域,如信号处理、自动控制等[1].MAT2 LAB作为一种高级语言,具有极高的编程效率,但它也存在一些缺陷:界面开发能力较差[2];使用的是解释性语言,大大限制了它的执行速度;源代码的公开不利于算法和数据的保密;局限于MAT2 LAB运行环境而不能用于开发商用软件.

C#.N ET是针对.N ET平台而设计的,是微软.N ET计划中的主要开发语言.利用C#.N ET 开发的系统具有界面友好、执行速度快、易维护和升级等优点,能够生成可执行文件能有效的保护算法和数据,并可脱离编程环境运行.但是在工程计算方面,和MA TL AB相比编程显得复杂

收稿日期:20051124

作者简介:赵士伟(1980),男,硕士研究生.

的多.因此实现C#.N ET与MA TL AB混合编程,使两者结合起来,协同工作,必将提高软件开发效率,使所开发的软件具有更高的性能,更大的应用范围,也可以为科学研究和工程技术提供更强的技术支持.

1 COM介绍

组件对象模型(Component Object Model, COM),是组件之间相互接口的规范,是OL E (Object Linking&Embedding)和ActiveX共同的基础,其作用是使各种软件构件和应用软件能够用一种统一的标准方式进行交互.COM不是一种面向对象的语言,而是一种与源代码无关的二进制标准.COM所建立的是一个软件模块与另一个软件模块之间的链接,当这种链接建立之后,模块之间就可以通过称之为“接口”的机制来进行通信.COM本质上仍然是客户/服务器模式.客户(通常是应用程序)请求创建COM对象并通过COM对象的接口操纵COM对象.服务器根据客户的请求创建并管理COM对象.客户和服务器这两种角色并不是绝对的.

MA TL AB支持组件自动化(COM Automa2 tion),即一个COM协议,该协议允许一个程序或组件去控制另一个程序或组件.因此,MA TL AB 支持的组件技术主要包括以下几个方面:①在MA TL AB下运行其它软件的组件;②在其它程序下运行MA TL AB的组件(包括MA TL AB自身);③将所需的MA TLAB功能(通常由若干个m和mex文件构成)用MA TL AB自带工具COM Builder自动转换生成组件,以供其它程序使用.

2 MA TL AB中COM组件的编程与创建

每个MA TL AB COM组件都作为一个标准的独立的COM对象创建,可以在C#.N ET中调用.一个COM组件可以包含许多类(Class)(添加的方法在2.2中介绍),类包括方法、属性、事件,用于和用户程序交互.下面以组件MyPolyfit为例介绍COM组件的编程创建方法.该组件包含一个名称为MyPolyfit的类,可完成曲线拟和的任务.该类具有polynihe和polynihe12种方法,分别完成带图形显示的多项式曲线拟和和不带图形显示的多项式曲线拟和的功能.还具有X,Y2个属性.文章中的实例在Matlab7.0和Mi2 cro soft Visual St udio.N ET2003中调试通过. 2.1 COM组件的编程

1)添加类的方法

在Matlab中编写polynihe.m和polynihe1. m2个函数.其中polynihe.m实现最小二乘的多项式曲线拟和,返回拟和的参数并将拟和结果图形显示出来,polynihe1.m也同样实现最小二乘的多项式曲线拟和,返回参数但并不显示图形结果.

2)添加类的属性

类的属性允许对象在方法调用之间保留一个内部的状态.Com Builder把类中所有M文件的共享的全局变量转化为类的属性.M文件中全局变量以关键字global描述.类的属性是相当有用的,例如在程序中把一个不经常改变值而需要经常对之操作的大的数组定义为属性,这样数组的值可以作为属性被设置为一次,就不需要在每个方法中进行传递了.作为示例在类MyPoltfit中定义了2个属性X,Y,如下:

polynihe1.m

f unction[p]=polynihe1(n)

 global X; %将被COM Builder转化为属性

 global Y; %将被COM Builder转化为属性

 p=polyfit(X,Y,n);

polynihe.m

f unction[p]=polynihe(n,minX,maxX)

 global X; %将被COM Builder转化为属性

 global Y; %将被COM Builder转化为属性

 p=polyfit(X,Y,n);

 xi=linspace(minX,maxX);%x2axis data for plotting z=polyval(p,xi);

 plot(x,y,’o’,x,y,xi,z,’:’)

 xlabel(’x’),ylabel(’y=f(x)’),title(’Curve Fitting’)

以上2个函数添加到COM组件中后,全局变量X、Y将转化为属性.

3)添加类的事件

Com Builder支持事件.在MA TL AB函数中加入一段”%#event”程序可把函数转化为事件函数,添加此函数到类中即为此类添加了一个事件.可以在MA TL AB的其他需要与外部程序交

72

第4期 赵士伟,等:基于COM的MA TL AB与C#.N ET混合编程的实现与应用

互的函数中调用事件函数以引发事件,在C#. N ET中编写该事件的事件处理函数,这样可实现组件函数内部与外部程序的交互.一般在下列3种情况下会用到事件函数:

a)在长时间的运算过程中给客户端程序一个反馈结果.例如:一个需要n次迭代的任务,可能会需要在每次迭代中引发一个事件用以驱动客户端程序中的进度条.

b)在任务运行过程中发出警告信息,但仍希望任务继续运行.

c)不终止任务运行的条件下为用户返回中间结果.

2.2 利用COM Builer创建组件

COM Builder在编译生成COM组件的时候需要借助于外部的编译器,但并不是所有的编译器都能生成和Micro soft相兼容的COM组件. COM Builder支持的编译器为:Borland C++ Builder4,Borland C++Builder5,Borland C+ +Builder6,Micro soft Visual St udio 5.0,Mi2 cro soft Visual St udio6.0,Micro soft Visual St u2 dio.N ET.可通过在MA TLAB的Command Window中输入命令Mbuild set up来设置编译器,此处将编译器设置为Micro soft Visual St udi2 o.N ET.

利用COM Builder创建COM组件需要4个简单的步骤:

1)创建一个工程

在MA TL AB的“Command Window”中输入命令“comtool”,出现“MA TL AB Builder”窗口,在此创建一个新的工程,出现“New Project Set2 tings”窗口,进行一些必要的设置.在“Component name”中输入组件名称,编译后将生成该名称的dll.此处将创建一个用于多项式数据拟和的组件,名称为“MyPolyfit”.在“Class name”中键入类的名称,通过“Add”键加入到“Classes”列表中,或者通过“Remove”键移除“Classes”列表中的类.“Classes”列表中的类将包含在生成的“MyPoly2 fit”组件中.“Project version”中可以输入版本信息,进行简单的版本管理,以区分不同时期制作的相同名字的COM组件.“Project directory”是整个工程的存放目录.编译器选项:“Build debug version”,选中该选项会生成调试版本的COM组件,在调试的时候如果有错误发生,就会有相应的错误提示信息并能方便地定位错误,而不是De2 bug版本的COM在出错时仅能给出错误提示信息;“Show verbo se outp ut”,选中该选项可以在编译生成COM组件的时候输出详细的过程信息.在工程创建之后,仍然可以通过菜单Project-> Settings打开此窗口进行修改.

2)添加文件

创建好一个工程后,“MA TL AB Buider”中菜单“Project”、“Build”、“Component”将生效.可选择需要添加的文件的类型,然后添加相应的文件.在此所添加的M文件或者M EX文件将作为类的方法出现在COM组件中.

3)编译工程

完成工程设置并添加需要的M函数和M EX 函数后,选择Build->COM Object,便可编译生成dll文件.生成的DLL文件将自动注册到所使用的系统中.

4)发布组件

组件编译完成并测试成功后,若脱离MA T2 L AB环境使用则需要打包.选择Component->Package Component,弹出Package Files对话框,添加与发布组件相关的文件:_install.bat,< component name_p rojectversion>.dll,mglin2 staller.exe,mwcomutil.dll,mwregsvr.exe等文件.添加完成所有文件后,单击Create生成发布文件.

3 C#.NET中调用生成的COM组件

上述步骤完成后已经生成COM组件,接下来将在C#.N ET中使用该COM组件完成采集数据后数据拟和的功能.

3.1 COM组件的注册和引用

使用Matlab中制作的COM组件首先需要把该控件注册到目标计算机上.若在本地使用,编译生成组件时就已经注册了,不需要再人为干预.而如果需要在其他未注册的机器上使用则需要做两方面的工作:一是安装Matlab的数学图形库;再者就需要利用mwregsvr注册mwcomutil.dll and< componentname>_.dll..

例如,注册MyPolyfit组件需要在运行对话框中输入命令:mwregsvr MyPolyfit_1_0.dll,反注册则需要输入命令:mwregsvr/u MyPolyfit_1

82山东理工大学学报(自然科学版)2006年 

_0.dll.注册成功后方可使用该组件.

在C#.N ET应用程序中使用该COM组件首先需要添加引用.右键单击工程项目下引用找到MyPolyfit_1_0.dll的位置添加至引用中,添加完成后可在C#.N ET中使用.

3.2 C#.N ET中使用COM组件

3.2.1 类的实例的创建与方法的调用

在C#.N ET中使用COM组件调用组件中类的方法之前需要创建包含这个方法的类的实例,C#.N ET中类的实例可以用new运算符来实现.

例如,创建类Z_Polyfit Class的实例;

Z_Polyfit Class zpf=new Z_Polyfit Class();

创建实例后,Matlab中的M函数可作为该实例的方法进行调用.

3.2.2 参数变量的转换

C#.N ET与MA TL AB的参数变量并不完全相同,这需要在调用组件的方法时将C#.N ET 的变量类型转化为MA TL AB中对应的变量类型.MA TL AB方法返回的数据为object类型,若在C#.N ET中使用需要将其强制转化为相应的数据类型.

3.3 在数据拟和中的实际应用

在数据采集项目中常常需要进行现场标定,把实际采集的信号与目标值进行对应,数据拟和是行之有效的方法.MA TL AB中有丰富的拟和函数,并可以图形的方式直观的显示数据拟和结果.下面以拟和多个采集值和仪表值为例,在c#中应用MyPolyfit组件完成该功能.该功能的部分c#源码如下:

private void button1_Click(object sender,System. EventArgs e)

{

 //对当前显示的数据进行拟和

 double[,]pr;

 object x1,y1,p=null;

 double[]x=new double[n];

 double[]y=new double[n];

 //此处省略部分源码

 Z_Polyfit.Z_PolyfitClass zpf=new Z_PolyfitClass (); ①

 zpf.x=x1;②

 zpf.y=y1;③

 zpf.polynihe(1,ref p,nc,minx,maxx); ④

 pr=(double[,])p; ⑤

}

代码①———⑤给出了PolyfitClass组件的使用方法:①构建组件PolyfitClass的类的实例;②③为类的属性赋值;④调用类的polynihe方法;

⑤将返回的结果转化为c#中的数据类型.

3.4 运行结果

应用Matlab的COM组件MyPolyfit后,使程序得到了简化,并且显示直观,是该程序的运行结果见图1.不仅能够根据所选择的拟和多项式的次数计算系数,而且还能直观的显示拟和结果,以更合理的选择数据的拟和方式.

文中所介绍的方法不局限于数据拟和,可广泛的应用于信号处理、自动控制等各个领域.应用Matlab丰富的工具箱并配合C#.N ET等高级语言的灵活编程,

可实现更为复杂的功能.

图1 运行结果

4 结束语

利用COM Builder创建COM组件并基于COM组件实现C#.N ET和MA TLAB混合编程的方法,可以高效的利用MA TLAB强大的科学计算功能和丰富的工具箱,并能充分发挥C#. N ET编程灵活,界面友好,易于维护、升级、发布的优点.混合编程的实现提高了软件开发效率,优化了软件的性能,增强了算法和数据的保密性,可广泛应用于科学研究和工程技术中.

参考文献:

[1]胡劲松,周方洁.基于COM的MA TLAB与Delphi混合编

程研究[J].计算机应用研究,2005,(1):1652166.

[2]岳玉芳,尤忠生,张玉双.基于COM的VB与MA TLAB混

合编程[J].计算机工程与设计,2005,(1):61262.

92

第4期 赵士伟,等:基于COM的MA TL AB与C#.N ET混合编程的实现与应用

相关主题
相关文档
最新文档