1/23MATLAB与VB混合编程MATLAB是MathWork公司于1984年推出的数学工具软件,其科学计算功能的强大和开放式的开发思想使其成为当今最为流行的、最为优秀的科技应用软件之一,在数值分析、科学计算、算法开发、建模和仿真等方面具有独特的优势。支持对通信系统、信号处理、图像处理、小波分析、鲁棒控制、系统辨别、非线性控制、模糊控制、神经网络、优化理论、样条、商用统计分析等30多个不同领域的内容的处理和分析。但其用户界面的设计不如VB方便,解释执行的运行环境使其开发的程序不能离MATLAB独立地进行发布。因此通过MATLAB与VB混合编程,利用VB作为前端开发工具进行应用程序开发的同时,将应用程序中较为复杂的数学计算交由MATLAB来完成,从而更加地充分发挥两者的优势。2/23一、ActiveX技术二、动态链接库(DLL)实现步骤(一)Matlab7.1版开发环境编写m文件生成COM组件VB中调用动态链接库应用程序发布应用程序安装实现步骤(二)Matlab2013a版主要内容3/23一、ActiveX技术ActiveX自动化协议是一种允许一个应用程序或组件去控制另一个应用程序或组件的协议,VB和MATLAB都支持ActiveX自动化协议。通过自动化协议,可以在VB应用程序中执行MATLAB命令,并从的MATLAB工作空间中获取数据以及向MATLAB输送数据从而实现数据的交互。要实现这种功能,用户首先必须获得MatlabActiveX对象在系统注册表中定义的名字─Matlab.Application。4/23在VB程序中要添加如下的代码:DimMatlabasObjectSetSetMatlab=CreateObject(“Matlab.Application”)Matlab.execute(Strcommand)VB可执行一条由Strcommand字符串决定的Matlab指令或在Matlab的工作空间调用M函数文件,在屏幕上显示图形或计算结果。5/23DimMatlabAsObjectPrivateSubForm_Load()SetMatlab=CreateObject(matlab.application)EndSubPrivateSubCommand1_Click()DimstrcommandAsStringstrcommand=x=0:0.01:2*pi;y=sin(x);plot(x,y)Matlab.execute(strcommand)EndSubPrivateSubCommand2_Click()Matlab.execute(closegcf)EndSub6/23DimMatlabAsObjectPrivateSubForm_Load()SetMatlab=CreateObject(matlab.application)EndSubPrivateSubCommand1_Click()DimstrcommandAsStringstrcommand=x=0:0.01:2*pi;y=sin(x);set(gcf,'Visible','off');strcommand=strcommand+plot(x,y);print-dmeta;close(gcf);Matlab.execute(strcommand)Picture1.Picture=Clipboard.GetData()EndSubPrivateSubCommand2_Click()Picture1=NothingEndSub7/23利用ActiveX进行VB和Matlab的交互通信时,所采用的Matlab语句是直接使用Matlab提供的函数和图形库命令。该方法编程效率高,但程序的执行必须在Matlab环境下,这样会占用内存,使程序的执行速度受一定影响。8/23二、动态链接库(DLL)借助VisualC++与MATLAB的接口,将MATLAB的程序(.M)文件编译为动态链接库(.DLL)COM组件,VB可以通过调用DLL实现对Matlab的调用。这种方法脱离了MATLAB环境,在算法上采用C++语句,所以运行速度较快,可应用于实时运算。通过这种方法可以发布成脱离MATLAB和VB的安装软件,在其他没有安装MATLAB和VB软件的计算机上都能运行。9/23实现步骤(一)Matlab7.1版1、开发环境:VisualStudio6.0Matlab7.1安装路径不能有空格或中文2、编写m文件(注:m文件必须为m函数,不能是脚本文件)functionplotcurx=0:0.01:2*pi;y=sin(x);set(gcf,'visible','off');plot(y)print-dmeta;close(gcf);10/233、生成COM组件(1)设置系统路径我的电脑属性高级环境变量系统变量Path选项,增加以下路径:头文件:C:/MATLAB7/extern/include;库:C:/MATLAB7/extern/lib/win32/microsoft/msvc60;DLL:C:/MATLAB7/bin/win32C:为自己实际的MatlAB安装目录11/23(2)安装C++编译器在MATLAB命令窗口里输入:mbuild–setup命令•PleasechooseyourcompilerforbuildingstandaloneMATLABapplications:Wouldyoulikembuildtolocateinstalledcompilers[y]/n?n有个让选y/n的matlab自动定位编译器位置的提示时要选n,然后手动指定MicrosoftVisualStudio文件夹所在位置,选择安装VC++6.0编译器。12/23(3)创建COM组件工程在命令窗口中输入comtool,出现com组件builder。选择FILENewProject选项。Componentname选项中输入组件名称:test(*组件名不能与m文件重名)(4)添加m文件(5)生成动态链接库单击buildComObject在创建的COM工程下会生成相关的组件。13/234、VB中调用动态链接库(1)注册动态链接库将生成的COM组件复制到其他位置,运行distrib文件夹中的_install.bat文件注册动态链接库。(2)创建VB工程引入COM组件。选择ProjectReference选项,将test_com_1.0TypeLibrary选中14/23编写VB程序代码DimMatlabAstestCOM.testCOMclassPrivateSubForm_Load()SetMatlab=NewtestCOM.testCOMclassEndSubPrivateSubCommand1_Click()CallMatlab.plotcurPicture1.Picture=Clipboard.GetData()EndSubPrivateSubCommand2_Click()Picture1=NothingEndSub15/235、应用程序发布(1)COM组件打包在本地使用的话,MATLAB会自动注册COM组件,无需发布;但如果要在没有安装MATLAB的计算机上使用,安装包就需添加MATLAB运行库MCR。打开创建的COM工程,点击ComponentPackageComponent选项,选中IncludeMCR,点击create。16/23(2)VB程序发布filemakeproject1.exeAdd-InsAdd-InManager,点击PackageanddeploymentWizard,并选中Loaded/unloadedAdd-InsPackageanddeploymentWizard,按提示进行操作,直至打包发布完成。*打开生成的安装包中的setup.Lst文件,[BootstrapFiles]字段里面只保留VB6STKIT.DLL和msvbvm60.dll几个文件,其余的都删掉,否则在不同版本的系统上使用可能会报错。17/236、应用程序安装(1)安装VB应用程序。在要安装的计算机上,新建一个文件夹作为应用程序的安装目录。将打包好的VB程序中的压缩包(.CAB)解压到安装目录中再进行安装。(2)安装Matlab控件。运行COM组件包中的distrib文件夹下的类名.exe文件,运行过程中全部按“y”覆盖原文件。将安装目录指向VB应用程序安装所在的目录(即VB应用程序与Matlab控件安装在同一个目录下),否则dll文件是没有办法注册的,选择后,全部点击Next,至MatlabComponentRuntime安装完成,DOS安装界面也会随后自动关闭。18/2319/23MATLAB7.1及以前版本生成COM组件的命令是comtool,从R2006a(7.2)开始换成了deploytool。2013b版和2014a版利用deploytool生成COM组件时都会出现如下图所示的错误:实现步骤(二)Matlab2013a版20/23MatlAB2013a版生成COM组件的方法步骤:1、同MATLAB7.1版安装路径不能有空格或中文,编写m函数文件,选择C/C++编译器2、在命令窗口运行deploytool。输入project名称,Type选项选择GenericCOMComponent。21/233、为COM组件添加类及类的输出函数,然后点击编译。编译编译过程22/234、生成自解压安装包在本地使用的话,MATLAB会自动注册COM组件,无需发布;但如果要在没有安装MATLAB的计算机上使用,安装包就需添加MATLAB运行库MCR。点击PackageAddMCR23/23把Matlab的m文件编译成VB可以执行的.dll文件,执行的效率高,可以实现脱离MATLAB和VB环境而独立运行。但当COM组件一旦编译成功之后,m文件的功能就不能变化,所编程序的数据交换能力弱。总结24/23谢谢!