《基于COM的MATLAB与C#NET混合编程的实现与应用.pdf》由会员分享,可在线阅读,更多相关《基于COM的MATLAB与C#NET混合编程的实现与应用.pdf(4页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 2 O卷 第 4期 2 0 0 6年 7月 山 东 理 工 大 学 学 报(自 然 科 学 版)J o u r n a l o f S h a n d o n g Un i v e r s i t y o f Te c h n o l o g y(S c i Te c h)V0 1 2 O NO 4 J u 1 2 0 0 6 文章编号:1 6 7 2 6 1 9 7(2 0 0 6)0 4 0 0 2 6 0 4 基于 C OM 的 MATL AB与 C#NE T混合编程的实现与应用 赵 士伟,赵 明波,陈 平(山东理工大学 计算机科学与技术学院,山东 淄博 2 5 5 0 4 9)摘
2、要:介绍 了一种基于 C OM 组件 的 MATL A B与 C#NE T混合编程的实现方法 论述 了 MA TL AB中C OM 组件的编程、利用 C OM B u i l d e r 开发 C OM 组件、组件 的注册 以及在 C#NE T 中接 口、调用的方法,并给出了在数据采集中曲线拟和的实例 关键词:C 0M;MATL AB;C#NE T;混 合编程 中图分类号:T P 3 1 1 1 1 文献标识码:A I mp l e me n t a t i o n a n d a p p l i c a t i o n o f M ATLAB C#NET i nt e g r a t e d
3、 p r o g r a mmi n g b a s e d o n COM ZHAO Shi we i,ZHAO Mi n g b o,CHEN Pi ng (S c h o o l o f Co mp u t e rS c i e n c e a n d Te c h n o l o g y,S h a n d o n g Un i v e r s i t y o f Te c h n o l o g y,Z i b o 2 5 5 0 4 9,Ch i n a)Ab s t r a c t:A me t h o d o f MATL AB C#NE T i n t e g r a t e
4、 d p r o g r a mmi n g b a s e d o n COM i s i n t r o d u c e d Th e f o l l o wi n g t e c h n i q u e s a r e d e mo n s t r a t e d i n d e t a i l,i n c l u d i n g p r o g r a mmi n g wi t h COM i n M ATL AB,d e v e l o p i n g COM c o mp o n e n t s wi t h COM Bu i l d e r。r e g i s t e r i n
5、 g C【)M c o m p o n e n t a n d h o w t o u s e COM i n C#NE TAn e x a mp l e o f d a t a g a t h e r i n g i s g i v e n Ke y w o r d s:COM;MATLAB;C#NET;h y b r i d p r o g r a mmi n g MA T L A B是 Ma t h Wo r k s 公司于 1 9 8 2年推出 的一种功能强大、效率高、交互性好的数值计算和 可视化计算机高级语言,它集数值计算、信号处理 和图形分析等功能于一体,被称为演算纸式的语 言 它
6、强大的功能为各领域 的应用提供了基础,已经从最初的“矩阵实验室”渗透到科学 与工程计 算的多个领域,如信号处理、自动控制等_ 1 MA T I AB作为一种高级语言,具有极高的编程效率,但 它也存在一些缺陷:界面开发能 力较差!;使用的 收稿 日期:2 0 0 51 1 2 4 作者简介:赵士伟(1 9 8 0一)男 硕士研究生 是解释性语言,大大限制了它的执行速度;源代码 的公开不利于算 法和数据 的保密;局限于 MA T L A B运行环境而不能用于开发商用软件 C#NE T 是针 对 N E T 平 台而设计 的,是微 软 NE T计划中的主要开发语言 利用 C#NE T 开发的系统具有
7、界面友好、执行速度快、易维护和 升级等优点,能够生成可执行 文件能有效的保护 算法和 数据,并 可脱 离 编 程 环 境 运行 但 是 在 工程计算方 面,和MATL A B相 比编 程显得 复杂 维普资讯 http:/ 第 期 赵士伟。等:基于 C O M 的 MAT 1 AB与 C#NE T混合编程 的实现与应用 的多 因此实现 C#NE T与 MAT I AB混合编 程 使两者结 合起来。协同工作,必将提高软件开 发效率 使所开发的软件具有更高 的性能,更大的 应用范围。也可以为科学研究和工程技术提供更 强 的技 术支持 1 C()M 介绍 组 件 对 象 模 型(C o mp o n
8、e n t Ob j e c t Mo d e l。c()M)。是 组 件 之 间 相互 接 口的规 范,是 0L E (Ob j e c t L i n k i n g E mb e d d i n g)和 Ac t i v e X共同 的基础 其作用是 使各种软件构件和应用软件能 够用 一 种 统 一 的标 准 方 式 进 行 交 互 C 0M 不 是 一种面向对象的语言。而是一种与源代码无关 的 二进 制标准 C OM 所建立的是一个软件模块 与 另一个软件模块之间的链接,当这种链 接建立之 后 模块之间就可以通过称之为“接 口”的机制来 进行通 信 C OM 本质 上仍 然是 客户$t
9、 务器 模 式 客户(通常是应用程序)请求 创建 C OM 对象 并通过(、OM 对象的接 口操纵 C OM 对象 服务器 根据客户的请求创建并管理 C OM 对 象 客户 和 服务器这两种角色并不是绝对的 MATI AB支持组件 自动化(C OM Au t o ma t i o n)即一个 C OM 协议,该协议允许一个程序或 组件去控制另一个程 序或组件 因此,MATL A B 支持的组件技术 主要 包括 以下几个方面:在 MATI AB下运行其它 软件 的组件;在其 它程 序下运 行 MA TL AB的组 件(包 括 MA TL AB 自 身);将 所需的 MATL A B功能(通常 由
10、若干个 m 和 me x文 件 构 成)用 MAT L AB 自 带 工 具(、()M B u i l d e r自动转换生成组件,以供其它程序 使用 2 MA TI AB中 C OM 组件的编程 与 I l 律 每个 MATL A B C OM 组件都作 为一个标准 的独立的COM 对象创建,可以在 C#NE T中调 用 一个 C OM 组件可以包含许多类(C l a s s)(添加 的方法在 2 2中介绍),类包括方法、属性、事件,用于和用户程序交互 下面 以组件 My P o l y f i t 为 例介绍 C OM 组件 的编程创建方法 该组 件包含 一个名称为 My P o l y
11、f i t 的类,可完 成曲线 拟和 的 任务 该类 具 有 p o l y n i h e和 p o l y n i h e l 2种方 法,分别完成带图形显示的多项式曲线拟和和不带图 形显示的多项式曲线拟和 的功能 还具有 X,Y 2 个属 性 文 章 中 的实 例 在 Ma t l a b 7 0和 Mi c r o s o f t Vi s u a l S t u d i o NE T 2 o 0 3中调 试通 过 2 1 C 0 M 组件 的编 程 1)添加类 的方 法 在 Ma t l a b中编 写 p o l y n i h e m 和 p o l y n i h e 1 m
12、2个函数 其 中 p o l y n i h e m 实现最小二乘的多 项式曲线拟和,返回拟 和的参数并将拟 和结果图 形显示出来,p o l y n i h e 1 m也 同样实现最 小二乘 的多项式曲线拟 和,返 回参数但并不显示 图形结 果 2)添 加类 的属性 类的属性允许对象在方法调用之间保留一个 内部 的状态 C o rn B u i l d e r 把类 中所有 M 文件的 共享 的全局变量转化为类 的属性 M 文件中全局 变量以关键字 g l o b a l 描述 类 的属性是相 当有用 的,例如在程序中把一个不经常改变值而需要经 常对之操作的大的数组定义为属性,这样数组的 值
13、可以作为属性被设置为一次,就不需要在每个 方法 中进行 传递 了 作为示例在类 My P o l t fi t中 定 义了 2个属性 X,Y,如 下:p o l y n i h e 1 m f u n c t i o n E p 3=p o l y n i h e l(n)g l o b a l X;将被 C OM B u i l d e r 转化 为属性 g l o b a l Y;将被 C O M B u i l d e r 转 化为属性 p=p o l y f i t(X,Y n);p o l y n i h e m f u n c t i o n E p 3=p o l y n i h
14、 e(n mi n X ma x X)g l o b a l X;将被 C O M B u i l d e r 转化 为属性 g l o b a l Y;将被 C OM B u i l d e r 转化为属性 p=p o l y f i t(X。Y。n);x i=l i n s p a c e(mi n X,r n a x X);x-a x i s d a t a f o r p l o t t i n g z=p o l y v a l(P,x i):p l o t(x,Y,0 ,x,Y,x i,Z,:)x l a b e l(x ),y la b e l(y f(x),t i t l e(
15、C u r v e F i t t i n g )以上 2个 函数添加到 C OM 组件 中后,全 局 变量 X Y将转化为属性 3)添加类的事件 C o rn B u i l d e r 支持事件 在 MATL A B函数中 加入一段”9 5#e v e n t”程序可把 函数转 化为事 件 函数,添加此函数 到类 中即为此类 添加 了一个事 件 可 以在 MATL A B的其他需要与 外部程序交 维普资讯 http:/ 2 8 山 东 理 工 大 学 学 报(自 然 科 学 版)互的函数 中调 用事件 函数 以引发事 件,在 C#NE T中编写该事件的事件处理函数,这样可实现 组件函数内部
16、与外部程序的交互 一般在下列 3 种情 况下会 用到 事件 函数:a)在长时间的运算过程中给客户端程序一个 反馈结果 例如:一个需要 n次迭代的任务,可能 会需要在每次迭代中引发一个事件用以驱动客户 端程序中的进度条 b)在任务运行过程 中发 出警告信息,但仍希 望 任务继 续运 行 c)不终止任务运行的条件下为用户返回中间 结果 2 2利 用 C oM B u i l e r 创 建 组件 C OM B u i l d e r 在编译生成 C OM 组件的时候 需要借助于外部的编译器,但并不是所有的编译 器都能生 成和 Mi c r o s o f t 相 兼容 的 C oM 组件 C OM
17、 B u i l d e r支持 的编译 器 为:B o r l a n d C+Bu i l d e r 4,B o r l a n d C+B u i l d e r 5,B o r l a n d C+Bui l de r 6,M i c r os o f t V i s u a l St u di o 5 0。M i c r o s of t V i s u a l St u d i o 6 O,M i c r o s o f t Vi s u a l St u d i o NE T 可 通 过 在 MATL A B 的 C o mma n d Wi n d o w中输入 命令 Mb
18、u i l d s e t u p来设置 编译 器,此处将编译器设置为 Mi c r o s o f t Vi s u a l S t u d i O NET 利用 C OM B u i l d e r 创建 C OM 组件需要 4个 简单的步骤:1)创 建一 个工 程 在 MAT L AB的“C o mma n d Wi n d o w”中输 入 命令“c o mt o o l”,出现“MATL AB B u i l d e r”窗 口,在此创建一个新 的工 程,出现“Ne w P r o j e c t S e t t i n g s”窗口,进行一些必要的设置 在“C o mp o n e
19、 n t n a me”中输入组件名称,编译 后将 生成该 名称 的 d l 1 此处将 创建 一个用 于多项式 数据 拟和 的组 件,名称 为“My P o l y f i t 9 9 在“C l a s s n a me”中键人 类 的名称,通过“Ad d”键 加入 到“C l a s s e s”列表 中,或者通过“R e mo v e”键移除“C l a s s e s”列表中的类“C l a s s e s”列表 中的类将包含在生成的“My P o l y f i t”组件中“P r o j e c t v e r s i o n”中可以输入版 本信 息,进行简单的版本管理,以区分不
20、同时期制作的 相同名字的 C OM 组件“P r o j e c t d i r e c t o r y”是整 个工程 的存 放 目录 编译 器选 项:“B u i l d d e b u g v e r s i o n”,选 中该选 项会 生成 调试 版 本 的 C OM 组 件,在调试的时候如果有错误发生,就会有相应的 错误提示信息并能方便地定位错误,而不是 De b u g版本的 C OM 在 出错时仅能给 出错误提示信 息;“S h o w v e r b o s e o u t p u t”,选 中该选项可以在编 译生成 C OM 组件的时候输出详细 的过程 信息 在工 程创 建之
21、后 仍然 可 以通 过 菜 单 P r o j e c t 一 S e t t i n g s 打开此窗 口进行修改 2)添加 文件 创 建 好 一 个 工 程 后,“MATI AB B u i d e r”中 菜单“P r o j e c t”、“B u i l d”、“C o mp o n e n t”将生效 可 选择 需 要添 加 的文 件 的 类 型,然 后 添 加 相 应 的文 件 在此所添加的 M 文件或者 ME X文件将作为 类的方 法 出现在 C OM 组件 中 3)编译 工 程 完成工 程设 置 并添加 需 要 的 M 函数 和 ME X 函数 后,选 择 B u i l d
22、一 C OM Ob j e c t,便 可 编 译 生成 d l l 文件 生成的 D L I 文件将 自动注册 到所 使用的系统中 4)发布组 件 组件编译完成并测试成功后,若脱离 MAT L AB环境 使用则需 要打包 选择 C o mp o n e n t一 P a c k a g e C o mp o n e n t,弹 出 P a c k a g e F i l e s对话 框,添加与发布组件相关的文件:一 i n s t a l 1 b a t,d l l,mg l i n s t a l l e r e x e。mwc o mu t i l d l l,mwr e g s v r
23、 e x e等文 件 添加完 成所有文件后。单击 C r e a t e生成发布 文件 3 C#NE T中调用生成的 C O M 组件 上述步骤完成后已经生成 C OM 组件。接下 来将在 C#NE T中使用该 C OM 组件完成采集 数据后数据拟和的功能 3 1 C OM 组件 的注 册和 引用 使用 Ma t l a b中制作 的 C O M 组件首先需要把 该控件注册到 目标计算机上 若在本地使用,编译 生成组件 时就 已经 注册 了,不需 要 再人 为干预 而 如果需要在其他未注册 的机器上使用则需要做两 方面的工作:一是安装 Ma t l a b的数学图形库;再者 就需要利用 mwr
24、 e g s v r 注册 mw c o mu t i l d l l a n d一 d l 1 例如,注册 My P o l y f i t 组件需要在 运行对话 框 中输入命令:mwr e g s v r My P o l y f i t _ 1 0 d l l。反 注册则需要输入命令:mwr e g s v r u My P o l y f i t 1 维普资讯 http:/ 第 4期 赵士伟,等:基于 C OM 的 MATI AB与 C#NE T混合编程 的实现 与应用 2 9 0 d l 1 注册成 功后 方可 使用该 组 件 在 c#NE T应用程序中使用该 C 0M 组件 首 先
25、需要 添加 引 用 右 键 单 击 工 程项 目下 引 用 找 到 My P o l y f i t 1 0 d l l 的 位置 添加 至引 用 中,添 加 完成后 可在 C#NE T 中使用 3 2 C#NE T 中使 用 C OM 组 件 3 2 1 类 的实例 的创 建 与方法 的调用 在 C#NE T 中使 用 C OM 组 件 调 用 组 件 中 类的方法之前需要 创建包含这 个方法的类 的实 例,C二 NE T 中类的实例可 以用 F l e w运算符来 实 现 例如,创建类 Z P o l y f i t C l a s s的实例;ZPo l yf i t Cl a s s z
26、 pf=n e w ZPol yf i t Cl a s s();创建实例后,Ma t l a b中的 M 函数 可作为该 实例 的方 法进行 调用 3 2 2 参数 变量 的转 换#NE T与 MAT L AB的参数变量并不完 全相 同,这需要在调用组件的方法时将 C#NE T 的变量类型转化 为 MATL AB中对应 的变量类 型 MAT I AB方法返回的数据为 o b j e c t 类型,若 在 C:NE T中使用需要将其强制转化 为相应的 数据类 型 3 3在 数据 拟和 中的 实 际应用 在数据采集项 目中常常需要进行现场标定,把实际采集的信号与 目标值进行对应,数据拟和 是行之
27、 有 效 的 方 法 MAT L AB 中有 丰 富 的 拟 和 函数 并可以图形的方式直观 的显示数据拟 和结 果 下面以拟和多个采集值和仪表值为例,在 C#中应用 My P o l y f i t 组件完 成该功能 该功能 的部 分 c#源码 如下:p r i v a t e v o i d b u t t o n l Cl i c k(o b j e c t s e n d e r,S y s t e m Ev e nt Ar gs e)对当前显示的数据进行拟和 d o u b l e ,p r;o b j e c t x l,y l,p=n u l l;d o u b l e x n
28、e w d o u b l e n :d o u b l e y=n e w d o u b l e n ;此处省略部分源码 Z P o l y f i t Z P o l y f i t Cl a s s z p f=n e w ZP o l y f i t Cl a s s ():z p f x=x l;z p f y=y l;z p f p o l y n i h e(1,r e f P,m e,mi n x,ma x x);p r=(d o u b l e ,)P;I 代码给 出了 P o l y f i t C l a s s组件的使 用方法:构建组件 P o l y f i t C
29、 l a s s的类 的实例;为 类 的属 性 赋 值;调 用 类 的 p o l y n i h e方 法;将返回的结果转化为 C#中的数据类型 3 4运 行结 果 应用 Ma t l a b的 C 0 M 组 件 My P o l y f i t 后,使 程序得到了简化,并且显示直观,是该程序的运行 结果见图 1 不仅能够 根据所选择 的拟和 多项式 的次数计算系数,而且还能直观的显示拟和结果,以更合 理 的选 择 数据 的拟 和方式 文 中所介 绍 的 方法 不 局 限 于 数 据 拟 和,可 广 泛的应用于信号处理、自动控制等各个领域 应用 Ma t l a b丰富的工具箱 并配合 C
30、#NE T等 高级 语言的灵活编程,可实现更为复杂的功能 4 结束语 图 1 运行结果 利用 C OM B u i l d e r创建 C OM 组 件并 基于 C 0M 组 件 实 现 C#NE T 和 MATI AB混 合 编 程的方法,可 以高效的利用 MAT L AB强大的科 学计算功能和丰富的工具箱,并能充分发挥 C#NE T编程灵活,界面友好,易于维护、升级、发布 的优点 混合编程的实现提高了软件开发效率,优 化了软件的性能,增强了算法和数据的保密性,可 广泛应用于科学研究和工程技术中 参 考文 献:1 胡劲松,周方洁基于 C OM 的 MAT L AB与 De l p h i 混 合编 程研究 J 计算机应用研究。2 0 0 5。(1):1 6 5 1 6 6 2 岳玉芳,尤忠生。张 玉双基于 C OM 的 VB与 MA TL AB混 合编程 J 计算机工程与设计,2 0 0 5,(1):6 1 6 2 维普资讯 http:/