第3章Simulink基础 3.1Simulink简介 Simulink是美国Mathworks公司推出的MATLAB中的一种可视化仿真工具。Simulink是一个模块图环境,用于多域仿真以及基于模型的设计。它支持系统设计、仿真、自动代码生成以及嵌入式系统的连续测试和验证。 Simulink提供图形编辑器、可自定义的模块库以及求解器,能够进行动态系统建模和仿真。 Simulink与MATLAB集成之后能够在Simulink中将MATLAB算法融入模型,还能将仿真结果导出至MATLAB做进一步分析。Simulink应用领域包括工业自动化、复杂系统建模、复杂系统仿真、信号处理、电力电子、航空航天等方面。 3.1.1Simulink的特点 Simulink具有适应面广、结构和流程清晰及仿真精度高、方法直观、效率高、灵活等优点,基于以上优点,Simulink已被广泛应用于控制理论和数字信号处理的复杂仿真和设计。其特点具体表现在如下几方面。 (1) 适应面广。可构造的系统包括: 线性、非线性系统; 离散、连续及混合系统; 单任务、多任务离散事件系统。 (2) 易于扩充。Simulink具有丰富的可扩充的预定义模块库。 (3) 结构和流程清晰,使用简单。Simulink的模块以图形方式呈现,交互式的图形编辑器来组合和管理直观的模块图,采用分层结构,既适于自上而下的设计流程,又适于自下而上逆程设计。通过Model Explorer导航、创建、配置、搜索模型中的任意信号、参数、属性,生成模型代码。 (4) 可访问MATLAB从而对结果进行分析与可视化,定制建模环境,定义信号参数和测试数据。 (5) 仿真更为精细。它提供的许多模块更接近实际,易于使用者对工程问题更精确的仿真。 (6) 提供API用于与其他仿真程序的连接或与手写代码集成,模型内码更容易向DSP、FPGA等硬件移植。 3.1.2Simulink 的工作环境 Simulink的工作环境由菜单、工具栏、模型浏览器窗口、模型框图窗口以及状态栏组成,如图31所示。 图31Simulink的工作环境窗口 Simulink的模型窗口中的部分常用菜单的使用说明如表31所示。 表31Simulink的模型窗口常用菜单表 菜单名 菜单项 使 用 说 明 File New→Model 创建新模型 Model properties 模型的属性 Preferences Simulink界面的默认设置选项 Print… 打印模型 Close 关闭当前Simulink窗口 Exit MATLAB 退出MATLAB系统 Edit Create subsystem 创建子系统 Mask subsystem… 封装子系统 Look under mask 查看封装子系统的内部结构 Update diagram 更新模型框图的外观 View Go to parent 显示当前系统的父系统 Model browser options 模型浏览器设置 Block data tips options 鼠标指针位于模块上方时显示模块内部数据 Library browser 显示库浏览器 Fit system to view 自动选择最合适的显示比例 Normal 以正常比例显示模型续表 菜单名 菜单项 使 用 说 明 Simulation Start/Stop 启动/停止仿真 Pause/Continue 暂停/继续仿真 Simulation Parameters… 设置仿真参数 Normal 普通Simulink模型 Accelerator 产生加速Simulink模型 Display Text alignment 标注文字对齐工具 Flip name 翻转模块名 Show/Hide name 显示/隐藏模块名 Flip block 翻转模块 Rotate Block 旋转模块 Library link display 显示库链接 Show/Hide drop shadow 显示/隐藏阴影效果 Sample time colors 设置不同的采样时间序列的颜色 Wide nonscalar lines 粗线表示多信号构成的向量信号线 Signal dimensions 注明向量信号线的信号数 Port data types 标明端口数据的类型 Storage class 显示存储类型 Tools Data explorer… 数据浏览器 Simulink debugger… Simulink调试器 Data class designer 用户定义数据类型设计器 Linear Analysis 线性化分析工具 3.1.3Simulink仿真基本步骤 启动Simulink后,就可以进行Simulink 仿真了,其仿真的基本过程如下: (1) 打开一个空白的Simulink模型窗口,根据要仿真的系统框图,在该模型窗口中选择模块,构建仿真模型。 (2) 设置模块参数。 (3) 设置仿真参数。 (4) 启动仿真。 (5) 观测仿真结果,分析结果,修改模型参数直至满足仿真精度要求。 3.2模型的创建 根据要仿真的系统框图,构建系统仿真的模型时,涉及如下概念和常用操作。 3.2.1模型概念和文件操作 Simulink是一种强有力的仿真工具,它能让使用者在图形方式来模拟真实动态系统进行模型的建立。Simulink这种通过图形化的模块进行模型的搭建,使得Simulink的模型具有层次性,通过底层子系统可以构建上层主系统。 Simulink建模具有如下特点: (1) 方便建立动态的系统模型并进行仿真。Simulink是一种图形化的仿真工具,用于对动态系统建模和控制规律的研究制定。由于支持线性、非线性、连续、离散、多变量和混合式系统结构,Simulink几乎可分析任何一种类型的真实动态系统。 (2) 能以直观的方式建模。利用Simulink可视化的建模方式,可迅速地建立动态系统的框图模型。只需在Simulink元件库中选出合适的模块并放置到Simulink建模窗口,通过信号线连接就可以了。Simulink标准库拥有众多可用于构成各种不同种类的动态模型系统。模块包括输入信号源、动力学元件、代数函数和非线性函数、数据显示模块等。Simulink模块可以被设定为触发和使能的,用于模拟大模型系统中存在条件作用的子模型的行为。 (3) 方便地定制模块元件和用户代码。Simulink模块库是可制定的,能够扩展以适应使用者自定义的系统环节模块。用户也可以修改已有模块,重新设定对话框,甚至换用其他形式的弹出菜单和复选框。Simulink允许使用者把自编的C、FORTRAN、Ada代码直接植入Simulink模型中。 (4) 可以快速、准确地进行设计模拟。Simulink优秀的积分算法给非线性系统仿真带来了极高的精度。先进的常微分方程求解器可用于求解刚性和非刚性的系统、具有时间触发或不连续的系统和具有代数环的系统。Simulink的求解器能保证连续系统或离散系统的仿真精度。Simulink还为用户准备一个图形化的调试工具,以辅助用户进行系统开发。 (5) 可以分层次地表达复杂系统。Simulink的分级建模能力使得体积庞大、结构复杂的模型构建也简便易行。根据需要,各种模块可以组织成若干子系统。在此基础上,整个系统可以按照自上向下或自下向上的方式搭建。子模型的层次数量完全取决于所构建的系统,不受软件本身的限制。为方便大型复杂结构系统的操作,Simulink还提供了模型结构浏览的功能。 (6) 实现了交互式的仿真分析。Simulink的示波器可以动画和图像显示数据,运行中可调整模型参数进行Whatif分析,能够在仿真运算进行时,同步监视仿真结果。这种交互式的特征可以帮助使用者快速地评估不同的算法,进行参数优化。由于Simulink完全集成于MATLAB,在Simulink下计算的结果可以方便地保存到MATLAB工作空间中,因而就能为MATLAB所具有的众多工具提供数据。 Simulink文件操作主要涉及新建仿真模型文件和打开仿真模型文件。 新建仿真模型文件的几种操作方法: 在MATLAB的命令窗口选择菜单File→New→Model; 在Simulink模块库浏览器窗口选择菜单File→New→Model,或者单击工具栏的 图标; 在Simulink模型窗口选择菜单File→New→Model,或者单击工具栏的 图标。 打开仿真模型文件的几种操作方法: 在MATLAB的命令窗口输入不加扩展名的文件名,该文件必须在当前搜索路径中; 在MATLAB的命令窗口选择菜单File→Open,或者单击工具栏的 图标打开文件; 在Simulink模块库浏览器窗口选择菜单File→Open,或者单击工具栏的 图标打开.xls文件; 在Simulink模型窗口中选择菜单File→Open,或者单击工具栏的 图标打开文件。 3.2.2模块操作 1. 对象的选定 选定单个对象: 选定对象只要在对象上单击,被选定的对象的四角处都会出现小框用于拖动。 选定多个对象: 如果选定多个对象,可以按下Shift键,然后再单击所需选定的模块; 或者用鼠标拉出矩形虚线框,将所有待选模块框在其中,则矩形框中所有的对象均被选中,如图32所示。 图32选定多个对象 选定所有对象: 如果要选定所有对象,可以选择菜单Edit→Select all命令。 2. 模块的复制 不同模型窗口之间的模块复制: 选定模块,用鼠标将其拖到另一模型窗口,或使用菜单/工具栏的Copy和Paste命令,或使用菜单/工具栏中的Copy和Paste按钮。 在同一模型窗口内的模块复制: 选定模块,按下鼠标右键,拖动模块到合适的地方,释放鼠标; 或按住Ctrl键,再用鼠标将对象拖动到合适的地方,释放鼠标,如图33所示。 图33在同一模型窗口内的模块复制 3. 模块的移动 在同一模型窗口移动模块: 选定需要移动模块,用鼠标将模块拖到合适的地方。当模块移动时,与之相连的连线也随之移动。 在不同模型窗之间移动模块: 在用鼠标移动的同时按下Shift键。 4. 模块的删除 要删除模块,先选定待删除模块,按Delete键; 或用菜单Edit→Clear或Cut命令; 或用工具栏的Cut按钮。 5. 改变模块大小 选定需要改变大小的模块,出现小黑块编辑框后,用鼠标拖动编辑框,可以实现放大或缩小。 6. 模块的翻转 为了系统模型结构美观清晰,常需要对模块进行翻转。 模块翻转180°: 选定模块,选择菜单Format→Flip Block可以将模块旋转180°; 还可以选定模块后,直接用 Ctrl+I快捷键实现翻转。 模块翻转90°: 选定模块,选择菜单Format→Rotate Block可以将模块旋转90°,如果一次翻转不能达到要求,可以多次翻转来实现,如图34所示; 还可以选定模块后,直接用 Ctrl+R快捷键实现翻转。 图34模块的翻转 7. 模块名的编辑 修改模块名: 单击模块下面或旁边的模块名,出现虚线编辑框就可对模块名进行修改。 模块名字体设置: 选定模块,选择菜单Format→Font命令,打开字体对话框设置字体。 模块名的显示和隐藏: 选定模块,选择菜单Format→Hide/Show name命令,可以隐藏或显示模块名。 模块名的翻转: 选定模块,选择菜单Format→Flip name命令,可以翻转模块名。 8. 常用的模块 连续系统模块是构成连续系统的环节,常用的连续系统模块如表32所示。 表32常用的连续系统模块表 名称 模块 使 用 说 明 Integrator 积分环节 Derivative 微分环节 StateSpace 状态方程模型 Transfer Fcn 传递函数模型 ZeroPole 零极点增益模型 Transport Delay 把输入信号按给定的时间做延时 离散系统模块是用来构成离散系统的环节,常用的离散系统模块如表33所示。 表33常用的离散系统模块表 名称 模块 使 用 说 明 Discrete Transfer Fcn 离散传递函数模型 Discrete ZeroPole 离散零极点增益模型 Discrete StateSpace 离散状态方程模型 Discrete Filter 离散滤波器 ZeroOrder Hold 零阶保持器 FirstOrder Hold 一阶保持器 Unit Delay 采样保持,延迟一个周期 3.2.3信号线操作 1. 模块间的连线 先将光标指向一个模块的输出端,待光标变为十字形状后,按下鼠标左键并拖动,直到另一模块的输入端。 2. 信号线的引出 信号线的引出: 将光标指向信号线的分支点,右击,光标变为十字形状,拖动鼠标直到分支线的终点,释放鼠标; 或者按住Ctrl键,同时按下鼠标左键拖动鼠标到分支线的终点,如图35所示。 图35信号线的引出 3. 信号线文本注释 添加文本注释: 双击需要添加文本注释的信号线,则出现一个空的文字填写框,在其中输入文本。 复制文本注释: 单击需要复制的文本注释,按下Ctrl键同时移动文本注释,或者用菜单和工具栏的复制操作。 4. 在信号线中插入模块 如果模块只有一个输入端口和一个输出端口,则该模块可以直接被插入一条信号线中。 3.2.4对模型的注释 添加模型的注释: 在需要做注释区的中心位置双击,就会出现编辑框,在编辑框中就可以输入注释内容。 注释的移动: 在注释内容处单击,当出现文本编辑框后,用鼠标就可以拖动该文本编辑框实现注释的移动。 3.2.5常用的信源 信源模块是用来向模块提供输入信号。常用的信源模块如表34所示。 表34常用的信源模块表 名称 模块 使 用 说 明 Constant 恒值常数 Step 阶跃信号 Ramp 斜坡信号 Sine Wave 正弦信号 Signal Generator 信号发生器 From File 从文件获取数据作为下级模块输入 From Workspace 从当前工作空间定义的矩阵读取数据 Clock 仿真时钟,输出每个仿真步点的时间 In 输入模块 3.2.6常用的信宿 信宿模块是用来接收模块信号的,常用的信宿模块如表35所示。 表35常用的信宿模块表 名称 模块 使 用 说 明 Scope 示波器 Display 实时数值显示 XY Graph XY关系图 To File 将数据保存为文件续表 名称 模块 使 用 说 明 To Workspace 将数据输出到工作空间 Stop Simulation 输入不为零时终止仿真(常与关系模块配合使用) Out 输出模块 3.2.7仿真的配置 在模型窗口选择菜单Simulation→Simulation parameters命令,会打开参数设置对话框,如图36所示。 图36求解器Solver参数设置 需要设置的选项主要是仿真开始和结束的时间,选择解法器,并设定它的参数,选择输出项。 仿真时间: 注意这里的时间概念与真实的时间并不一样,只是计算机仿真中对时间的一种表示,比如10秒的仿真时间,如果采样步长定为0.01,则需要执行1000步; 若把步长减小,则采样点数增加,那么实际的执行时间就会增加。一般仿真开始时间设为0,而结束时间视不同的仿真要求来确定。执行一次仿真要耗费的时间依赖于很多因素,包括模型的复杂程度、解法器及其步长的选择、计算机CUP的速度等等。 仿真步长: 用户在Type后面的第一个下拉选项框中指定仿真的步长选取方式,可供选择的有Variablestep(变步长)和Fixedstep(固定步长)方式。变步长模式可以在仿真的过程中改变步长,提供误差控制和过零检测。固定步长模式在仿真过程中提供固定的步长,不提供误差控制和过零检测。用户还可以在第二个下拉选项框中选择对应模式下仿真所采用的算法。 变步长模式解法器有ode45、ode23、ode113、ode15s、ode23s、ode23t、ode23tb和discrete。默认情况下,具有状态的系统用的是ode45; 没有状态的系统用的是discrete。 ode45采用显式四阶五阶RungeKutta公式来求解微分方程。它是一个单步求解器。也就是说,它在计算输出时,仅仅利用前一步的计算结果。对于绝大多数问题,在第一次仿真时可选择ode45。 ode23采用显式二阶三阶RungeKutta公式来求解微分方程。对于宽误差容限和存在轻微刚性的系统,该解法器比ode45更有效。ode23也是单步求解器。 ode23s是基于一个二阶改进的Rosenbrock公式的解法器。因为它是一个单步求解器,所以对于宽误差容限,可以用它解决。 ode23t是使用“自由”内插式梯形规则来实现的解法器。如果问题是适度刚性的,而且需要没有数字阻尼的结果,可以考虑采用该求解器。 ode23tb是使用TRBDF2来实现的解法器。即基于隐式RungeKutta公式,其第一级是梯形规则步长,第二级是二阶反向微分公式,两级计算使用相同的迭代矩阵,与ode23s相似,适用于宽误差容限。 discrete(变步长)是Simulink在检测到模型中没有连续状态时所选择的一种求解器。 定步长求解可以选择的求解器有ode5、ode4、ode3、ode2、ode1和discrete。 ode5是ode45的一个定步长版本。 ode4是基于四阶RungeKutta公式的求解器。 ode3是ode23求解器的定步长版本。 ode2是采用Heun方法的求解器。 odel是采用Euler方法的求解器。 discrete(定步长)是不执行积分的定步长求解器,它适用于没有状态的模型,以及对过零点检测和误差控制不重要的模型。 选择SimulationParameters对话框的Diagnostics标签可以用来指明在仿真期间遇到一些事件或者条件时希望执行的动作。对于每一事件类型,可以选择是否需要提示消息,是警告消息还是错误消息。警告消息不会终止仿真,而错误消息则会中止仿真的运行。 一致性检查是一个调试工具,用它可以验证Simulink的ODE求解器所做的某些假设,它的主要用途是确保s函数遵循Simulink内建模块所遵循的规则。一致性检查会导致求解速度大幅度下降,所以一般应将它设为关闭状态。使用一致性检查可以验证s函数,并有助于查找导致意外仿真结果的原因。 根据需要选择输出模式(Output options),可以达到不同的输出效果。 可以设置Simulink从工作空间输入数据、初始化状态模块,也可以把仿真的结果、状态模块数据保存到当前工作空间。包括从工作空间装载数据(Load from workspace),保存数据到工作空间(Save to workspace),选中Time栏后,模型将把时间变量以在右边空白栏填写的名称(默认名为tout)存放于工作空间。选中States栏后,模型将把其状态变量以在右边空白栏填写的名称(默认名为xout)存放于工作空间。如果模型窗口中使用输出模块Out,那么必须选中Output栏,并填写在工作空间中的输出数据变量名,默认名为yout。若选中Final state栏则将向工作空间以在右边空白栏填写的名称(默认名为xFinal)存放最终状态值。 3.2.8启动仿真 执行菜单Simulation→Start命令,仿真立即启动,这时Start变为Stop。若要停止仿真,可执行菜单Simulation→Stop命令,仿真运行立即停止。若要使仿真运行暂停,可执行菜单Simulation→Pause命令,这时Pause变为Continue。若要使仿真继续运行,则选择Continue。 3.3子系统与封装 1. 建立子系统 建立如图37(a)所示的控制系统模型,然后将控制系统中的整个被控对象建立为一个子系统。 在模型窗口中,将控制系统中的整个被控对象用鼠标左键拖出的虚线框框住,右击选择Edit→Create subsystem命令,则系统如图37(b)所示。 图37子系统建立 图38Icon参数设置 双击图37(b)中的子系统Subsystem,则会出现封装的被控对象子系统的内部模型窗口,如图37(c)所示。可以看到,子系统模型除了如图37(a)所示虚线框框住的模块,还自动添加了一个输入模块In1和一个输出模块Out1。 2. 子系统的封装 封装子系统的步骤如下: (1) 选中子系统双击打开,给需要进行赋值的参数指定一个变量名。 (2) 选择菜单Edit→Mask subsystem命令,出现封装对话框。 (3) 在封装对话框中的设置参数,主要有Icon、Parameters、Initialization和Documentation 4个选项卡。 Icon选项卡: 用于设定封装模块的名字和外观,如图38所示。 Drawing commands栏: 用来建立用户化的图标,可以在图标中显示文本、图像、图形或传递函数等。在Drawing commands栏中的命令如图38中Examples of drawing commands的下拉列表所示,包括plot、disp、text、port_label、image、patch、color、droots、dploy和fprintf。 Icon options栏: 用于设置封装模块的外观。 Parameters选项卡: 用于输入变量名称和相应的提示,如图39所示。 图39Parameters参数设置 Add 、Delete 、Move up 和Move down 按钮分别用于添加、删除、上移和下移输入变量。 Dialog parameters参数如下所述。 Prompt: 指定输入变量的含义,其内容会显示在输入提示中。 Variable: 指定输入变量的名称。 Type: 给用户提供设计编辑区的选择。Edit提供一个编辑框; Checkbox提供一个复选框; Popup提供一个弹出式菜单。 Evaluate: 用于配合type的不同选项提供不同的变量值,有两个选项Evaluate和Literal,其含义如表36所示。 Tunable: 用于确定参数在仿真时是否可以修改,选中时,在仿真时可以修改。 表36Assignment选项的不同含义 选项 on off Edit 输入的文字是程序执行时所用的变量值 将输入的内容作为字符串 Checkbox 输出1和0 输出为on或off Popup 将选择的序号作为数值,第一项则为1 将选择的内容当作字符串 Options for selected parameter选项如下所述。 Popup: 当type选择Popup时,用于输入下拉菜单项。 Callback: 用于输入回调函数。 Initialization选项卡: 用于初始化封装子系统。 Documentation选项卡: 用于编写与该封装模块对应的Help和说明文字,分别有Mask type、Mask Description和Mask help栏。 Mask type栏: 用于设置模块显示的封装类型。 Mask description栏: 用于输入描述文本。 Mask help栏: 用于输入帮助文本。 3.4Simulink仿真示例 【例31】创建一个在阶跃信号激励下,二阶系统1s2+s+1的响应仿真模型,通过示波器观察输出。 步骤如下: (1) 在MATLAB的命令窗口运行Simulink命令,或单击工具栏中的 图标,就可以打开Simulink模块库浏览器(Simulink Library Browser) 窗口,如图310所示。 图310模块库浏览器 (2) 单击工具栏上的 图标或选择菜单File→New→Model命令,新建一个名为untitled的空白模型窗口。 (3) 在图310的右侧子模块窗口中,单击Source子模块库前的“+”号(或双击Source),或者直接在左侧模块和工具箱栏单击Simulink下的Sources子模块库,便可看到各种输入源模块。 (4) 单击所需要的输入信号源模块Step(阶跃信号),如图311所示,将其拖放到的空白模型窗口untitled,则Step模块就被添加到untitled窗口; 也可以用鼠标选中Step模块,右击,在快捷菜单中选择add to 'untitled'命令,将Step模块添加到untitled窗口。 图311选择阶跃输入信号 (5) 用同样的方法分别打开连续系统模块Continuous,选择其中的Transfer Fcn模块(传递函数模块)拖放到untitled窗口中。接收模块库Sinks,选择其中的Scope模块(示波器)拖放到untitled窗口中。 (6) 在untitled窗口中,用鼠标指向Step右侧的输出端,当光标变为十字形状时,按住鼠标拖向Transfer Fcn的输入端,然后用鼠标指向Transfer Fcn右侧的输出端,按住鼠标拖向Scope模块的输入端,松开鼠标按键,就完成了两个模块间的信号线连接,一个简单模型已经建成。 (7) 双击Transfer Fcn模块,按指定的二阶系统传递函数1s2+s+1,根据分子和分母多项式的系数输入模型,如图312所示。 图312传递函数模型参数设置 (8) 最终生成的仿真模型如图313所示。然后就可以进行仿真了,单击untitled模型窗口中开始仿真图标 ,或者选择菜单Simulink→Start命令,则仿真开始。双击Scope模块,出现示波器显示屏,可以看到黄色的二阶系统的响应曲线如图314所示。 图313二阶系统的仿真模型 图314二阶系统的响应曲线 (9) 保存模型,单击工具栏的 图标,可将该模型保存为ch3_lt01.mdl或ch3_lt01.slx文件,其中后缀为.mdl的文件可兼容低版本MATLAB。 习题 1. 建立被控对象为3s+9s3+3s+1单位负反馈的PI控制系统,并采用阶跃信号作为输入,示波器观察输出。 2. 构建如图315所示系统,并保存。 图315习题2系统模型 3. 试采用MATLAB函数得到习题2的传递函数。