Matlab RTW&Engine 建模仿真实验报告

更新时间:2024-05-05 20:40:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

1

基于MATLAB RTW/Engine

的建模仿真实验

实验报告

院(系)名称 专学学任

自动化 导航、制导与控制

苏泽亚 SY1103508

李妮

业生

名姓

称 名 号

课老师

2011年 12 月 17日

北京航空航天大学研究生实验报告

1 实验目的

MATLAB集成了各类应用领域的专用库函数和模块,用于数值计算、系统建模、控制和信号处理的软件包。Simulink工具可以对分系统或单个仿真模型进行设计。

RTW(Real-Time Workshop)是MATLAB提供的自动化代码生成工具,将Simulink模型框图转化为标准的C代码;Engine是MATLAB提供的C语言调用接口,可以通过API函数调用像Simulink模型等MATLAB资源。 学会利用MATLAB/Simulink创建仿真模型,利用MATLAB RTW和Engine工具,通过两种不同的方式在Visual C++环境中对Simulink模型进行集成和调用,从而辅助在科研及工程实践中准确、通用快速的建立分布交互仿真体系结构下的复杂系统仿真模型。

2 实验内容

(1)基于MATLAB RTW的建模与仿真 理解MATLAB RTW工作原理,在MATLAB中搭建Simulink仿真模型,对仿真模型参数及RTW参数进行配置,自动生成C代码,理解生成的C代码的功能,分析各个文件内容,并在Visual C++环境中集成生成代码,构建仿真模型,运行得到仿真结果,并与Simulink仿真模型的运行结果进行比较。

- 1 -

北京航空航天大学研究生实验报告

(2)基于MATLAB Engine的建模与仿真

理解MATLAB Engine调用机制以及帧周期的概念,熟悉Engine的常用接口函数,在MATLAB中搭建Simulink仿真模型,对仿真模型参数及Engine参数进行配置,对模型进行仿真得到仿真结果,编写VC应用程序,通过Engine引擎调用Simulink仿真模型,将运行的结果与使用Simulink仿真得到的结果进行比较。

3实验步骤及过程

(1) 基于MATLAB RTW的建模与仿真

第一步:搭建Simulink模型,如图1:

图 1

图1所示模型为六自由度飞行模拟器Stewart平台的洗出算法模型,模型有六个输入In_fAAx、In_fAAy、In_fAAz、In_Omega、In_Cita、In_Fi分别为要模拟的飞行器在纵向、横向、垂向的比力和俯仰、横摇、侧滚的角速度,模型有六个输出Out_L1、Out_L2、Out_L3、Out_L4、Out_L5、Out_L6分别为飞行模拟器六个作动器的伸长量。

- 2 -

北京航空航天大学研究生实验报告

仿真时间为0到30秒,类型选择为定步长,ode4(Runge-Kutta)数值分析方法,设置固定步长大小为0.01秒;

第二步:配置RTW参数,在Real-Time Workshop属性页中将系统目标文件选择为grt.tlc,

选择只生成代码,其余设置均采用默认设置,最后点击“Generate code”按钮,生成代码; 第三步:分析代码,在Visual C++中建立Windows窗体应用程序,设计窗体应用程序的前面板,包括参数设置区和图像绘制区。在解决方案属性页中添加MATLAB头文件、库文件目录,将生成的C代码加入到工程中,根据模型执行过程编写模型的模块,编译调试通过;

第四步:执行C++程序,绘制仿真波形,与Simulink模型得到的结果进行比较。 (2) 基于MATLAB Engine的建模与仿真

第一步:搭建Simulink仿真模型,如图1:

图 2

图2中模型与图1中相同为Stewart平台的洗出算法模型,在用Matlab仿真时仿真时间为0到30秒,类型选择为定步长,ode4(Runge-Kutta)数值分析方法,步长大小为0.1秒,模型中的simout中的数据保存格式选择为Array,并运行模型得到仿真结果;

- 3 -

北京航空航天大学研究生实验报告

第二步:配置Workspace I/O属性页,初始状态设为xInitial,用于工作控件中加载变量, Final state选为xFinal,用于存储每个时间段运行结束时的终端状态,并且选择数据类型为Array;

第三步:在Visual C++中建立Windows窗体应用程序,设计窗体应用程序的前面板,包括参数设置区和指令显示区,在解决方案属性页中添加MATLAB头文件、库文件目录,编先仿真模块,编译调试通过;

第四步:将运行结果与在Simulink下的输出波形进行比较。

4 实验软件设计与实现

编程环境为Visual Studio 2008,MATLAB版本为R2011b。

4.1软件流程

建立Windows窗体应用程序,设计软件主窗体如图3,包括两个选项卡,RTW选项卡和ENGINE选项卡。打开软件时默认显示RTW选项卡,RTW选项卡包括两个区域,输入参数设置区和仿真结果绘制区,仿真结果绘制区含两个绘图区,上面的绘图区用于绘制Out_L1、Out_L2、Out_L3的仿真结果,下面的绘图区用于绘制Out_L4、Out_L5、Out_L6的仿真结果。

图 3

ENGINE选项卡如图4,可选择模型路径,设置模型名称、仿真步长和仿真时间,指令显示区用来显示配置完成后要发送到ENGINE的指令。

- 4 -

北京航空航天大学研究生实验报告

图 4

整个软件的操作流程如图5所示:

- 5 -

北京航空航天大学研究生实验报告

选择选项卡RTWENGINE设置模型输入参数设置模型路径、模型名称点击仿真按钮设置仿真步长、仿真时间查看仿真结果确认要发送到ENGINE的指令点击开启ENGINE按钮点击执行按钮查看仿真结果 图 5

(1)基于MATLAB RTW的建模与仿真

基于RTW的仿真的流程主要包括设置仿真模型输入参数、模型的初始化、模型的执行与终止几个部分,要在主函数中声明需要用到的外部函数,软件流程为:

a) 设置仿真模型输入参数; b) 模型注册;

c) 初始化大小和采样时间,启动模型,为输入变量赋值;

d) 计算机输出数据,更新离散状态变量,计算连续模行导数,根据输出数据实时绘制图形,更新进度条,此过程执行3000次; e) 终止模型。

(2)基于MATLAB Engine的建模与仿真

基于ENGINE的仿真流程包括设置仿真参数、Matlab引擎的开启、Simulink模型的调用与关闭引擎的操作几个部分,软件流程为:

a) 设置仿真模型路径、模型名称、仿真步长、仿真时间; b) 开启引擎;

c) 进入模型所在目录;

d) 模型初始化,设置仿真开始时刻,根据输出数据的维数、仿真步长和仿真时间的大小定义一个数组用于存放输出结果;

e) 调用本地模型,根据设置的仿真步长进行逻辑时间推进,记录模型输出,时间推进

之后将前一状态的输出作为下一个状态的输入,继续执行,根据仿真步长和仿真时

- 6 -

北京航空航天大学研究生实验报告

间确定循环次数; f)

画出仿真结果。

4.2程序结构及主要功能模块

(1)基于MATLAB RTW的建模与仿真

基于RTW的仿真主要过程由“Simulate”按钮的响应函数System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e)实现,其中调用的RTW功能函数及绘图函数主要有:

函数 cw(); MdlInitializeSizes(); MdlInitializeSampleTimes(); MdlStart(); MdlOutputs(); MdlUpdate(); cw_derivatives(); MdlTerminate(); DrawLine() progressBar1->PerformStep()

(2)基于MATLAB Engine的建模与仿真

基于RTW的仿真主要过程由“执行”按钮的响应函数System::Void button2_Click(System::Object^ sender, System::EventArgs^ e),其中调用的Engine引擎的函数主要有:

函数 engOpen() engEvalString() engClose()

功能 开启引擎 执行MATLAB命令 关闭引擎 功能 模型注册 初始化大小 初始化采样时间 启动模型 计算机系统输出 更新离散状态向量 计算连续模型导数 模型终止 绘制图形 更新进度条 5.实验结果分析

(1)基于MATLAB RTW的建模与仿真

仿真时模型的输入参数In_fAAx、In_fAAy、In_fAAz、In_Omega、In_Cita、In_Fi分别设置为6.37、0、-9.8、0、0.6981、0,仿真步长0.01s,仿真时间30s。

MATLAB仿真结果如图6、图7所示,图6显示Out_L1、Out_L2、Out_L3的仿真结果,图7显示Out_L4、Out_L5、Out_L6的仿真结果:

- 7 -

北京航空航天大学研究生实验报告

图 6

图 7

VC程序仿真结果如图8所示:

图 8

- 8 -

北京航空航天大学研究生实验报告

结果分析:通过VC程序得到仿真数据并绘制图形,得到仿真结果,与Simulink仿真模型得到的结果进行比较发现,输出波形是相同,说明可以通过VC对Simulink模型进行仿真,快速准确的得到仿真结果,且仿真时可以配置输入参数,但不可配置仿真步长仿真速度较快。

(2)基于MATLAB Engine的建模与仿真 仿真时模型的输入参数In_fAAx、In_fAAy、In_fAAz、In_Omega、In_Cita、In_Fi分别设置为6.37、0、-9.8、0、0.6981、0,仿真步长0.1s,仿真时间30s。

MATLAB仿真结果如图9、图10所示,图9显示Out_L1、Out_L2、Out_L3的仿真结果,图10显示Out_L4、Out_L5、Out_L6的仿真结果:

图 9

图 10

VC程序调用Engine的仿真结果如图11、图12所示:

- 9 -

北京航空航天大学研究生实验报告

图 11

图 12

结果分析:VC程序和Simulink得到的仿真波形一致,说明通过VC程序可以操纵MATLAB Engine引擎得到准确的仿真结果。仿真时可配置仿真步长和仿真时间,不过仿真速度较慢。

6 实验总结

实验过程中,不但对MATLAB RTW和MATLAB Engine的调用方法有了深入的学习,同时,对MATLAB中的一些操作和执行语句有了一定的了解,更是锻炼了自己的编程能力。 在解决问题的过程中对基于vc++ .net的编程进行了学习,为今后的工作打下了基础。通过MATLAB RTW及Engine工具以两种不同的方式在Visual C++环境中对Simulink模型进行集成和调用,准确、通用、快速地建立复杂系统仿真模型,这在以后的科研及工程实践中会有很大的帮助。

7附:程序主要代码

(1) 基于MATLAB RTW的建模与仿真

“Simulate”按钮的响应函数:

System::Void button1_Click_1(System::Object^ sender, System::EventArgs^ e) {

int i; double t=0; cw();//模型注册 MdlInitializeSizes(); MdlInitializeSampleTimes(); MdlStart();//启动模型 //获得输入参数

cw_U.In_fAAx=System::Decimal::ToDouble(numericUpDown1->Value); cw_U.In_fAAy=System::Decimal::ToDouble(numericUpDown2->Value); cw_U.In_fAAz=System::Decimal::ToDouble(numericUpDown3->Value); cw_U.In_Omega=System::Decimal::ToDouble(numericUpDown4->Value); cw_U.In_Cita=System::Decimal::ToDouble(numericUpDown5->Value); cw_U.In_Fi=System::Decimal::ToDouble(numericUpDown6->Value); progressBar1->Value=0; PointF tempPt1=Point(23,90);

- 10 -

北京航空航天大学研究生实验报告

PointF tempPt2=Point(23,90); PointF tempPt3=Point(23,90); PointF tempPt4=Point(23,280); PointF tempPt5=Point(23,280);

PointF tempPt6=Point(23,280); //设置画笔 Pen^ myPen1=gcnew Pen(Color::Blue,1.0f); Pen^ myPen2=gcnew Pen(Color::Red,1.0f); Pen^ myPen3=gcnew Pen(Color::LightGreen,1.0f); Graphics^ gs=this->pictureBox1->CreateGraphics(); pictureBox1->Refresh(); for (i = 0; i < 3000; i++) { MdlOutputs(0);//产生输出 MdlUpdate(0);//更新状态

cw_derivatives();//连续模型导数 t = t + 0.01;//时间推进

progressBar1->PerformStep();//更新进度条

PointF endPt1=Point(t*10+23,90-(cw_Y.Out_L1*210)); PointF endPt2=Point(t*10+23,90-(cw_Y.Out_L2*210)); PointF endPt3=Point(t*10+23,90-(cw_Y.Out_L3*210)); PointF endPt4=Point(t*10+23,280-(cw_Y.Out_L4*210)); PointF endPt5=Point(t*10+23,280-(cw_Y.Out_L5*210));

PointF endPt6=Point(t*10+23,280-(cw_Y.Out_L6*210)); //绘制图形

gs->DrawLine(myPen1,tempPt1,endPt1); gs->DrawLine(myPen2,tempPt2,endPt2); gs->DrawLine(myPen3,tempPt3,endPt3); gs->DrawLine(myPen1,tempPt4,endPt4); gs->DrawLine(myPen2,tempPt5,endPt5); gs->DrawLine(myPen3,tempPt6,endPt6); tempPt1=endPt1; tempPt2=endPt2; tempPt3=endPt3; tempPt4=endPt4; tempPt5=endPt5; tempPt6=endPt6;

}

MdlTerminate();//模型终止 }

(2) 基于MATLAB Engine的建模与仿真

“执行”按钮的响应函数:

System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) {

- 11 -

北京航空航天大学研究生实验报告

int i;

String^ module_path; String^ module_name; String^ temp; Decimal step,time;

module_path=textBox1->Text;//模型路径 module_name=textBox2->Text;//模型名称 step=numericUpDown7->Value;//仿真步长 time=numericUpDown8->Value;//仿真时间 temp=\+textBox1->Text+\;

engEvalString(ep,(char*)(void*)Marshal::StringToHGlobalAnsi(temp));//进入模型所在目录 engEvalString(ep,\);//对模型运行所需变量初始化

temp=\+int(numericUpDown8->Value/numericUpDown7->Value+1)+\;

engEvalString(ep,(char*)(void*)Marshal::StringToHGlobalAnsi(temp));//生成一个矩阵用于存

储模型的输出结果

engEvalString(ep,\);//设置仿真的开始时刻 engEvalString(ep,\);

engEvalString(ep,\);//载入模型参数 progressBar2->Value=0;

progressBar2->Maximum=int(numericUpDown8->Value/numericUpDown7->Value); for(i=0;iValue/numericUpDown7->Value+1);i++) {

temp=\+textBox2->Text+\+step.ToString()+\+step.ToString()+\;

engEvalString(ep,(char*)(void*)Marshal::StringToHGlobalAnsi(temp));//调用本地节点

的SIMULINK,将模型运行的逻辑时间推进.1s }

}

/////////画出模型输出///////////

temp=\+Decimal(numericUpDown7->Value)+\+int(numericUpDown8->Value)+\; engEvalString(ep,(char*)(void*)Marshal::StringToHGlobalAnsi(temp)); engEvalString(ep,\); engEvalString(ep,\); engEvalString(ep,\);

engEvalString(ep,\); engEvalString(ep,\); engEvalString(ep,\); engEvalString(ep,\);

engEvalString(ep,\);

engEvalString(ep,\);//记录模型输出 engEvalString(ep,\);

engEvalString(ep,\);//状态变量迭代,将本次时间步结束时系统 //的中断状态记录下来,作为下一个时间步运行的初始状态 progressBar2->PerformStep();//更新进度条

- 12 -

本文来源:https://www.bwwdw.com/article/3t2g.html

Top