搜档网
当前位置:搜档网 › 浅谈VB与MATLAB相结合的三种方法

浅谈VB与MATLAB相结合的三种方法

浅谈VB与MATLAB相结合的三种方法
浅谈VB与MATLAB相结合的三种方法

浅谈VB与M AT LAB相结合的三种方法

樊金荣① 黎洪生②

摘 要 本文分别介绍了在VB中调用M atlab的三种方法:利用动态链接库DLL、利用动态数据交换D EE以及利用A ctivex自动化技术。并以具体的例子给出通过这些方法实现了VB的可视化界面与M atlab强大的数值计算和图形显示能力的结合。

关键词 客户 服务器 M atlab DLL DD E A ctivex 技术

一、前言

V isual Basic是由M icro s oft公司开发的在W indow s95 98平台上的一种十分强大和有生命W indow s编程语言之一,具有易学易用、编程简单、程序集成化程度高及界面可视化又能实现大多数W indow s编程目的,因而一经推出就风靡全球然而,VB提供的数学函数及其有限,因而使之在数值计算和图形显得力不人心。M atlab是M ath W o rk s公司开发的一种工程计算语言。用这个交互系统可以解决很多工程计算问题,特别当涉及到矩阵和矢量形式的问题时,M atlab提供了强大的矩阵处理的和绘图功能。显然,将二者结合起来,能实现VB 可视化界面下运用M A TLAB强大的数值计算和图形显示,使VB编更加灵活快洁。

二、采用动态链接库DLL方法

M atcom是一个从M A TLAB到C++的编译器,它可以节省用户的运算时间和内存要求。M ath too ls公司利用M atcom4技术编写了M ideva工具软件,它可以借用C++编译器将M atlab下的M-文件转换为可被VB调用的DLL或独立瓣可执行文件。VB中要使用DLL,必须在VB工程中包含DLL的声明文件(即模块文件),同时还要将DLL放在工程文件所在的目录下。

如下操作可以一个M-文件编译成DLL:启动M atcom4的M ideva,点菜单F ile Comp ile,选要转换的M-文件应该是能作为函数被其他集城环境调用的M-文件,设文件名为m yfile)。编译完成后,在对应的D ebug或R elease目录下,可以找到一些编译生成的文件。VB需要用到的文件有两个。m yfile.dll(DLL文件)m yfile.bas(在VB中声明DLL的模块文件)。事实上,m yfile.dll中的函数并不能直接与VB进行数据交换,它只能通过矩阵数据进行操作。M ah tToo ls提供了一个单独的C++库文件m atlib42.dll(相当VB集成环境与DLL之间的代理,它包含有20多个矩阵句柄操作函数和800多个从M atlab中转换来的矩阵函数)以及相应的模块文件m atlib42.bas。为了在VB中能调用这类DLL,必须将m yfile. bas和m atlib42.bas加入工程中,并将m yfil.dll和m atlib42. dll拷贝到工程所在的目录下。编译后,在VB中的函数名为m yfile-in-out,其中,in和out分别为函数的输入输出参数的个数。注意,在编程时,必须调用m t In it M来初始化库文件,即请求允许使用转换的DLL,并调用m tEx it M来结束这种请求。另外,还要使用其它的矩阵句柄函数来分配、访问和释放矩阵句柄。

这种方式最简单的例子是直接调用m atlib42.dll中提供的inv-2-1来计算矩阵的逆。

二、采用动态数据交换D EE方法

该方法是利用M A TLAB提供的客户 服务器(C lien t Server)功能,VB应用程序作为系统主控,用M atlab作为后台应用程序完成复杂计算任务与绘画功能,M atlab与VB应用程序间通过DD E协议进行数据交换,DD E(D ynam ic D ata Exchange)是一种开放的、与语言无关的、基于消息的协议,它是应用程序通过共享内存进行进程通信的一种形式。

VB应用程序首先通过确定服务器名和主题(top ic)建立与M A TLAB的DD E会话,服务器名和主题唯一地确定作为客户端,M atlab作为服务端,客户端与服务端可以就确定的项目(Ite m)交换数据。关于VB的DD E功能可以参文献。VB应用程序中需指明的M A TLAB的服务器为M atlab,, M A TLAB有Syste m和Engine两个主题,在Syste m主题下可以列出M A TLAB所提供的详细的DD E功能,在Engine主题下可以充分实现M A TLAB的服务功能。利用VB具有的DD E客户端功能,使用M A TLAB的Engine主题支持的三种操作,VB应用程序主河以向M A TLAB传送可执行的命令,从M A TLAB中读取数据以及向M A TLAB中传送数据。

VB为用户提供的支持DD E通信的控件有:窗体(Fo r m)、多文档窗体(M D I Fo r m)、标签(L abel)、文本框(T ex t Box)和图片框(P icture Box)。相应于DD E协议,这些控件提供了完成一次DD E链接需要的属性和事件,以及设置

②黎洪生 武汉理工大学自动化学院 教授 博士生导师 武汉 430070

樊金荣 武汉理工大学自动化学院 硕士 武汉 430070

必要的参数和响应DD E 过程事的事件。

服务器应用程序开发涉及到的主要属性如下:

1.L i n k M ode :对于一个V isual Basic 程序来说,作为一个

服务器程序和作为一个客户程序时,它们的L ink M ode 属性的取值是不同的。当一个V isual Basic 程序作为服务程序时,L ink M ode 属性只是针对Fo r m 的,它的取值为

“1-Source ”。此时,这个Fo r m 中的P icture Box 控件、T ex tBox 控件和L abel 控件就可以作为客户程序的信息源。

2.L i n k Top i c :如同L ink M ode 属性一样。对于服务器程

序和客户程序来说,属性有不同的意义。对服务器程序来说,

L ink Top ic 属性是针对Fo r m 的,用户可以将服务器程序中的Fo r m 的属性设置为任何一个名字,该名字在客户应用程序中

使用。

3.L i n k Ite m :是指通过一个DD E 链接传输的数据容器,

它是标签(L abel )、文本框(T ex t Box )和图片框(P icture Box )的名称。

下面以一个具体的例子来说明该方法:

在VB 主窗体中设置T ex tl 、T ex t 2两个文本框,当T ex 1的内容有变化,则x 矩阵获得变化后的数据,而后在函数

m yfunc 中进行矩阵相乘运算,并把结果返回至T ex t 2控件

中。在实际应用中,m yfunc 函数可以是任意复杂的数据处理函数和控制算法函数。

程序清单:

channel =ddein it (′Server ′,′DD E ′

);rc =ddeadv (channel ,′T ex tl ′,′m yfunc ′,′x ′,[1,0]);Pause ;

rc =ddeunadv (channel ,′T ex tl ′,[1,0]);rc =ddeter m (channel );

其中m yfunc 为自定义的m atlab 函数:

Functi on y -m yfunc (x 3x );

rc =ddepoke (channel ,′

′,y ,[10]);注意:利用动态数据交换调用M A TLAB 时,M A TLAB 的命令窗口必须在建立DD E 会话之前已经运行

四、采用Acti veX 自动化技术

A ctiveX 自动化(OL E 自动化)协议是一种允许一个应用

程序(控制端)去控制另一个应用程序(服务器端)的协议。由于VB 支持A ctiveX 自动化控制端协议,M A TLAB 支持

A ctiveX 自动化服务器端协议。如果已经建立了一个V

B 应用

程序和M A TLAB 之间的A ctiveX 自动化连接,那么一个VB 应用程序中就可以调用M A TLAB 的命令、向M A TLAB 传送或从M A TLAB 接收矩阵数组。

在VB 应用程序中创建了M A TLAB 的A ctiveX 对象以后就可以使用这个对象所包含的各种方法来实现对

M A TLAB 的调用。M atlab .A pp licati on 对象含有3个方法,可

以实现任决定何M A TLAB 功能。现简单介绍它们的用法。

1.Execute (Co mmand a s Str i n g )方法:执行本方法将调用M A TLAB 执行一条Comm and 字符串决定的M A TLAB 命

令,同时返回一个字符串表示命令的执行情况。任何能在

M A TLAB 命令行窗口执行的命令均可以被包括在Comm and

字符串中。

2.GetFull M a tr i x 方法:该方法用来将M A TLAB 中的一

个矩阵变量传送室VB 程序的一个1维或2维数组中。

3.PutFull M a tr i x 方法:该方法用来将VB 程序的一个1

维或2维数组传送到M A TLAB 中的一个矩阵变量中。

4.Vo i d M i n i m i xe Co mmand W i n dow ()方法:该方法用来M A TLAB 使命令行窗口最小化,具体调用如下:Call m atlab M in i m ize Comm and W indow ()。

5.Vo i d M ax i m i ze Co mmandW i n dow ()方法:

该方法用来使M A TLAB 命令行窗口最大化,具体调用如下:CallM atlab .M ax i m ize Comm and W indow ()下面我们用具体例子如何使用该方法:

例:VB 中建立一个新窗口,上有3个控件。按钮Comm and 1、

编辑框T ex t 1,用来接收M A TLAB 命令、文本控件L abell 用户按下Cmm and 1,该程序运行编辑框中给出的

M A TLAB 语句,并将其结果在L abell 控件中显示出来。

(1)建立一个VB 窗口,在其变量声明部分要调用M A TLA T 的A ctiveX 部件,通过如下应用程序在VB 创建A ctiveX 部件,通过如下应用程序在VB 中创建A ctiveX 对

象:

D i m M atlab as O bject (2)在按钮中给出下面的命令P rivate Sub Comm and 1-C lick ()

Set M atlab =C reate O bject (M atlab .A pp licati on )L abell .Cap ti on =M atlab .Execute (T ex tl .T ex t )End Sub

如果在T ex t 1中输入一个命令“Surf (peak s )”,按下

Comm and 1键后,VB 应用程序通过建立与M A TLAB 的DD E

会话,经M A TLAB 执行后生成图形。VB 主界面如图1,图形

界面如图2所示。

图1 VB 主界面

图2 生成图形界面

利用A ctiveX自动化技术调用M A TLAB,M A TLABR 命令窗口不必在建立DD E会话之前运行。

五、结束语

比较上述三种方法,通过DLL动态链接库,将M atlab的函数转换为VB中可以调用动态链接库,操作简单,调用方便;通过D EE动态数据交换VB应用程序作为主程序,完成数据的定时采样、友好用户界开发等工作,而M atlab作为后台应用程序,完成复杂控制算法及数据处理等任务,这种结构使得控制系统软件和控制算法的开发可以分开进行,同时,两者又很容易结合;通过的应用软件中嵌入上述软件的功能,从而大大简化软件开发过程同时提供给使用者更为专业、可靠的软件界面且能让W ebm aster及软件开发者很方便、快速地在In tranet和In tranet网络环境里运用。可以预见,该方法将广泛应用在未来的工业控制软件的开发上。

参考文献

[1]刘柄文,V isual Basic6.0精通中文版(M).北京:电子工业

出版社,1999,10.

[2]M atlab A ppp licati on P rogram In terface Guide[A].

T he M ath W o rk s Inc[C].1999

[3]薛定宇控制系统计算机辅助设计-M A TLAB语言及其应

用,北京:清华大学出版社,1996

[4]Paul L om ax A ctiveX与VBScri p t实中解析。北京:机械工

业出版社,西蒙与舒斯特国际出版公司,1997

(收稿日期:2002年5月14日)

投稿须知

一、来稿应反映当前国内外计算机科技的先进理论、应用研究、技术成果和发展趋势。

二、要求打印稿文图清晰,字数控制在6000字以内,其中包括图表和空格所占的版面。凡附盘寄来文稿者,优先录用。

三、用Em ail投稿s m caa@https://www.sodocs.net/doc/483256426.html, o r s m caa@on https://www.sodocs.net/doc/483256426.html,均可,要求使用W o rd97或W o rd2000,不得使用携带病毒的工具。

四、打印次序为:(1)题目、(2)姓名、单位、职称、邮编、(3)摘要、(4)关键词、(5)中图分类号、(6)正文、(7)参考文献、(8)英文题目、(9)英文或汉语拼音作者姓名、(10)英文作者单位、(11)英文摘要、(12)英文关键词。

五、200字左右的摘要应准确反映论文的关键和重点。关键词3-5个;题目、摘要、关键词皆中英文对照且中英文含意相符;尤其是英文力求语法正确流畅通俗。

六、参考文献3-6篇、并按序号、作者、题目、出处列出。

七、给出作者简介(姓名、工作单位、职称、城市、邮编)详细通信地址、邮编及电话等、以便联系。

来稿请寄:上海市华山路1954号交通大学内

《微型电脑应用》编辑部 邮编200030

M i croco m puter Appl i ca ti on s Vol.19,No.4,2003 ABSTRACTS&KE YWOR D S 微型电脑应用 2003年第19卷第4期

VB和Matlab传递数据

VB和Matlab传递数据 lb107 VB和Matlab传递数据 请问: 我想将m函数文件编译成dll文件,在VB里面输入数据然后调用这个dll进行计算,这样能够实现吗? 有兄弟有相关的例子没?网上VC调用Matlab的例子挺多的,但没有VB调用Matlab的例子。 谢谢指点。 2006-3-5 20:19 taohe Re:VB和Matlab传递数据 VB调用DLL会不会很复杂?总感觉VB属于高级编程语言,在调用DLL方面不会比VC更难才对。根据网上你发现的VC调用MATLAB产生的DLL的例子,大概了解MATLAB产生的DLL,然后在VB中调用,貌似应该顺理成章。 使用VB的话,一个好的方案可能是使用MATLAB产生的COM组件,而不是普通的DLL。在VB中可以很方便地使用这些COM组件。MATLAB的在线帮助有较详细的例子,不妨看看。 2006-3-5 23:01 bainhome Re:VB和Matlab传递数据 前一段儿看了看书,做过两个简单的,下面这个是其中之一(曾发在别的论坛上,转一下),因最近实在是太忙,没有时间研究,所以比较基础,没有更加复杂的Trick 比如将VBtext中的数组作为COM的input、图形绘制等等,VB代码:[code] Private addn As addn.Add Private Sub Command1_Click() Dim x As Double Dim y As Variant x = CDbl(Text1.Text) Call addn.numadd(1, y, x) Text2.Text = y End Sub Private Sub Command2_Click() End End Sub Private Sub Form_Load() Set addn = New addn.Add Form1.Caption = "VB调用MATLAB示例" Text1.Text = 2 End Sub [/code] [code] function y=numadd(x) y=2*x; [/code] COM组件调用格式: [code]call h.func(numout,arg1,arg2,...)[/code] MATLAB中的函数书写格式: [code][out1,out2,out3]=myfunc(arg1,arg2)[/code] 则VB的调用应该为: [code]call object.myfunc(3,out1inVB,out2inVB,out3inVB,arg1inVB,arg2inVB)[/code] “3”指的是输出变量的数目 另外当多个版本的MATLAB在同一PC上时,VB只认其中一个版本产生的COM,不知道是不是环境变量设置的问题。 2006-3-6 09:41 lb107 Re:VB和Matlab传递数据 谢谢楼上二位的指点!! 我的想法也是利用comtool直接将m文件编译成COM组件,然后在VB中调用实现应该是没有问题,但是在交换数据方面肯呢感有点难度,我只想找几个具体的例子看看其调用的根据体过程 谢谢!! 2006-3-6 19:53 taohe Re:VB和Matlab传递数据 [quote][b]lb107 wrote:[/b] 谢谢楼上二位的指点!! 我的想法也是利用comtool直接将m文件编译成COM组件,然后在VB中调用实现应该是没有问题,但是在交换数据方面肯呢感有点难度,我只想找几个具体的例子看看其调用的根据体过程 谢谢!! [/quote] 如果用comtool也就是使用COM组件的话,事情就更好办了。因为进入COM世界后,所有的数据都是VARIANT,而VB和COM是非常亲近的关系,在VB中使用COM比起其他语言比如C++来说显得更为轻松。还得重复一下,matlab的在线帮助上关于COM组件的应用几乎全部是VB作为应用程序例子,不妨看看。2006-3-6 20:05 lb107Re:VB和Matlab传递数据 我的英语不太好 taohe 老师能给一个具体的链接地址吗?? 谢谢 2006-3-6 20:46 taohe Re:VB和Matlab传递数据 你指什么连接地址?我刚才说的在线帮助是matlab安装文档。 本来matlab的公司MathWorks的网站上有每次最新版的matlab的帮助文档连接。不过现在MathWorks网站上的连接好像已经变成新版matlab R2006a的文档了。所以只好看matlab安装后的在线帮助了。 matlab不知你用那个版本的matlab,不管那个版本,在matlab环境中运行doc,然后在出来的帮助文档中寻找相关的话题。如果是matlab6.5.x的话,应该在matlab com builder,如果是matlab7.x的话应该是matlab builder for com。 里面有例子程序,如果VB好的话,应该没有问题的。别怕英文。 可惜我是VB盲,无法给出具体的帮助。 Good luck! 2006-3-6 22:40 lb107 Re:VB和Matlab传递数据 再次谢谢 2006-3-12 21:35 godzilla2000cn Re:VB和Matlab传递数据 如果matlab中生成的图片怎么传到VB里,也就是在VB中用什么控件来接收matlab的fig??? 2006-11-1 19:46 tian7tian 大家好啊! 我现在是将m文件组成com组件,还没搞定呢,总出现错误! 2006-11-8 19:46 jimin 看了bainhome版主的一个例子后,做了个vb调用matlab时隐藏matlab figure 的例子 Private Sub Command1_Click() Dim objMATLAB As Object Set objMATLAB = CreateObject("matlab.application") Dim strEnter As String Dim strCommand As String strEnter = Chr(13) & Chr(10) strCommand = "figure('visible', 'off', 'Units','points','PaperUnits', 'points');" strCommand = strCommand & strEnter strCommand = strCommand & "surf(peaks(25));" strCommand = strCommand & strEnter strCommand = strCommand & "print -dmeta" strCommand = strCommand & strEnter strCommand = strCommand & "close(gcf)" strCommand = strCommand & strEnter objMATLAB.execute (strCommand) imgDraw.Picture = Clipboard.GetData() imgDraw.Refresh Set objMATLAB = Nothing End Sub 2006-11-12 10:42 WaitingForMe Matlab的代码或者窗口, 用combuilder编译以后, 可以直接在VB里面引用. 如果需要移植到其他计算机上, 需要在目标计算机上安装一个虚拟机, 大概8M大小. 2006-11-12 13:59 bainhome [quote]Matlab的代码或者窗口, 用combuilder编译以后, 可以直接在VB里面引用. 如果需要移植到其他计算机上, 需要在目标计算机上安装一个虚拟机, 大概8M大小.[/quote] 前一句话已经基本实现,后一句话不太明白...什么虚拟机?还是java虚拟机吗(自己感觉不像)?请教一下^_^ 2006-11-29 19:23 tian7tian 关于bainhome写的程序,我问个问题,关于 function y=numadd(x) 其中y定义为variant,x定义为double类型;是不是类型是固定的呢? x可以定义为string类型么? 2006-12-11 14:43 tian7tian 有哪位了解的话,有时间的话,给答复一下,谢谢了!! 2006-12-31 01:24 WaitingForMe [quote]原帖由[i]bainhome[/i] 于2006-11-12 13:59 发表 前一句话已经基本实现,后一句话不太明白...什么虚拟机?还是java虚拟机吗(自己感觉不像)?请教一下^_^ [/quote] Combuilder创建的程序,移植到没有安装Matlab的电脑上的时候,需要安装一个什么包,都忘了,这个是Matlab的帮助,自己看帮助吧 MATLAB COM Builder: Overview: Packaging and Distributing the Component 2007-7-20 15:53 shiwenyaboa

遗传算法的VB程序【精品毕业设计】(完整版)

遗传算法的VB程序 最近看了下遗传算法,刚看了一点,就觉得手痒,非要把程序编制出来看看效果(我现在总认为那些理论再高深,无法用计算机实现就是空话,呵呵)。下面是我调试了好久的代码,无赖没有学过数据结构&算法,程序写的很差,单效果还是出来了,高兴,和大家共同分享下成果吧。 还是一样,不想说原理,因为这里想搞个公式上去N麻烦。直接给点实际的东西。具体步骤是参考《MATLAB遗传算法工具箱及应用》(西安电子科技大学出版社)16~22页的相关说明编制的,有兴趣的同学可以去看看这本书。 在程序调试成功的同时,郁闷的是工作的事情,现在好多企业久是指名不要研究生,而我又是一个四不象,本专业是热能工程,可我本专业基本上还是本科水平,大部分时间都去自学一些杂七杂八的东西去了,比如人工智能,PLC,自动控制方面,图像处理啊,可又只是懂个皮毛,现在找工作也不知道怎么给自己定位了。有相关经历的同学可要指点我一二哦。 Option Explicit '程序实现功能:用遗传算法求函数的最大值 '作者: laviewpbt '联系方式: 'QQ:33184777 '版本:Version 1.4.0 '说明:复制请保留源作者信息,转载请说明,欢迎大家提出意见和建议 Dim N2(30) As Long '用来保存2的N次方的数据 Dim Script As Object '调用其Eval函数 Public Enum CrossOver OnePointCrossOver '单点交叉 TwoPointCrossOver '两点交叉 UniformCrossOver '平均交叉 End Enum Public Enum Selection RouletteWheelSelection '轮盘赌选择 StochasticTourament '随机竞争选择 RandomLeagueMatches '随机联赛选择 StochasticUniversalSampleing '随机遍历取样 End Enum Public Enum EnCoding Binary '标准二进制编码

vb调用matlab的四种方法

一、借助ActiveX部件 Microsoft把所有以COM为基础的技术统称为ActiveX技术。自动化是大多数ActiveX技术的基础,它可使解释性的宏语言(如VB)能够在不了解应用程序实现细节的情况下控制自动化对象。Matlab实现了ActiveX自动化服务支持,在VB下通过ActiveX自动化接口可将Matlab作为Visual Basic语言的一个ActiveX部件调用。 Matlab ActiveX自动化服务的功能主要包括在Matlab工作空间执行Matlab命令,以及直接从工作空间存取矩阵等,下面列出了Matlab自动化服务支持的几个主要方法,其参数和返回值的类型采用ActiveX自动化协议所定义的与语言无关的类型描述: ● BSTR Execute([in] BSTR Command); BSTR表示宽字符串类型,它与VB存储字符串所采用的数据格式相同。该方法接收字符串命令并在Matlab中执行,将结果以字符串形式返回。 ● void GetFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in, out] SAFEARRAY(double)* pr,[in, out] SAFEARRAY(double)* pi); 该方法从指定的工作空间检索一个完整的一维或二维的实型或虚mxArray,其实部和虚部被分别存放到两个单独的Double型数组中。 ● void PutFullMatrix([in] BSTR Name,[in] BSTR Workspace,[in] SAFEARRAY(double) pr,[in] SAFEARRAY(double) pi); 该方法将一个mxArray放入指定的工作空间。各参数的含义及调用方法与GetFullMatrix方法类似。 示例代码如下: 1Dim Matlab As Object ’声明对象 2Dim MReal1(5,5) As Double ’声明存放实部的Double型数组 3Dim MImag() As Double ’声明存放虚部的Double型数组 4Set Matlab=CreateObject(“Matlab.Application”) '初始化对象 5Matlab.Execute(“a=hilb(5)”) '执行Matlab命令 6Call Matlab.GetFullMatrix(“a”,“base”,MReal1,MImag) '将结果分别存入实部、虚部数组 复制代码 二、借助DDE技术 DDE(Dynamic Data Exchange)允许Microsoft Windows应用程序通过交换数据实现彼此间的通信。应用程序间彼此通信要先建立一个DDE会话,对会话进行初始化的应用程序称为客户端(Client),对Client端作出响应的应用程序称为服务器(Server)。图1描述了Matlab 作为服务器时与其他应用程序的通信机制。

MATLAB与VB混合编程方式简易教程

3.1 MATLAB与Visual Basic 语言的混合编程方式 MATLAB提供了与C/C++、Fortran语言的接口,但没有与Vsiual Basic语言的接口,要想实现MATLAB与Visual Basic的混合编程可以通过以下途径来实现。 1.通过ActiveX方式 一是用Visual Basic开发服务器ActiveX组件,MATLAB作为客户端程序使用,事实上无论是用VB还是VC或者其他语言环境开发的ActiveX组件,对于MATLAB来说集成与调用方式是一样的,一般情况下很容易地将不同环境下开发的用途各异的ActiveX对象集成到一个MATLAB应用中来。其使用方法见第5章关于MATLAB作为ActiveX的客户端使用方法。 二是在VB环境下可以通过ActiveX自动化接口将MATLAB作为Visual Basic语言的一个ActiveX 部件调用。MATLAB ActiveX自动化服务的功能主要包括在MA TLAB工作空间执行MA TLAB 命令,以及直接从工作空间存取矩阵等,我们在第5章中关于MA TLAB作为服务器组件的部分的例子就是以Visual Basic应用程序,以MATLAB作为服务器客户端的。 2.通过动态链接库方式 该种方式是一种间接调用MATLAB命令的方式,借助于C++与MA TLAB的接口,将MATLAB 的程序文件(.M文件)编译为动态链接库(.DLL),VB在代码中与调用其他语言编写的DLL文件一样调用MATLAB中.M 文件生成的动态链接库。这种方法可以脱离具体的MA TLAB环境,运行效率较高。 3.通过嵌入VB的矩阵函数库MatrixVB的方法 MatrixVB是由第三方(mathtools公司)提供的COM组件,包含了大量与MATLAB相似的函数与调用语法,可以加强VB内建数学运算与图形展示功能,在VB程序代码中可以像使用VB自己的函数一样使用MatrixVB的函数,而且可以不依赖于MATLAB的环境在Visual Basic中完成矩阵运算与图形绘制显示等功能,这种方法使用起来简单,编程效率较高。MatrixVB函数库的功能大致可分为8大类(矩阵运算、运算符重载、图形图像处理、最优化运算、多项式、信号处理、随机与统计分析、控制系统)。 除以上3种方式外,我们还可以通过DDE的方式实现VB与MATLAB的数据通信。 3.2 MatrixVB 环境设置 3.2.1 在VB应用中引入MatrixVB

浅谈VB与MATLAB相结合的三种方法

浅谈VB与M AT LAB相结合的三种方法 樊金荣① 黎洪生② 摘 要 本文分别介绍了在VB中调用M atlab的三种方法:利用动态链接库DLL、利用动态数据交换D EE以及利用A ctivex自动化技术。并以具体的例子给出通过这些方法实现了VB的可视化界面与M atlab强大的数值计算和图形显示能力的结合。 关键词 客户 服务器 M atlab DLL DD E A ctivex 技术 一、前言 V isual Basic是由M icro s oft公司开发的在W indow s95 98平台上的一种十分强大和有生命W indow s编程语言之一,具有易学易用、编程简单、程序集成化程度高及界面可视化又能实现大多数W indow s编程目的,因而一经推出就风靡全球然而,VB提供的数学函数及其有限,因而使之在数值计算和图形显得力不人心。M atlab是M ath W o rk s公司开发的一种工程计算语言。用这个交互系统可以解决很多工程计算问题,特别当涉及到矩阵和矢量形式的问题时,M atlab提供了强大的矩阵处理的和绘图功能。显然,将二者结合起来,能实现VB 可视化界面下运用M A TLAB强大的数值计算和图形显示,使VB编更加灵活快洁。 二、采用动态链接库DLL方法 M atcom是一个从M A TLAB到C++的编译器,它可以节省用户的运算时间和内存要求。M ath too ls公司利用M atcom4技术编写了M ideva工具软件,它可以借用C++编译器将M atlab下的M-文件转换为可被VB调用的DLL或独立瓣可执行文件。VB中要使用DLL,必须在VB工程中包含DLL的声明文件(即模块文件),同时还要将DLL放在工程文件所在的目录下。 如下操作可以一个M-文件编译成DLL:启动M atcom4的M ideva,点菜单F ile Comp ile,选要转换的M-文件应该是能作为函数被其他集城环境调用的M-文件,设文件名为m yfile)。编译完成后,在对应的D ebug或R elease目录下,可以找到一些编译生成的文件。VB需要用到的文件有两个。m yfile.dll(DLL文件)m yfile.bas(在VB中声明DLL的模块文件)。事实上,m yfile.dll中的函数并不能直接与VB进行数据交换,它只能通过矩阵数据进行操作。M ah tToo ls提供了一个单独的C++库文件m atlib42.dll(相当VB集成环境与DLL之间的代理,它包含有20多个矩阵句柄操作函数和800多个从M atlab中转换来的矩阵函数)以及相应的模块文件m atlib42.bas。为了在VB中能调用这类DLL,必须将m yfile. bas和m atlib42.bas加入工程中,并将m yfil.dll和m atlib42. dll拷贝到工程所在的目录下。编译后,在VB中的函数名为m yfile-in-out,其中,in和out分别为函数的输入输出参数的个数。注意,在编程时,必须调用m t In it M来初始化库文件,即请求允许使用转换的DLL,并调用m tEx it M来结束这种请求。另外,还要使用其它的矩阵句柄函数来分配、访问和释放矩阵句柄。 这种方式最简单的例子是直接调用m atlib42.dll中提供的inv-2-1来计算矩阵的逆。 二、采用动态数据交换D EE方法 该方法是利用M A TLAB提供的客户 服务器(C lien t Server)功能,VB应用程序作为系统主控,用M atlab作为后台应用程序完成复杂计算任务与绘画功能,M atlab与VB应用程序间通过DD E协议进行数据交换,DD E(D ynam ic D ata Exchange)是一种开放的、与语言无关的、基于消息的协议,它是应用程序通过共享内存进行进程通信的一种形式。 VB应用程序首先通过确定服务器名和主题(top ic)建立与M A TLAB的DD E会话,服务器名和主题唯一地确定作为客户端,M atlab作为服务端,客户端与服务端可以就确定的项目(Ite m)交换数据。关于VB的DD E功能可以参文献。VB应用程序中需指明的M A TLAB的服务器为M atlab,, M A TLAB有Syste m和Engine两个主题,在Syste m主题下可以列出M A TLAB所提供的详细的DD E功能,在Engine主题下可以充分实现M A TLAB的服务功能。利用VB具有的DD E客户端功能,使用M A TLAB的Engine主题支持的三种操作,VB应用程序主河以向M A TLAB传送可执行的命令,从M A TLAB中读取数据以及向M A TLAB中传送数据。 VB为用户提供的支持DD E通信的控件有:窗体(Fo r m)、多文档窗体(M D I Fo r m)、标签(L abel)、文本框(T ex t Box)和图片框(P icture Box)。相应于DD E协议,这些控件提供了完成一次DD E链接需要的属性和事件,以及设置 ① ②黎洪生 武汉理工大学自动化学院 教授 博士生导师 武汉 430070 樊金荣 武汉理工大学自动化学院 硕士 武汉 430070

VB调用Matlab生成的dll完全攻略(混合编程必备)

用VB调用Matlab生成的dll MATLAB 具有强大的运算功能,VB 具有开发界面友好的特点,可以将二者结合,可以开发出脱离MATLAB 环境的VB程序,即利用VB调用Matlab生成的dll。 工具/原料 Microsft Visual Basic 6 Matlab 7.0 步骤/方法 在MA TLAB 系统中的命令输入comtool命令或点击左下角“Start- > MATLAB - > MA TLAB COMBuilder - > MATLAB COM Builder”,启动MATLAB COM Builder。 建立工程,选择菜单“File - > New Project”,设置工程参数。设置的工程名为COM 组件编译后的文件名称,也可以输入新类,点击“Add”建立新类。

点击菜单“Project - > Add File. . . ”,向工程中加入M或MEX文件。 点击菜单“Build - >COM Object. . . ”,状态窗口出现“Standalone DLL build complete.”说明生成dll成功。

注册生成的myfunc_1_0.dll,在VB中引用MWComUtil.dll和myfunc_1_0.dll,就可以像调用里边的函数了!

插入完成后,Visual Basic中的具体调用方法和命令 此时Matlab中定义的函数: function daoju_gonge(z,x,m,ha,c,b) (函数名daoju_gonge) VB调用 1.先对所有的参数进行定义(关键) Private z As Double Private x As Double Private m As Double Private ha As Double Private c As Double Private b As Double Private theDaoju As myDaoju.Daoju (theDaoju 是自己设定的一个VB中的变量,myDaoju 则是由.m文件编译而成的.dll文件文件名,同时也是其中定义的组件名Component name,daoju则是其类名Class name) 2.调用命令 Call theDaoju.Daoju_gonge(z, x, m, ha, c, b) 3.对VB进行初始化 Private Sub Form_Load() Set theDaoju = New myDaoju.Daoju End Sub 注意事项以及相应问题解决 1.在编译dll时,需要机器安装有C或C++编译器,比如安装VC++6.0 2.Matlab启动Comtool工具之前,还需要利用mbuild –setup 命令对compiler(转换器) 设 置,将转换器设置成C++/C语言对应的compiler,而不是Matlab自带的compiler。 Ps:前两条如果没有做到的话,在comtool生成界面往往出错,无法生成dll等相应的文件。 3.如果出现有其他一些小问题,尝试重启Visual Basic或Matlab,再或者重启电脑。 疑难点: 如果对文件进行处理,使其能够在其他电脑上同样实现设定的功能。 可选方案一:文件打包。 Visual Basic打包程序或是Matlab打包程序。

VB调用MATLAB混合编程教程(完整版)

VB与MATLAB混合编程探讨 摘要:介绍了VB与MATLAB混合编程的方法,二者结合可以充分利用VB的方便快捷和MATLAB软件工具箱的强大功能。 关键词:VBVC++MATLABDLL编译MATLABAdd-inMATLAB是MathWorks公司开发的科学计算环境,具有强大的计算绘图能力,提供大量的函数库、工具箱,几乎涵盖了所有的工程计算领域,被誉为“演算纸”式的工程计算工具。但是MATLAB语言是一种解释执行的脚本语言,运算速度较慢是一个比较突出的问题。 VisualBasic作为一门易学易用的编程语言,受到很多工程技术人员的青睐,其执行速度相对较快,界面友好。因此实现VB与MATLAB混合编程,可以为科研工作和工程应用提供有力的技术支持。 1基本思路及实现方法 MATLAB提供了与C++、Fortran的程序接口,并没有提供直接与VB的接口。目前VB与MATLAB混合编程方面主要使用以下一些方法: (1)在VB中通过调用MATLAB的引擎(Engine)接口,使用Windows的OLE或ActiveX通道与MATLAB通信。通过Object.Execute MATLAB语句在程序中直接使用MATLAB提供的函数库和图形库。这种方法可以较快地编写出程序;但在调用引擎时,会在后台启动一个MATLAB进程,影响程序运行速度,占用内存。 (2)通过使用嵌入VB的矩阵函数库MatrixVB的方法。MatrixVB是由原MathTools公司开发的第三方插件,利用与MATLAB相似的函数、语法嵌入到VB中,可以象使用VB的函数、命令一样使用MATLAB函数。这种方法语法和函数使用比较简单,编程效率很高,几乎完全融入VB语言,特别对图形的处理非常方便,弥补了其他方法在图形处理上的弱点。安装后,只需在打开的工程中添加MatrixVB库

基于VB调用ANSYS与MATLAB的电机电磁场计算

2006年第2期┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉┉ ! 设计分析"#$%&’&(’&’)*#$#┉ " """"" " " "" " "" """ " " " """ "" """"" "" " "" "" """" """ "" """基 于 " " ""调 用 """ "与 "" " " """"" """ "的电机 电 磁 场 计 算11 收稿日期:2005-04-14 改稿日期:2005-09-23 基于VB 调用ANSYS 与MATLAB 的电机电磁场计算 顿月芹1,孔 宇2 (1.清华大学,北京100084;2.山东医学高等专科学校,山东济南250000)Calculation of Electromagnetic Field by Calling ANSYS and MATLAB based on VB DUN Yue -qin 1,KONG Yu 2 (1.Tsinghua University ,Beijing 100084,China ;2.Shandong Medical College ,Jinan 250000,China ) 摘 要:介绍了一种基于VB 调用ANSYS 与MATLAB 进行电磁场计算的方法及其工作过程。借助VB 实现了可视化参数输入界面,通过调用APDL 语言编写的建模分析程序及MATLAB 的绘图程序实现了电磁场计算的一体化运 行,MATLAB 大大增强了图形的处理能力。最后以分析大气隙永磁电机的三维电磁场为例,证明了该方法的优越性,该 方法在很大程度上降低了ANSYS 的使用难度并提高了电磁场设计分析的效率。 关键词:VB ;ANSYS ;MATLAB ;电机电磁场 中图分类号:TM301.4+4;TP391 文献标识码:A 文章编号:1004-7018(2006)02-0011-03Abstract :A method of calculation of electromagnetic field by calling ANSYS and MATLAB based on VB is presented in this paper.Its operational process is introduced detailedly.The visible interface of inputting parameters is realized with VB.The calculation of electromagnetic field is finished by calling the pro-gram of APDL and the plotting one of MATLAB based on VB. The capability of dealing with figures is improved greatly with MATLAB.The analysis of a PM machine with big air -gap takes an example to validate the advantages of the method.The method decreases the difficulty of using ANSYS and increases the effi-ciency of program.Keywords :VB ;ANSYS ;MATLAB ;electric machine elec-tromagnetic field 1引 言 随着电机设计与分析的发展,有限元在电机电磁场分析中得到了广泛应用。ANSYS 是目前应用较多的有限元分析软件之一,该软件具有强大的前、后处理功能。其基本分析过程为:建模、划分网格、加载、求解和后处理 [4] 。如果模型参数变化,则要 重复执行上述步骤,操作相当复杂。ANSYS 自带的参数化设计语言APDL 可以实现参数化建模分析,避免了重复操作,但是APDL 不提供图形化界面输入,不熟悉ANSYS 软件的技术人员想轻松使用之并非一件易事。在电磁场分析方面,ANSYS 软件后处 理中得到图形的功能有限,而且当采用三维场进行分析时,存在无法得到磁力线分布的缺陷,与此相比,MATLAB 显示出了灵活的绘图功能[5]。VB 是目前较流行的应用程序的可视化开发工具[3] ,在图形用户界面开发方面具有突出的优势[3] 。由于VB 功能强大、易学易用,越来越多的人对VB 与其它软件的集成开发进行了研究[1~2] 。为了解决ANSYS 分析中所存在缺陷,笔者以分析计算电机的三维电磁场为例介绍一种基于VB 开发的ANSYS 和MATLAB 程序调用方法,实现了三者之间的无缝集成,提高了程序的开发效率。2基于VB 集成开发ANSYS 与MATLAB 2.1基本原理 ANSYS 采用参数化建模分析,便于参数的修改。VB 提供输入参数的可视化界面,由此界面可输入或修改相关参数,这些赋值后的参数被传送到ANSYS 的参数化命令流文件从而构成完整的运行程序,VB 再调用该程序分析电磁场。之后,VB 调用MATLAB 进行绘图(利用ANSYS 的后处理所得数据)处理。ANSYS 和MATLAB 经VB 调用后在后台运行程序,程序运行结束再返回到VB 界面,从而 用户只需和VB 界面打交道即可进行电磁场的分析及查看后处理结果。 2.2VB 调用ANSYS 实现参数化界面分析 文献[4]给出了一种VB 增强ANSYS 前处理能力的方法,其建立模型的命令流文件是通过VB 编程来输入,这无疑增加了VB 编程的工作量,对复杂模型来说更是如此,如果再加上求解和后处理部分难度更大,这在很大程度上掩盖了VB 编程的优点。与此不同,本文先用APDL 语言编写参数化建模分析命令流文件。然后通过VB 的读文件和写文件函数对该命令流文件进行操作,只需几行程序即可完成整个调用过程。 用APDL 编写参数化建模分析命令流文件an-sys.dat (此时没有给参数赋值),利用VB 创建可视

五种VB与MATLAB混合编程接口的方法

摘要:为充分发挥Matlab与VB各自的优势,将二者结合起来进行工程应用软件的开发。本文介绍了五种VB与MATLAB混合编程接口的方法,并对各方法性能的优劣进行了比较和评价。 关键词:Matlab;Visual Basic;ActiveX;DDE;MatrixVB;DLL;COM 1引言 Microsoft Visual Basic是由微软公司开发的可视化编程语言之一,由于它简单易学的特点,只要稍有编程基础就可以很快掌握,可视化的用户界面设计功能,把程序设计人员从繁琐复杂的界面设计中解脱出来。因而很快就风靡全球,是一种十分强大和有生命力的Windows编程语言。但是我们知道VB语言也有它的缺点,即对于数值计算方面其能力欠佳。 Matlab是Matlab擅长处理数值计算和系统模拟仿真,已被广泛应用于数字信号处理、电力系统仿真、图像处理、系统识别等各个领域。但是Matlab也存在一些缺点:1、和其他高级程序相比,程序的执行速度较慢,那是因为;2、对于底层硬件操作以及编程界面方面远远比不上VB、VC等软件。鉴于二者各自的优势,为了提高工程软件的开发效率和质量,将两种软件结合起来进行工程应用软件的开发便成了实际的需要。本文主要讨论VB与Matlab混合编程的几种方法。 2Vb和Matlab接口实现方法介绍 2.1借助ActiveX技术 ActiveX是特点就是使不同的软件对象可以跨进程、跨平台并能在网络上进行交互。Matlab ActiveX自动化服务的功能主要包括在 (1)Execute(Command as String)方法:执行本方法将调用MATLAB执行一条Command字符串决定的Matlab命令,同时返回一条字符串表示命令的执行情况。任何能在MATLAB命令行窗口执行的命令均可以被包括在Command 字符串中。 (2)GetFullMatrix方法:该方法用来将Matlab中的一个矩阵变量传送到VB程序的一个一维数组或二维数组中。

Matlab与VB_NET混合编程中数据存储方式的研究

2008 2009,30 (8)0引言 Matlab 是科学计算和工程应用的常用工具,它内置大量的函数,可以方便的用于各种数学运算。https://www.sodocs.net/doc/483256426.html, 是一种简单易学、功能强大的程序设计语言。使用这两种工具混合编程可以利用各自的优点,减少程序开发时间,提高程序的计算能力和易用性,编写出适合各种需要的应用程序。 在我们实验室开发的SUNIST 单粒子模拟系统中,由于需要进行大量的矩阵计算,同时需要对这些计算结果进行分析和应用,所以我们使用Matlab R2007b 和https://www.sodocs.net/doc/483256426.html, 2005作为程序开发工具。其中,使用Matlab R2007b 进行矩阵计算,使用https://www.sodocs.net/doc/483256426.html, 2005设计人机界面、管理模拟结果。在SUNIST 单粒子模拟系统中,Matlab 和https://www.sodocs.net/doc/483256426.html, 的数据交互和存取是一个非常重要的问题。因为在计算过程中,需要保存大量的数据用于以后的分析使用,如模拟的初始条件、粒子轨道上各点的坐标、速度、磁矩等。 Txt 文本文件和xls 文件是两种常见的文件格式,具有各自的优点。Matlab 和https://www.sodocs.net/doc/483256426.html, 各自均可以方便的存取这两种格式的文件。虽然在Matlab 中可以通过dlmwrite 和xlswrite 函数把数据写入txt 文本文件和xls 文件,但是我们发现,无论 是将这两条语句写入.m 文件通过https://www.sodocs.net/doc/483256426.html, 调用,还是在https://www.sodocs.net/doc/483256426.html, 中直接调用这两个函数都无法实现数据的存储功能,只能通过其它的存储方法[1-2] 。本文将详细阐述该问题及其解 决方法。 1Matlab 和https://www.sodocs.net/doc/483256426.html, 混合编程中通过Matlab 存储Matlab 计算结果存在的问题 在Matlab 中,函数dlmwrite 和函数xlswrite 可以将其中的矩阵变量写入txt 文本文件和xls 文件。但是,在https://www.sodocs.net/doc/483256426.html, 和Matlab 的混合编程中,这两条语句却无法实现该存储功能。为了说明这个问题,以dlmwrite 函数建立如下的tempWrite.m 文件: tempData =random ('Normal',0,10,10,3);;%生成一个随机的10×3矩阵 dlmwrite ('tempTxt.txt',tempData,'delimiter','\t','newline','pc');%将数据写入tempTxt.txt ReadTempTxtData =dlmread ('tempTxt.txt');%读入temp-Txt.txt 中存储的10×3矩阵 figure; plot (tempData (:,1));%利用TempData 矩阵的第一列数据作图figure; 收稿日期:2008-04-18;修订日期:2008-06-12。 计算机应用技术

相关主题