MarlabSimulink(2014a)生成C++代码,并用VC2010生成dll供VBA或VB调用使用说明_第1页
MarlabSimulink(2014a)生成C++代码,并用VC2010生成dll供VBA或VB调用使用说明_第2页
MarlabSimulink(2014a)生成C++代码,并用VC2010生成dll供VBA或VB调用使用说明_第3页
MarlabSimulink(2014a)生成C++代码,并用VC2010生成dll供VBA或VB调用使用说明_第4页
MarlabSimulink(2014a)生成C++代码,并用VC2010生成dll供VBA或VB调用使用说明_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、MarlabSimulink(2014a)生成C+代码,并用VC2010生成dll供VBA或VB调用使用说明一、过程概述1、 使用VC2010生成.dll文件,测试VC程序是否正常2、 使用VBA调用VC2010生成的.dll文件,测试.dll文件调用的VBA代码是否正常,这里使用Excel VBA主要是为了以后输入输出数据更方便。3、 使用MatlabSimulink模型编译成c+文件。4、 VC2010集成MatlabSimulink生成的c+代码,验证在VC2010环境下能正常运行。5、 VC2010将生成的程序编译成.dll文件,以便于VB调用6、 使用步骤1,2验证MatlabSim

2、ulink生成的代码二、具体实施过程描述1、使用VC2010生成.dll文件1.1工程建立 首先打开VS 2010-> 新建工程 -> Win32 -> Win32项目 -> 输入工程名称(MakeDll),选择好保存工程的路径->确定。 在弹出的“应用程序设置”-> "应用成程序型"  -> 选择 "DLL(D)" -> 附加选项-> 选择"空项目(E)" ->点击"完成"进入项目工作窗口 1.2开始创建DLL&#

3、160;第一步:在头"解决方案资源管理器" -> 头文件 ->  右键 ->添加新建项  -选择"头文件(.h)" ->输入文件名称(max) -> 点击“添加(A)”,完成max.h文件的添加。max.h头文件中的代码为:1.#ifndef _MAX_H 2.#define _MAX_H_ 3._declspec(dllexport) int _stdcall fmax(int a,int b); 4.#endif 代码说明:_declspec(dllexport) 的作用是指定导出该函数为DLL函数;

4、_stdcall是函数调用约定,表示该DLL函数被C/C+以外的语言调用; 备注:使用时需要根据实际定义的主函数返回值类型和函数名称修改低3行红色而自体标记部分内容。这里需要修改的是int数据类型,fmax(int a,int b)的函数名称和变量名称和变量的类型,或者直接从第二步的主程序中复制过来。 第二步:在头"解决方案资源管理器" -> 源文件 ->  右键 ->添加新建项 ->选择"C+文件(.cpp)" ->输入文件名称(max) -> 添加(A) max.c源文件中的

5、代码为: 1.#include"max.h" 2.int _stdcall fmax(int a,int b) 3. 4. return a>b?a:b; 5.  主函数中定义了比较两数大小的函数fmax(),依然在此函数前声明该函数的调用为_stdcall类型(被C语言以外的语言调用); 备注:第2行中除了 _stdcall不能修改之外,其他的数据类型,变量名称,函数名称均可以根据实际需要进行修改。例如如下所示的示例。主程序修改示例int _stdcall fmax(int a,int b) int c;c=a+b; return c;

6、 / 返回运算结果 第三步:在头"解决方案资源管理器" -> 源文件 ->  右键 ->添加新建项 ->选择"模块定义文件(.def)" ->输入文件名称(max) -> 添加(A) max.def的作用是用于导出一个DLL的函数;max.def模块文件中的代码为: 1.LIBRARY MakeDll 2.EXPORTS 3. fmax 1 第一行:“LIBRARY”的作用是告诉链接器(linker)如何命名你的DLL,但它只是影响lib连接dll的名称的,而不是影响生成dll的

7、名称;第二行:EXPORTS 语句的作用是引入导出的函数或数据组成的节;第三行:fmax 1指定按序号导;所有程序文件添加完成后如下图所示。  第四步:按 F5启动调试 或直接 菜单栏 -> 生成 ->生成 MakeDll(U),这如果提示生成成功那么在你保存工程的的路径下的"Debug"文件夹下即可找到生成成功的MakeDll.dll动态链接库文件在VC2010界面的下方,编译器信息中也会有生成的.DLL文件所在的路径信息,这条信息在VBA中引用.dll时可以直接复制过去。 2 用VB或者VBA调用 2.1新建VBA用户

8、窗体或者VB工程选择"标准EXE"在对象窗口设计好如下界面,一些标签,三个文本框和一个按钮,如图: 输入以下代码1.Private Declare Function fmax Lib _2."D:ProgramFileVc.dllToVba_ZuiDaZhiMakeDllDebugMakeDll.dll" _2.1.(ByVal inta As Integer, ByVal intb As Integer) As Integer3.Private Sub CommandButton1_Click()4. Dim a As Integer, b

9、As Integer5. a = TextBox1.Text6. b = TextBox2.Text7. TextBox3.Text = fmax(a, b) '调用MakeDll.dll8.End Sub第1行,申明函数,'声明DLL过程第2行,申明.dll所在的文件路径,可根据实际情况更改存放地点第2.1行,申明变量,使用ByVal传值方式将变量传送到.dll中第38行完成.dll内的fmax函数调用和结果显示。运行VB或VBA程序,输入a,b的数值(因为.dll中定义的白能量为int整数型,因此程序在这里使用整数型运算,输入数据的小数点会被自动取整)3 新建MatlabS

10、imulink模型并编译成c+程序3.1 使用simulink建立模型建立一个最简单的乘法模型如下图所示3.2设置Simulink模型配置3.2.1按下Ctrl+E或者按下图路径打开配置界面3.2.2配置解算器3.2.3配置运行程序的硬件系统(条件)3.2.4配置生成的代码语言3.2.5配置是否生成代码报告模型配置中的内容较多,这里只配置了基本的项目,其余配置说明许参考帮助文档或代码生成书籍。3.3代码生成和代码报告使用菜单栏实现代码生成使用工具栏编译图标实现代码生成代码生成完成后会弹出代码生成报告,蓝色框内的代码文件就是后面要添加到VC2010工程中的程序。 只有配置生成报告选项,这里才会弹

11、出代码报告窗口。如果编译出现找不到编译器的情况,在命令窗口输入mex setup(注意前面有一个空格)。选择已经安装的编译器即可。4 使用VC2010集成Simulink生成的代码4.1特殊情况和错误处理使用MATLAB2014A和VS2010时,编译模型后会自动新建并打开一个VC2010工程。 如果VC工程提示“LINK1123错误”则在属性里面把嵌入清单项选为否即可。4.2建立VC2010工程如果代码生成后自动建立并打开VC2010工程则不需要这一步。如果没有自动建立工程,则新建VC2010工程,添加代码生成报告界面的所有.h和.cpp文件即可,这些文件在simulink所在模型文件夹下可

12、以找到。4.3生成的程序接口在VC2010中打开ert_main.cpp文件,这个文件中包含了两个程序rt_OneStep()main()在VC2010中,ert_main.cpp程序文件的开始申明部分还有这样一行申明static SimulinkCodeForVcModelClass SimulinkCodeForVc_Obj;/ Instance of model class 这个申明的作用是:说明模型的所有的变量都是SimulinkCodeForVc_Obj的内容,因此模型的输入输出接口的命名是SimulinkCodeForVc_Obj.SimulinkCodeForVc_Y.Out1输

13、入、输出接口变量名称是按照一定的格式书写的,比如:SimulinkCodeForVc_Y.Out1表示模型的名称为SimulinkCodeForVc,而后缀_Y表示的是输出,.Out1表示的是输出接口1如果生成代码用于不同的硬件平台,这个命名会有一些差异,实际使用时根据编译器的提示和生成的代码的情况决定使用哪一种格式。如果格式错误,会提示未定义标识符。4.3.1 函数rt_OneStep()void rt_OneStep(void) 每次调用这个程序,对模型执行一次,输入输出数据更新一次,这个函数内部包括模型输入、输出接口变量的定义。1、定义输入端口位置的提示,在这一行下,定义模型的输入接口/

14、 Set model inputs here例如给模型的输入接口赋值SimulinkCodeForVc_Obj.SimulinkCodeForVc_U.In1=20;2、定义输出端口位置的提示,在这一行下,定义模型的输出接口,或者对模型的输出进行操作/ Get model outputs here例如:把模型结果打印出来的操作如下所示std:cout<<SimulinkCodeForVc_Obj.SimulinkCodeForVc_Y.Out1<<std:endl;4.3.2 主函数main()和更改操作int_T main(int_T argc, const char

15、 *argv) 这个是主程序,在这个程序里面完成对void rt_OneStep(void)的调用(执行模型计算)以及增加其他的功能。1、如果主函数没有输入变量参数,括号内为空(写成int_T main()2、注释掉程序自动生成的模型无限执行时的提示信息/* printf("Warning: The simulation will run forever. " "Generated ERT main won't simulate model step behavior. " "To change this behavior select

16、 the 'MAT-file logging' option.n"); fflush(NULL); */3、主程序的大循环while (rtmGetErrorStatus(SimulinkCodeForVc_Obj.getRTM() = (NULL) / Perform other application tasks here-添加自定义功能SimulinkCodeForVc_Obj.SimulinkCodeForVc_U.In1=10; /这里可以添加模型的输入接口设置,赋值rt_OneStep(); /调用rt_OneStep(),运行一次模型,可以用定时器实现每

17、过一段时间执行一次模型,时间间隔和simulink中设定的仿真步长一致。 4.4运行模型的方法在ert_main.cpp文件保留代码生成的头文件部分#include <stddef.h>#include <stdio.h> / This ert_main.c example uses printf/fflush #include "SimulinkCodeForVcDll.h" / Model's header file#include "rtwtypes.h"static SimulinkCodeForVcModelCl

18、ass SimulinkCodeForVcDll_Obj;/ Instance of model class文件ert_main.cpp其他的程序代码可以删掉,自定义一个主函数,在主程序里面对执行模型的程序进行调用即可。通过调用void rt_OneStep(void)程序,间接地实现对SimulinkCodeForVc_Obj.step()程序的调用。为了减少程序的复杂程度,可以直接调用SimulinkCodeForVc_Obj.step()程序,实现模型的运行。不用太多的理会ert_main.cpp中的程序部分,但是这个文件中的申明部分一定是要保留的。修改完成后的主函数的如下所示(注释部分

19、删掉)#include <stddef.h>#include <stdio.h> / This ert_main.c example uses #include "SimulinkCodeForVc.h" / Model's header file#include "rtwtypes.h"/程序修改-1,增加字符串输出头文件和变量#include<iostream>using namespace std;static SimulinkCodeForVcModelClass SimulinkCodeForVc_O

20、bj;/ Instance of model class void rt_OneStep(void) static boolean_T OverrunFlag = 0; if (OverrunFlag) rtmSetErrorStatus(SimulinkCodeForVc_Obj.getRTM(), "Overrun"); return; OverrunFlag = true; /程序修改2,输入端口赋值 /设置模型输入 SimulinkCodeForVc_Obj.SimulinkCodeForVc_U.In1=20; / Step the model 对模型执行一次 S

21、imulinkCodeForVc_Obj.step(); /程序修改-3,输出模型运行结果(模型的输出) std:cout<<SimulinkCodeForVc_Obj.SimulinkCodeForVc_Y.Out1<<std:endl; / Indicate task complete OverrunFlag = false;/程序修改-4,主函数没有输入值,因此定义为空int_T main() SimulinkCodeForVc_Obj.initialize(); /程序修改-5,这部分提示信息没什么用,注释掉 /* printf("Warning: T

22、he simulation will run forever. " "Generated ERT main won't simulate model step behavior. " "To change this behavior select the 'MAT-file logging' option.n"); fflush(NULL); */ while (rtmGetErrorStatus(SimulinkCodeForVc_Obj.getRTM() = (NULL) /程序修改-6,调用执行模型的函数,或者在这里给模型的输入赋值 rt_OneStep(); SimulinkCodeForVc_Obj.terminate(); return 0;5 使用VC2010将生成的代码编译成.dll文件5.1 VC2010引入生成的代码按照上文所述的方

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论