MATLABSimulink基础.docx
《MATLABSimulink基础.docx》由会员分享,可在线阅读,更多相关《MATLABSimulink基础.docx(29页珍藏版)》请在冰豆网上搜索。
![MATLABSimulink基础.docx](https://file1.bdocx.com/fileroot1/2023-1/31/2779d82f-3852-47d8-9479-c84cf31aa1b2/2779d82f-3852-47d8-9479-c84cf31aa1b21.gif)
MATLABSimulink基础
ROBOTVISION–Matlab–Simulink基础
§1Simulink简介
Simulink是一个用来对动态系统进行建模、仿真和分析的软件包,它支持连续、离散及两者混合的线性和非线性系统,也支持具有多种采样频率的系统。
在Simulink环境中,利用鼠标就可以在模型窗口中直观地“画”出系统模型,然后直接进行仿真。
它为用户提供了方框图进行建模的图形接口,采用这种结构画模型就像你用手和纸来画一样容易。
它与传统的仿真软件包微分方程和差分方程建模相比,具有更直观、方便、灵活的优点。
Simulink包含有Sinks(输出方式)、Source(输入源)、Linear(线性环节)、Nonlinear(非线性环节)、Connections(连接与接口)和Extra(其他环节)等子模型库,而且每个子模型库中包含有相应的功能模块,用户也可以定制和创建自己的模块。
用Simulink创建的模型可以具有递阶结构,因此用户可以采用从上到下或从下到上的结构创建模型。
用户可以从最高级开始观看模型,然后用鼠标双击其中的子系统模块,来查看其下一级的内容,以此类推,从而可以看到整个模型的细节,帮助用户理解模型的结构和各模块之间的相互关系。
在定义完一个模型后,用户可以通过Simulink的菜单或MATLAB的命令窗口键入命令来对它进行仿真。
菜单方式对于交互工作非常方便,而命令行方式对于运行一大类仿真非常有用。
采用Scope模块和其他的画图模块,在仿真进行的同时,就可观看到仿真结果。
除此之外,用户还可以在改变参数后迅速观看系统中发生的变化情况。
仿真的结果还可以存放到MATLAB的工作空间里做事后处理。
模型分析工具包括线性化和平衡点分析工具、MATLAB的许多基本工具箱及MATLAB的应用工具箱。
由于MATLAB和Simulink是集成在一起的,因此用户可以在这两种环境下对自己的模型进行仿真、分析和修改。
Simulink具有非常高的开放性,提倡将模型通过框图表示出来,或者将已有的模型添加组合到一起,或者将自己创建的模块添加到模型当中。
Simulink具有较高的交互性,允许随意修改模块参数,并且可以直接无缝地使用MATLAB的所有分析工具。
对最后得到的结果可进行分析,并能够将结果可视化显示。
Simulink非常实用,应用领域很广,可使用的领域包括航空航天、电子、力学、数学、通信、影视和控制等。
世界各地的工程师都在利用它来对实际问题进行建模、分析和解决。
§2Simulink的基本操作
2.1Simulink的运行
运行Simulink有三种方式:
♦在MATLAB的命令窗口直接键入“Simulink”并回车;
♦单击MATLAB工具条上的Simulink图标;
♦在MATLAB菜单上选File→New→Model。
运行后会显示图2.1所示的Simulink模块库浏览器,单击工具条左边建立新模型的快捷方式,则显示如图2.2所示的新建模型窗口,在模型窗口中用户便可通过选择模块库中的仿真模块,建立自己的仿真模型,并进行动态仿真。
图2.1Simulink模块库浏览器
图2.2新建模型窗口
2.2常用的标准模块
附录C以表格的形式给出Simulink几个基本模块库中的模块功能简介,表格中的模块名和模块库中的模块图标下的名称一致。
打开模块库(图标)窗口的方法非常简单,以连续系统模块库(continuous)为例,在Simulink模块库浏览窗口中选中Simulink,然后单击Simulink旁边的小加号或者双击鼠标左键,这时就会出现如图2.3所示Simulink基本库窗口,并选择Continuous模块库的图标双击即可进入如图2.4所示的连续系统模块库,可选择相应的模块图标拖至编辑窗口即可。
图2.3Simulink模型库窗口
图2.4continuous模块库
2.3模块的操作
图2.5选取模块
1、模块的选取
当选取单个模块时,只要用鼠标在模块上单击即可,此时模块的角上出现黑色小方块。
选取多个模块时,选取拖拽鼠标的方式把要选择的模块全部包围即可,若所有被选取的模块都出现小黑方块,则表示模块被选中,如图2.5所示。
2、模块的复制、剪切、删除、移动
应用【Edit】│【copy】/【cut】/【paste】/【clear】可对选取的模块进行复制,剪切,粘贴,删除等操作,如果要在同一窗口移动模块,则在模块选中的基础上,用鼠标进行拖拽并放在合适的位置。
3、模块的连接
(1)连接两个模块:
从一个模块的输出端连到另一个模块的输入端。
如果两个模块不在同一水平线上,连线是折线,若用斜线表示则需在连接时按住【Shift】。
(2)在连线之间插入:
把模块用鼠标拖到连线上,然后释放鼠标即可。
(3)连线的分支:
当我们需要把一个信号输送给不同的模块时,连线要采用分支结构,其操作步骤是:
先连好一条线,把鼠标移到支线的起点,并按下【Ctrl】,再将鼠标拖至目标模块的输入端即可。
4、模块参数的设置
Simulink中几乎所有模块的参数(Parameters)都允许用户进行设置,只要双击要设置的模块或在模块上按鼠标右键并在弹出的菜单中选择【BlockParameters】就会显示参数设置对话框。
例2.1已知单位负反馈二阶系统的开环传递函数为
试绘制单位阶跃响应的Simulink结构图。
解:
1、利用Simulink的Library窗口中的【File】|【New】,打开一个新的工作空间;
2、分别从信号源库(Sourse)、输出方式库(Sink)、数学运算库(Math)、连续系统库(Continuous)中,用鼠标把阶跃信号发生器(Step)、示波器(Scope)、传递函数(TransferFcn)、相加器(Sum)四个标准功能模块选中,并将其拖至工作平台;
3、按要求先将前向通道连接好,然后把相加器(Sum)的另一个端口与传递函数和示波器间的线段相连,形成闭环反馈;
4、双击阶跃信号发生器,打开其属性设置对话框,并将其设置为单位阶跃信号,如图2.6所示,同理,将相加器设置为“+-”,使传递函数的Numerator设置为“[10]”,Denominator设置为“[14.470]”;
图2.6模块参数设置对话框
5、绘制成功后,如图2.7所示,并命名后存盘。
图2.7二阶系统Simulink结构图
5、模块外形的调整
(1)改变模块的大小:
选定模块,用鼠标点住其周围的四个黑方块中的任意一个拖动,这时会出现一个虚线的矩形表示新模块的位置,到需要的位置后释放鼠标即可。
(2)调整模块的方向:
选定模块,选择菜单【Formt】|【RotateBlock】使模块旋转90°,【FlipBlock】使模块旋转180°。
(3)给模块加阴影:
选定模块,选择菜单【Formt】|【ShowDropShadow】使模块产生阴影效果。
6、模块名的处理
(1)模块名的显示与消隐:
选定模块,选择菜单【Format】|【FilpName】使模块名被隐藏,同时【ShowName】会使隐藏的模块名显示出来。
(2)修改模块名:
用鼠标左键单击模块名的区域,使光标处于编辑状态,此时便可对模块名进行任意的修改。
同时选定模块,选择菜单【Format】|【Font】可弹出字体对话框,用户可对模块名和模块图标中的字体进行设置。
例2.2将图2.7所示的结构图进行模块处理。
解:
1.对模块名进行修改,如单击传递函数模块标题“TransferFcn”,将其原字符删除,并输入汉字“传递函数”,同理将其他模块也改为汉字标题;
2.将相加器的标题移至其顶部;
3.选中“传递函数”模块,并选择菜单【Formt】|【ShowDropShadow】并将其设置为阴影;
4.将模块全部选中,选择菜单【Format】|【Font】通过字体对话框将所有字体设置为“宋体”,如图2.8所示。
图2.8二阶系统模型
§3系统仿真及参数设置
在Simulink中建立起系统模型框图后,运行菜单【Simulation】|【Start】就可以用Simulink对模型进行动态仿真。
一般在仿真运行前需要对仿真参数进行设置,运行菜单【Simulation】|【Parameters】完成设置,如图3.1所示。
图3.1仿真参数设置对话框
3.1算法设置
在Solver里需要设置仿真起始和终止时间、选择合适的解法(Solver)并指定参数、设置一些输出选择。
1设置起始时间和终止时间(Simulationtime)
【Simulation】|【Starttime】设置起始时间,而【Stoptime】设置终止时间,单位为“秒”。
2算法设置(Solveroption)
(1)算法类型设置
仿真的主要过程一般是求解常微分方程组,【Solveroption】|【Type】用来选择仿真算法的类型是变化的还是固定的。
变步长解法可以在仿真过程中根据要求调整运算步长,在采用变步长解法时,应该先指定一个容许误差限(【Relativetolerance】或【Absolutetolerance】),使得当误差超过误差限时自动修正仿真步长,【Maxstepsize】用于设置最大步长,在缺省情况下为“auto”,并按下式计算最大步长:
最大步长=(终止时间-起始时间)/50。
(2)仿真算法设置
离散模型:
对变步长和定步长解法均采用discrete(nocontinuousstate)。
连续模型:
可采用变步长和定步长解法。
变步长解法有:
ode45、ode23、ode113、ode15s、ode23s、ode23t,ode23st
ode45:
四阶/五阶Runge-Kutta算法,属单步解法;
ode23:
二阶/三阶Runge-Kutta算法,属单步解法;
ode113:
可变阶次的Adams-Bashforth-MoultonPECE算法,属于多步解法;
ode15s:
可变阶次的数值微分公式算法,属于多步解法;
ode23s:
基于修正的Rosenbrock公式,属单步解法。
定步长解法有:
ode4、ode5、ode3、ode2、ode1
ode5:
定步长的ode45解法;
ode4:
四阶Runge-Kutta算法;
ode3:
定步长ode23算法;
ode2:
Henu方法,即改进的欧拉法。
ode1:
欧拉法。
3设置输出选项
图3.2二阶系统的仿真曲线
对同样的信号,选择不同的输出选项,则得到输出设备上的信号是不完全一样的。
要根据需要选择合适的输出选项以达到满意的输出效果。
对于例2.2,首先运行菜单【Simulation】|【Parameters】,进行系统的仿真参数设置,如仿真时间为2秒,仿真算法选择定步长的四阶龙格—库塔法,然后运行菜单【Simulation】|【Start】进行系统仿真,最后双击示波器,得到系统的仿真曲线如图3.2所示。
3.2工作空间设置
工作空间设置(WorkspaceI/O)窗口如图3.3所示,可以设置Simulink和当前工作空间的数据输入、输出。
通过设置,可以从工作空间输入数据、初始化状态模块,也可以把仿真结果、状态变量、时间数据保存到当前工作空间。
图3.3设置WorkspaceI/O窗口
1、从工作空间读入数据(Loadfromworkspace)
Simulink通过设置模型的输入端口,实现在仿真过程中从工作空间读入数据,常用的输入端口模块为信号与系统模块库(Signals&Systems)中的In1模块,其参数设置如图3.4所示。
图3.4输入参数设置对话框
设置的方法是选中Input前的复选框,并在后面的编辑框键入输入数据的变量名,并可以用命令窗口或M文件编辑器输入数据。
Simulink根据输入端口参数中设置的采样时间读取输入数据。
2、保存数据到工作空间(Savetoworkspace)
可以选择保存的选项有:
时间、端口输出、状态、最终状态。
选中选项前面的复选框并在选项后面的编辑框输入变量名,就会把相应数据保存到指定的变量中。
常用的输出模块为信号与系统模块库(Signals&Systems)中的Out1模块和输出方式库(Sink)中的ToWorkspace模块。
3、初始化状态模块
状态模块初始化的方法有两种:
使用模块本身的参数设置和从工作空间读入。
用于初始化的变量中的元素个数要和状态模块数目一致,而且当从工作空间载入数据时,模块本身的参数设置初始值无效。
§4Simulink模块库
4.1信号源模块库
图4.1Sources模块库
信号源模块库(Sources)见图4.1,主要包括如下模块:
♦输入端口模块(In1):
用来反映整个系统的输入端子。
♦常数模块(Constant):
可以产生一个常数值,一般用做给定输入。
♦信号发生器(SignalGenerator):
可以产生正弦波、方波、锯齿波、随机信号等波形信号,用户可以自由地调整信号的幅值及相位。
♦时钟(Clock):
生成当前仿真时钟,以秒为单位,在记录数据序列或与时间相关的指标中需要此模块。
♦读文件模块(FromFile)和读工作空间模块(FromWorkspace):
允许从文件或MATLAB工作空间中读取信号作为输入信号。
♦阶跃信号模块(Step):
生成一个按给定的时间开始的阶跃信号,信号的初始值和终值均可自由设定。
常用来仿真系统的阶跃响应,也可用来仿真定时的开关动作。
♦其他类型的信号输入模块:
带宽限幅白噪声(Band-LimitedWhiteNoise),斜坡输入(Ramp),脉冲信号(PulseGenerator),正弦信号(SineWave)等。
4.2连续系统模块库
连续系统模块库(Continuous)见图4.2,主要包括如下模块:
图4.2Continuous模块库
♦积分器(Integrator):
对输入(向量或标量)进行积分,用户可以设定初始条件。
♦微分器(Derivative):
将输入端的信号经过一阶数值微分,在输出端输出,在实际应用中应该尽量避免使用该模块。
♦传递函数(TransferFcn):
使用分子、分母多项式的形式给出系统的传递函数模型,分母的阶次必须大于或等于分子的阶次。
♦状态空间(State-Space):
使用A、B、C、D矩阵形式表示系统的状态空间模型,并可以给出初值。
♦零极点(Zero-Pole):
用指定的零、极点建立连续系统模型。
♦时间延迟(TransportDelay):
将输入信号延迟指定的时间后,再传输给输出信号,用户可自行设置延迟时间。
4.3离散系统模块库
离散系统模块库(Discrete)见图4.3,主要包括如下模块:
♦零阶保持器(Zero-OrderHold):
在一个计算步长内将输出的值保持在同一个值上。
♦一阶保持器(First-OrderHold):
依照一阶插值的方法计算一个步长后的输出值。
♦离散传递函数(DiscreteTransferFcn):
与连续传递函数结构相同,可设置采样时间。
♦离散状态空间(DiscreteState-Space):
与连续状态空间结构相同,可设置采样时间。
♦离散积分器(Discrete-TimeIntegrator):
实现离散的欧拉积分,可以设置初值和采样时间。
♦离散滤波器(DiscreteFilter):
实现IIR和FIR滤波器。
图4.3Discrete模块库
4.4数学运算模块库
图4.4MathOperations模块库
数学运算模块库(MathOperations)见图4.4,主要包括如下模块:
♦增益(Gain):
输出为输入与增益的乘积。
♦加法模块(Sum):
对输入进行求代数和,在组建反馈控制系统方框图时必须采用此模块,反馈的极性(+或-)可自行设置。
♦数字逻辑模块:
逻辑运算模块(LogicalOperator),组合逻辑模块(CombinatorialLogic)和位逻辑运算模块(BitwiseLogicalOperator),可以用这些模块很容易地组建数字逻辑电路。
♦数学函数模块:
绝对值函数(Abs),三角函数(Trigonometric),数学运算函数(MathFunction),复数的实部、虚部提取函数(ComplextoReal-Imag),取整函数(RoundingFunction)等。
4.5输出模块库
输出模块库(Sinks)见图4.5,主要包括如下模块:
♦输出端口模块(Out1):
表示整个系统的输出端,系统直接仿真时该输出将自动在MATLAB工作空间中生成变量。
♦示波器(Scope):
显示数据随时间变化的过程和结果。
♦x-y示波器(XYGraph):
将两路输入信号分别作为示波器的两个坐标轴,并将信号的轨迹显示出来。
♦写文件模块(ToFile)和工作空间写入模块(ToWorkspace):
将输出信号写到文件或工作空间中。
♦数字显示模块(Display):
将输出信号以数字的形式显示出来。
♦仿真终止模块(StopSimulation):
强行终止正在进行的仿真过程。
图4.5Sinks模块库
4.6非线性系统模块库
非线性系统模块库(Discontinuities)见图4.6,主要包括如下模块:
♦黏性摩擦(Coulomb&ViscousFriction):
在原点不连续,在原点外具有线性增益。
♦滞环非线性模块(Backlash):
该模块具有滞环非线性特性。
♦死区非线性模块(DeadZone):
该模块具有死区非线性特性。
♦饱和非线性模块(Saturation):
该模块具有饱和非线性特性。
图4.6Discontinuities模块库
§5Simulink子系统
5.1Simulink子系统简介
Simulink提供的子系统功能可以大大地增强Simulink系统框图的可读性,可以不必了解系统中每个模块的功能就能够了解整个系统的框架。
子系统可以理解为一种“容器”,我们可以将一组相关的模块封装到子系统模块中,并且等效于原系统模块群的功能,而对其中的模块我们可以暂时不去了解。
组合后的子系统可以进行类似模块的设置,在模型的仿真过程中可作为一个模块。
建立子系统有以下两种方法:
1、在已有的系统模型中建立子系统
设已有Simulink模型图如图5.1所示,选择需要封装的模块区域(用Shift键和鼠标左键配合可以达到同样的目的),框选如图5.2所示区域,然后右击,弹出浮动菜单,选择【CreatSubsystem】,如图5.3所示。
创建子系统的结果如图5.4所示。
然后双击Subsystem模块,弹出子模块如图5.5所示。
图5.1简单的Simulink模型
图5.2框选需要封装的模块图5.3快捷菜单
图5.4创建子系统后的模型图5.5子系统模型图
子系统的功能就是把相关模块集中起来,并没有删除。
系统的结构仍然没有改变。
2、在已有的系统模型中新建子系统
简单建立模型如图5.6所示,双击Subsystem模块,在弹出的窗口中建立如图5.7所示模型。
图5.6含有子系统的模型图5.7子系统模型结构
这两种创建子系统最后实现的是一模一样的功能,只不过操作顺序不同。
前者是先将这个结构搭建起来,然后将相关的模块封装起来;后者则是先做一个封装容器,然后在封装容器中添加模块。
对于一个相对简单的模型我们采用第一种,这种操作一般不会出错,能够顺利搭建模型。
而对于非常复杂的系统,我们事先将模型分成若干个子系统,然后再采用第二种方法进行建模。
在使用Simulink子系统建立模型时,有如下几个常用的操作:
1.子系统命名:
命名方法与模块命名方法类似,是用有代表意义的文字来对子系统进行命名,有利于增强模块的可读性。
2.子系统编辑:
用鼠标双击子系统模块图标,打开子系统并对其进行编辑。
3.子系统的输入:
使用Souces模块库中的Input输入模块,即In1模块,作为子系统的输入端口。
4.子系统的输出:
使用Sinks模块库中的Output输出模块,即Out1模块,作为子系统的输出端口。
5.2Simulink高级子系统应用
子系统的最基本目的就是将一组相关的模块包含到一个模块库中,用以简化系统,使得系统的分析更加容易。
例如在一个控制系统中,受控系统就可以视为一个子系统,控制器也可以作为一个子系统。
从前面的介绍可以发现。
这些子系统就如其他一般模块一样,都是具有特定输入输出的模块。
对于子系统输入的信号,会产生一个特定的输出信号。
但是对于某些特殊的情况,并不是对所有的输入信号都要产生输出信号,只有在某些特定的条件下才会产生输出信号,这就需要输入一个控制信号,控制信号由子系统模块的特定端口输入,这样的子系统称为条件执行子系统。
在条件子系统中,输入信号取决于输入信号和控制信号。
根据不同的控制信号,可将条件执行子系统分为如下几类:
1.触发子系统:
在控制信号满足某种变化要求的瞬间可以触发(激活)子系统,然后保持子系统的输出状态,等待下一个触发信号,它允许用户自己设置在控制信号的上升沿、下降沿或控制信号变化时触发子系统。
具体有以下形式:
(1)控制信号上升沿触发:
子系统在控制信号上升的时候执行。
(2)控制信号下降沿触发:
子系统在控制信号下降的时候执行。
(3)控制信号的双边沿触发:
子系统在控制信号符号发生变化时就执行。
2.使能子系统:
控制信号分成“允许”和“禁止”两种,在允许信号控制下,可以执行子系统中的模块,否则将禁止其功能。
为保证整个系统的连贯性,在禁止状态下子系统仍然有输出信号,用户可以选择继续保持禁止前的信号,或复位子系统,强制使其输出零信号。
3.使能触发子系统:
在使能状态下被触发时将激活该子系统,否则将禁止子系统。
5.3封装子系统
在这里要分清楚封装子系统和建立子系统是两个不同的概念,分别介绍如下:
建立子系统是将一组完成相关功能的模块包含到一个子系统当中,用一个模块来表示,主要是为了简化Simulink模型,增强Simulink模型的可读性,便于我们仿真和分析。
在仿真前,需要打开子系统模型窗口,对其中的每个模块分别进行参数设置。
虽然增加了Simulink模型的可读性,但并没有简化模型的参数设置。
当模型中用到多个这样的子系统,但是每个子系统中模块的参数设置都不相同时,这就显得很不方便。
而且容易出错。
为了解决简单建立子系统的不足,我们可以对子系统进行封装。
将完成特定功能的相关模块集合到一起,对其中经常要设置的参数设置为变量,然后封装,使得其中变量可以在封装系统的参数设置对话框中统一进行设置,这就大大简化了参数的设置,而且不容易出错,这非常有利于进行复杂的大系统仿真。
封装后的子系统可以作为用户的自定义模块,作为普通模块一样添加到Simulin