第3章 Simulink入门

Simulink是用于动态系统和嵌入式系统的多领域仿真工具和基于模型的设计工具。对各种时变系统,包括通信、控制、信号处理、视频和图像处理系统等,Simulink都提供了交互式图形化环境和可定制模块库来对其进行设计、仿真、执行和测试。

Simulink提供了一个建立系统仿真模型的图形用户界面,只需单击和拖动鼠标即可实现静态和动态系统以及多速率系统的建模和仿真。构架在Simulink基础之上的其他产品扩展了Simulink多领域建模功能,也提供了用于设计、执行、验证和确认任务的相应工具。
Simulink集成于MATLAB中,能够将MATLAB算法引入仿真模型,也能将仿真结果导出到MATLAB中,以便做进一步分析处理。Simulink可以直接访问MATLAB大量的工具,以便进行算法研发和仿真分析、数据的可视化、批处理脚本的创建、建模环境的定制以及信号参数和测试数据的定义等。
3.1Simulink的工作环境


 微课视频

Simulink的工作环境包括Simulink编辑器(Editor)和库浏览器(Library Browser)。其中,库浏览器提供搭建仿真模型所需的各种模块(Block); 编辑器用于添加和连接模块以搭建仿真模型。
3.1.1Simulink编辑器
打开Simulink编辑器的方式有如下几种: 
(1) 在MATLAB主窗口中,单击“主页”标签下的Simulink按钮。
(2) 在MATLAB主窗口中,依次单击“主页”标签下的“新建”和Simulink Model菜单命令。
(3) 在命令行窗口输入“simulink”。
(4) 在当前文件夹窗口右击,在弹出的快捷菜单中依次单击“新建”和“模型”菜单命令,在当前文件夹中新建一个模型文件。然后,双击该模型文件,即可启动Simulink编辑器,同时打开该模型文件。
在上述方法中,前面3种方法都将首先打开如图31所示的Simulink开始页面(Simulink Start Page)。单击该页面New选项卡中的相应按钮,可以选择创建一个空的模型(Blank Model)和空的子系统(Blank Subsystem)等。此外,在该页面的Examples选项卡中,还提供了大量的仿真模型示例。






图31Simulink开始页面


在New选项卡中单击某个按钮,将打开Simulink编辑器,如图32所示。与MATLAB主窗口类似,Simulink编辑器窗口顶部有若干标签,每个标签对应不同的选项卡工具栏,工具栏中的各工具按钮根据功能分别放在不同的按钮组中。


图32Simulink编辑器窗口


刚启动Simulink时,编辑器窗口顶部有5个标签,从左往右依次为SIMULATION(仿真)、DEBUG(调试)、MODELING(建模)、FORMAT(格式)和APPS(应用程序)。在编辑区的模型中单击选中某模块,还将在最右侧出现BLOCK(模块)标签。

单击不同的标签,将在下方显示对应的选项卡按钮组工具栏。例如,SIMULATION选项卡中的按钮组工具栏如图33所示,
根据功能将所有的按钮从左往右依次放在FILE(文件)、LIBRARY(库)、PREPARE(预设)、SIMULATE(仿真)和REVIEW RESULTS(结果查看)按钮组中。


图33SIMULINK选项卡中的工具栏



最左边的FILE按钮组包括New(新建)、Open(打开)、Save(保存)和Print(打印)等按钮。每个按钮旁边都有一个下三角形,单击可以弹出下拉列表框,以进一步选择功能。例如,单击New按钮旁边的下三角形,在弹出的级联菜单中可以选择Blank Model、Blank Subsystem等。

LIBRARY按钮组中只有一个Library Browser按钮,单击可以打开库浏览器。而在SIMULATE按钮组中,有控制仿真运行的Run(运行)和Stop(停止)等按钮。
按钮组工具栏的下方是模型编辑区。编辑区左侧的选项板中提供了很多按钮,以控制仿真模型的外观并实现模型导航。例如,单击选项板中的Zoom按钮,再在编辑区中单击,可以将编辑区中的仿真模型图进行放大。
3.1.2库浏览器
利用Simulink进行系统建模和仿真时,需要用到很多模块(Block),这些模块构成了Simulink的模块库。单击Simulink编辑器窗口中SIMULATION选项卡中的Library Browser按钮,即可打开模块库浏览器,如图34所示。



图34库浏览器

如果知道模块的名称,可以在库浏览器窗口上面的模块搜索工具栏中输入名称以搜索所需的模块。如果知道模块所属的库,也可以在库浏览器左侧的列表中找到并打开模块所属的库,然后在右侧的列表中找到所需模块。
利用库浏览器定位和查找模块,并将其添加到仿真模型中。在库浏览器左侧面板的树形结构中,最下端将显示Recently Used Blocks,其中列出了最近使用过的模块。这对于快速添加仿真模型中所需的重复模块是非常方便的。
3.2Simulink建模与仿真的基本过程

下面通过一个简单的仿真模型说明利用Simulink实现系统建模和仿真的基本操作过程。
【例31】简单模型的创建。搭建如图35所示的仿真模型,实现将输入的正弦信号整形后变为周期脉冲信号,并且在同一个示波器中显示两个信号。


图35简单模型的创建


首先在MATLAB主窗口中选择当前工作文件夹,然后启动并进入Simulink编辑器。刚进入编辑器时,创建的空白仿真模型默认命名为untitled.slx。单击Save按钮,将模型文件保存到当前工作文件夹中,并将文件命名为ex3_1.slx。在Simulink中,模型文件名后缀默认为.slx,也可以是.mdl。
3.2.1模块的调入和参数设置
例31的仿真模型一共有4个模块,各模块的名称及其主要参数设置如表31所示。


表31例31中模型所需模块及其参数设置



模块名所属库参 数 设 置功能

Sine WaveSimulink/SourcesFrequency(rad/s): 2*pi为仿真模型产生输入正弦波信号
RelaySimulink/DiscontinuitiesOutput when on: 1

Output when off: -1对输入正弦波信号进行整形
Bus CreatorSimulink/Signal Routine参数都取默认值将多路信号合并为一路信号
ScopeSimulink/Sinks参数都取默认值示波器

从库浏览器中找到表31中的各模块,
单击选中每个模块并拖入编辑器的合适位置,即可将模块添加到模型中。通过单击拖动或者选中模块后按方向键可以移动模块位置。单击拖动模块的边界,可以调节模块的大小。
在编辑器中双击各模块,将弹出模块的参数对话框,可以在对话框中设置各模块的参数。例如,双击Relay模块,打开其参数对话框如图36所示。


图36Relay模块的参数对话框


注意,在Simulink所有模块的参数对话框中,都有对该模块功能的简单介绍。为节省篇幅,本书对模块的参数对话框都做了适当的缩放裁剪,只列出需要设置和修改的主要参数。

Relay模块称为继电器模块,其输入与输出之间的关系具有继电特性。在参数对话框中,Switch on point和Switch off point参数都设为默认值eps,Output when on设为默认值1,Output when off重新设置为-1。根据这些参数设置,当Relay模块的输入大于0和小于0时,继电器分别接通和断开,对应的输出分别为1和-1,从而实现正弦波的整形。

用同样的方法设置Sine Wave模块的Frequency参数为2*pi rad/s,其他参数取默认值,意味着该模块将产生并输出频率为1Hz、幅度为1V、初始相位为0的正弦波。
3.2.2模块的连接
调入所有模块后,需要将这些模块相互连接起来以构成完整的仿真模型。大多数模块的一侧或者两侧有尖括号,其中指向模块的尖括号代表模块的输入端子,背离模块的尖括号代表输出端子。如果用线条将模块A的输出端子连接到模块B的输入端子,则表示将模块A输出的信号送到模块B。

连接模块的操作有多种方法,下面列举几种典型的情况。

(1) 将光标移动到Sine Wave模块右侧的输出端子上,直到光标变为“十”字形。然后,单击并拖动到Bus Creator模块的一个输入端子,松开鼠标。此时,将在两个模块之间添加一根连线,箭头指示信号流动的方向。

在连接的过程中,Simulink会根据需要自动对连线进行分段、转折。如果需要自行控制连线的转折点,可以在需要转折处松开一次鼠标,再按住鼠标继续拖动。
(2) 按住Ctrl键,依次单击Relay和Bus Creator模块,即可将这两个模块连接起来。
(3) 拖动示波器模块,当其输入端与Bus Creator输出端对齐时,将在两个模块之间显示一条蓝色的水平线。单击该蓝色线,即可将这两个模块连接起来。
3.2.3运行仿真
运行仿真之前需要配置仿真参数,包括数值求解的类型、仿真起始时间和结束时间以及最大步长。这里假设所有参数都取默认值。

在Simulink编辑器菜单中选择SIMULATION选项卡中的Run命令,即可启动仿真运行。然后,双击Scope模块
打开示波器窗口,其中将显示正弦波及其整形得到的周期脉冲信号,如图37所示。


图37例31的运行结果


注意到在图37的波形图中存在如下问题: 
(1) 显示的正弦波波形有失真,不是标准的正弦波; 
(2) 显示图形的背景颜色为黑色,有些情况下不便于观察; 
(3) 波形曲线没有纵横轴标注等。
这些问题将在后面逐一进行解释,并介绍解决办法。
3.3Simulink模块库和模块
在Simulink中,模块是搭建各种系统仿真模型的基本单位,能够实现仿真模型中某项特定的运算变换功能。通过添加模块、指定模块的行为,并用信号线将模块相互连接起来,即可创建Simulink仿真模型。
3.3.1Simulink模块库

Simulink库浏览器中的模块库可以分为两大类,即Simulink基本模块和扩展模块。基本模块位于Simulink子库中,如图38所示,其中有Sources(信号源模块子库)、Sinks(接收器子库)、Continuous(连续模块子库)等。扩展模块又称为应用工具箱,是针对具体专业或行业的函数包,例如通信系统工具箱(Communications Toolbox)、控制系统工具箱(Control System Toolbox)、DSP系统工具箱(DSP System Toolbox)等。
这里首先介绍几个常用的Simulink基本模块子库及常用模块,各模块的功能和参数设置及其用法可以查阅MATLAB帮助系统,附录B给出了常用的基本模块速查表。


图38Simulink模块库


1. 信号源模块子库
信号源(Sources)模块子库中的所有模块实现各种常用信号的产生,这些模块都只有输出端子,没有输入端子,一般用于为仿真模型提供输入激励信号。常用的信号源模块有
(1) Sine Wave: 正弦波信号源模块; 
(2) Pulse Generator: 脉冲发生器模块; 
(3) Constant、Step、Ramp: 直流信号、阶跃信号和斜坡信号发生器模块; 
(4) Signal Generator: 信号发生器模块; 
(5) Random Number: 随机整数发生器模块; 
(6) From File、From Workspace: 读文件、读工作区模块,从文件或者MATLAB工作区读取信号数据; 
(7) Clock、Digital Clock: 时钟、数字时钟发生器模块。
2. 接收器模块子库
接收器(Sinks)模块子库中的所有模块用于显示模型的仿真运行结果,所有模块都只有输入端子,没有输出端子。常用的接收器模块有
(1) Display: 数据显示模块,用于以数值数据的形式显示仿真运行结果,例如信号的功率、误码率等; 
(2) Scope: 示波器模块,用于显示信号的时间波形; 
(3) To File、To Workspace: 写文件、写工作区模块,将运行结果数据保存到文件和MATLAB工作区中指定的变量。
3. 数学运算模块子库
数学运算(Math Operations)模块子库中的所有模块用于实现典型的数学运算。常用的数学运算模块有
(1) Add、Substract、Product、Divide: 实现基本的代数四则运算; 
(2) Abs: 求输入参数的绝对值; 
(3) Gain、Slider Gain: 放大器、滑动增益放大器,将输入参数乘以指定的放大倍数; 

(4) Complex to RealImag、Complex to ManitudeAngle、RealImag to Complex、ManitudeAngle to Complex: 实现复数实部和虚部、模和辐角之间的相互转换。

4. 逻辑和位操作模块子库
逻辑和位操作(Logic and Bit Operations)模块子库中的模块实现基本的逻辑运算和位操作,主要包括如下模块: 
(1) Bit Clear、Bit Set、Bitwise Operator: 二进制位复位、置位、按位操作; 
(2) Logical Operator、Relational Operator、Shift Arithmetic: 逻辑运算、关系运算、算术移位; 
(3) Combinatorial Logic: 组合逻辑运算; 
(4) Compare To Zero、Compare To Constant: 过零比较器、常数比较器; 
(5) Detect Change: 输入信号变化检测器; 
(6) Detect Rise Positive、Detect Fall Negative: 上升沿过零、下降沿过零检测。
3.3.2模块的参数设置
搭建仿真模型时,将所需模块调入模型编辑区后,需要根据仿真的系统正确设置各模块的参数。模块的参数可以是常数数值、变量或表达式等,而设置模块的参数可以通过模块的参数对话框、模型数据编辑器、属性检查器和模型资源管理器等各种方法实现。
1. 模块参数设置对话框
在仿真模型中,双击某模块,将立即弹出该模块的参数对话框,通过参数对话框可以对模块的功能进行简单了解,并对模块的参数进行设置。图39为Simulink/Sources子库中Sine Wave模块的参数对话框。


图39Sine Wave模块的参数对话框


2. 模型数据编辑器

在Simulink编辑器的MODELING选项卡中,单击Model Data Editor(模型数据编辑器)按钮,将在编辑器下方显示模型数据编辑器子窗口。子窗口顶部有5个标签,单击Parameters(参数)标签,即可在下方的选项卡列表中查看和修改仿真模型中各模块的参数。

对例31所示的仿真模型,打开的模型数据编辑器子窗口如图310所示。仿真模型中共有4个模块,但只有Relay和Sine Wave模块需要设置参数,因此子窗口以列表的形式列出了这两个模块需要设置的所有参数,每个参数对应一行。单击Value(参数值)列,即可进入编辑状态,对该行参数值进行修改和设置。
利用模型数据编辑器可以集中处理仿真模型中的所有模块,不用在模型图中逐个打开对话框进行配置。



图310模型数据编辑器子窗口


3. 属性检查器
在Simulink编辑器的MODELING选项卡中,单击Design按钮组中的Property Inspector(属性检查器)按钮,将在编辑器右侧显示属性检查器面板。


图311属性检查器面板

为了检查和设置某模块的参数,在仿真模型中单击指定的模块,将在属性检查器面板中显示出该模块的参数(Parameters)、属性(Properties)和信息(Info)。例如,在例31的仿真模型中,单击Sine Wave时,属性检查器面板的显示如图311所示。


单击该面板中的Parameters标签,立即显示出Sine Wave模块的所有参数,在对应的文本框中可以对这些参数进行设置和修改。
需要注意的是,Simulink仿真模型中所有的模块参数都可以设置为常数、变量、表达式或者MATLAB函数。例如,设置Sine Wave模块的Frequency参数为“2*pi*f”,这是一个表达式,其中f为MATLAB工作区中的一个变量。运行时,必须首先用MATLAB命令或者程序代码设置变量f的值,才能启动仿真运行。
4. 模型资源管理器

如果仿真模型比较复杂,模型中的模块比较多,利用前面介绍的方法逐一对模块进行参数设置很不方便。为此,Simulink提供了一个模型资源管理器(Model Explorer),可以很方便地查看、修改和添加模型中的模块。
要打开模型资源管理器,可以采用如下方法: 

(1) 在Simulink编辑器的MODELING选项卡中,单击Model Explorer按钮; 

(2) 在仿真模型中,右键单击任意一个模块,然后从弹出的快捷菜单中选择Explore菜单命令; 
(3) 在MATLAB命令行窗口中输入“daexplr”命令。
默认情况下,打开后的模型资源管理器窗口如图312所示。窗口顶部有一个主工具栏,其中提供了相关按钮以执行MATLAB和Simulink的相关命令,例如新建仿真模型、打开模型文件等。通过勾选 View菜单下Toolbars级联菜单中的Search Bar菜单命令,还可以在主工具栏下方显示一个Search(搜索)工具栏,用于执行在模型层次结构面板中所选节点(例如仿真模型)上的搜索操作。



图312模型资源管理器窗口


工具栏下面共有3个面板,从左往右依次为Model Hierarchy(模型层次结构)、Contents(内容)和Model Properties(模型属性)面板。其中,模型层次结构面板用于导航和浏览仿真模型和MATLAB工作区,内容面板用于显示和修改模型或模块,模型属性面板用于查看和更改所选对象的属性。
1) 模型层次结构面板
模型层次结构面板以树状形式显示Simulink模型的层次结构,在该面板中可以快速浏览和定位模型中的指定模块。
所有的模型层次结构都以Simulink Root为根节点,根节点下面有很多子节点。其中,Base Workspace子节点表示MATLAB工作区,下面的各子节点代表当前打开的所有Simulink仿真模型。每个模型节点下面又包括Model Workspace(模型工作区)、Configurations(模型配置)和External Data(外部数据)节点。此外,还可能有其他子节点。例如,如果一个仿真模型中含有子系统,则将增加一个子节点代表该子系统。

在图313所示的模型层次结构面板中,根节点下面共有3个节点,其中ex3_1和smart_braking节点分别代表当前打开的两个仿真模型。展开smart_braking节点,下面的Alert system、Proximity sensor和Vehicle节点分别代表一个子系统。而Vehicle子节点下面又有3个子节点,代表其中还有3个更小的子系统。
由此可见,对于含有多层结构的复杂系统仿真模型,利用模型浏览器可以很方便地查看模型的层次结构,快速查找模型中的指定模块。此外,在层次结构视图中,右击某个模型或者子系统节点,可以弹出快捷菜单,单击菜单中的Open菜单命令,可以快速打开该节点对应的仿真模型。
2) 内容面板
内容面板主要由两个选项卡构成,如图314所示。其中,Contents选项卡用于显示在模型层次结构面板中选中节点的对象属性列表,Search Results(搜索结果) 选项卡用于显示通过搜索工具栏执行搜索的结果。


图313模型层次结构面板




图314内容面板


在两个选项卡中,都以表格的形式显示所选节点对象或者搜索结果。表格的每行代表一个对象(模块或者子系统),而每列代表对象的一个属性,其中前两列默认为Name(对象名)和BlockType(模块类型)。
3) 模型属性面板
使用模型属性面板可查看和更改在模型层次结构或内容面板中所选对象的属性。默认情况下,模型属性面板显示在内容面板的右侧。通过View菜单中的Show Dialog Pane菜单命令或者主工具栏中的Dialog View按钮可以显示或者隐藏该面板。

在模型层次结构面板中选中某个仿真模型,将在模型属性面板中显示该模型的相关信息。在内容面板中单击仿真模型中的某个模块,将在模型属性面板中显示该模块的简要介绍及所有参数,通过该面板即可对所选的模块进行参数检查和设置,如图315所示。


图315模型属性面板


内容面板中列出了模型中的所有模块。单击不同的模块,模型属性面板中显示的内容将同步刷新。因此,利用模型浏览器对仿真模型中各模块的参数进行设置、检查和修改是相当方便的。
3.3.3模块的基本操作

从模块库调入仿真模型所需的模块,并根据仿真模型的需要正确设置各模块的参数,然后将各模块连接起来,即可构成系统的仿真模型。在此过程中,对模块还有一些基本操作。这里列举几种典型的操作。

1. 模块的移动和翻转
在仿真模型中单击需要移动的模块,通过鼠标拖动即可将模块移动到所需的位置。在移动过程中,与之相连接的连线也将自动随之移动。

默认情况下,所有模块的输入端子和输出端子分别位于模块图标的左侧和右侧。在连接各模块时,有时很不方便,搭建的仿真模型也不够清晰整洁。为此,可以将模块图标进行旋转、翻转等操作。具体操作方法是: 右键单击模块,在弹出的快捷菜单中选择Rotate & Flip菜单项; 该菜单项下面有若干子菜单命令,可以根据需要选择,从而实现模块的顺时针旋转90°(Clockwise)、逆时针旋转90°(Counterclockwise)、翻转180°(Flip Block)和模块名翻转(Flip Block Name)等操作。

需要注意的是,将模块翻转180°,实际上只是将模块的输入/输出端子交换,分别放到模块的右侧和左侧; 而Flip Block Name菜单命令是将默认位于模块图标下面的模块名移动到模块图标的上方显示。
2. 模块的复制和删除

要删除已经调入仿真模型中的某个模块或者某几个模块(模块组),可以单击或者拖动鼠标选中这些模块,然后直接按Del键删除; 也可以右击模块,在弹出的快捷菜单中选择“剪切”菜单命令。

如果一个模块或者模块组在同一个仿真模型中多次用到,可以对其进行复制操作,而不需要重复从模块库中调入。为此,选中需要复制的模块组以后,在弹出的快捷菜单中选择“复制”菜单命令即可。

3. 模块及信号线的命名
从模块库中调入的大多数模块都有名字,默认情况下模块名显示在模块图标的下方。Simulink中对各模块的命名规则是
根据调入的顺序依次命名。例如,一个仿真模型中需要3个Sine Wave模块,则根据这3个模块调入的顺序,依次将其命名为Sine Wave 1、Sine Wave 2、Sine Wave 3。

为便于阅读仿真模型,直观了解各模块在仿真模型的作用和功能等,通常需要根据仿真系统的数学模型,对仿真模型中的各模块重新命名。单击模块名称(注意不是模块图标)即可进入编辑状态,通过键盘对模块进行重命名。

此外,还可以选择是否显示指定模块的名称。首先,单击模块,在Simulink编辑器窗口顶部将出现BLOCK标签; 在该选项卡中单击FORMAT按钮组中的Auto Name按钮,在弹出的下拉菜单中选择Auto Name(自动命名)、Name On(显示模块名)或Name Off(隐藏模块名),即可隐藏或者显示模块名称。

在Simulink模型中,用带有箭头的线条表示信号,进而表示各模块之间的数学和连接关系。为便于区分模型中的各信号,一般根据仿真模型中各信号代表的物理意义对信号进行命名。右键单击需要命名的信号线,在弹出的菜单中选择Properties菜单命令,打开Signal Properties对话框,即可设置信号名称; 也可以双击信号线直接设置。
4. 模块帮助文档的获取

前面只是简单列举了Simulink中常用模块的名称。在搭建仿真模型的过程中,通常需要频繁借助于帮助系统,以详细了解各模块的功能特性、使用方法以及参数设置。
获取指定模块帮助文档的常用方法有如下几种: 

(1) 在MATLAB帮助系统页面的搜索栏中输入模块名称进入指定模块的帮助页面; 
(2) 在仿真模型中右击模块,在弹出的快捷菜单中选择Help菜单命令,即可打开MATLAB帮助系统,并自动进入该模块的帮助页面; 
(3) 在模块的参数对话框中,单击最下面的Help按钮,进入该模块的帮助页面。
3.4Simulink求解器

在Simulink中,在指定的时间范围内,以给定的时间间隔(步长,Step)计算系统的状态,
这种计算模型状态的过程称为模型的求解。Simulink提供了一组称为求解器(Solver)的程序,每个求解器都体现了求解模型的特定方法。
3.4.1求解器的分类及选择
Simulink中所有求解器可以分为固定步长和变步长求解器、连续和离散求解器。针对具体的仿真模型,
通常需要从中选择一种合适的求解器,否则仿真精度不够,甚至仿真运行结果发生错误。
1. 求解器的分类
根据仿真模型中的状态和仿真运行时所采用的步长,可以将求解器分为连续和离散求解器、固定步长和变步长求解器。
(1) 固定步长和变步长求解器

根据仿真步长是否固定,可将求解器
分为固定步长(Fixedstep)求解器和变步长(Variablestep)求解器。对固定步长求解器,在仿真运行的整个过程中,步长都保持不变。对变步长求解器,步长随仿真过程而变化。当模型的状态变化较快时,减小步长以提高精度; 当模型的状态变化较慢时,适当增大步长,可避免不必要的计算步骤,减少计算开销。
(2) 连续和离散求解器

根据仿真模型中的状态是否连续,可以将求解器分为连续(Continuous)求解器和离散(Discrete)求解器。离散求解器主要用于求解纯离散模型,这种模型中没有连续状态,因此只需要计算和更新模型在每个时间步内离散状态的值。连续求解器用于求解连续系统,基于前一个时间步的状态和状态变量的导数,利用数值积分算法来计算模型在当前时间步的连续状态,并计算模型在每个时间步内离散状态的值。常用的连续求解器及其采用的数值积分算法如表32所示。


表32常用的连续求解器及其算法



类型求解器所 用 算 法

固定步长

ode1欧拉法
ode2改进欧拉法
ode3二/三阶龙格库塔法(RK2、RK3)
ode4四阶龙格库塔法(RK4)
ode5DormandPrince法(RK5)
ode8DormandPrince法(RK7、RK8)

续表



类型求解器所 用 算 法

变步长

ode45RK4、RK5,是连续系统的默认求解器
ode23RK2、RK3,比ode45效率高,但精度稍差
de113亚当斯算法(AdamsBashforthMoulton),效率比ode45高
ode15sNDFs(Numerical Differentiation Formulas)算法,适用于刚性系统


2. 求解器的选择
对于给定的仿真模型,求解器的选择取决于系统的动态特性、求解结果的稳定性、计算速度和求解器的稳健性。理想情况下,求解器应该能够在合理的时间内解算模型。对于变步长求解器,求解结果应该在指定的容差范围内。
在实际应用中,每个求解器都不可能满足一个问题的所有需求,因此在选用时通常采用尝试迭代方法,通过比较不同求解器下的仿真运行结果,选择一种能够以最小的开销获得最优性能的求解器。
一般情况下,首先选用auto(自动)求解器。此时,系统自动为仿真模型选择一种固定或变步长的求解器,并使其步长尽可能大,以提高仿真效率。如果使用自动求解器的仿真结果不能满足要求,再通过尝试自行选择确定一个合适的求解器。
3.4.2求解器的参数配置
求解器的参数配置包括求解器的选择、仿真步长的设置等,这些操作主要通过求解器参数配置面板进行。
在Simulink编辑器中单击SIMULATION标签,在选项卡的PREPARE按钮组中选择Model Settings按钮,即可打开模型参数配置(Configuration Parameters)对话框。在对话框左侧列表中单击Solver选项,即可进入求解器参数配置面板,如图316所示。


图316求解器参数配置面板


通过求解器参数配置面板主要对求解器的如下参数进行设置。
(1) 仿真时间(Simulation time): 
设置仿真运行的起始时间(Start time)和结束时间(Stop time),一般根据需要观察的信号波形时间范围确定。
(2) 求解器的选择(Solver selection): 
可以选择求解器的类型(Type)为固定步长(Fixedstep)或者变步长(Variablestep),设置求解器的名称(Solver)为ode1、ode2等。
(3) 附加选项(Additional options): 
选择了求解器后,还需要设置一些附加选项,例如设置仿真步长。单击面板中Solver details左侧的箭头,可以隐藏或者展开显示这些附加选项。
如果在求解器选项中选择固定步长求解器,则附加选项主要是步长(Fixedstep size); 对变步长求解器,附加选项有最大步长(Max step)、最小步长(Min step)等。

默认情况下,上述附加选项都设为auto。此时,固定步长和最大步长根据仿真起始时间tstart和结束时间tstop自动确定,即hmax=(ts-te)/50。如果由上式得到的步长不能满足要求,则可以自行设置一个合适的步长。
3.4.3求解器步长与模块采样时间
在Simulink中,求解器的步长很大程度上取决于仿真模型中各模块的采样时间参数(Sample time),通过设置该参数可以控制模块的执行速度,确定模块输出信号的形式(连续信号或离散信号)等。
模块的采样时间可以在其参数对话框中进行设置。如果设置模块的采样时间参数为0,则将以所设置的求解器步长执行该模块对应的运算。如果设置模块的采样时间参数为非零,则求解器以该参数作为步长计算模块的输出。

例如,对Sine Wave模块,设置其Sample time参数为0,设置求解器采用固定步长求解器,仿真运行2s。运行时,将以求解器中的步长参数作为采样时间对正弦波进行采样,得到正弦波的波形如图317(a)所示。当求解器步长足够小时,可以近似认为得到一个连续的正弦波。
如果将模块的Sample time参数设置为非零值,则将以所设置的采样时间作为求解器的步长,以执行模块的运算和操作。对Sine Wave模块,此时可以认为输出一个离散正弦波信号。图317(b)是Sample time参数设为0.1s的情况。


需要注意以下两点: 
(1) 有些模块的输入信号要求必须是离散信号,此时对产生该输入信号的模块,必须设置其Sample time参数为非零值,或者将其输出经过ZeroOrder Hold(零阶保持器)模块采样后再送入后续模块。

(2) 不是所有模块都有Sample time参数。没有该参数的模块都有隐式采样时间,由Simulink根据模块在仿真模型中的上下文来决定。例如,Integrator(积分器)就是一种具有隐式采样时间的模块,运行时Simulink会自动将其采样时间设置为0。如果该模块的输入信号来自Sine Wave模块,则运行时自动以Sine Wave模块的Sample time参数作为采样时间。


图317Sine Wave模块在不同采样时间和求解器步长下的输出波形


3.5仿真运行
搭建好仿真模型并设置模块参数和求解器后,即可启动仿真运行。可以使用工具栏上的按钮实现暂停、继续和停止仿真运行。在仿真过程中,不能更改模型的结构,例如添加或删除信号线或模块等。
3.5.1仿真运行方式
Simulink中对仿真运行过程的控制可以采用两种方式,即通过Simulink编辑器中的工具按钮对仿真运行实现交互控制或者通过MATLAB程序代码进行程序控制。
1. 交互方式
在Simulink编辑器的工具栏中,提供了工具按钮实现仿真运行的交互控制。
1) 启动仿真运行
单击编辑器SIMULATATION选项卡中的Run按钮,可以启动或继续执行仿真。单击Step Back或者Step Forward按钮,可以采用步进方式运行仿真。
模型的仿真运行从求解器中指定的Start time开始,直到指定的Stop time时刻结束。在仿真运行过程中,编辑器底部会显示仿真完成的百分比和当前仿真时间。

在仿真运行过程中,如果发生错误将停止仿真并显示一条消息。单击编辑器底部的诊断链接查看相应的消息,以快速准确地定位错误。
2) 仿真运行的暂停和停止
在运行仿真的过程中,Run按钮将替换为Pause按钮。单击该按钮,可以暂停运行仿真。暂停操作将在执行完当前时间步之后开始,恢复暂停继续运行也只在下一个时间步发生。
单击工具栏上的Stop按钮,可以在完成当前时间步时立即停止仿真。如果设置模型输出数据到文件或工作区,则停止或暂停仿真时将会执行输出数据的操作。

图318Stop Simulation模块的使用



除了通过上述方法实现仿真运行的启动和停止以外,在Sinks子库中,还提供了一个Stop Simulation 模块。将该模块添加到仿真模型中,则当模块的输入不等于零时,将自动停止仿真。
例如,在图318所示的仿真模型中,当仿真运行10s后,Relational Operator输出为1。将该输出送入Stop Simulation模块,则运行10s后,该模块将控制停止仿真运行,从而使Sine Wave模块只输出0~10s的正弦波形。
2. 程序控制方式
在Simulink中搭建好仿真模型并保存为.slx文件后,可以通过在MATLAB命令行窗口输入命令或者在MATLAB程序中插入专用语句以启动仿真模型的运行,这主要通过调用sim()函数来实现。
1) sim()函数的调用方法
在新版本的MATLAB中,sim()函数的一种标准调用格式为



simOut = sim(model,Name,Value)






其中,参数model为模型文件名,文件名必须以单引号括起来,不需要写后缀.slx; Name和Value分别为仿真运行的参数。在同一条sim()调用语句中,可以写出多个“名值”对参数,也可以省略而采用默认的参数运行仿真。
例如,如下命令: 



>>simOut = sim('ex3_1')






采用默认求解器参数运行名为ex3_1.slx的仿真模型文件。如下命令: 



>> sim('ex3_1','Solver','ode15s','TimeOut',20)






将采用ode15s变步长求解器仿真运行名为ex3_1.slx的模型文件,运行时间为20s。

执行上述命令后,仿真运行的结果(所有仿真输出,例如运行时间、模型的状态和信号等)将保存到一个Simulink.SimulationOutput 对象中,并将相关信息显示在命令行窗口。例如,执行上述第一条命令后,将在命令行窗口显示如下信息: 



simOut =

Simulink.SimulationOutput:

tout: [51x1 double]

yout: [1x1 Simulink.SimulationData.Dataset]

SimulationMetadata: [1x1 Simulink.SimulationMetadata]

ErrorMessage: [0x0 char]






上述信息表示仿真运行后得到两个输出tout和yout,其中tout为仿真运行的时间向量,yout为仿真运行输出的结果。具体输出结果取决于在模型参数配置对话框中通过Data Import/Export面板所定义的模型时间、状态和输出,以及仿真模型中使用的To Workspace和Scope等模块。
2) sim()函数的兼容格式
要向后兼容MATLAB R2009a或更早版本,可以使用如下语句调用sim()函数: 



[T,X,Y] = sim(model)

[T,X,Y1,...,Yn] = sim(model)






在上述调用格式中,T为返回的仿真运行时间向量,X为返回的模型状态矩阵,Y为模型的输出矩阵。矩阵Y中保存的是仿真模型中Out模块对应的信号数据。一个仿真模型中如果有多个Out模块,则仿真运行后将返回多个输出。此时,矩阵Y中的每列对应一个输出。也可以采用第二种调用格式,分别列出Y1、Y2等。
3.5.2仿真运行过程
无论是交互方式还是程序控制方式,启动仿真运行后,Simulink将依次执行以下操作。
1. 模型编译
打开仿真模型并启动仿真运行时,将进入仿真运行的第一个阶段,即编译阶段。此时Simulink 引擎调用模型编译器,将模型编译为可执行文件。在此阶段,编译器将执行如下操作: 
(1) 计算模型的模块参数表达式以确定模块的参数; 
(2) 确定模型没有显式指定的信号属性,例如名称、数据类型、数值类型和维度,并检查每个模块输入信号的有效性; 
(3) 根据属性传播过程将源信号的属性传播到后续模块的输入端; 
(4) 执行模块约简优化; 
(5) 将虚拟子系统替换为子系统所包含的模块; 
(6) 通过基于任务的排序确定模块的执行顺序; 
(7) 对于模型中未显式指定采样时间的模块,确定其采样时间。
2. 链接
在此阶段,Simulink引擎为工作区中的信号、状态和运行时参数等分配所需的内存,并为存储每个模块运行信息的数据结构体分配和初始化内存。
此外,在链接阶段还将创建方法执行列表,根据编译阶段确定的模块执行顺序确定仿真模型中各函数和方法的最有效调用顺序。
3. 仿真循环
在此阶段,Simulink引擎使用编译和链接阶段提供的仿真模型信息,从仿真开始到结束的时间段内,以固定的时间间隔连续循环地计算系统的状态和输出。
仿真循环可以分为循环初始化和循环迭代两个阶段。其中,初始化在循环开始时只执行一次,以指定模型系统的初始状态和输出; 循环迭代将在仿真运行的每个时间步重复执行,在每个时间步计算系统的输入、状态和输出值,并且更新仿真模型以反映计算结果。仿真结束时,将得到系统的输入、状态和输出的最终值。

在仿真循环的每个时间步,Simulink 将执行以下操作。
(1) 计算模型的输出。
Simulink引擎通过调用仿真模型的Outputs()方法启动此步骤。模型的Outputs()方法会自动调用模型系统的Outputs()方法,各Outputs()方法将按链接阶段确定的顺序依次再调用各模块的Outputs()方法。

在调用各方法的过程中,模型系统的Outputs()方法将指向模块数据结构体及其SimBlock结构体的指针参数传递给每个模块的Outputs()方法。其中,SimBlock数据结构体指向Outputs()方法计算模块输出所需的信息,包括输入缓冲区和其输出缓冲区的位置。
(2) 计算模型的状态。
Simulink引擎通过调用求解器来计算模型状态。如果模型只有离散状态,Simulink将调用用户设置的离散求解器。求解器计算得到模型采样时间所需时间步的大小,然后按照链接阶段确定的顺序调用各模块的Update()方法。
如果模型只有连续状态,Simulink引擎将调用模型的Derivatives()方法,或者进入子时间步(微步)子循环。在子循环中,重复调用模型的Outputs()方法和Derivatives()方法,以便在主时间步内按连续时间间隔计算模型的输出和导数,提高状态计算的准确性。
(3) 检查模块连续状态中的不连续性。
采用过零检测技术来检测连续状态中的不连续性。
(4) 计算下一个时间步对应的采样时间。



微课视频

3.6仿真数据的导出和检查

仿真数据包括仿真时间变量、模型的输入/输出信号、状态变量和数据存储日志等数据。导出仿真数据指在仿真过程中将这些数据保存到MATLAB工作区或MAT文件中,以便于检索和进一步处理。

在MATLAB和Simulink中,可以利用Simulink/Sinks子库中的Scope(示波器)、To File(输出到文件)、To Workspace(输出到工作区)或者Out(输出端子)模块实现仿真数据的导出,也可以在命令行窗口或者程序文件中通过调用sim()函数启动仿真运行,并导出结果数据。
3.6.1导出数据的格式

在Simulink中,导出的仿真数据格式可以是数组、结构体、带有时间的结构体、MATLAB时间序列、Simulink.SimulationData.Dataset对象、ModelDataLogs对象等。

在模型参数配置对话框中,单击左侧列表中的Data Import/Outport选项,在对话框右侧将显示数据输入/输出面板,如图319所示。在该面板中,有一个Format下拉列表,通过下拉列表即可设置导出数据的格式,其中提供了4个选项,即Array(数组)、Structure(结构体)、Structure with time(带时间的结构体)和Dataset(数据集)。

在数据输入/输出面板中,还提供了很多复选框用于选择需要导出的数据。其中,Time为时间向量,States为仿真模型中的状态变量,Output为输出变量。这3种数据默认分别导出到变量tout、xout和yout,也可以根据需要自己重新设置变量名。


图319数据输入/输出面板


此外,如果勾选Single simulation output(单个仿真输出)复选框,上述3种数据将合并为一个数据,导出到同一个变量out中。
下面通过一个简单的仿真模型来介绍各种数据记录格式的区别。
【例32】导出数据的格式。搭建如图320所示的仿真模型,以观察导出仿真数据的各种记录格式。
模型中由Add、Integrator和Gain模块构成一个一阶单位负反馈系统,系统有一个状态变量x。Sine Wave模块产生一个频率为1Hz的正弦波作为系统的输入u,同时由Out1模块导出,系统的输出y由Out2模块导出。双击Out1和Out2模块,在弹出的模块参数对话框中设置Signal name(信号名称)参数分别为sig1和sig2。


图320仿真数据的导出


1. 数组格式
在数据输入/输出面板的Format下拉列表中选中Array选项,则设置以数组格式导出数据。仿真运行后,在MATLAB工作区将得到3个变量,如图321所示。



图321以数组格式导出数据


在工作区中双击某一个变量,立即在主窗口中打开一个子窗口,在其中显示该变量中的数据。图321是双击tout变量后得到的结果。该变量是一个长度为51的列向量,共有51个数据,分别代表仿真运行过程中的各采样时刻。

类似地,双击xout和yout变量,在子窗口中显示这两个变量的数据如图322所示。由于该例中的仿真模型是一个一阶系统,只有一个状态变量,所以xout为长度等于51的列向量。模型中有两个输出端子,因此得到的yout为51行2列的数组或者矩阵,第1列和第2列分别为仿真模型中的sig1和sig2(即系统输出信号y)。



图322变量xout和yout中的数据



如果在模型参数配置对话框的数据输入/输出面板中勾选Single simulation output复选框,则仿真运行后,时间变量、状态变量和输出变量将合并为一个变量out。仿真运行后,在工作区中只得到该变量。双击变量out,在打开的子窗口中将显示该变量的属性,据此可知out中共有3个变量,其中时间变量tout和状态变量xout为长度为51的列向量,yout为51×2数组,如图323所示。


图323单个仿真结果输出


得到上述数组格式的仿真结果数据后,如果需要将这些数据进行可视化,即绘制出这些信号的波形,可以调用plot()等绘图函数实现。
对于上述第一种情况,用如下命令: 



>> plot(tout,yout(:,1))






可以绘制出模型中第一个输出信号sig1的波形。而用如下命令: 



>> plot(tout,yout)






将同时绘制出仿真模型中两个输出信号sig1和sig2的波形。
对于第二种情况,要绘制sig1的波形,需要用如下命令: 



>> plot(out.tout,out.yout(:,1))






如果需要同时绘制出两个信号的波形,则可用如下命令实现: 



>> plot(out.tout,out.yout)






2. 结构体格式
在Format下拉列表中选中Structure选项,则设置以结构体格式导出数据。此时得到的tout仍然为时间向量,而状态变量xout和输出变量yout分别都是结构体,含有time和signals两个字段。其中,time字段记录仿真时间,signals字段是一个子结构体数组,每个子结构体对应模型中的一个输出端子。该子结构体又进一步由4个字段构成,即values字段(输出端子输出的信号数据)、dimensions字段(输出信号的维数)、label字段(信号标签)和blockName字段(输出端子模块的名称)。
对于例32中的仿真模型,仿真运行后,在MATLAB工作区中得到的结果如图324(a)所示。双击工作区中的yout,在中间的子窗口中显示该变量中的两个字段time和signals,注意到time字段为空。


图324以结构体格式导出数据



字段signals是一个子结构体。双击该字段,窗口中将以表格的形式列出该子结构体内部的4个字段,如图324(b)所示。由于仿真模型中有两个Out模块,所以有两个输出,每个输出对应表格中的一行。单击某一行中的values列,将以列向量的形式显示该行对应的信号y的数据。

对于以结构体格式输出的数据,要绘制出对应信号的波形,可以用如下命令: 



>>plot(tout,xout.signals.values)%绘制状态变量的波形

>> plot(tout,yout.signals(2).values)%绘制sig2的波形






在Format下拉列表中还可以设置数据以带时间的结构体格式输出。此时,得到的状态变量和输出变量结构体中,time字段不为空,而是保存有仿真运行过程中的采样时间。
3. 数据集格式

在Format下拉列表中选中Dataset选项,则将以数据集格式导出数据。在MATLAB中,数据集(Dataset)是 一个Simulink.SimulationData.Dataset类对象,其中不仅可以保存信号数据,还有日志记录等信息。数据集中各个信号的数据可以使用Timeseries(时间序列)或Timetable(时间表)元素进行记录。

对于例32中的仿真模型,如果设置以数据集格式导出数据,则仿真运行后,在工作区中双击打开变量yout,在MATLAB主窗口中得到的结果将如图325所示。变量yout中共有两行,每行都是一个Simulink.SimulationData.Signal类对象,对应模型中的一个输出信号。每个类对象都存储了仿真运行中的信号日志记录信息,例如BlockPath(信号对应的模块路径)、Name(信号名称)、PortType(端子类型)和Values(采样时间或信号数据值)等。


图325以数据集格式导出数据



在其中某一行双击(例如第二行),将在MATLAB主窗口显示如图326(a)所示的属性信息。再双击Values字段,在子窗口中即可查看信号sig2的数据,如图326(b)所示。


图326信号属性信息及其数据



得到上述数据集对象后,可以用如下命令: 



>> plot(yout{2}.Values)






绘制信号sig2的时间波形。注意,其中使用的是大括号,而不是中括号或者小括号。
3.6.2To Workspace和To File模块
前面介绍了利用Out模块将仿真数据以数组、结构体或数据集的格式导出。除了Out模块以外,还可以利用Simulink/Sinks子库中的To File和To Workspace模块,将仿真数据导出到MAT文件或工作区。

To Workspace模块将模块的输入信号数据写入MATLAB工作区。在仿真期间,模块首先将数据写入内部缓冲区,暂停仿真或仿真完成后,再将数据写入工作区。在仿真暂停或停止之前,数据不可用。如果是通过编程方式调用sim()函数启动仿真运行,则To Workspace模块将数据写入发送到调用函数的工作区,而不是MATLAB工作区。

To File模块将输入信号数据写入MAT文件。如果仿真开始时指定的文件已经存在,模块将覆盖该文件。暂停仿真或仿真结束时,文件会自动关闭。如果仿真异常终止,To File 模块将保存在异常终止之前记录的数据。

图327(a)和图327(b)分别为To Workspace和To File模块的参数对话框。两个模块的大多数参数相同,而To File模块还需要指定保存的MAT文件名。



图327To Workspace和To File模块的参数对话框


(1) Variable name: 保存信号数据的变量名。
(2) Limit data point to last: 要保存的输入采样的最大数量。如果仿真生成的数据点数大于指定的最大值,仿真将只保存最近生成的采样点数据。默认值inf表示写入整个仿真运行时间范围内的所有数据。
(3) Decimation: 确定数据写入时间的抽取因子,默认为1,表示保存所有采样时刻的数据。
(4) Save format: 保存仿真输出的格式,可以是Timeseries(时间序列)、Structure With Time(带时间的结构体)、Structure(结构体)或者Array(数组)。
(5) Sample time: 采样时间,默认为-1,表示采用模块输入端送入信号的采样时间。
下面结合具体的仿真模型说明上述两个模块的用法。
【例33】To Workspace和To File模块的用法。搭建如图328所示的仿真模型。该模型与例32中的模型相同,只是将两个Out端子分别替换为To File和To Workspace模块。


图328To Workspace和To File模块的用法



1. 输出数据到工作区
在上述仿真模型中,设置To Workspace模块的参数Variable name为y。运行仿真后,将在MATLAB工作区得到一个同名变量。

需要注意的是: 
(1) 由于模型中不再有Out模块,所以工作区不会得到变量yout。是否有tout和xout变量,取决于在模型参数配置对话框的数据输入/输出面板中的设置。

(2) 对于To Workspace模块,输出变量y的格式仍然可以是数组、结构体和时间序列。但是,具体输出格式由模块的Save format参数决定,而不取决于数据输入/输出面板中的设置。
(3) 在该例中,由于只有一个To Workspace模块,所以得到的变量y只有一列。如果有多个信号需要通过同一个To Workspace模块导出到工作区,可以用Bus Creator模块将其创建为总线信号,再送入该模块。

(4) 本例中设置Save format参数为Timeseries(时间序列),时间序列可以认为是一种特殊的数据集。对于To Workspace模块输出的时间序列y,如果需要绘制其波形,也与前面的数据集格式有所区别。例如,对本例中的y,要绘制其波形,可以用如下命令: 



>>plot(y)






(5) 如果To Workspace模块的输入端是用Bus Creator模块将多个信号sig1、sig2等送入,并假设保存到工作区的变量y,则可以用y.sig1等格式访问其中的各信号。
2. 输出数据到文件

在上述仿真模型中,设置To File模块的参数File name(文件名)为mydata.mat,
Variable name(变量名)为u,则仿真运行后,将在当前文件夹中得到一个同名文件。在当前文件夹子窗口中双击文件名,即可在工作区中看到文件中保存的变量u。再双击该变量,可以查看该变量对应的输入信号数据,如图329所示。

图329是设置To File模块的参数Save format为Arrays的情况,保存的输入信号变量u是一个数组。与用Out模块导出的数组不同的是,这里得到的数组u维数为2×51。其中第一行为时间向量,第二行为信号数据。


图329To File模块导出的数据



3.6.3仿真数据检查器

Simulink中提供了仿真数据检查器(Simulation Data Inspector),以便采用交互方式导出和查看仿真模型中的信号数据。利用仿真数据检查器可以将多次仿真结果分别在各子图中绘制出信号波形,并对其进行综合检查比较。
可以用如下几种方法打开仿真数据检查器: 
(1) 在Simulink编辑器的SIMULATION 选项卡中,单击REVIEW RESULTS按钮组中的Data Inspector按钮打开。
(2) 单击仿真模型中的信号日志标记

打开。在仿真模型中,单击需要检查的信号,然后单击SIMULATION 选项卡的PREPARE按钮组中的Log Signals(记录信号)按钮。此时,在信号线旁边将出现日志标记。单击日志标记,将打开仿真数据检查器。
打开后的仿真数据检查器窗口如图330所示。



图330仿真数据检查器窗口


窗口最左边是工具栏,其中有“打开”“保存”等功能按钮。窗口的右侧是图形区。窗口中部的面板中有“检查”(Inspector)和“比较”(Compare)两个标签。在“检查”选项卡中有3个区域,从上往下依次为工作区、存档区和属性区。

仿真数据检查器为每次仿真运行的数据创建一个运行实例,并依次命名Run1、Run2、……每次仿真运行得到的仿真实例将显示在工作区。通过拖动可以将指定的运行实例在工作区和存档区之间移动。在存档区或者工作区右键单击某运行实例,通过弹出的快捷菜单可以将指定的运行实例进行展开、删除、重命名等操作,或者将对应的结果数据导出到MATLAB工作区或者文件。

下面通过一个具体的仿真模型介绍数据检查器的基本使用方法。

【例34】数据检查器的使用。打开例33中的仿真模型,注意将信号u、x和y命名。依次单击这3个信号,再单击Log Signals按钮,将在3个信号旁边分别添加一个日志标记,如图331所示。最后保存模型文件。


图331仿真数据检查器的使用


1. 运行实例的创建
单击模型中的任何一个日志标记,即可打开仿真数据检查器窗口。此时窗口的工作区和存档区都是空白的。仿真运行结束后,在仿真数据检查器的工作区将出现第一个运行实例Run1,如图332(a)所示。在Run1实例下面有模型中的3个信号列表。单击Run1前面的箭头,可以展开或者收起信号列表。



图332创建Run实例


将仿真模型中Gain模块的参数Gain修改为5,再次单击运行。运行结束后,在工作区将出现第二个Run实例,并自动命名为Run2。同时,原来的Run1实例自动移到了存档区,如图332(b)所示。

2. 信号波形的显示
在存档区或者工作区展开某个运行实例,再单击勾选信号前面的复选框,即可将该信号的波形显示在窗口右侧的图形区。如果同时勾选多个信号,图形区将绘制出所有被选中信号的波形。单击信号右侧的颜色条,可以设置信号波形曲线的颜色。例如,勾选存档区中Run1下面的y和u,立即在右侧的图形区显示出这两个信号的时间波形,如图333所示。


图333信号波形的显示



图形区上方提供了一个工具栏,通过工具栏上的按钮可以设置图形区中图形显示的样式(网格、背景颜色、坐标刻度、数据点标记等)、对波形进行缩放(放大、缩小、自适应等)、沿纵横坐标轴移动、设置测量游标等。

此外,还可以将图形区划分为几个子图,将多个信号分别显示在不同的子图中,并根据需要设置各子图的布局方式。
单击图形区上方的布局按钮,再选择格子图合适的布局方式,即可将整个图形区按照所选布局方式进行分割,如图334所示。


图334图形区布局方式设置


然后,单击某个子图区(选中的子图区用框线标出),然后在左侧选择运行实例中的信号,即可将该信号显示到指定子图区。
在图335中,两个子图上下排列布局。单击第1个子图,然后在左侧的存档区选中信号u,则将其波形显示到该子图中。单击选中第2个子图,然后在存档区选择信号y,将其波形显示到该子图中。


图335子图


3. 信号的比较
仿真数据检查器一个重要的功能是可以将多个信号进行比较。例如,比较系统输入、输出信号之间的关系,比较不同的系统模型和模块参数对信号的影响等。
在该例中,已经在数据检查器中得到了两个运行实例Run1和Run2,两个实例对应模型中Gain模块的Gain参数分别为10和5的情况。下面介绍对这两次运行结果得到的输出信号y进行比较的方法。具体操作步骤如下: 
(1) 单击工作区上方的“比较”标签,切换到比较面板,如图336所示。


图336比较面板



(2) 选择“基线”下拉列表最下面的“信号”标签,此时将列出所有运行实例中的信号。单击Run1实例中的信号
y(设为y1)。类似地,在“比较”下拉列表中选择Run2实例中的信号y(设为y2)。
(3) 在“全局绝对误差”和“全局相对误差”框中设置绝对误差和相对误差为默认值0。
(4) 单击比较面板最右侧的“比较”按钮,此时将在比较面板下方显示比较结果,如图337所示。右侧的图形区有上下两个子图,其中上面的子图显示参与比较的两个信号波形,下方的子图显示两个信号的差值(Difference)曲线。


图337确定时间容差


(5) 在图形区,通过游标可以测得y2比y1滞后约0.04s,据此在左侧属性列表中的“基线”列设置时间容差为0.04s。

然后,根据所设置的时间容差进行比较。此时,将在上方子图中基线信号y1的波形和下方的信号差值曲线上绘制出容差带,并且在第2个子图上方将分别显示红色和绿色柱状条,如图338所示。图中,在0~0.16s、0.41~0.58s、0.93~1.0s为绿色柱状条,表示在这些时间范围内,两个信号之间的误差没有超出容差带; 在其余时间范围内,柱状条为红色,表示两个信号之间的幅度误差超出了容差带。



图338时间容差带的设置和显示



(6) 在左侧属性列表中的“基线”列,逐渐增大绝对容差值。重新进行比较,可以观察到不同的容差带。当绝对容差设为0.35时,比较结果如图339所示。此时在0~1s的柱状条都显示为绿色。这说明,两个信号的幅度误差近似为0.35。


图339绝对容差设为0.35时的比较结果

3.7示波器和信号观察器
Simulink中提供了几种方法来显示和观察仿真数据,主要包括信号测试点(Signal Test Point)、信号记录(Signal Logging)、信号查看器(Signal Viewer)、示波器(Scope)和浮动示波器(Floating Scope)。这些不同的方法在仿真模型中用不同的模块和标记表示,如图340所示。在前面的仿真数据检查器中已经用到了Signal Logging,这里继续介绍示波器和信号查看器。


图340仿真数据显示和观察的方法


3.7.1示波器

示波器(Scope)模块用于显示仿真过程中生成的信号波形,通过设置参数,也可以将信号的波形数据导出到工作区。

在仿真模型中双击示波器模块将打开示波器窗口,如图341所示。单击窗口中View菜单下的Configuration Properties菜单命令,可以打开示波器属性配置对话框; 单击Style菜单命令,可以打开示波器样式设置对话框。



图341示波器窗口


1. 示波器属性配置
示波器属性配置对话框如图342所示,通过该对话框对示波器的属性进行设置。


(1) Open at simulation start: 设置何时打开示波器窗口。默认未选中,则需要在仿真模型中双击Scope模块才会打开示波器窗口。如果勾选该选项,则启动仿真后自动打开示波器窗口。

(2) Number of input ports: 示波器输入端子个数。默认设置为1。如果需要在同一个示波器窗口中同时对比观察多个信号,可以将该参数设置为相应的值。


图342示波器属性设置


(3) Layout: 显示画面的数量和排列方式。默认为1×1 画面,即在示波器窗口中只显示一个图形。
(4) Axes scaling: 指定如何设置坐标轴刻度。默认设置为Manual,表示通过Scale Yaxis Limits手工设置y轴刻度。如果设置为Auto,则表示在仿真过程中自动设置y轴刻度。单击Configure按钮,可以继续设置Scale axes limits at stop、Yaxis Data range(%)、Autoscale Xaxis limits等选项。

(5) Time span和Time display offset: 这两个参数位于Time选项卡中,用于设置x轴方向显示的时间范围。例如,如果设置两个参数分别为20和10,则示波器将显示10~30s的波形。如果将两个参数分别设为Auto和0,则默认显示由仿真时间确定的整个时间范围。

(6) Show timeaxis label: 勾选后,将显示时间轴标签。
(7) Title: 该参数位于Display选项卡中,用于设置图形标题,即对应的信号名称。默认设置为 %<SignalLabel>,表示用仿真模型中设置的信号名作为波形图名。


图343波形显示样式设置


2. 波形显示样式设置
示波器样式(Style)设置对话框如图343所示,通过该对话框可以对示波器中波形的显示样式进行设置。

(1) Figure color: 示波器窗口的背景颜色。
(2) Plot type: 绘图类型,可以是Line(连续曲线)、Stairs(阶梯波形)、Stem(点线图)或者Auto(自动确定)。

(3) Axes colors: 设置图形窗口中坐标轴的背景颜色、网格和标签的颜色。
(4) Active display: 活动图形,指定需要设置样式的图形窗口。
(5) Properties for line: 指定需要设置样式的信号波形。如果送入示波器的信号是通过Bus Creator等模块汇总的多个信号,则在一个图形窗口中将同时显示各信号。通过该参数可以指定后面的设置对其中哪个信号起作用。
(6) Line: 设置信号波形曲线的样式、粗细和颜色。
(7) Marker: 设置波形上数据点的标注样式。
3. 波形常用操作

仿真运行后,示波器所连接的信号波形将显示在示波器窗口中。可以对所显示的波形进行很多操作,也能够进行分析和测量。这里列举几种典型的操作。
1) 多个信号的显示
Simulink中的示波器模块功能十分强大,可以实现多踪示波器的功能,在一个示波器窗口中同时显示最多256个信号波形。
要在同一个示波器中同时显示多个信号的波形,可以设置其属性参数Number of input ports为信号的个数。此时,示波器图标上将出现相应个数的端子。也可以在仿真模型中将需要显示的信号连接线直接拖到示波器模块,示波器会自动设置Number of input ports参数,并在图标上添加相应的输入端子。
此外,还可以将多个信号利用Signal Routing子库中的Bus Creator模块合并为一路总线信号,通过示波器的一个输入端子送入。
2) 图形窗口的布局
示波器中的图形窗口可以显示一个信号波形,也可以在同一个图形窗口中叠加显示多个信号的波形。图形窗口的个数和布局方式可以通过属性设置对话框中的Layout按钮进行,也可以单击窗口右侧的Layout按钮或者通过View菜单中的Layout菜单命令进行设置。

如果图形窗口的个数等于示波器输入端子数,则每个图形窗口按照从左往右、从上往下的顺序逐一显示各信号波形。如果图形窗口个数小于输入端子数,则多余的输入信号叠加显示在最后一个图形窗口。

【例35】多个信号的显示。搭建如图344所示的仿真模型。该模型与例32中的模型相同,只是将系统的输入信号u和输出信号y送入示波器。


图344多个信号波形的显示



模型中,信号u和y分别通过两个输入端子送入Scope模块,另外通过Bus Creator模块合并为一路后送入Scope1模块。两个示波器的Number of input ports参数分别设为2和1,其他属性参数都采用默认设置,显示样式适当设置。仿真运行后,在一个图形窗口中将同时显示两个信号的波形,如图345所示。


图345图形窗口的默认布局




图346布局方式设为2行1列的情况

如果将两个示波器的布局方式重新设置为2行1列,此时两个示波器中的显示如图346所示。对于Scope模块,两个信号分别在不同的图形窗口中显示。而对于Scope1模块,由于是将两个信号合并为一路后,由同一个输入端子送入,因此两个信号还是在同一个图形窗口中显示,第二个图形窗口显示为空白。

3) 图形的缩放

通过示波器模块的Axes scaling和Time span可以指定x轴、y轴刻度和x轴方向显示的时间范围。示波器会根据这两个参数的设置自动确定图形窗口中显示的图形大小和范围。除此之外,利用图形窗口上方的Zoom和Scale按钮,还可以对图形窗口所显示的图形进行缩放操作。

在工具栏中单击Zoom或者Scale按钮旁边的下拉箭头,可以在下拉列表中选择对波形进行放大(Zoom In)、缩小(Zoom Out)、
y轴方向放大(Zoom Y)、平移(Pan),或者按照x轴刻度范围(Scale Xaxis limits)、y轴刻度范围(Scale Yaxis limits)还原图形。单击Zoom按钮后,在图形区单击鼠标,即可实现图形的放大或者缩小。如果需要恢复初始图形,可以在图形区右击,在弹出的快捷菜单中单击“还原图形”菜单命令。

在放大或者缩小图形时,还可以通过快捷菜单和工具按钮选择自由缩放、水平缩放或者垂直缩放。以垂直缩放为例,当在快捷菜单中选择“垂直缩放”菜单命令后,光标将变为“工”字形状。在图形窗口将鼠标移动到需要显示的图形区域顶端(或者底端),按下鼠标左键,沿垂直方向拖动鼠标到需要显示的图形区域底端(或者顶端)。释放鼠标左键后,图形将在y轴方向得到放大。
4. 信号的测量和分析
在示波器窗口的Tools菜单中,提供了Measurements(测量)子菜单,可以实现对图形窗口中的信号进行测量分析。具体来说,可以实现游标测量、信号的统计特性分析、峰值检测和过渡过程特性测量等。
1) 游标测量
单击Measurements子菜单下的Cursor Measurements菜单命令,将在示波器窗口右侧显示游标测量面板,此时可以通过使用垂直和水平游标测量信号值,如图347所示。


图347示波器中的游标测量面板



游标测量面板中共有两个选项卡,即Settings(设置)和Measurements,单击选项卡标签左侧的
下三角形图标,可以隐藏或者展开两个选项卡。
在Settings(设置)选项卡中,可以设置屏幕游标(Screen cursors)为水平游标(Horizontal)或垂直游标(Vertical),也可设置波形游标(Waveform cursors)。波形游标一定是垂直游标,如图中右侧图形区域的两根竖线。

在Measurements选项卡中,可以查看或修改信号波形上两个游标处的时间和信号幅度、两个游标处对应的时间和幅度,以及时间差和幅度差、斜率等。
2) 信号的统计特性分析
单击Measurements子菜单下的Signal Statistics(信号统计) 菜单命令,将在示波器窗口右侧显示统计特性分析面板,如图348所示。该面板中将显示所选信号的最大值(Max)、最小值(Min)、峰峰值(Peak to Peak)、平均值(Mean)、中值(Median)和有效值(RMS)等统计特性数据。

需要注意的是,对示波器图形窗口中的波形进行缩放操作后,统计特性数据也将随之变化。
3) 过渡特性测量
单击Measurements子菜单下的Bilevel Measurements(过渡特性测量) 菜单命令,将在示波器窗口右侧显示过渡过程特性测量面板,通过该面板可以测量信号波形的过渡过程、超调、欠调和循环等特性。
4) 峰值检测
单击Measurements子菜单中的Peak Finder(峰值检测) 菜单命令,将在示波器窗口右侧显示峰值检测面板,如图349所示。通过该面板可以查找信号波形的最大值,显示最大值对应的时刻等信息。


图348统计特性分析面板




图349峰值检测面板


5. 波形数据的导出
送入示波器的信号不仅可以在示波器窗口中显示器波形,还可以将波形数据导出到MATLAB工作区。打开示波器模块的属性配置对话框,单击Logging标签,在选项卡中勾选Log data to workspace复选框,同时在Variable name编辑框中输入变量名,并在Save format下拉列表中选择希望的导出数据格式,如图350所示。


图350示波器波形数据导出到工作区


用上述方法设置仿真模型中Scope和Scope1模块的参数,设置导出数据的变量名分别为ScopeData和ScopeData1,设置数据格式分别为数据集(Dataset)和数组(Array)。
完成上述设置后,启动仿真运行。运行得到的信号立即在两个示波器中显示出其波形,同时在MATLAB工作区中得到变量ScopeData和ScopeData1,此外还有时间变量tout和状态变量xout。
变量ScopeData和ScopeData1分别是数据集对象和数组,要根据这两个变量绘制出信号的波形,可以参考前面介绍的方法。这里介绍另外一种方法。
首先,在模型参数配置对话框的Data Import/Export面板中勾选Single simulation output复选框,并在右侧的编辑框中输入变量名out。该设置将使仿真模型中导出的所有数据合并为一个变量out。
然后,在命令行窗口输入如下命令启动仿真运行。



>>out=sim('ex3_5_1')






其中,ex3_5_1.slx为本例中的模型文件名。

执行上述命令后,在MATLAB工作区得到一个变量out,并且在命令行窗口显示如图351所示的信息,其中表明ScopeData是一个数据集对象,ScopeData1是一个51×3的矩阵,而tout为长度等于51的列向量。


在工作区中双击out变量,将在命令行窗口上方的子窗口中显示该变量的相关信息,如图352(a)所示。与前面介绍的以数据集和数组格式导出数据相同,通过逐级双击,可以查看数组中保存的信号数据或者数据集对象中的各索引项和属性。例如,依次双击ScopeData、ScopeData索引列表中第一行的Value列,再双击Values属性,得到如图352(b)所示时间序列,该序列对应Scope模块中第一个信号的波形数据。


图351调用sim()函数启动仿真运行并导出数据




图352out变量的相关信息


绘制该信号的时间波形可以采用如下命令: 



>> t=out.ScopeData{1}.Values.Time;

>> sig1=out.ScopeData{1}.Values.Data(:,1);

>> plot(t,sig1)







3.7.2浮动示波器和信号观察器
在仿真模型中也可以采用浮动示波器模块或信号查看器观测信号。与示波器模块不同的是,浮动示波器没有输入端。观测信号时,不需要将信号通过连接线送入浮动示波器和信号观察器。因此,对于复杂的仿真模型,可以极大地减少仿真模型中的信号连接线。
1. 浮动示波器

浮动示波器(Floating Scope)位于Simulink/Sinks库中。要使用浮动示波器时,可从该库中找到该模块,将其添加到仿真模型中。下面举例说明浮动示波器的使用方法。
【例36】浮动示波器的使用。搭建如图353所示的仿真模型。


图353浮动示波器的使用



搭建好仿真模型后,首先在仿真模型中双击Floating Scope模块以打开浮动示波器窗口。浮动示波器窗口与普通的示波器窗口类似,不同的是,在工具栏中增加了一个Signal Selector(信号选择器)按钮。
单击Signal Selector按钮,Simulink编辑器中的模型编辑区将变为灰色。此时,光标末端将出现一个特殊的标记。按住鼠标左键在编辑区任意拖动,在合适的位置松开鼠标,将立即弹出一个对话框,如图354所示。对话框中列出了拖动区域所覆盖的所有信号。如果没有出现希望的信号,可以重新拖动选择区域。


图354连接到浮动示波器的信号选择


在对话框中勾选需要连接到浮动示波器的信号。在图354中,选中了模型的输入信号u和输出信号y。然后,单击模型编辑区右上角的“X”符号,即可将选中的信号添加到浮动示波器。

运行仿真,即可在浮动示波器窗口中同时显示出信号u和y的波形。

浮动示波器窗口与普通的示波器窗口类似,可以通过菜单命令或者工具按钮进行属性设置、显示样式设置等。如果需要将同一个示波器窗口划分为几个子窗口,也可以通过设置示波器窗口的布局实现。

如果要将多个信号显示到浮动示波器中不同的子窗口,需要首先设置示波器的布局方式。然后,通过拖动弹出的对话框
,上方的下拉列表中将会出现与各子窗口相对应的选项,依次为Display1、Display2等。连接信号到浮动示波器时,首先选择需要连接到哪一个子窗口,然后再选择相应的信号,如图355所示。


图355连接信号到浮动示波器不同的子窗口


2. 信号观察器

除浮动示波器以外,Simulink还提供了具有类似功能的信号观察器。下面仍然通过具体例子介绍其使用方法。
【例37】信号观察器的使用。仿真模型与上例相同,但不再需要浮动示波器模块。

在仿真模型中单击需要观察的信号线y,Simulink编辑器窗口顶部将增加一个SIGNAL标签。单击SIGNAL选项卡MONITOR按钮组中的Add Viewer,将打开如图356所示的对话框,单击Scope,即可为所选中的信号y添加一个观察器,同时将立即打开观察器(Viewer)窗口,窗口自动命名为Viewer: Scope(y),如图357所示。


图356Add Viewer对话框




图357信号观察器窗口


用类似方法为仿真模型中的信号u添加观察器,将打开另一个信号观察器窗口Viewer :Scope(u)。在仿真模型中,添加了观察器的信号u和y旁边将出现一个示波器形状的标记,如图358所示。


图358添加了信号观察器的仿真模型


运行仿真,信号u和y的波形将分别出现在对应的信号观察器窗口。信号观察器窗口与普通的示波器窗口基本相同,通过菜单命令和工具栏按钮同样可以进行属性和显示样式的设置。与普通示波器窗口的区别是,在工具栏中增加了一个Signal Selector(信号选择器)按钮,通过单击该按钮可以自动返回仿真模型,从中选择需要观察的信号。

此外,如果关闭了信号观察器,可以在仿真模型中单击信号旁边的示波器标记重新打开。也可以与普通示波器一样,勾选File菜单中的Open at Start of Simulation菜单命令,以便在每次仿真运行后自动打开相应的信号观察器窗口。
本章习题
1. Simulink的工作环境包括和。
2. Simulink中的所有信号源模块都位于库中。
3. 位于库中的所有模块都只有输入端,没有输出端。
4. 在Simulink的模型浏览器中,面板用于显示模型的树状结构视图; 单击某个模型,将在面板中显示模型中的所有模块; 单击某个模块,将在面板中显示该模块的所有参数。
5. 假设仿真运行时间为10s,则对于固定步长自动求解器,步长为。
6. 假设仿真模型中所有信号的最高频率为500Hz,则在求解器中最大步长不能超过。

7. Simulink中设置模块参数有哪4种方法?简述各方法的操作步骤。
8. 简述什么是求解器及其分类。
9. 简述在仿真模型运行的仿真循环阶段,在计算模型输出状态时,连续系统和离散系统的主要区别。

10. 要通过调用sim()函数,采用ode45求解器运行名为hill.slx的模型文件,将仿真运行10s的结果保存到Simulink.SimulationOutput对象y中,写出相应的语句或命令。

11. 某仿真模型中有3个Out模块,连接的信号名分别为y1、y2和y3,3个信号分别以数组格式、结构体格式和数据集格式导出到MATLAB工作区,然后用plot语句将3个信号的波形绘制在同一个图形窗口中。假设模型参数配置对话框中的Data Import/Outport选项都取默认设置,分别写出相应的命令或者语句。

12. 某动态系统的Simulink仿真模型如题图31所示,其中x和y分别为系统的输入和输出。

(1) 分析该模型实现的系统功能。
(2) 若Step模块的参数取默认值,仿真运行时间为5s,分析并粗略绘制出仿真运行后示波器上显示的3个信号波形。


题图31


实践练习
1. 搭建如题图32所示Simulink仿真模型,求二阶系统的单位阶跃响应。注意,设置Step模块的Step time为0,其他参数取默认值。


题图32


要求: 
(1) 选用固定步长求解器,步长设置为0.01s,仿真运行5s,观察运行结果; 

(2) 选用变步长求解器,求解器所有参数取默认值auto。仿真运行5s,观察示波器上的信号波形,并与(1)中的波形进行比较。
2. 搭建仿真模型如题图33所示。模型中Pulse Generator模块产生幅度为2V、周期为1s的单极性周期方波。在模型参数配置对话框中设置求解器为固定步长,并在Data Import/Outport面板中清除Single simulation output复选框。



题图33


要求: 
(1) 根据示波器上显示的信号x和y的波形,分析该仿真模型实现的功能; 
(2) 将信号x和y的波形数据以数组的格式保存到MAT文件的变量s1中,然后用plot语句在两个子图中分别绘制其波形; 
(3) 将信号x和y以时间序列的格式保存到工作区的变量s2中,然后用plot语句在两个子图中分别绘制其波形。