simulink与vc++6.0接口

2016-02-19 16:20 11 1 收藏

今天图老师小编给大家精心推荐个simulink与vc++6.0接口教程,一起来看看过程究竟如何进行吧!喜欢还请点个赞哦~

【 tulaoshi.com - 编程语言 】

Simulink与VC++6.0接口

Simulink与VC应用程序接口一个显著的特点就是Simulink仿真必须依赖于MATLAB系统,目前为止,MATLAB提供引擎方式将Simulink同VC应用程序的编程结合起来。要通过引擎方式将Simulink与VC结合起来首先要掌握VC与MATLAB通过引擎方式混合编程以及Simulink命令行仿真两方面的内容。

MATLAB引擎方式函数库

MATLAB引擎函数库是MATLAB提供引擎方式接口的一系列程序的集合,它允许用户用自己的C/C++语言或FORTRAN语言应用程序中对MATLAB进行调用,将MATLAB作为一个计算引擎使用,让其在后台运行,完成复杂的矩阵计算,简化前台用户程序设计的任务。

在用户启动MATLAB引擎时,相当了启动了另外一个MATLAB进程并在后台运行。应用程序通过MATLAB引擎函数库中提供的函数完成与MATLAB引擎之间进行数据交换和命令传送的任务。MATLAB引擎函数库总共提供了13个C语言的引擎函数,它们均在头文件engine.h中予以说明,所以在使用它们时,必须对该头文件进行包含。下面简要介绍引擎库中的六个基本库函数:

(1) engOpen 

功能:启动MATLAB引擎。   

语法:Engine* engOpen(const char* startcmd);   

其中,startcmd为一字符串,用于启动MATLAB进程。在Windows中,startcmd必须为NULL。   

(2) engClose   

功能:退出MATLAB引擎。   

语法:int engClose(Engine* ep);   

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

其中,ep是Engine类型的指针。EngClose发出退出MATLAB命令,成功时返回0,否则返回l。   

(3) engEvalString   

功能:执行一个用字符串表示的MATLAB表达式。   

语法:int  engEvalString(Engine* ep, const char* string);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

其中,string是命令字符串,该字符串必须是一个合法的MATLAB表达式。凡可在MATLAB命令窗口中执行的命令均可以字符串形式执行。

(4) engGetArray 

功能:从MATLAB的工作空间中拷贝一个变量。   

语法:mxArray* engGetArray(Engine* ep, const char* name); 

其中,name是从engine中得到的mxArray名。engGetArray从ep所指向的engine中读取使用参数name指定的mxArray结构体的内容,正确返回时其返回值为一指向新分配的mxArray结构体对象的指针,否则为NULL。

(5) engPutArray

功能:将mxArray结构体类型变量放入MATLAB的工作空间中。  

语法:int  engPutArray(engine* ep, const mxArray* mp);

其中,mp为mxArray结构体对象的指针。engPutArray将一个mxArray结构体类型的变量写入引擎ep。如果当前程序的工作空间中不存在指定的mxArray结构体,则函数会自动创建。若有同名的mxArray结构体存在,它将被这一新的mxArray结构体取代。  

(6)  engOutPutBuffer   

功能:确定存放MATLAB输出结果的缓冲区域。   

语法:int engOutputBuffer(Engine* eP,char* p,int n);   

使用engOutputBuffer,用户可以为引擎指针ep所指向的引擎设置一个输出缓冲区,将MATLAB输出到屏幕上的内容保存在其中,其长度由参数n确定,位置由字符指针p来确定。

VC++6.0集成环境中建立MATLAB引擎程序的方法   

第一步,建立项目工程。启动VC++6.0集成环境,选择File下拉式菜单中的New选项,可有三种类型的应用程序创建工程选择.分别为MFC AppWizard(exe)、Win32Application和Win32conso1e Application。选择其中一种,在Project name编辑框中输入项目名,按照项目向导完成项目工程创建。

第二步,设置编译环境。选择下拉式菜单Tools中的菜单项Options,选择其中的Directories属性页,在其中的Show directories下拉式选项框中分别选择Include Files和Library Files,在下部的编辑框中通过浏览分别添加如下路径:Include Fiels:MATLAB根目录externinclude

MATLAB根目录externincludecpp
Library Fiels:MATLAB根目录externlib   
MATLAB根目录externinclude   

第三步,设置项目连接选项。选择菜单Project中的子菜单Settings,选择其中的属性页Link,在其中的Catogery下拉式选项框中选择Input.在下部的Object Library modules编辑框中填写:libeng.lib、libmx.1ib和libmat.1ib。(具体用到什么库由你的应用决定)

第四步,加入引擎头文件。在准备使用MATLAB引擎的类的cpp文件中,加入“#include “engine.h””语句,并且在以后建立的要使用MATLAB引擎的类中也注意加入上述语句。   

当完成以上述四步工作后,用户就可以在VC++中对MATLAB引擎程序进行编译和调试了。

 Simulink的命令行仿真方式

一般情况下,Simulink是类似框图图形化的仿真方法;而在通过引擎方式将Simulink同VC相结合时,仿真的每个操作是通过调用engEvalString执行一个用字符串表示的MATLAB表达式(Simulink仿真命令)来实现的。因此,要掌握Simulink&VC混合编程,首先需要掌握Simulink的命令行仿真方式:

[t,x,y]=sim('modelname')

利用对话框参数进行仿真,返回输出矩阵;

[t,x,y]=sim('modelname', timespan, options, ut)

利用输入参数进行仿真,返回输出矩阵;

[t,x,y1,y2,...yn]=sim('modelname', timespan, options, ut)

利用输入参数进行仿真,返回逐个输出;

参数说明:

'modelname' 运行的模型名(不包含扩展名),必须在MATLAB的搜索路径上。

timespan 指定仿真的时间区间,可以采取以下几种格式:

(1)[] 空,利用模型对话框设置时间;

(2)T_final 标量,制定终止仿真时间;

(3)[T_start T_final] 二元向量,指定仿真时间区间;

(4)outputTimes 任何指定输出时间记录点的向量。

options MATLAB特定的一种数据结构,具有最高优先权,可以覆盖模型参数对话框中的设置。

ut 赋给仿真对象数入口模块的量,具有最高优先设置,它是形为[t,u1,u2...]的数值矩阵,每个为时间序列或输入序列。

Simulink与VC++6.0接口中的几点问题

根据自己在将Simulink与VC++6.0相结合过程中的经验,在实际运作过程中,需要注意以下几点问题:

Solver的选择

仿真要涉及常微分方程组的数值积分,为适应计算的多样性,Simulink提供了多种求解器。因此在解决具体的问题时,应当选择合适的求解器,并且设定合适的参数,以得到精确且迅速的仿真结果。比如:

ode45 即Nonstiff微分方程式,应用Runge-Kutta解法的中阶解法;应用最广的ode23 即Nonstiff微分方程式,应用Runge-Kutta解法之较低阶的求解方式,误差会比ode45多一点,但执行的效率快 ;ode113 即Nonstiff微分方程式,应用Adams-Bashforth-Moulton解法; ode15s 即stiff微分方程式之变阶数求解方式,是一种数值差分法;ode23s 即stiff微分方程式之低阶数求解方式,应用修正的Rosenbrock二阶解法;ode23t 即stiff微分方程式与dae三角形法整合求解方式 ode23tb 即stiff微分方程式之低阶数求解方式。
对于ode45,通常适用于连续状态模型,而对于刚性(stiff)系统,则需要采用如ode23s的刚性求解器。对于我们的可控整流电路故障模型,由于采用短路器模拟开路现象,系统为刚性系统,所以在solver选择时需要选择刚性求解算法。

通过VC++编写的应用程序采用引擎方式通过命令行仿真设置Solver只是改变了当前仿真的Solver,默认设定为Simulink中的仿真参数设定。比如对于可控整流电路故障诊断系统这一刚性系统,即便程序中选用了ode15s而默认为ode45,则本次仿真确实使用ode15s求解,但仍然会报警说应该用刚性解法。不过对于刚性系统,ode45可不好用,因此从仿真效果(如耗时)上可以认定程序中设定的刚性解法奏效了。

VC数据类型与MATLAB数据类型之间的转换

使用VC++6.0与MATLAB通过引擎方式混合编程,不可避免地要在VC数据类型与MATLAB数据类型之间进行转换。一般来说,可以使用memcpy进行转换。即通过mxGetPr()获取MATLAB数据类型的指针,再调用memcpy,比如在命令行方式下设置仿真时间时可以如下处理:

//设定仿真时间VC数据类型àMATLAB数据类型

double timespan[2];
timespan[0] = (double) m_fStartTime;
timespan[1] = (double) m_fStopTime;
T = mxCreateDoubleMatrix(1, 2, mxREAL);
memcpy((char *) mxGetPr(T), (char *) timespan, 2*sizeof(double));
engPutVariable(ep, "T", T);
// MATLAB数据类型àVC数据类型
double test[2];

来源:http://www.tulaoshi.com/n/20160219/1611739.html

延伸阅读
Windows7系统不兼容VC++6.0的问题解决方案   运行setup.exe安装程序,会弹出如下的的程序兼容性助手提示:此程序存在已知的兼容性问题,tuLaoShi.com这个是Win7在警告用户VC++6.0存在兼容性问题:此程序存在已知的兼容性问题。如下图,选中不再显示此消息,点运行程序,之后再有遇到此程序存在已知的兼容性问题的提示时候,也按这个做...
标签: 服务器
VC6.0 使用教程 你首先要打开 VC6.0 界面,一般用得较多的是Win32控制台应用程序(源程序,扩展名.cpp), 步骤是:(先工程后文件编译连接---运行) 1,建立一个工程,文件新建,出现下面界面:     选择Win32ConsoleApplication(控制台应用程序,左边倒数第三个),命名工程名称,选...
_heap_alloc_debug 会使程序崩溃调。所有版本的VC++6.0。 new中调用了._malloc_dbg(), 和_heap_alloc_dbg(). 在_heap_alloc_dbg()中有个静态的long 型计数器, _lRequestCurr (Microsoft visual StudioVC98CrtSrcdbgheap.c),初始化为1。 每次new()或 malloc()调用,这个计数器加1,当你的程序运行到足够时间,这个值会在 -2,147,483,648 to 2,...
摘要:MySQL数据库作为一种网络数据库性能十分出色,但其在应用软件中使用较少。本文将主要探讨MySQL提供的两种数据库接口 ——(ODBC API和C API)在VC中的应用,并且形成一个类用以封装C API数据库接口的功能。 关键词:MySQL;数据库接口;ODBC API;C API 引言 随着现代计算机软硬件及网络技术的发展,在网上查找资料已成为现在获...
摘要:MySQL数据库作为一种网络数据库性能十分出色,但其在应用软件中使用较少。本文将主要探讨MySQL提供的两种数据库接口 ——(ODBC API和C API)在VC中的应用,并且形成一个类用以封装C API数据库接口的功能。 关键词:MySQL;数据库接口;ODBC API;C API 4 MySQL性能测试 4.1 ODBC API 通过索引读取200万行:528秒 插入35万行: 750...

经验教程

802

收藏

78
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部