Labview和matlab混编软件在labview环境下
进行可执行化的方法
一、问题的提出:
Labview下对matlab程序(m文件)的调用采用ActiveX技术,该技术不能脱离matlab运行环境。为解决问题,尝试将m文件编译成dll文件,将Labview对m文件的调用变为Labview对dll文件的调用。但由于研究过程出现的问题和时间的关系,这一问题并未得到解决。在此作一总结,以便后续工作继续进行。 二、问题的确立: 在本文档中,主要针对在Labview环境编写的软件进行可执行化的讨论,该软件包
含了使用matlab节点或ActiveX机制的matlab函数。
因此,在Labview环境下对软件进行可执行化的主要包含了三个方面的内容:
1. 把matlab下编的m文件编译成可被Labview调用的文件形式。例如:动态链接库
(dll)、COM组件等。本文档主要对动态链接库方式进行讨论,其它方式将在附录中简要说明。
2. 在Labview下对动态链接库(dll)文件进行调用
3. 在Labview下,将含有dll的VI生成安装文件。该文件可在脱离matlab和labview
的目标机上安装、运行。
以上三个步骤如全部完成,则可以说明该应用程序已可以的运行发布了。 三、问题的解决方法及过程:
下面将详细的讨论每个步骤的具体解决方法和过程,以供参考。
1. 把matlab下编的m文件编译成可被Labview调用的文件形式(dll).
解决本问题的方法,在不同的matlab版本中是不同的,在此将对在matlab6.5和matlabr2007a(7.4)两个版本下的方法作一说明。
在Matlab6.5版本中,可以通过两种方式将m文件编译成dll文件。一种是利用matlab为Visual C++发布的一个插件add-in,在Visual C++的环境下,将m文件编译成dll文件。另一种则是使用mcc命令行的方式对m文件直接进行编译,生成dll文件。
在matlabr2007a的版本中,同样可以用两种方式对m文件进行编译生成dll文件。一种是与matlab6.5版本中相同的方式,使用mcc命令对m文件进行编译,其命令的方式方法与matlab6.5版本下相同。另一种是使用deploytool工具,对m文件编译时对各个参数进行配置,因为这种使用的是界面化的方法,所以更加的直观。
下面将对各种编译方法的步骤作一说明: 1) 在6.5版本中使用插件add-in的方法: 使用此方法的思路如下:
创建M文件 转换成C或C++代码 编译dll文件
(1) 编写M文件,在matlab中打开Editior,按照matlab程序格式输入代码,
实现算法,调试成功。此M文件必须以Function开始,即M文件是函数文件而不能是脚本文件。
(2) 完成add-in的连接:
在matlab中运行”mex –setup”,选择Microsoft Visual C/C++ version 6.0选项,安装Matlab Add-in文件到VC++目录,确认;接着运行“mbuild –setup”,选择Microsoft Visual C/C++ version 6.0作为本地默认编译器,然后在matlab下运行“cd(prefdir)”和“mccsavepath”命令,matlab add-in可以脱离matlab环境找到matlab路径。
VC++中的操作为:在VC++中选择“工具 tools ->定制(customize)->附加项和宏文件(Add-in and Macro files)页,选中“matlab add-in”。这样, 在VC++工具栏出现matlab add-in 图标,在VC++中新建工程对话框中会出现“matlab project wizard”至此连接工作完成。
打开VC++,在新建工程中选择“matlab project wizard”,按照提示,选择“Shalled M-dll”,输入M文件位置,开始转换。如果M文件没有错误,在工程文件中夹会生成一系列.C文件。其中M文件同名.C文件即为转换的C代码。
然后将此C代码编译成dll文件。选择“编译”菜单,构建dll文件,在文件夹中会生成与工程各相同的dll文件。
2) 使用mcc命令将M文件转换成dll文件。
在使用mcc命令编译之前,需要对matlab的编译器进行设置,可按照上面的方法来进行,即使用mex –setup和mbuild –setup命令。
(1) 编写一个M函数文件。
(2) 使用以下命令对此函数文件进行编译
mcc -B csharedlib:filename filename1.m filename2.m filename3.m –v
其中-B csharedlib为filename1.m、filename2.m、filename3.m梆定在一起生成一个dll文件。
对于单个的M文件,也可以用下面的命令来进行编译 Mcc -W lib: 其中-W lib: 使用mcc命令还可以通过添加其它参数来对dll文件进行设置,其具体的使用方法请参照matlab帮助文档。 3) 使用deploytool工具进行编译 在matlabr2007a中版本中,还可以使用deploytool工具的方法对M文件进 行编译,使之生成dll文件(在matlab6.5版本中尚未有此工具)。 操作方法如下: 创建工程 添加文件 编译 打包 在matlab的命令窗口中输入deploytool命令,这时会弹出一个名为depolyment tool 的窗口,这时选择creat a new deployment project->matlab Compile->C/C++ shared library,在name和location中分别指定所创建工程的名称和存放的位置。点击OK。然后选择add files,这是可把M函数文件添加到工程中,这时即可进行编译,如果需要对所编译的dll文件进行配置,可以通过settings…来进行。各种配置的具体含义请参照matlab帮助文档。参数配置完成之后,点击build the project..等待完成,即可获得所需的dll文件。 2. 在将M文件编译成dll文件之后,可进行下一步,即使用labview对其进行 调用,可使用两种调用方式。一种是使用call library function node(简称CLF)对dll文件进行直接调用。另一种方法则是使用共享库向导,先将dll文件包装成一个共享库中的VI,然后采用编程的方式直接使用,这种共享库中的VI,其实质是dll中的函数与CLF梆定在了一起,在使用时是以CLF的形象出现的。下面是使用两种方法对dll文件进行调用的步骤。 1) 使用CLF对dll文件进行直接调用 打开Labview,进入框图面板,点击右键,在弹出的VI选项框中选择all function ->Advance->call library function node,将此节点放在框图面板中,右键点击此节点,在菜单中选择config选项,进行配置。在Library name or path中指定dll文件的位置所在,在function name栏中将dll中主函数名称填入,calling conventions这一栏为对dll的调入规范,一般来讲,对于在纯C或C++下编写的dll文件,一般使用C的调用规范,而对于系统文件的dll或其它语言编译的dll文件则使用stdcall调用规范。参数个数及参数类型的选择由调用的dll函数的数据类型来确定。所有配置完成以后,即可作为一个VI进行编程连接。然后测试其是否成功。 2) 使用共享库向导封装dll文件(此方法Labview8.0以后的版本可用,本文档 所使用的为Labview8.5中文版) 在Labview中选择“工具-->导入——>共享库(.dll)” 然后会进入“导入共享库”的窗口,对于一个新的dll文件而言,在“指 定创建或更新模式”窗口中选择“为共享库创建VI”,点击下一步。 在“选择共享库及头文件”窗口中指定dll文件的路径,如果有头文件 的话,头文件的位置会随之自动给出,点击下一步。 在“配置包括路径和预处理定义”窗口中将与dll文件相关的文件包括在路径中, 在“预处理定义”中对函数进行预处理定义(如何定义尚未搞清楚),完成之后,点击下一步。 在“选择待转换函数”窗口选择dll文件中的主函数,然后点击下一步。在“配置项目库设置”窗口中为将要生成的VI指定一个项目库及其路径,然后点击下一步。 在“选择错误处理模式”窗口中可对出现错误的处理模式进行选择,可根据需要来进行设置。 下面的窗口为“配置VI及控件”,此窗口主要对生成VI的属性进行设置,详细说明请参照Labview8.5的帮助文档。 设置完成之后会将以上设置的主要内容放在一个窗口中,以供操作者检查。该窗口为“生成总结”。 点击下一步,即可进行生成。到此使用导入共享库对dll文件进行包装的工作完成。 将此VI进行连接编程,并测试其是否成功。 3. 在Labview下将调试好的程序,编译成可执行文件(.exe)。 这一步骤在Labview7.0版本和Labview8.5版本中皆可完成。由于这一步比较简单,下面以Labview7.0版本为例简要的讲一下步骤: 1) 在Labview下先打开一个做好的程序,然后选择“tools->Build applicattion or shared library(.dll)” 2) Build application or shared library窗口中对所要编译的程序进行配置。其具体 说明请参照Labview的帮助文档。 3) 配置完成之后,点击build,这时即可生成该程序的exe文件。 4) 如需要在未安装Labview的目标机使用该exe文件,则在配置时需将run-time 包含进去。 以上所述即为matlab和labview混合编程中调用的大致步骤,由于操作过程中仍存在着一些问题,所以还未能完成。需以后继续研究。 下面是我在研究过程中出现的一些问题及自己的一些想法: 1. 在使用导入共享库对dll文件进行封装时,在“选择待转换函数”窗口中发 现dll文件中的函数不可进行封装,根据提示,需要对一些符号进行声明或定义,我根据提示定义了相应的符号之后,发现其中有两个函数(filenameInitialize和filenameterminate)可以进行封装了,而其它函数依然不行。这表明,对于dll文件中的一些未定义符号还需要进一步的进行声明。 2. 从matlab帮助文档中可以得知,任何一种应用程序如需要对matlab生成的 dll文件进行调用的话,一般需要七个步骤,如声明变量、检测初始化函数、检测终止函数等等。在matlab的帮助文档中,举出了C和C++对matlab生成的dll文件进行调用的例子,可以看出,该例完成调用规则的七个步骤。那么对于Labview来讲,它同样也需要完成这七个步骤,我们可以从导入共享库的的过程中可以看出,它实际上就是在完成这七个步骤,比如进行预处理定义即是对函数中的变量符号进行声明,而选择待转换函数则是对函数的初始化、终止等进行检测的一个过程。在导入共享库的处理过程中,我们可以把其中的每个函数都进行封装,然后进行测试成功与否。在进行连接编程时,只选取主函数生成的VI即可。 3. 在有些文献中,我们可以看到,labview中的数据类型与matlab中的数据类 型是不同的,二者是不可通用的,而C/C++中数据类型则可为labview所调用,那么因此可以有C/C++作一个接口程序,来调用matlab的数据类型转化成C/C++的数据类型,然后为labview所调用。 附录: 一、下面讲下在matlab环境下生成可执行文件及其使用的过程 在matlab环境将m文件编译成可执行文件的过程与编译成dll文件的过程类似,在matlabr2007a版本中也可使用两种方式进行:使用mcc命令的方式和使用deploytool的窗口配置方式。 这两种方式可以参照编译dll文件过程来进行(详细可以参照帮助文档)。如需要在未安装matlab软件的目标机上运行时,则需要在命令的参数设置或窗口的配置中添加MCR(matlab的运行引擎)选项。 对于一个编译好的可执行文件,在目标机上运行时可作如下操作: 1. 安装MCR安装包,在安装过程中可能会出现下面的问题,请参照解决 (1). 若“MCRInstaller.exe”无法正常安装,请运行“vcredist_x86.exe”,然后再运行“MCRInstaller.exe”。 (2). 当运行“MCRInstaller.exe”时,会弹出对话框提示你安装“.Net Framework”。 你不需要安装“.Net Framework”,点击继续即可。原文如下: NOTE: When you run the MCR installer, you will see a pop-up message indicating that .Net Framework is not installed. Click the option to continue without installing .NET Framework 2. 然后直接点击运行filename.exe即可。 3. 对于些exe文件还可以通过DOS命令行的方式来运行。 “开始-->运行――>输入cmd”在弹出DOS窗口中可以输入路径例如 D:\\cd..\\My Documents\\matlab找到此文件所在文件夹。下面的工作则与在matlab环境中对m文件的使用相同了。 二、关于COM组件 组件对象模型(Component Object Model,简称COM的核心就是二进制接口规范,此规范于编程语言和操作系统。基于组件的应用开发,其方法和组装数字电路一样。可以用已经制作好的软件组件来构筑应用程序。Labview5.0及以上的版本都提供了对COM的支持。 在matlab中使用MATLAB Builder for COM来创建COM组件,一般需要四个过程,创建工程、管理M文件和MEX文件、编译生成组件、打包和发布组件。 具体操作步骤如下: 1. 首先新建一个M文件,在matlab命令行中输入comtool,启动“MATLAB Builder” 图形用户界面。 2. 新建一个工程,在New Project Setting对话框中的Componet name和Class name 中输入组件名和类名,其余可设为默认。 3. 返回Matlab Builder窗口中添加M文件,当有多个文件时,可以进行删除、添 加、编辑等操作。当定义工程设置并添加必要的M文件和MEX文件后、运行菜单命令Build-COM、这时会生成包括dll的一系列文件。 4. 如果算法文件编译成功,并通过测试,可以打包和发布组件了。 在Labview中调用COM对象 COM组件是具有双重接口的的COM对象,调用COM对象时输入参数将转换为MATLAB内部数组格式并传递给经过编译的MATLAB函数。函数退出时,输出参数由MATLAB内部数组格式转换为COM自动化数据类型。COM客户端在经过编译的MATLAB函数中将所有的输入、输出参数作为变体型(Variant)变量进行值传递。变体型是一种特殊的数据类型,可以适应所需要数据的变化。如表征字符型、整形、浮点型,并可以按需要进行大小调节。该数据类型并不存在于Labview中,但是由于ActiveX、COM等控件允许使用变体型数据,因而Labview提供了对这种数据类型的支持,以便传递和检索COM对象中的数据。 由于此步操作并未完成,具体的操作步骤请详见Labview帮助文档。 因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务