《VB与Matlab混合编程探讨.pdf》由会员分享,可在线阅读,更多相关《VB与Matlab混合编程探讨.pdf(5页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、VB与Matlab混合编程探讨冯 莉,李 巨,邓云华,李玺钦,王 兰(中国工程物理研究院流体物理研究所107室,四川绵阳 621900)摘 要:介绍了VB与Matlab混合编程的方法。充分利用VB编程简洁、开发界面友好等特点和MATLAB强大的数据计算和分析、图形处理功能,开发出复杂的、界面友好人机交互处理软件。关键词:Matlab;VB;ActiveX;混合编程1 引 言 在开发数据采集分析软件时,有时需要对采集的数据信息进行处理、计算以及对分析结果进行实时、直观的图形化显示。Matlab是集数值分析、矩阵运算、信号处理和图形显示于一体的高性能数学软件。VB在图形用户界面开发方面有很强的优势
2、。利用VB开发数据采集系统应用界面,调用Matlab编写的数据处理子程序,可实现应用系统的快速开发。下面讨论VB调用Matlab的几种方法。2 调用方法211 利用ActiveX技术1 由于Matlab支持ActiveX服务器端协议,因此,通过建立VB与Matlab之间的ActiveX自动化连接,实现在VB应用程序中调用Matlab。在VB中使用Matlab=createobject(“matlab.application”)创立Matlab的ActiveX对象,其中Matlab.Application是Matlab的ActiveX对象在Windows注册表中的名称。在创建Matlab的Act
3、iveX对象后,就可以使用这个对象的各种方法来调用Matlab了。Matlab.Application包含以下几个主要方法。(1)BSTR Execute(Command as string);执行Execute方法将调用Matlab执行一条Command字符串的Matlab命令,同时以字符串的形式返回命令的结果。(2)GetFullMatrix(in BSTR Name,in BSTR Workspace,in SAFEARRA Y(double)pr,in SAFEARRA Y(double)pi);此方法将指定的Matlab工作空间中的一个一维或二维数组送到VB程序中,Name指定了Ma
4、tlab中的矩阵变量名,WorkSpace指定了该矩阵所在的工作空间,pr和pi分别是数组的实部和虚部。(3)PutFullMatrix(in BSTR Name,2005年9月 爆 轰 波 与 冲 击 波 第3期in BSTR Workspace,in SAFEARRA Y(double)pr,in SAFEARRA Y(double)pi);此方法将VB程序中的一个一维或二维数组传送到指定的Matlab工作空间中。(4)MinimizeCommandWindow方法,用于使Matlab命令行窗口最小化。(5)MaximizeCommandWindow方法,用于使Matlab命令行窗口最大化
5、。在利用Matlab作为ActiveX自动化服务器时,VB应用程序将自动启动Matlab的Ac2tiveX自动化服务程序,并在程序执行完成后自动关闭ActiveX自动化服务程序。以计算一组温度对电阻的积分为例说明在VB中利用ActiveX自动化接口,使用上述方法后编程。把采集到的温度和电阻保存到数据文本文件(d:WDZ.dat)中;在命令字中,将温度值存放到X矩阵中,电阻值放在Y矩阵,积分值Z在VB界面的文本框IntegralText中显示。在命令按钮Command1编写源码如下:Private Sub Command1_Click()Dim z(1 To 1)As DoubleDim I()
6、As DoubleDim TempValue asDoubleSet Matlab=CreateObject(Matlab.Application)初始化对象Matlab.Execute(load d:WDZ.dat;y=WDZ(:,2);x=WDZ(:,1);z=rapz(x,y);)Call Matlab.GetFullMatrix(z,base,z,I)For j=1 To 1TempValue=z(j)NextIntegralText=Str(TempValue)Call Matlab.quitSet Matlab=NothingEnd Sub212 应用DDE与Matlab通讯2DD
7、E(Dynamic Data Exchange)允许Microsoft Windows应用程序通过交换数据实现彼此间的通信。应用程序间通过建立一个DDE会话相互通信,发起会话的应用程序叫客户端(Client),对Client端作出响应的应用程序被称为服务器(Server)。图1描述了Matlab作为图1Matlab作为DDE服务器应用服务器时与其他应用程序的通信机制。其中,DDE功能函数既可以由应用程序提供,也可以由Matlab引擎库提供,初始化会话时,客户端应用程序必须指定两个参数service name(服务器应用程序的名称)和topic(会话主题)。就上述例子,说明VB与Matlab建立
8、连接,完成DDE会话的全过程。程序首先启动701 第3期 冯 莉 等:VB与Matlab混合编程探讨Matlab,设置TextInput是输入文本框,TextOutput是输出文本框。在TextInput中输入Matlab命令(load d:WDZ.dat;y=WDZ(:,2);x=WDZ(:,1);z=trapz(x,y);z)回车后,由Matlab在后台执行并将结果返回给TextOutput显示。Private Sub Form_Load()Dim id As Stringid=Shell(d:matlab bin matlab.exe/automation,6)启动MATLABForm1
9、.SetFocusEnd SubPrivate Sub Command2_Click()Textinput.LinkMode=vbLinkNoneTextinput.LinkTopic=MATLAB|EngineTextinput.LinkItem=EngEvalStringTextinput.LinkMode=vbLinkManualszCommand=Textinput.Text执行Matlab命令Textinput.LinkExecute szCommandTextinput.LinkMode=vbLinkNone初始化TextOutput与Matlab间的DDE会话TextOutput
10、.LinkMode=vbLinkNoneTextOutput.LinkTopic=MATLAB|EngineTextOutput.LinkItem=EngStringResultTextOutput.LinkMode=vbLinkManual返回执行结果并显示TextOutput.LinkRequestTextOutput.LinkMode=vbLinkNoneEnd Sub2.3 使用MatrixVBMatrixVB是由原MathTools公司开发的第三方插件,利用与Matlab相似的函数、语法嵌入到VB中,可以象使用VB的函数、命令一样使用Matlab函数。这种方法语法和函数使用比较简单,
11、编程效率很高,对图形的处理非常方便。安装后,只需在打开的工程中添加Ma2trixVB库即可(在工程-引用对话框中选中MMatrix)。但由于其仍然采用解释执行,执行效率较低,实时运算难以实现。2.4 生成执行文件2Matlab产生的程序文件(M文件)不能直接在VB中调用,可利用mcc命令将M文件直接编译成.EXE文件,然后在VB中声明三个API函数,最后使用Shell命令实现VB直接调用M文件生成的.EXE文件。(1)用mcc生成独立的外部应用程序可使用命令mcc2m filename.m,将filename.m编801 爆 轰 波 与 冲 击 波 2005年9月 译成filename.exe
12、文件。(2)在VB中声明调用的三个API函数:Declare Function WaitForSingleObject Lib“kernel32”(ByVal hHandle As Long,ByValdwMilliseconds As Long)As LongDeclare Function CloseHandle Lib“kernel32”(ByVal hObject As Long)As LongDeclare Function OpenProcess Lib“kernel32”(ByVal dwDesiredAccess As Long,示例代码:Dim lTask As Long,l
13、ret As Long,lHandle As LonglTask=Shell(“filename.exe”,vbNormalFocus)执行file.exe文件lHandle=OpenProcess(SYNCHRONIZE,False,lTask)lret=WaitForSingleObject(lHandle,INFINITE)等待进程执行完毕lret=CloseHandle(lHandle)file.exe文件执行完毕后,关闭该文件 应注意M文件生成EXE文件时,对一些Matlab命令不支持,如PRINT LOAD等。2.5 编译成动态链接库2.5.1 借助Visual C+与Matlab
14、的接口3 借助Visual C+与Matlab的接口,将Matlab的程序文件(M文件)编译为动态链接库(DLL),VB在代码中调用生成的DLL中的函数,实现算法,便于用户脱离Matlab环境使用。步骤如下:(1)编写M文件。实现算法,调试成功。注意:M文件必须以Function开始,避免在VC+中出现转换错误。(2)使用MatlabB6.0新提供的编译插件Matlab Add2in在VC+中转换为C文件。在转换前做好Matlab与VC+的接口连接。方法如下:3 在Matlab中运行“mex2setup”,选择Microsoft visual C/C+选项,安装Matlab Add2in目录,
15、确认;接着运行“mbuild2setup”,选择Microsoft visual C/C+versiuon6.0作为本地默认编译器;保存当前路径,Matlab Add2in可以脱离Matlab环境找到Matlab路径。3 在VC+中选择“工具tools-定制(customize)-附加项和宏文件(Add2ins and2Macro Files页”,选中“Matlab Add2in”。显示Matlab Add2in图标。3 在新建工程中选择“Matlab Prject Wizard”,按照提示选择“Shalled M2dll”,输入M文件位置,VC+开始转换。如果M文件没有错误,在工程文件夹中会
16、生成一系列.C文件。其中与M文件同名的.C文件即为转换的C代码。(3)编译DLL文件。选择“编译”菜单,构建.DLL文件,在文件夹中会生成与工程名相同的DLL文件。在VB中调用DLL文件。在(2)生成的C代码中找到所要的接口函数,注意大小写,记下函数名。在VB中象声明API函数一样使用Declare语句声明这个函数。在程序代码中直接调用声明的函数即可。需要注意的是函数调用过程中的参数传递问题。由于VB和C的数据类型以及参数传递形式不太一样,传递不当,可能会造成调试困难。特别是Matlab中用到的大量矩阵(数组)参数,调用需十分当心。901 第3期 冯 莉 等:VB与Matlab混合编程探讨2.
17、5.2 利用Mideva工具软件Math2Tools公司利用Matcom技术编写了Mideva工具软件。它可以借用C+编译器将Matlab下的M文件转换为可被VB、Excel以及Dephi调用的DLL(动态链接库),亦可编译成独立的标准可执行文件,不需装载任何附加产品。具体使用请参考Mideva的详细说明。需注意的是,Matcom最后版本为4.5,之后部分Matcom的内容被合并到Mathworks的visu2al Matlab中。3 结 束 语 主要罗列了Matlab和VB混合编程的5种方法,各有优、缺点。第1、2两种方法从使用来看,程序的运行都没有脱离Matlab环境,需要在机器上安装好M
18、atlab系统,并且运行时会在后台启动一个Matlab进程,影响程序运行速度,占用内存,同时也无法开发出独立的运行程序,但实现过程较简单。第3种使用MatrixVB方法,依赖库中的函数且运行速度慢。第4种生成执行文件方法比较简单,使用方便,可脱离Matlab环境,但支持的命令有限。第5种方法也可脱离Matlab环境运行,是最实用的方法,运行速度最快,但实现过程较烦琐,对编程不熟悉的人员易出错。建议针对不同的使用情况,灵活使用。参考文献:1 苏金明,阮沈勇1Matlab 6实用指南1 北京:电子工业出版社12 马兴义,杨立群,等1Matlab 6应用开发指南1 北京:机械工业出版社13 周竹生1VB实现对Matlab的调用1 电脑开发与应用,2004,17(5)1011 爆 轰 波 与 冲 击 波 2005年9月