版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【例6-1】已知某振动系统的振动速度为,初始条件为x(0)=0,利用Simulink仿真该系统的振动位移。分析:要计算振动位移必须解上述微分方程,因此需要一个积分模块(Integrator),被积函数是sin(t),因此需要一个正弦波输入源模块(SineWave),积分器的输出(即振动位移x(t))用示波器观察,因此需要一个显示输出模块(Scope)。所用各模块如下所示:步骤1:新建模型窗口。步骤2:从源模块库(Sources)中用鼠标拖放一个正弦波模块(SineWave)至模型窗口中,然后从连续模块库(Continuous)中拖放一个积分模块(Integrator),再从输出显示模块库(Sinks)拖放一个示波器模块(Scope)。步骤3:将各模块的输入、输出用信号线按如下所示依次连接(连接方法:将鼠标移动到模块的输出端,此时鼠标箭头成十字形,按住左键,移动鼠标到另一个模块的输入端,当信号线由虚线变为实线时,释放左键完成信号线连接),然后保存模型。步骤4:运行仿真,然后双击示波器模块,可观察到仿真结果如图6-15所示。图6-15振动位移的仿真结果【例6-2】使用SimulinkExtras模块集中带有初始参数的传递函数模块。首先建立如图6-21所示的模型并保存。图6-21Simulink模型需要说明的是:TransferFcn(withinitialoutputs)模块的初始输出和参数设置如图6-22。图6-22TransferFcn(withinitialoutputs)模块设置TransferFcn(withinitialstates)模块的初始状态和参数设置如图6-23所示。SpectrumAnalyzer模块为系统频谱分析器,它的第一个输入表示系统输入信号,第二个输入表示系统输出信号。(2)运行该模型,然后双击SpectrumAnalyzer模块可得到如图6-24所示的结果,双击Scope模块可得到如图6-25所示的结果。图6-23TransferFcn(withinitialstates)模块设置图6-24SpectrumAnalyzer模块运行结果图6-25Scope模块运行结果【例6-3】通过Subsystem模块创建子系统。具体步骤如下。从Ports&Subsystems中复制Subsystem模块到模型中,如图6-35所示。图6-35子系统创建实例双击Subsystem模块图标即可打开Subsystem模块编辑窗口。在新的空自窗口创建子系统,然后保存。运行仿真并保存。【例6-4】创建一个子系统,实现斜截式直线方程模型y=kx+b。分析:由直线方程可知,该子系统后有两个端口x和y,可以用端口和子系统子库(Ports&Subsysterms)中的输入模块In1和输出模块Out1表示。子系统本身有两个变量k和b,由方程中的kx可以看出,k可由增益模块Gain实现,而b则可由常数模块Constant实现。选取模块,在模型窗口中创建模型,如图6-37所示。图6-37直接创建子系统设置子系统内模块参数,这里将增益模块参数设置为k,将常数模块参数设置为b,如图6-38所示。图6-38模块参数设置使用虚线框将要装入子系统部分选中,包括模块和信号线,如图6-39所示。图6-39选择创建子系统的对象选择虚线框右下角菜单中的CreateSubsystem命令,Simulink将会用一个子系统模块代替所选中是模块组。适当调整系统模型,如图6-40所示。图6-40带有子系统的模型查看如图6-40所示的Subsystem子系统最简洁的办法就是双击模块,就能看到子系统模块的内部结构图,如图6-41所示。图6-41子系统模块内部结构图【例6-5】封装在例6-4中构建的子系统模块。创建子系统,与例6-4相同,最终构建如图6-42所示的模型。图6-42子系统封装模型设置子系统中模块参数变量。这一步主要是将子系统模块中需要设定的参数在子系统模块内部变量化。本例中,需要对子系统中Gain和Constant模块中的参数Gain和ConstantValue进行变量化赋值,假设Gain设定为变量k,ConstantValue为b,设定后子系统内部模型如图6-43所示。图6-43子系统中模块参数变量化选择子系统模块Subsystem,选择(在子系统模块上)右键→Mask→CreateMask菜单命令打开封装编辑器,如图6-44所示。图6-44子系统封装编辑器设置参数标签页(Parameters),该设置主要是为了让子系统模块能够像其他Simulink模块一样,具有参数设置对话框,可以设置自己的参数。选择Parameters&Dialog选项卡。在Dialogbox栏中选择项目。在Controls栏中单击图标。Edit类型表示封装后子系统参数设置界面中Slope的变量值通过文本框输入。在Diaglogbox或Propertyedito栏中的Prompt栏中写入“斜率(Slope)”。在Propertyeditor的Name栏中写入变量名k;勾选Evaluate栏,表示输入量是“数值类”的数值或者结果为数值的表达式。按照前述的方法,设置子系统所需的参数“截距(Intercept)”。设置结果如图6-45所示。图6-45参数标签页设置设置图标页(Icon)。选择Icon&Ports选项卡。在Icondrawingcommands栏中写入如图6-46所示的绘制指令。设置Icontransparency选项为Opaque(不透明)设置。图6-46图标标签页设置设置文档标签页Documentation。选择Documentation选项卡。在Type栏中输入“斜截式直线方程模块”。在Description栏中输入“斜截式直线方程模块,斜率(Slope)和截距(Intercept)是该模块的参数”。在Help栏中输入“变量k表示斜率,变量b表示截距”,设置界面如图6-47所示。图6-47文档标签页设置界面运行仿真,查看封装结果。以上基本完成了对子系统的封装,在单击封装编辑器OK按钮后,将看到如图6-48所示的模型图。图6-48封装后的子系统模型图双击封装子系统Subsystem,可以弹出如图6-49的封装子系统参数设置对话框。图6-49封装后子系统的参数设置对话框改变封装子系统参数设置对话框中参数斜率Slope和截距Intercept的值,设置Slope为3,Intercept为4,相当于赋值操作,令k=3、b=4,将所赋值传递给子系统内的模块。此时整个模型实现等式:y=3x+4的计算。在Display中可以实时看到输出值的变化。重新运行仿真后,模型的输出变化如图6-50所示。图6-50参数调整后的输出变化【例6-6】利用S-函数实现斜截式直线方程模块。构建模型。构建如图6-56所示的模型。图6-56S-函数使用演示模型打开标准模板文件sfuntmpl。打开模板文件,有三种方式可以打开:在MATLAB命令窗口中输入:>>opensfuntmpl.m在MATLAB命令窗口中输入:>>editsfuntmpl在Simulink库浏览器中,双击User-definedFunction\S-FunctionExamples\MATLABfileS-functions\Leveal-1MATLABfileS-functions\Leveal-1MATLABfiletemplate模块。修改模板文件,完成S-函数源代码编写。修改后的完整代码如下,所需修改的代码处已经标注出。function[sys,x0,str,ts]=Sfun_line(t,x,u,flag,k,b)%在主函数中修改函数名称,输入S-函数模块需要设置的参数k和b。switchflag,case0,[sys,x0,str,ts]=mdlInitializeSizes;case1,sys=mdlDerivatives(t,x,u);case2,sys=mdlUpdate(t,x,u);case3,sys=mdlOutputs(t,x,u,k,b);case4,sys=mdlGetTimeOfNextVarHit(t,x,u);case9,sys=mdlTerminate(t,x,u);otherwiseerror(['Unhandledflag=',num2str(flag)]);end%=================================================================function[sys,x0,str,ts]=mdlInitializeSizes%初始化:在mdlInitializeSizes中,确定输入和输出数目。%对于带有至少一个输出和输入的简单系统,它总是直接反馈的。sizes=simsizes;sizes.NumContStates=0;sizes.NumDiscStates=0;sizes.NumOutputs=1;sizes.NumInputs=1;sizes.DirFeedthrough=1;sizes.NumSampleTimes=1;%atleastonesampletimeisneededsys=simsizes(sizes);x0=[];str=[];ts=[00];%=================================================================functionsys=mdlDerivatives(t,x,u)sys=[];%=================================================================functionsys=mdlUpdate(t,x,u)sys=[];%=================================================================%在mdlOutputs函数中,编写输出方程,并通过变量sys返回。functionsys=mdlOutputs(t,x,u,k,b)sys=[k*u+b];%=================================================================functionsys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=1;sys=t+sampleTime;%=================================================================functionsys=mdlTerminate(t,x,u)sys=[];双击S-Function模块,打开模块参数设置对话框设置如图6-57所示。图6-57设置模型参数对话框封装S-函数模块,这里的封装步骤和例6-5的步骤完全相同,请读者参照例6-5,封装后的导入模型如图6-58所示。图6-58封装后的S-函数模块设置S-Function模块参数对话框,并进行仿真,这里的步骤与例6-5的步骤完全相同,在这里不再重复。【例6-7】创建S-函数描述该连续系统。假设线性连续系统的状态方程为其中,,,,创建S-函数描述该系统。打开sfuntmpl模板,该系统可通过在sfuntmpl模板编写如下源代码实现:function[sys,x0,str,ts]=sfun_c(t,x,u,flag)%定义连续系统的S-函数sfun_c。生成连续系统状态。A=[-0.09-0.01;10];B=[1-7;0-2];C=[02;1-5];D=[-30;10];switchflag,%初始化状态case0,[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D);%计算连续状态变量case1,sys=mdlDerivatives(t,x,u,A,B,C,D);%由于含有状态导数,故mdlDerivatives函数调用需要修改case2,sys=mdlUpdate(t,x,u);%计算系统输出case3,sys=mdlOutputs(t,x,u,A,B,C,D);case4,sys=mdlGetTimeOfNextVarHit(t,x,u);case9,sys=mdlTerminate(t,x,u);%处理错误otherwiseerror(['Unhandledflag=',num2str(flag)]);end%=================================================================function[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D);sizes=simsizes;sizes.NumContStates=2;sizes.NumDiscStates=0;sizes.NumOutputs=2;sizes.NumInputs=2;sizes.DirFeedthrough=1;sizes.NumSampleTimes=1;%atleastonesampletimeisneededsys=simsizes(sizes);x0=zeros(2,1);str=[];ts=[00];%=================================================================functionsys=mdlDerivatives(t,x,u,A,B,C,D)%状态方程含有状态的导数,故需要编写mdlDerivatives子函数,%将状态的导数通过sys变量返回sys=A*x+B*u;%=================================================================functionsys=mdlUpdate(t,x,u)sys=[];%=================================================================functionsys=mdlOutputs(t,x,u,A,B,C,D)sys=C*x+D*u;%=================================================================functionsys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=1;sys=t+sampleTime;%=================================================================functionsys=mdlTerminate(t,x,u)sys=[];%结束仿真保存该M文件S-函数文件名为sfun_c.m。【例6-8】创建S-函数描述该离散系统。假设离散系统的状态方程为:其中,,,,。打开sfuntmpl模板,该系统可通过在sfuntmpl模板编写如下源代码实现:function[sys,x0,str,ts]=sfun_d(t,x,u,flag)%定义离散系统的S-函数sfun_d。生成离散系统状态。A=[-1.3-0.5;-1.00];B=[-2.50;04.3];C=[02.1;17.8];D=[-0.8-2.9;1.20];switchflag,%初始化状态case0,[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D);case1,sys=mdlDerivatives(t,x,u,A,B,C,D);%更新离散状态case2,sys=mdlUpdate(t,x,u);%计算系统输出case3,sys=mdlOutputs(t,x,u,A,B,C,D);case4,sys=mdlGetTimeOfNextVarHit(t,x,u);case9,sys=mdlTerminate(t,x,u);%处理错误otherwiseerror(['Unhandledflag=',num2str(flag)]);end%=================================================================function[sys,x0,str,ts]=mdlInitializeSizes(A,B,C,D);sizes=simsizes;sizes.NumContStates=0;sizes.NumDiscStates=size(A,1);sizes.NumOutputs=size(D,1);sizes.NumInputs=size(D,1);sizes.DirFeedthrough=1;sizes.NumSampleTimes=1;%atleastonesampletimeisneededsys=simsizes(sizes);x0=zeros(sizes.NumDiscStates,1);str=[];ts=[10];%=================================================================functionsys=mdlDerivatives(t,x,u)sys=[];%=================================================================%更新离散状态子函数functionsys=mdlUpdate(t,x,u,A,B,C,D)sys=A*x+B*u;%=================================================================%计算输出子函数functionsys=mdlOutputs(t,x,u,A,B,C,D)sys=C*x+D*u;%=================================================================functionsys=mdlGetTimeOfNextVarHit(t,x,u)sampleTime=1;sys=t+sampleTime;%=================================================================functionsys=mdlTerminate(t,x,u)sys=[];%结束仿真保存该M文件S-函数文件名为sfun_d.m。【例6-9】创建一个Simulink模型HelloWorld。1.打开Matlab,新建一个Simulink模型,同时将模型另存为HelloWorld.slx。2.打开模块库浏览器。在Sources库中添加2个Constant模块,将其中一个旋转至输出端向上。在MathOperations库中添加1个Sum模块。在Sinks库中添加1个Display模块。3.连接信号线。如图6-69所示。图6-69系统框图4.按下快捷键Ctrl+B对模型进行编译。此时,由于还没有对代码生成进行相关配置,系统会弹出错误提示,要求对代码生成进行相关配置。由于程序仿真为非连续仿真,所以在生成C代码时,Simulink会给出三个提示及对策:需要将仿真解算器(Solver)步长改为固定步长(fixed-step)。把输出目标文件类型改为可变步长目标文件。通过向导完成代码生成的相关设置。如图6-70所示。图6-70错误提示5.点击第一项后的Open按钮,在弹出模型参数设置对话框中,将Solverselection栏中的Type改为fixed-step。如图6-71所示。图6-71设置Solverselection6.为了简化其他代码生成的相关设置,点击错误提示中的第三项后的Open按钮,利用SimulinkCoderQuickStart向导进行配置。如图6-72所示。图6-72SimulinkCoderQuickStart向导7.一直点击Next按钮,采用默认配置即可。配置完成后,点击Finish按钮关闭SimulinkCoderQuickStart向导。如图6-73所示。图6-73SimulinkCoderQuickStart向导配置完成8.回到Simulink模型界面,按下快捷键Ctrl+B进行C代码
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年农贸市场消防设计标准
- 2026年财会学生职业规划书
- 2026年早教中秋节主题活动方案策划书
- 2026年专职安全员安全责任
- 2026年教师职业生涯规划目标与计划书
- 2026年糖尿病人销售方案设计
- 江西省赣州市石城县2025届三年级数学第二学期期末复习检测模拟试题含解析
- 2026年思政课专题教学指南
- 2026年规划停车位方案设计规范标准
- 2026年雨天驾驶员安全告诫书
- 2026年重庆市中考道德与法治真题【含答案解析】
- 2026年辽宁锦州海通实业有限公司计划招录28人备考题库带答案详解
- 2026年院感新标准试题及答案
- 2026内蒙古鄂尔多斯市本级事业单位第二批引进高层次和紧缺人才28人备考题库有答案详解
- 2025~2026学年四川眉山市东坡区外研版(三起)小学四年级期末质量监测英语试卷
- 2026“才聚齐鲁成就未来”山东百特展览工程有限公司校园招聘4人笔试参考题库及答案详解
- 2025年江苏省南通市八年级地生会考考试试题及答案
- 2026年学党史党建知识竞赛题库(附答案)
- 教育改革创新实施路径
- 2026抖音生活服务通案
- 新人教版四年级下册数学期末总复习课件
评论
0/150
提交评论