Presentation is loading. Please wait.

Presentation is loading. Please wait.

第七章 Simulink建模和仿真 在计算机技术飞速发展的今天,许多科学研究、工程设计由于其复杂性越来越高,因此与计算机的接合日趋紧密。也正是计算机技术的介入,改变了许多学科的结构、研究内容和研究方向。例如,计算流体力学、计算物理学、计算声学等新兴学科的兴起,均与计算机技术的发展分不开。控制理论、仿真技术本身与计算机的接合就十分紧密,而随着专业领域的研究深入和计算机软硬件技术的发展,这种联系呈现更加紧密。计算控制论的建立,足以说明这个问题。而这种发展,又以系统仿真技术的发展分不开的。

Similar presentations


Presentation on theme: "第七章 Simulink建模和仿真 在计算机技术飞速发展的今天,许多科学研究、工程设计由于其复杂性越来越高,因此与计算机的接合日趋紧密。也正是计算机技术的介入,改变了许多学科的结构、研究内容和研究方向。例如,计算流体力学、计算物理学、计算声学等新兴学科的兴起,均与计算机技术的发展分不开。控制理论、仿真技术本身与计算机的接合就十分紧密,而随着专业领域的研究深入和计算机软硬件技术的发展,这种联系呈现更加紧密。计算控制论的建立,足以说明这个问题。而这种发展,又以系统仿真技术的发展分不开的。"— Presentation transcript:

1 第七章 Simulink建模和仿真 在计算机技术飞速发展的今天,许多科学研究、工程设计由于其复杂性越来越高,因此与计算机的接合日趋紧密。也正是计算机技术的介入,改变了许多学科的结构、研究内容和研究方向。例如,计算流体力学、计算物理学、计算声学等新兴学科的兴起,均与计算机技术的发展分不开。控制理论、仿真技术本身与计算机的接合就十分紧密,而随着专业领域的研究深入和计算机软硬件技术的发展,这种联系呈现更加紧密。计算控制论的建立,足以说明这个问题。而这种发展,又以系统仿真技术的发展分不开的。 为了满足用户对工程计算的要求,一些软件公司相继推出一批数学类科技应用软件,如Matlab、Xmath、Mathematica、Maple等。其中MathWorks公司推出的Matlab由于有强大的功能和友好的用户界面受到越来越多的科技工作者的青睐,尤其是控制领域的专家和学者 .

2 第七章 Simulink建模和仿真 Matlab具有友好的工作平台和编程环境、简单易学的编程语言、强大的科学计算和数据处理能力、出色的图形和图像处理功能、能适应多领域应用的工具葙、适应多种语言的程序接口、模块化的设计和系统级的仿真功能等,诸多的优点和特点。 支持Matlab仿真是Simulink工具箱,Simulink一般可以附在Matlab上同时安装,也有独立版本来单独使用。但大多数用户都是附在Matlab上,以便能更好地发挥Matlab在科学计算上的优势,进一步扩展Simulink的使用领域和功能。 本章详细地向用户介绍Simulink地建模方法、使用操作、以及使用Simulink进行系统级的仿真和设计原理。使读者通过本章地学习,不但可以进一步掌握计算机仿真的基本概念和理论,也可以初步学会使用Simulink去真正地运用仿真技术解决科研和工程中地实际问题。

3 第七章 Simulink建模和仿真 7.1 Simulink的概述和基本操作
近几年来,在学术界和工业领域,Simulink已经成为动态系统建模和仿真领域中应用最为广泛的软件之一。Simulink可以很方便地创建和维护一个完整地模块,评估不同地算法和结构,并验证系统的性能。由于Simulink是采用模块组合方式来建模,从而可以使得用户能够快速、准确地创建动态系统的计算机仿真模型,特别是对复杂的不确定非线性系统,更为方便。 Simulink模型可以用来模拟线性和非线性、连续和离散或者两者的混合系统,也就是说它可以用来模拟几乎所有可能遇到动态系统。另外Simulink还提供一套图形动画的处理方法,使用户可以方便的观察到仿真的整个过程。 Simulink没有单独的语言,但是它提供了S函数规则。所谓的S函数可以是一个M函数文件、FORTRAN程序、C或C++语言程序等,通过特殊的语法规则使之能够被Simulink模型或模块调用。S函数使Simulink更加充实、完备,具有更强的处理能力。

4 第七章 Simulink建模和仿真 7.1 Simulink的概述和基本操作
同Matlab一样,Simulink也不是封闭的,他允许用户可以很方便的定制自己的模块和模块库。同时Simulink也同样有比较完整的帮助系统,使用户可以随时找到对应模块的说明,便于应用。 综上所述,Simulink就是一种开放性的,用来模拟线性或非线性的以及连续或离散的或者两者混合的动态系统的强有力的系统级仿真工具。 目前,随着软件的升级换代,在软硬件的接口方面有了长足的进步,使用Simulink可以很方便地进行实时的信号控制和处理、信息通信以及DSP的处理。世界上许多知名的大公司已经使用Simulink作为他们产品设计和开发的强有力工具。

5 第七章 Simulink建模和仿真 7.1 Simulink的概述和基本操作
7.1.2 基本操作 一、模型基本结构 一个典型的Simulink模型包括如下三种类型的元素: ① 信号源模块 ② 被模拟的系统模块 ③ 输出显示模块 如图7.1.1所示说明了这三种元素之间的典型关系。系统模块作为中心模块是Simulink仿真建模所要解决的主要部分;信号源为系统的输入,它包括常数信号源函数信号发生器(如正弦和阶跃函数波等)和用户自己在Matlab中创建的自定义信号或Matlab工作间中三种。输出模块主要在Sinks库中。 图 Simulink模型元素关联图

6 第七章Simulink建模和仿真 7.1 Simulink的概述和基本操作
Simulink模型并不一定要包含全部的三种元素,在实际应用中通常可以缺少其中的一个或两个。例如,若要模拟一个系统偏离平衡位置后的恢复行为,就可以建立一个没有输入而只有系统模块加一个显示模块的模型。在某种情况下,也可以建立一个只有源模块和显示模块的系统。若需要一个由几个函数复合的特殊信号,则可以使用源模块生成信号并将其送入Matlab工作间或文件中。 二、仿真运行原理 Simulink仿真包括两个阶段;初始化阶段和模型执行阶段 (1) 模块初始化 在初始化阶段主要完成以下工作: ① 模型参数传给Matlab进行估值,得到的数值结果将作为模型的实际参数; ② 展开模型的各个层次,每一个非条件执行的子系统被它所包含的模块所代替;

7 第七章Simulink建模和仿真 7.1 Simulink的概述和基本操作
③ 模型中的模块按更新的次序进行排序。排序算法产生一个列表以确保具有代数环的模块在产生它的驱动输入的模块被更新后才更新。当然,这一步要先检测出模型中存在的代数环。 ④ 决定模型中有无显示设定的信号属性,例如名称、数据类型、数值类型以及大小等,并且检查每个模块是否能够接受连接到它输入端的信号。Simulink使用属性传递的过程来确定未被设定的属性,这个过程将源信号的属性传递到它所驱动的模块的输入信号; ⑤ 决定所有无显示设定采样时间的模块的采样时间; ⑥ 分配和初始化用于存储每个模块的状态和输入当前值的存储空间。 完成这些工作后就可以进行仿真了。 2) 模型执行 一般模型是使用数值积分来进行仿真的。所运用的仿真解法器(仿真算法)依赖于模型提供它的连续状态微分能力。计算微分可以分两步进行:

8 第七章Simulink建模和仿真 7.1 Simulink的概述和基本操作
① 首先,按照排序所决定的次序计算每个模块的输出。 ② 然后,根据当前时刻的输入和状态来决定状态的微分;得到微分向量后再把它返回给解法器;后者用来计算下一个采样点的状态向量。一旦新的状态向量计算完毕,被采样的数据源模块和接受模块才被更新。 在仿真开始时模型设定待仿真系统的初始状态和输出。在每一个时间步中,Simulink计算系统的输入、状态和输出,并更新模型来反映计算出的值。在仿真结束时,模型得出系统的输入、状态和输出。 在每个时间步中,Simulink所采取的动作依次为: ① 按排列好的次序更新模型中模块的输出。Simulink通过调用模块的输出函数计算模块的输出。Simulink只把当前值、模块的输入以及状态量传给这些函数计算模块的输出。对于离散系统,Simulink只有在当前时间是模块采样时间的整数倍时,才会更新模块的输出。

9 第七章Simulink建模和仿真 7.1 Simulink的概述和基本操作
④ 计算下一个仿真时间步的时间。这是通过调用模块获得下一个采样时间函数来完成的。 (3) 定模块更新次序 在仿真中,Simulink更新状态和输出都要根据事先确定的模块更新次序,而更新次序对方针结果的有效性来说非常关键。特别当模块的输出是当前输入值的函数时,这个模块必须在驱动它的模块被更新之后才能被更新,否则,模块的输出将没有意义。

10 第七章Simulink建模和仿真 7.1 Simulink的概述和基本操作
为了建立有效的更新次序,Simulink根据输入和输出的关系将模块分类。其中,当前输出依赖于当前输入的模块称为直接馈入模块,所有其他的模块都称为非虚拟模块。直接馈入模块的例子有Gain、Product和Sum模块;非直接馈入模块的例子有Integrator模块(它的输出只依赖于它的状态),Constant模块(没有输入)和Memory模块(它的输出只依赖于前一个模块的输入)。 基于上述分类,Simulink使用下面两个基本规则对模块进行排序: ① 每个模块必须在它驱动的所有模块更新之前被更新。这条规则确保了模块被更新时输入有效。 ② 若非直接馈入模块在直接馈入模块之前更新,则它们的更新次序可以是任意的。这条规则允许Simulink在排序过程中忽略非虚拟模块。 另外一个约束模块更新次序的因素是用户给模块设定优先级,Simulink在低优先级模块之前更新高优先级模块。

11 第七章 Simulink建模和仿真 7.2 基本模块
由于大多数物理系统都可以用微分方程组和代数方程组来描述,Simulink也采用的是本教材第四章介绍的面向结构图的数字仿真原理。但其功能块的类型、数值解法、功能快的描述、以及建模方式和方法远远超出CSS仿真程序包,其界面也更加友好。 Simulink 4把功能块分成9类,分别放置在9个库中,如图7.2.1所示:源模块库(Sources)、输出显示库(Sinks)、离散模块库(Discrete)、连续模块库(Continuous)、非线性模块库(Nonlinear)、数学函数库(Math)、通用函数及列表库(Functions and Tables)、信号处理及系统类模块库(Signal and Systems)和子系统模块库(Subsystems)。 表7.2.1到表7.2.8列出了个库包含的主要模块及简单说明。图7.2.2到图7.2.10列出了各库包含的主要模块种类图形。

12 第七章 Simulink建模和仿真 7.2 基本模块
模 块 名 说 明 Clock 显示或者提供仿真时间 Constant 产生一个常数值信号 Digital clock 产生数字采样时间信号 Digital pulse generator 产生数字脉冲信号 From file 从文件读取数据输入 From work space 从工作间定义的矩阵读入数据 Pulse generator 产生脉冲信号 Ramp 产生“斜坡”信号 Random number 产生正态分布的随机信号 Repeating sequence 产生周期序列信号 Signal generator 信号发生器 Sine wave 正弦波信号 Step 产生一个阶跃信号 Uniform random number 产生均匀分布的随机信号 表 Source库

13 第七章 Simulink建模和仿真 7.2 基本模块
表 Sinks库 模 块 名 说 明 Display 显示输入信号的值 Scope 显示信号的波形 Stop simulation 当输入信号为0时结束仿真 To file 向文件中写数据 To workspace 向工作间定义的变量写数据到 XY graph Matlab图形窗口显示信号的二维图

14 第七章 Simulink建模和仿真 7.2 基本模块
表 Discrete库 模 块 名 说 明 Discrete filter 实现IIR和FIR滤波器 Discrete state-space 实现离散状态空间系统 Discrete-time integrator 离散时间积分器 Discrete transfer fcn 实现离散传递函数 Discrete zero-pol 实现用零极点表达的离散传递函数 First-order hold 实现一阶采样保持系统 Unit delay 单位采样时间延迟器 Zero-order hold 实现采样的零阶保持

15 第七章 Simulink建模和仿真 7.2 基本模块
表 Continuous库 模 块 名 说 明 Derivative 信号的微分运算 Integrator 信号的积分运算 Memory 输出前一个时间步的输入值 State-space 实现线性状态空间系统 Transfer fcn 实现线性传递系统 Transport delay 对输入信号进行传输延时 Variable transport delay 对输入信号进行可变时间的传输延时 Zero-pole 实现零-极点表达式的传递函数

16 第七章 Simulink建模和仿真 7.2 基本模块
模 块 名 说 明 Abs 信号的绝对值 Algebraic constraint 将输入信号强制为零 Combinatorial logic 实现一个真值表 Complex to magnitude-angle 输出一个复数输入信号的幅角和模 Complex to real-imag 输出一个复数信号的实部和虚部 Dot product 向量信号的点积 Gain 将模块的输入信号乘上一个增益 Logical operator 输入信号的逻辑操作 Magnitude-angle to complex 将模和幅角的信号转换成为复数信号 表 Math库

17 第七章 Simulink建模和仿真 7.2 基本模块
Math function 实现数学函数 Matrix gain 将输入乘上一个矩阵增益 Minmax 信号的最小值和最大值 Product 信号的乘积或者商 Real-imag to complex 将实部虚部的信号转换成为复数信号 Relational operator 进行指定的关系运算 Rounding function 实现舍入运算 Sign 符号函数 Slider gain 滑块增益 Sum 输入信号的和 Trigonometric function 实现三角函数运算

18 第七章 Simulink建模和仿真 7.2 基本模块
表 Function and Tables函数 模 块 名 说 明 Fcn 实现自定义表达式的输入信号 Look-up table 实现输入的线性查表 Look-up table(2-d) 实现两维信号的线性查表 Matlab fcn 实现Matlab函数或表达式输入信号 S-Function S函数模块

19 第七章 Simulink建模和仿真 7.2 基本模块
表 Nonlinear 库 模 块 名 说 明 Backlash 偏移模块 Coulomb&viscous friction 模拟原点不连续系统 Dead zone 输出一个零输出的区域 Manual switch 在信号间手工切换 Multiport switch 多端口的切换(开关)器 Quantizer 按指定的间隔离散化输出信号 Rate limiter 限制信号的改变速率 Relay 实现继电器功能 Saturation 限制信号的饱和度 Switch 在两个信号间切换

20 第七章 Simulink建模和仿真 7.2 基本模块
模 块 名 说 明 Bus selector 有选择的输出信号 Configurable subsystem 代表任何一个从指定的库中选择的模块 Data store memory 定义共享数据存储空间 Date store read 从共享数据空间读数据并输出 Date story write 写数据到共享数据存储空间 Date type conversion 将信号转换为其它数据类型 Demux 将一个向量信号分解输出 Enable 为子系统增加激活断口 From 从一个Goto模块接受信号 Goto 传递信号到From模块 Goto tag visibility 定义Goto模块标记的可视域 Ground 将末连接的输入端接地 表 Signal and Systems库

21 第七章 Simulink建模和仿真 7.2 基本模块
表 Signal and Systems库 模 块 名 说 明 Hit crossing 检测过零点 IC 设置一个信号的初始值 Inpl 为子系统建立一个输入端口或建立一个外部入口 Merge 将几个输入量合并为一个标量的输出串 Modelinfo 显示模型信息 Mux 将几个输入信号合成一个向量信号 Out 1 为子系统建立一个输出端口或建立一个外部出口 Probe 信号的宽度,采样时间及信号类型 Subsystem 子系统模块 Terminator 结束一个未连接的输出端口 Trigger 为子系统增加触发端口 Width 输入向量的输出宽度 Selector 在输入信号中选择并输出

22 第七章 Simulink建模和仿真 7.2 基本模块
图7.2.1 库的类型 图7.2.2 Sources库

23 第七章 Simulink建模和仿真 7.2 基本模块
图 Sinks库 图7.2.4 Discrete库 图7.2.5 Continuous库

24 第七章 Simulink建模和仿真 7.2 基本模块
图7.2.7 Nonlinear库 图7.2.6 Math库

25 第七章 Simulink建模和仿真 7.2 基本模块
图7.2.8 Signak & Systems库

26 第七章 Simulink建模和仿真 7.2 基本模块
图7.2.9 Subsystems库

27 第七章 Simulink建模和仿真 7.2 基本模块
图 Functions & Tables库

28 第七章 Simulink建模和仿真 7.2 基本模块
(1) External reset 为外部重置选项。它用在当重置信号中发生触发事件时,模块将照初始条件重置状态。 (2) initial condition source 此项用来从初始条件参数或外部模块中获取初始条件。 (3) initial condition 此区域用来设置初始条件。 (4) Limit output 如果此项被选中,则状态将被限制在饱和度下限和上限之间。 (5) Upper saturation limit 此参数用来设置饱和度上限。 (6) Lower saturation limit此参数用来设置饱和度下限。 (7) Show saturation port 若此项被选中,则模块上将增加一个饱和度端口。 (8) Show state port 若此项被选中,则模块上将增加一个状态端口。

29 第七章 Simulink建模和仿真 7.2 基本模块
(9) Absolute tolerance 此参数用来设置模块状态的绝对误差。 图 积分模块属性对话框

30 第七章 Simulink建模和仿真 7.3 建模方法
利用Simulink建立物理系统和数学系统的仿真模型,关键是对Simulink提供的功能模块进行操作,即用适当的方式将各种模块连接在一起。本小节将介绍模块的基本操作。在介绍具体的操作之前先对建模过程提两点建议: ⑴ 在建模之前,应对模块和信号线有一个整体、清晰和仔细的安排,以便能减少建模时间; ⑵ 及时对模块和信号线命名、及时对模型加标注,以增强模型的可读性。 本小节将详细介绍创建Simulink仿真模型的过程,包括模块操作、编辑信号线及标注模型等。

31 第七章 Simulink建模和仿真 7.3 建模方法
7.3.1 模块的操作 模块是建立Simulink模型的基本单元。用适当的方法把各种模块连接在一起就能够建立任何动态系统的模型。 一、选取模块 当选取单个模块时,只要用鼠标在模块上单击即可,这是模块的角上出现黑色的小方块。选取多个模块时,在所有模块所占区域的一角按下鼠标左键不放,拖向该区域的对角,在此过程中会出现虚框,当虚框包住了要选的所有模块后,放开鼠标左键,这时在所有被选模块的角上都会出现小黑方块,表示模块被选中了。此过程如图7.3.1所示。 图 选取多个模块

32 第七章 Simulink建模和仿真 7.3 建模方法
二、复制、删除模块 (1) 在不同的窗口之间复制 当我们建立模型时,需要从模块库窗口或者已经存在的窗口把需要的模块复制到新建模型文件的窗口。要对已经存在的模块进行编辑时,有时也需要从模块库窗口或另一个已经存在的模型窗口复制模块。 最简单的办法是用鼠标左键点住要复制的模块(首先打开源模块和目标模块所在的窗口),按住左键移动鼠标到相应窗口(不用按住Ctrl键),然后释放,该模块就会被复制过来,而源模块不会被删除。 当然还可以使用Edit菜单的Copy和Paste命令来完成复制:先选定要复制的模块,选择Edit菜单下的Copy命令,到目标窗口的Edit菜单下选择Paste命令。 (2) 在同一个模型窗口内复制 有时一个模型需要多个相同的模块,这时的复制方法如下: 用鼠标左键点住要复制的模块,按住左键移动鼠标,同时按下Ctrl键,到适当位置释放鼠标,该模块就被复制到当前位置。更简单的方法是按住鼠标右键(不按Ctrl键)移动鼠标。

33 第七章 Simulink建模和仿真 7.3 建模方法
另一种方法是先选定要复制的模块,选择Edit下的Copy命令,然后选择Paste命令。 在图7.3.2的复制结果中我们会发现复制出的模块名称在原名称的基础上又加了编号,这是Simulink的约定:每个模型中的模块和名称是一一对应的,相同的模块或不同的模块都不能用同一个名字。 图 在同一模型窗口内复制模块

34 第七章 Simulink建模和仿真 7.3 建模方法
(3) 删除模块 选定模块,选择Edit菜单下的Cut(删除到剪贴板)或Clear(彻底删除)命令。或者在模块上单击鼠标右键,在弹出菜单上选择Cut或Clear命令。 三、模块的参数和特性设置 Simulink中几乎所有模块的参数(Parameter)都允许用户进行设置。只要双击要设置参数的模块就会弹出设置对话框,如图7.3.3所示。这是正弦波模块的参数设置对话框,您可以设置它的幅值、频率、相位、采样时间等参数。模块参数还可以用set-param命令修改,这在后面将会讲到。

35 第七章 Simulink建模和仿真 7.3 建模方法
每个模块都有一个内容相同的特性(Properties)设置对话框,如图7.3.4所示。它包括如下几项: (1) 说明(Description) 是对该模块在模型中用法的注释。 (2) 优先级(Priority) 规定该模块在模型中相对于其他模块执行的有限顺序。优先级的数值必须是整数或不输入数值,这时系统会自动选取合适的优先级。优先级的数值越小(可以是负整数),优先级越高。 (3) 标记(Tag) 用户为模块添加的文本格式的标记。 (4) 调用函数(Open function) 当用户双击该模块时调用的Matlab函数。 (5) 属性格式字符串(Attributes format string)

36 第七章 Simulink建模和仿真 7.3 建模方法
图7.3.3 模块参数设置对话 图7.3.4 模块特性设置对话框

37 第七章 Simulink建模和仿真 7.3 建模方法
指定在该模块的图标下显示模块的那个参数,以什么格式显示。属性格式字符串由任意的文本字符串加嵌入式参数名组成。例如,对一个传递函数模块指定如下的属性格式字符串: 优先级=%<priority>\n传函分母=%<Denominator> 该模块显示如图7.3.5的内容: 如果参数的值不是字符串或数字,参数值的位置会显示N/S(not supported)。如果参数名无效,参数值的位置将显示“???”。 图 设置属性格式字符串后的效果

38 第七章 Simulink建模和仿真 7.3 建模方法
四、模块外形的调整 (1) 改变模块的大小 选定模块,用鼠标点住其周围的四个黑方块中的任意一个拖动,这时会出现虚线的矩形表示新模块的位置,到需要的位置后释放鼠标即可。 (2) 调整模块的方向 选定模块,选取菜单Format下的Rotate Block使模块旋转90º,Flip Block使模块旋转180º。效果如图7.3.6所示。 (3) 给模块加阴影 选定模块,选取菜单Format下的Show Drop Shadow使模块产生阴影效果。如图7.3.7所示。 图 调整模块的方向 图 模块的阴影效果

39 第七章 Simulink建模和仿真 7.3 建模方法
五、模块名的处理 (1) 模块名的显示与否选定模块,选取菜单Format下的Hide Name,模块名就会被隐藏,同时Hide Name改为Show Name。选取Show Name就会使模块隐藏的名字显示出来. (2) 修改模块名 用鼠标左键单击模块名的区域,这时会在此处出现编辑状态的光标,在这种状态下能够对模块名随意修改。 模块名和模块图标中的字体也可以更改,方法是选定模块,在菜单Format下选取Font,这时会弹出Set Font的对话框,在对话框中选取想要的字体。 (3) 改变模块名的位置 模块名的位置有一定的规律,当模块的接口在左右两侧时,模块名只能位于模块的上下两侧,缺省在下侧:当模块的接口在上下两侧时,模块名只能位于模块的左右两侧,缺省在左侧。 因此模块名只能从原位置移到相对的位置。可以用鼠标拖动模块名到其相对的位置;也可以选定模块,用菜单Format下的Flip Name实现相同的移动。

40 第七章 Simulink建模和仿真 7.3 建模方法
7.3.2 模块的连接 上面我们介绍了对模块本身的各种操作。当我们设置好了各个模块后,还需要把它们按照一定的顺序连接起来采能组成一个完整的系统模型。一下我们将讨论模块连接的相关问题。 一、在模块间连线 (1) 连接两个模块 这是最基本的情况:从一个模块的输出端连到另一个模块的输入端。方法是在移动鼠标到输出端,鼠标的箭头会变成十字形光标,这是点住鼠标左键,移动鼠标到另一个模块的输入端,当十字光标出现“重影”时,释放鼠标左键就完成了连接。 如果两个模块不在同一水平线上,连线是一条折线。要用斜线表示,需要在连接时按住Shift键。两种连接的结果见图7.3.8。 图 两模块不在同一水平线上

41 第七章 Simulink建模和仿真 7.3 建模方法
(2) 模块间连线的调整 如图7.3.9,这种调整模块间连线位置的情况采用鼠标简单拖动的办法实现。即先把鼠标移到需要移动的线段的位置,按住鼠标左键,移动鼠标到目标位置,释放鼠标左键。 还有一种情况如图7.3.10所示,要把一条直线分成斜线段。调整方法和前一种情况类似,不同之处在于按住鼠标之前要先按下Shift键,出现小黑方框之后,鼠标点住小黑方框移动,移动好后释放Shift键和鼠标。 图 调整连线的位置(二) 图 调整连线的位置(一)

42 第七章 Simulink建模和仿真 7.3 建模方法
(3) 在连线之间插入模块 把该模块用鼠标拖到连线上,然后释放鼠标即可。 (4)连线的分支 我们经常会碰到一些情况,需要把一个信号输送到不同的模块,这时就需要分支结构的连线。如图7.3.11所示,要把正弦波信号实时显示出来,同时还要到存到文件。这种情况地步骤是:在先连好一条线以后,把鼠标移到支线的起点位置,先按下键,然后按住Ctrl鼠标拖到目标模块的输入端,释放鼠标和Ctrl键。 图 连线的分支

43 第七章 Simulink建模和仿真 7.3 建模方法
二、在连线上反映信息 (1) 用粗线表示向量 为了能比较直观地区别各个模块之间传输的数据是数据还是矩阵(向量),可以选择模型文件菜单Format下的Wide vector Lines选项,这样传输向量的连线就会变粗。如果再选择Format 下的Vector Lines Widths选项,在传输矩阵的连线上方会显示出通过该连线的矩阵维数。如图7.3.12,模块State Space的输入为二维矩阵,在加粗的输入输出线的上方分别标出了相应矩阵的维数。 图 用粗线表示向量

44 第七章 Simulink建模和仿真 7.3 建模方法
(2) 显示数据类型 在连线上可以显示一个模块输出的数据类型:选择菜单Format下的Port Data Types选项。结果如图7.3.13所示。 图 在连线上显示数据类型 (3) 信号标记 为了使模型更加直观、可读性更强,我们可以为传输的信号 作标记。 建立信号标记的办法是:双击要做标记的线段,出现一个小 文本编辑框,在里面输入标记的文本,这样就建立了一个信 号标记。信号标记可以随信号的传输从一些模块中进行传递。 支持这种传递的模块有Mux、Demux、Inport、From、 Selector、Subsystem和Enable。

45 第七章 Simulink建模和仿真 7.3 建模方法
要实现信号标记的传递,需要在上面列出的某个模块的输出端建立一个以“<” 开头的标记。如图7.3.14所示。当开始仿真或执行Edit菜单下的Updata Diagram命令时,传输过来的信号标记就会显示出来。图7.3.15显示出了这个传递的结果。 图 信号标记的建立 图 信号标记的传递

46 第七章Simulink建模和仿真 7.4 系统仿真举例
利用Simulink仿真,其仿真工作过程与我们前面几节所介绍的仿真方法类似,对应与Simulink采用的图形输入方式。因此,我们对其建模有以下基本要求: 清晰性 一个大的系统往往由许多子系统组成,因此对应的系统模型也由许多子模型组成。在子模型与子模型之间,除了为实现研究目的所必需的信息联系以外,相互耦合要尽可能少,结构尽可能清晰。 切题性 系统模型只应该包括与研究目的有关的方面,也就是与研究目的有关的系统行为子集的特征描述。对于同一个系统,模型不是唯一的,研究目的不同,模型也不同。如研究空中管制问题,所关心的是飞机质心动力学与坐标动力学模型;如果研究飞机的稳定性和操纵性问题,则关心的是飞机绕质心的动力学和驾驶仪动力学模型。

47 第七章 Simulink建模和仿真 7.4 系统仿真举例
精确性 同一个系统的模型按其精确程度要求可以分为许多级。对不同的工程,精确程度要求不一样。例如用于飞行器系统研制全过程的工程仿真器要求模型的精度较高,甚至要考虑到一些小参数对系统的影响,这样的系统模型复杂,对仿真计算机的性能要求也高;但用于训练飞行员的飞行仿真器,对模型的精度要求则相对低一些,只要被培训人员感觉“真”即可。 集合性 这是指把一些个别的实体能组成更大实体的程度,有时要尽量从能合并成一个大的实体的角度考虑对一个系统实体的分割。例如对武器射击精度的鉴定,并不十分关心每发子弹的射击偏差,而着重讨论多发子弹的统计特性。

48 第七章Simulink建模和仿真 7.4 系统仿真举例
7.4.1非线性系统的模拟 例7.4.1 汽车行驶如图7.4.1所示的斜坡上通过受力分析可知在平行于斜面的方向上有三个力作用于汽车上:发动机的力、空气阻力和重力沿斜面的分量下滑力。设计汽车控制系统并进行仿真。 图7.4.1 斜坡上的汽车 由牛顿第二定律,汽车的运动方程为: 其中m代表汽车的质量,x为汽车的位移。 在实际系统中总会有下界和上界,上界为发动机的最大推动力,下界为刹车时的最大制动力。

49 第七章Simulink建模和仿真 7.4 系统仿真举例
空气阻力的值为阻力系数,汽车前截面积A和动力学压力P三项的乘积。其中 其中,表示空气的密度,表示汽车速度与风速之和。 假设 且风速以下式的规律变化: 因此,空气阻力可以近似为: 下面假设马路的斜角于位移的变化率符合规律: 则下滑力为: 用简单的比例控制法来控制车速: 其中, 为驱动力, 为期望速度值, 为反馈增益。这样驱动力正比于速度误差。实际中的驱动力是在上面所设的上下界中变化。于是选 。此系统的Simulink模型如图7.4.2所示,仿真时间为1000s。

50 第七章Simulink建模和仿真 7.4 系统仿真举例
图7.4.2 比例速度控制的汽车模型 比例控制器的输入为汽车的期望速度值,它由一个滑块增益模块(Slider Gain)外加一个常数输入模块(Constant)组成。比例控制器由一个用来计算速度误差的求和模块(Sum)和一个增益模块Ke组成。发动机输出力的上界和下界由两个最值模块来实现(也可以用非线性模块库中的饱和模块来实现)。

51 第七章Simulink建模和仿真 7.4 系统仿真举例
非线性的下滑力和空气阻力分别由函数模块来计算。其中标签为Aero Force 的函数模块的对话框中的【Expression】区中应填写0。001*(u[1]+20*sin(0.01*u[2]))^2,标签为Hill Force的应填写30*sin(0.0001*u[1])。显示模块(Display)用作速度表,而示波器模块(Scope)则记录了速度变化曲线,如图7.4.3所示。 说明:此模型也是一个轻度刚性问题的很好的例子,为了观察刚性的影响,先以解法0DE45l来运行模型,然后选择0DE15S再运行仿真,观察其区别。 图7.4.3 汽车的速度变化曲线

52 第七章Simulink建模和仿真 7.4 系统仿真举例
混和系统PID控制器仿真 混合系统包括连续和离散两种元素。下面的例子可以更加具体的说明混和系统的创建过程。 例7.4.2 为了说明混和系统模型的结构,可以对例7.4.1中的连续控制器用一个采样时间为0。5s的离散比例积分-微分控制器代替。 图7.4.4显示了连续的PID控制器。此控制器包括三个部分:比例部分、积分部分和微分部分。这三个部分都对计算误差v进行操作。 图 连续PID控制器

53 第七章Simulink建模和仿真 7.4 系统仿真举例
其中比例部分对v信号提供一个比例增益, 其表达式为: 积分部分用来消除静态误差。 对此积分部分需要注意的问题是,若plant模块对起输入信号的变化响应相对比较饱满,则积分就会很快的增加,这种现象成为“积分饱和”。积分饱和可以通过对 加一个上界或下界加以消除。 微分部分在模型中起衰减的作用。其输出正比于v的变化率:

54 第七章Simulink建模和仿真 7.4 系统仿真举例
这就是连续的PID控制器。而离散的PID控制器是在此基础上用离散积分器代替积分部分,有用离散微分模块来近似微分部分。一阶数值微分近似为: 此微分近似的传递函数为:

55 第七章Simulink建模和仿真 7.4 系统仿真举例
图 离散控制器的汽车模型 图7.4.5所示即为使用了离散PID控制器的汽车模型。其中 此模型除控制器 的部分之外都与例1是完全相同的。

56 第七章Simulink建模和仿真 7.4 系统仿真举例
它的控制器的三个部分分别是: ·比例部分由一个领零阶保持和一个比例增益模块组成。比例增益系数也是50。 · 积分部分由一个时间离散积分模块和一个增益模块组成。在离散积分模块中,选择【Limite Output】,并设置饱和限为。 ·控制器的微分部分包括一个离散传递函数模块和一个增益模块。 在此例中设仿真运行时间为100s,滑块增益为80。 得示波器图形如图7.4.6所示。 图7.4.6 汽车速度控制曲线

57 第七章Simulink建模和仿真 7.5子系统和子系统的封装
在前面的章节中,介绍了连续离散和混合系统创建器Simulink模型的基本方法。根据前面的介绍,基本可以创建任何物理系统的模型。然而随着模型越来越复杂,用这些基本操作创建的Simulink模变得越来越庞大而难于读懂。在接下来的章节中,将介绍一系列的Simulink特殊处理技术来使得模型变得更加简捷易懂易用。 本节先介绍一种类似于程序设计语言中的子程序的处理方法——Simulink子系统,然后讲解一种更加好用的封装子系统技术。

58 第七章Simulink建模和仿真 7.5子系统和子系统的封装
绝大多数的程序设计语言都有使用子程序的功能。在FORTRAN里有subroutine子程序和function子程序;C语言中的子程序被称为“函数”;Matlab的子程序称为函数式M文件。Sinlulilnk也提供了类似的功能——子程序。 随着模型越来越大、越来越复杂,人们很难轻易的读懂它们。在这种情况下,子系统通过把大的模型分割成几个小的模型系统以使得整个系统模型更简捷、可读性更高,而且这种操作并不复杂。举一个简单的例子,考虑在例1中提到的汽车模型,其Simulink模型图见图7.5.1。 图7.5.1 比例速度控制的汽车模型

59 第七章Simulink建模和仿真 7.5子系统和子系统的封装
整个模型包括两个主要部分:发动机动力系统和控制系统。但是在模型图中哪些模块代表发动机动力系统,那些模块代表控制系统并不明确。在图7.5.2中,将模型的这两个部分转化为子系统。经过转化后,主模型图中的结构就变得很明了了,只是两个子系统的具体结构被隐藏起来了,双击子系统模块,则会在一个新的窗口中显示子系统的模块图。如图7.5.3所示。 图7.5.2 子模块化了的汽车模型

60 第七章Simulink建模和仿真 7.5子系统和子系统的封装
(a) 控制子系统 (b) 发动机动力子系统 图7.5.3 子系统分解

61 第七章Simulink建模和仿真 7.5子系统和子系统的封装
子系统的另外一个重要的功能是把反复使用的模块组压缩成子系统后重复使用。在本例中,如果要比较在同一控制系统控制下不同发动机的工作效率,只需要替换新的发动机子系统而不是重建一个新的系统。这样的控制系统就可以反复利用。 注意:这种做法不仅节省了建模时间,而且可以保证在多次建模中不会因失误而在控制子系统中出现差错,这在大型的复杂系统建模中是非常重要的。 创建Simulink子系统共有两种方法: ·一种办法是对已存在的模型的某些部分或全部使用菜单命令【Edit/Create Subsystem】进行压缩转化,使之成为子系统; ·另一种方法是使用Connections模块库中的Subsystem模块直接创建子系统。

62 第七章Simulink建模和仿真 7.5子系统和子系统的封装
下面分别介绍这两种方法。 一、压缩子系统 把已经存在的Simulink模型中的某个部分或全部压缩成子系统的操作如下: 步骤一: 首先使用范围框将要压缩成子系统的部分选中,包括模块和信号线,如图7.5.4所示。 图7.5.4 选中要压缩的模块

63 第七章Simulink建模和仿真 7.5子系统和子系统的封装
注意:在这种情况下只能用范围框,而不能用Shift逐个选定。 为了能使范围框框住所有需要的模块,重新安排模块的 位置常常似乎是必要的。 步骤二: 在模块窗口菜单选项中选择【Edit>Creat Subsystem】,Simulink将会用一个子系统模块代替被选中的模块组,如图7.5.5所示。 图7.5.5 压缩后的模型图

64 第七章Simulink建模和仿真 7.5子系统和子系统的封装
步骤三: 子系统模块将有一个默认输入端口和输出端口。输入端口和输出端口的默认名分别为In1和Out1。调整子系统和模型窗口的大小使之美观,如图7.5.6所示。 图7.5.6 压缩后的模型图

65 第七章Simulink建模和仿真 7.5子系统和子系统的封装
特别注意:菜单命令【Edit/Creat Subsystem】没有相反的操作命令。也就是说一旦将一组模块压缩成子系统,就没有直接还原的处理方法了(UNDO除外)。因此一个理想的处理方法是在压缩子系统之前先把模型保存一下,作为备份。 二、子系统模块 在创建模型的时候,如果需要一个子系统,也可以直接在子系统窗口中创建。这样就省去了上面的压缩子系统和重新安排窗口的步骤。

66 第七章Simulink建模和仿真 7.5子系统和子系统的封装
要使用子系统模块创建新的子系统,先从Signals & Systems模块库中拖一个子系统模块到模型窗口中。双击子系统模块,就会出现一个子系统编辑窗口。 注意:在信号输入端口要使用一个输入模块,在信号输出端口要使用一个输出模块。 子系统创建完毕后,关闭子系统窗口。关闭子系统窗口之前不需要做任何保存操作。子系统作为模型的一部分,当模型被保存时,子系统会自动保存。

67 第七章Simulink建模和仿真 7.5子系统和子系统的封装
例7.5.1 模拟如图7.5.7所示的弹簧-质量系统的运动状态。 单个小车系统的运动方程如下: 图7.5.7 弹簧-质量系统 先建立如图7.5.8所示的单个小车系统的子系统 图7.5.8 单个小车系统

68 第七章Simulink建模和仿真 7.5子系统和子系统的封装
使用子系统模块创建如图7.5.9所示的子系统,此子系统用来模拟一个小车的运动。子系统的输入为小车的左距x(n-1)和右距x(n+1),输出为小车的当前位置x(n). 子系统完成之后,关闭 子系统窗口。复制两次此子系统模块,并如图7.5.10所示链接起来。 图7.5.9 小车1的子系统模型 图 使用子系统的三小车模型

69 第七章Simulink建模和仿真 7.5子系统和子系统的封装
为了可以对每个小车的参数进行赋值,要做以下设置: ⑴ 对小车1,将标签为LeftSpring的增益模块的增益系数设置为k1,标签为RightSpring 的增益模块的增益系数设置为k2,标签为1/mass的增益模块的增益系数设置为1/m1。设置速度积分模块的初始值为0,位置积分模块的初始值为1。 ⑵ 对小车2,将标签为LeftSpring 的增益模块的增益系数设置为k2,标签为RightSpring 的增益模块的增益系数设置为k3,标签为1/mass的增益模块的增益系数设置为1/m2。设置速度积分模块的初始值为0,位置积分模块的初始值为1。 ⑶ 对小车3,将标签为LeftSpring的增益模块的增益系数设置为k3,标签为RightSpring 的增益模块的增益系数设置为k4,标签为1/mass的增益模块的增益系数设置为1/m3。设置速度积分模块的初始值为0,位置积分模块的初始值为1。

70 第七章Simulink建模和仿真 7.5子系统和子系统的封装
此时就可以很方便地 使用Matlab变量对弹簧常数k1,k2,k3和小车质量m1,m2,m3进行赋值。这里使用了一个名为set_k_m 的M文件对它进行赋值,如下所示: &set the spring constants and block mass values k1=1; k2=2; k3=4; m1=1; m2=3; m3=2; 仿真开始之前在Matlab命令窗口中运行此M文件。 然后,指定示波器模块把显示数据保存到工作间中,并设置仿真的起始时间(StartTime)为0,终止时间(StopTime)为100。 仿真结束后,在Matlab窗口中把所得到的小车3的显示数据绘制成图。

71 第七章Simulink建模和仿真 7.5子系统和子系统的封装
7.5.2 子系统的封装 封装技术是将Simulink子系统“包装”成一个模块,并可以如同使用Simulink内部模块一样使用的技术。每个封装模块都可以有一个自定义的图标用来设定参数的对话框,参数设定方法也与Simulink模块库中的内部模块完全相同。 为了更好的理解封装的含义,见图7.5.10所示的模型。此模型与例7.5.1中的模型完全等价,但它要更容易使用。双击Spring-mass1模块可以打开该模块属性的对话框。与例7.5.1中打开每个模块去修改参数不同,这里可以直接在此对话框中输入参数。对话框的结构与形式都和“原装”的模型毫无两样。 本节将主要以此弹簧-质量系统为例来详细介绍创建一个封装模块的步骤。

72 第七章Simulink建模和仿真 7.5子系统和子系统的封装
创建一个封装模块的主要步骤分为三步: ⑴ 创建一个子系统; ⑵ 选中子系统,选择模型窗口菜单中的【Edit>Mask subsystem】选项生成封装模块; ⑶ 使用封装编辑器设置封装文本、对话框和图标。 一、子系统到封装模块的转换 当按照上节中介绍的方法创建以弹簧-质量子系统模块之后(如图7.5.10所示),将其复制到一个新的窗口中,如图7.5.11所示。选中此模块,在窗口的菜单中执行【Edit>Mask subsystem】指令,弹出如图7.5.12所示的一个封装编辑对话框。该对话框有三个选项卡。下面分别讨论这三个选项卡的功能和使用。

73 第七章Simulink建模和仿真 7.5子系统和子系统的封装
图 将子系统复制到新窗口 图 封装编辑对话框

74 第七章Simulink建模和仿真 7.5子系统和子系统的封装
(1) 文本页 Documentation 图7.5.13是编辑器的文本页。它也包括三个区域,每个区域都为一个自由区,既可填写也可以不填写。  Mask type:该区内容将作为模块的类型显示在封装模块的对话框中。  Block description:此区中的内容将显示在封装模块对话框的上部,它的位置在后面的图中可能看得更清楚。其内容脑壳描述模块的功用的简短语句或其它关于使用此模块的注意事项等。  Block help:当对话框中的【help】按钮按下时,MATLAB的帮助系统将显示此区中的内容,其内容应当包括使用此模块的详细说明。

75 第七章Simulink建模和仿真 7.5子系统和子系统的封装
(2) 初始化页 Initialization 初始化页是用来设置封装模块参数项的,如图7.5.14所示。此页也包括三个区域。  上区为Mask type区。此封装类型区与文本页中的封装类型区是等同的,可以在任意一页中定义或改变封装类型。  中区是用来设置封装模块对话框中的输入变量项目,如输入变量或操作选择等等。此区包括一个滚动项目列表、一套“加入”、“删除”和“移动”按钮,以及5个设置项目属性的编辑区。  底区为Initialization commands,在此区中可以输入MATLAB语句,如定义变量、初始变量值等等。

76 第七章Simulink建模和仿真 7.5子系统和子系统的封装
封装子系统与非封装子系统的一个重要的区别在于模块对话框中变量的作用范围。非封装子系统模块中的变量可以直接在MATLAB工作间中赋值。而封装子系统的模块则不能。封装子系统有一个独立于MATLAB工作间及其它子系统的内部存储空间、这个特点可以防止模块变量与其它工作间中无关变量的冲突。因此,在封装模块中用到的变量要在封装编辑器对话区或初始命令区中设置。

77 第七章Simulink建模和仿真 7.5子系统和子系统的封装
图 封装编辑器的文本页 图 封装编辑器的初始化页

78 第七章Simulink建模和仿真 7.5子系统和子系统的封装
(3) 图标页 Icon 编辑器的图标页如图7.5.12所示,它是用来给封装模块设计自定义图标的。此页分6个区。顶区的【Mask type】同其它两页中的【Mask type】是等同的。【Deawing commands】区是以MATLAB语句来绘制图标的编辑区。其余的4个区是用来指定图标的属性,理解了图标的这些属性再来分析图标的绘制命令是很容易的。  Icon fram: 第一个属性为图标框选项,他由一个下拉菜单组成,分别有可见、不可见选项。所谓的图标框即图标的边界线。  Icon transparency:第二个属性为图标的透明度选项,也是由一个下拉菜单组成,有两个选项,透明和不透明。

79 第七章 Simulink建模和仿真  Icon rotation:第三个选项为图标旋转选项,其下拉菜单选项为固定和旋转。这个选项决定了当执行【Format>Flip block】或【Formal>Rotate Block】指令时的图标形状。  Drawing cooedenates:最后一个区是图形坐标区,用来设置绘图的比例。它有三个选项:  Pixed:用来设置绘图系为绝对坐标系,其效果为当模块图调整大小时,图标不随其大小的改变而改变。此参数下的坐标系应为象素点坐标,图标的左下角为坐标系的原点。  Autoscale:该选项使得图标图形恰好充满整个模块。  Normalized:该选项是设置绘图比例在0河1之间的选项。图标的左下角的坐标定义为(0,0),模块的右上角坐标定义为(1,1)。当模块调整大小的时候,坐标系同样被调整。

80 第七章Simulink建模和仿真 7.5子系统和子系统的封装
二、查看封装和解封装 对于一个已封装的子系统要想查看其封装前子系统的具体内容,可以选着菜单命令【Edit>Look Under mask】。 若要对已经封装的模块进行解封装操作,要先选中此模块,打开封装编辑器,按下Unmask按钮,则封装就被解开。 若要再次封装此子系统,选着【Edit>Mask subsystem】即可。

81 第七章 Simulink建模和仿真 回调 回调是一种MATLAB命令,他在某种事件,如打开模块或双击模块等情况发生时执行。例如,通常双击一个模块时,屏幕上将会显示出此模4块的对话框。而对示波器模块,双击它将会执行一个显示示波器的回调函数。 回调与MATLAB的图形处理有着很紧密的联系。例如,当使用图形处理工具创建一个菜单时,每个菜单选项通常是与同一个回调相对应的,它会在选项被选中时自动执行。回调可以是一句非常简单的MATLAB命令。例如,若菜单选项为【Close Figure】,比较合适的回调语句是MATLAB命令close。回调在更多的情况下是一个可以完成指定操作的M文件。

82 第七章 Simulink建模和仿真 7.6 回调 7.6.1 回调函数的介绍
使用MATLAB的set_param命令可以加载回调,具体格式为 set_param(object,parameter,value) 其中:  object为包含模型名或模块路径的MATLAB字符串。如果回调是关于模型动作的,则object为模型名。例如,一模型以car_mod.mdl为名保存,则object应当为‘car_mod’。如果回调是关于模块的,则此模块的Simulink路径将成为object。例如,对于car_mod模型中的子系统Controller中的Gain_1模块,object应为字符串‘car_mod/Controller/Gain_1’。  parameter是一个包含回调参数的MATLAB字符串。  value是包含回调函数名的字符串。 例如,回调一名为set_gain.m的M文件,则value应为字符串‘set_gain’。

83 第七章 Simulink建模和仿真 回调 例7.6.1 考虑图7.6.1所示的Simulink模型。若模型以callb_1.mdl为名保存,其中常数块的值设置为In_val。希望在用户打开模型的时候,模型会自动提示要求输入In_val的值。 图7.6.1 使用回调初始化的模型图 用下面名为initm_1.m的简单M文件来实现回调,此M文件只有一个一条语句: In_val=input(‘Enter the valuv:’);

84 第七章 Simulink建模和仿真 7.6 回调 为了在模型打开的时候自动加载此回调,打开模型,并在MATLAB命令窗口中输入:
set_param(‘callb_1’,’PreloadFcn’,’inetm_1’) 保存此模型并关闭。下一次打开模型的时候,MATLAB会自动提示: >>Enter the value: 并将输入值赋给In_val变量。 若希望当仿真开始之前而不是模型打开时再输入参数值,则需要下面的命令来加载回调: set_param(‘callb_1’,’InitFcn’,’inetm_1’)

85 第七章 Simulink建模和仿真 7.6 回调 7.6.2 基于回调的图形用户界面
图7.6.2 滑块增益模块的用户界面窗口

86 第七章 Simulink建模和仿真 回调 在Simulink模型中,带有基于回调的图形界面的模块可以通过双击使回调函数加载。打开后应响应如下事件:  双击模块打开用户界面(OpenFcn)。此回调应包括创建界面图形并对其初始化的程序,而且程序还要确认在打开之前没有其它同一模块的图形界面打开。  删除该模块(DeleteFcn),则关闭相应的界面图形。  包含该模块的模型被关闭(ModelCloseFcn),则关闭界面。  包含该模块的子系统被关闭(ParentCloseFcn),则关闭界面。  界面窗口的控制按钮操作。 经验表明在回调M文件中加入加载回调的语句是非常有用的。一旦程序被执行,则回调将会成为模型的一个参数部分,运行速度大大提高。

87 第七章 Simulink建模和仿真 回调 如下所示的一段程序代码可以作为回调函数M文件的一个样板,读者可以从中看出此类文件的一般规律,稍作修改,即可应用于其它情况。 function clbktplt(varargin) % Callback function template % Install this callback by invoking it with the command % clbktplt('init_block') % at the MATLAB prompt with the appropriate model file open and selected. % % To use the template, save a copy under a new name. Then replace % clbktplt with the new name everywhere it appears.

88 第七章 Simulink建模和仿真 7.6 回调 action = varargin{1} ; switch action,
case 'init_block', init_fcn ; % Block initialization function, % located in this M-file case 'create_fig', if(findobj('UserData',gcb)) % Don't open two for same block disp('Only open one instance per block can be opened') else % Here, put all commands needed to set up the figure and its % callbacks.

89 第七章 Simulink建模和仿真 7.6 回调 left = 100 ; % Figure position values
bottom = 100 ; width = 100 ; height = 100 ; h_fig = figure('Position',[left bottom width height], ... 'MenuBar','none') ; set(h_fig,'UserData',gcb) ; % Save name of current block in % the figure's UserData. This is % used to detect that a clbktplt fig % is already open for the current block,

90 第七章 Simulink建模和仿真 7.6 回调 % so that only one instance of the figure
% is open at a time. end case 'close_fig', % Close if open when model is closed. h_fig = findobj('UserData',gcb) ; if(h_fig) % Is the figure for current block open? close(h_fig) ; % If so, close it.

91 第七章 Simulink建模和仿真 回调 case 'rename_block', % Change the name in the figure UserData. h_fig = findobj('UserData',gcb) ; if(h_fig) % Is the figure open? set(h_fig,'UserData',gcb) ; % If so, change the name. end

92 %************************************
第七章 Simulink建模和仿真 回调 case 'UserAction1', % Place cases for various user actions % here. These callbacks should be defined % when the figure is created. end %************************************ %* init_fcn *

93 第七章 Simulink建模和仿真 7.6 回调 function init_fcn()
% Configure the block callbacks % This function should be executed once when the block is created % to define the callbacks. After it is executed, save the model % and the callback definitions will be saved with the model. There is no need % to reinstall the callbacks when the block is copied; they are part of the % block once the model is saved. sys = gcs ;

94 第七章 Simulink建模和仿真 回调 block = [sys,'/InitialBlockName'] ; % Replace InitialBlockName with the % name of the block when it is % created and initialized. This does % not need to be changed when the block % is copied, as the callbacks won't be % reinstalled. set_param(block,'OpenFcn', 'clbktplt create_fig',... 'ModelCloseFcn','clbktplt close_fig', ... 'DeleteFcn', 'clbktplt close_fig', ... 'NameChangeFcn','clbktplt rename_block') ;

95 第七章 Simulink建模和仿真 S函数 S函数是扩展Simulink功能的强有力工具,它使用户可以利用MATLAB、C语言、C++语言等程序创建自己定义的Simulink模块。例如,对一个工程的几个不同的控制系统进行设计,而此时已经用M文件建立了一个动态模型,在这种情况下,可以将模型加入到S函数中,然后使用独立的Simulink模型来模拟这些控制系统。S函数还可以改善仿真的效率,尤其是在带有代数环的模型中。 S函数使用一种特殊的调用规则来使得用户可以与Simulink的内部解法器进行交互,这种交互通Simulink内部解法器与内置的模块之间的交互非常相似。而且可以适用于不同性质的系统,例如连续系统、离散系统以及混合系统。

96 第七章 Simulink建模和仿真 7.7 S函数 7.7.1 S函数模块
S函数模块在functions & Tables模块库中,用此模块可以创建包含S函数的Simulink模型。图7.7.1显示了一个含有S函数的简单模型。S函数模块的对话框如图7.7.2所示,它有两个区:S函数文件名区和S函数的参数区。S函数文件名区要填写S函数的文件名。S函数参数区要填写S函数所需要的参数。参数并列给出,各参数间以逗号分隔。如图7.7.2所示。表示了S函数的参数为:1.5,矩阵[1 2;3 4]和字符串‘miles’。 图7.7.1 包含S函数的模型

97 第七章 Simulink建模和仿真 S函数 图7.7.2 S函数模块的对话框

98 第七章 Simulink建模和仿真 7.7 S函数 7.7.2 S函数的工作原理
S函数具有一套不同的调用方法,可以在仿真的不同阶段完成不同的调用任务。在模型仿真的不同阶段,Simulink会对模型中S函数模块选择适当的方法来完成调用。S函数可以完成的任务大体分为以下几种。 (1) 初始化。在进入仿真循环之间,Simulink首先初始化S函数,主要完成任务:  初始化包含S函数信息的仿真结构SimStruct。  设置输入输出端口的数目和维数。  设置模块的采样时间。 分派内存区和sizes数组。 (2) 计算下一个采样点。若用户使用了可变采样时间的模块,在这一阶段需要计算下一个采样点时间,也就是说要计算下一个时间步长。

99 第七章 Simulink建模和仿真 7.7 S函数 (3) 计算主时间步的输出量。此调用结束后,所有模块的输出端口对当前的时间步都是有效的。
(4) 更新主时间步的离散状态。 (5) 积分计算。这一步只有当模型带有连续状态或带有非采样过零点时才有效。若S函数带有连续状态,则Simulink以较小的时间步长来调用S函数的输出和微分方法;若S函数具有非采样过零点,Simulink将以较小的时间步来计算S函数的输出和过零点部分。

100 第七章 Simulink建模和仿真 7.7 S函数 7.7.3 S函数中的几个概念 (1) 直接馈入
 输出函数(mdlOutpits或者flag=3)是一个参数包含u的函数。  若改S函数是一个可变采样时间的S函数,且下一个采样时间点的计算中要用到输入参数u时,也可以判断此S函数为直接馈入型。

101 第七章 Simulink建模和仿真 7.7 S函数 (2) 动态尺寸的输入
M文件S函数只能有一个输入端口,并且输入端口只能接收一维信号。然而,信号可以是变宽度的。在一个M文件S函数里,为了指定输入的宽度是动态的,可以指定sizes结构的适当区域的值为-1。也可以在S函数调用的时候使用length(u)来确定实际输入的宽度。若指定宽度值为0,则输入端口会从S函数模块中去掉。

102 第七章 Simulink建模和仿真 S函数 例如,图7.7.3所示表示了在同一个模型中使用同一个S函数模块的两种情况,前者的S函数模块是由一个三元素向量驱动,后者则是由一个标量输出模块信号驱动,为了表明S函数函数模块的输入是动态的,两个S函数模块是完全相同的Simulink自适应地使用合适的尺寸来调用函数。类似地,若其它模块属性如输出变量数和状态数也被指定为动态尺寸的,Simulink将会定义这些变量与输入变量同维。 图7.7.3 同一个模型中使用同一个S函数模块的两种情况

103 第七章 Simulink建模和仿真 7.7 S函数 (3) 采样时间的设置与采样延迟
M文件S函数和C语言S函数都在指定S函数的运行时间上有高度的自适应度。Simulink为采样时间提供了下面的几种选着。  连续采样时间:适用于具有连续状态和非采样过零点的S函数。这种S函数的输出按最小时间步改变。  连续但固定最小步长的采样时间:适用于需要在每一个主仿真时间步执行,但在最小仿真步内值不改变的。  离散采样时间:若S函数得行为发生具有离散时间间隔的函数,用户可以定义一个采样时间来规定Simulink何时调用函数。而且用户还可以定义一个延迟时间offset来延迟采样点,但offset的值不能超过采样周期。

104 第七章 Simulink建模和仿真 S函数 若用户定义了一个离散采样时间,则Simulink就会在所定义的每个采样点调用S函数的mdlOutpit和mdlUpdate方法。  可变采样时间:相邻采样点的时间间隔可变得离散采样时间。在这种采样时间的情况下,S函数要在每一步仿真的开始,计算下一个采样点的时刻。  继承采样时间:在有些情况下,S函数模块自身没有特定的采样时间,它本身的状态是连续的还是离散的完全取决于系统中的其它模块。此时,该S函数模块的采样时间属性可以设为继承。例如gain模块就是一个继承输入信号采样时间的例子。一般,一个模块可以从以下几个方式来继承采样时间:  继承驱动模块的采样时间;  继承目标模块的采样时间;  继承系统中最快的采样时间。

105 7.7.4 S函数动画 第七章 Simulink建模和仿真 7.7 S函数
基于S函数地动画就是一个由没有状态函数、没有输出变量的S函数生成的动画。因此它们只能作常规显示。这种S函数有两个主要部分:初始化部分和更新部分。  在初始化过程中要创建图形窗口及动画对象;  在更新过程中,动画对象的属性将作为S函数模块的输入函数,且它的变化导致动画对象的运动可能会以其它形式变化。 (1) 动画的初始化 S函数动画的初始化语句包括S函数的初始化和图形的初始化。采样时间应设置为较小的数值以便动画可以看起来更加连续。但同时也不能太小,因为那会使得仿真过程运行起来太慢。

106 第七章 Simulink建模和仿真 S函数 首先需要检验与当前S函数模块相联系的动画图形是否已打开。这里使用的方法是将当前模块的路径保存到图形的UserData参数中。此时使用gcd函数是一种比较安全的方法,因为在S函数的执行过程中,gcd总会返回S函数模块的路径。完成此任务的MATLAB命令可为如下形式: if(findobj(‘UserData’,gcb)) % 若模型已经打开,则不作任何事 else {……} % 初始化图形 end 其中的初始化图形语句可由figure命令实现,例如 h_fig=figure(‘Position’,[x_pos,y_pos,width,height]… 然后,将当前S函数模块的路径保存到图形UserData中,这样对图形的存在性检验才会正常工作。下面的语句可以用来设置UserData: set(h_fig,’UserData’,gcb);

107 第七章 Simulink建模和仿真 S函数 使用MATLAB绘图命令绘制动画图形。接着保存这些图形元素的句柄。例如,要绘制由向量x_array和y_array定义的曲线,使用下面的语句: hdl=plot(x_array,y_array); 图形初始化的最后一步是保存这些仿真元素的句柄。这里使用的方法是将这些元素成组地保存到一个MATLAB变量中,并把此变量保存到S函数模块的UserData中。UserData中可以保存MATLAB的任何变量,包括单元数组合结构。假设要绘制两个图形元素的动画,而它们的句柄名分别为hd1和hd2,下面的语句会把它们保存到一个结构中。 t_data.hd1=hd1; t_data.hd2=hd2; set_param(gcd,’UserData’,t_data);

108 第七章 Simulink建模和仿真 7.7 S函数 (2) 动画的更新
由于设置采样时间为正数,所以动画S函数可以被看成是离散模块。Simulink将以flag=2在采样时间执行S函数。更新函数会从S函数模块UserData中读取即将改变得图形对象的句柄。例如,如果句柄以结构变量的形式储存,则它们可以写成如下形式。 T_data=get_param(gcd,’UserData’); hd1=t_data.hd1; hd2=t_data.hd2; 然后计算改变得对象属性的新值,并使用set命令更新属性。 Set(handle,propertyName,propertyValue); 其中handle为对象的句柄,propertyName为有即将改变得对象属性的对象名构成的MATLAB字符串。propertyValue为新的属性值。

109 第七章 Simulink建模和仿真 S函数 例7.7.1 在本例中,将创建一个在半球形槽内往复滚动的圆盘的动画。分析:假设圆盘在槽内做无滑动的滚动,则系统的运动方程为 其中: 为重力加速度, 的动力学关系为 图7.7.4为此系统运动方程的Simulink模型,它用一个动画S函数模块来显示圆盘运动。

110 第七章 Simulink建模和仿真 7.7 S函数 S函数为一个M文件,其程序代码如下,
function [sys,x0,str,ts] = s_anm81s(t,x,u,flag) % S-file animation example 1 % This example demonstrates buidling an animation % using a single S-file with no callbacks. % % Based on sfuntmpl.m, supplied with SIMULINK % Copyright (c) by The MathWorks, Inc.

111 第七章 Simulink建模和仿真 7.7 S函数 switch flag, case 0, % Initialization
[sys,x0,str,ts]=mdlInitializeSizes; case 1, % Derivatives sys=mdlDerivatives(t,x,u); case 2, sys=mdlUpdate(t,x,u); case 3, sys=mdlOutputs(t,x,u); % Compute output vector case 4, % Compute time of next sample sys=mdlGetTimeOfNextVarHit(t,x,u); case 9, % Finished. Do any needed sys=mdlTerminate(t,x,u); otherwise % Invalid input error(['Unhandled flag = ',num2str(flag)]); end

112 第七章 Simulink建模和仿真 7.7 S函数 %************************************
%* mdlInitializeSizes * function [sys,x0,str,ts]=mdlInitializeSizes() % Return the sizes of the system vectors, initial % conditions, and the sample times and offets. sizes = simsizes; % Create the sizes structure sizes.NumContStates = 0; sizes.NumDiscStates = 0; sizes.NumOutputs = 0; sizes.NumInputs = 1; sizes.DirFeedthrough = 0; sizes.NumSampleTimes = 1;

113 第七章 Simulink建模和仿真 7.7 S函数 sys = simsizes(sizes);
x0 = []; % There are no states str = []; % str is always an empty matrix % Update the figure every 0.25 sec ts = [0.25 0]; %initialize the array of sample times. % Initialize the figure % The handles of the disk and index mark are stored % in the block's UserData. if(findobj('UserData',gcb)) % Figure is open, do nothing else h_fig = figure('Position',[ ], ... 'MenuBar','none','NumberTitle','off', ... 'Resize','off', ...

114 第七章 Simulink建模和仿真 7.7 S函数 'Name',[gcs,' Rolling Disk']) ;
set(h_fig,'UserData',gcb) ; % Save name of current block % in the figure's UserData. % This is used to detect % that a rolling disk figure % is already open for the % current block, so that % only one instance of the % figure is open at a time % for a given instance of the % block. r = 2 ; R = 12 ; q = r ;

115 第七章 Simulink建模和仿真 7.7 S函数 thp = 0:0.2:pi ; xp = R*cos(thp);
yp = -R*sin(thp) ; xp = [xp,-R,-(R+q),-(R+q),(R+q), (R+q),R] ; yp = [yp,0,0,-(R+q),-(R+q),0,0] ; cl_x = [0,0] ; cl_y = [0,-R] ; % Make the disk thp = 0:0.3:2.3*pi ; xd = r*cos(thp); yd = r*sin(thp) ; hd = fill(xp,yp,[0.85,0.85,0.85]); % Draw trough hold on ; % So it won't get erased

116 第七章 Simulink建模和仿真 7.7 S函数 set(hd,'erasemode','none');
axis('equal');axis('off'); hd0 = plot(cl_x,cl_y,'k--'); % Draw the centerline set(hd0,'erasemode','none'); % During this initialization pass, create the disk % (hd2) and the index mark (hd3). theta = 0 ; xc = (R-r)*sin(theta); % Find center of disk yc = - (R-r)*cos(theta) ; psi = theta*(R-r)/r ; xm_c = r*sin(psi) ; % Relative position of index mark ym_c = r*cos(psi) ; xm = xc + xm_c ; % Translate mark ym = yc + ym_c ;

117 第七章 Simulink建模和仿真 7.7 S函数 hd2 = fill(xd+xc, yd+yc, ...
[0.85,0.85,0.85]) ; % Draw disk and mark hd3 = plot([xc,xm],[yc,ym],'k-'); set_param(gcb,'UserData',[hd2,hd3]) ; End %************************************ %* mdlDerivatives * function sys=mdlDerivatives(t,x,u) % Compute derivatives of continuous states sys = []; % Empty since no continuous states %* mdlUpdate *

118 第七章 Simulink建模和仿真 7.7 S函数 function sys=mdlUpdate(t,x,u)
% Compute update for discrete states. sys = []; % Empty since this model has no states. % Update the figure r = 2 ; R = 12 ; q = r ; userdat = get_param(gcb,'UserData') ; hd2 = userdat(1) ; hd3 = userdat(2) ; theta = u(1) ; % The sole input is theta xc = (R-r)*sin(theta); % Find center of disk yc = - (R-r)*cos(theta) ; psi = theta*(R-r)/r ; xm_c = r*sin(psi) ; % Find relative position of index

119 第七章 Simulink建模和仿真 7.7 S函数 ym_c = r*cos(psi) ;
xm = xc + xm_c ; % Translate mark ym = yc + ym_c ; thp = 0:0.3:2*pi ; xd = r*cos(thp); yd = r*sin(thp) ; % Move the disk and index marks to new positions set(hd2,'XData',xd+xc); set(hd2,'YData',yd+yc); set(hd3,'XData',[xc,xm]); set(hd3,'YData',[yc,ym]);

120 第七章 Simulink建模和仿真 7.7 S函数 %************************************
%* mdlOutputs * function sys=mdlOutputs(t,x,u) % Compute output vector sys = []; %* mdlGetTimeOfNextVarHit *

121 第七章 Simulink建模和仿真 7.7 S函数 function sys=mdlGetTimeOfNextVarHit(t,x,u)
%************************************* %* mdlTerminate * function sys=mdlTerminate(t,x,u) % Perform any necessary tasks at the end of the simulation

122 第七章 Simulink建模和仿真 本章小结
高性能、低成本以及短周期的更新换代是当今科学研究和工业生产企业一大特点,而研究对象的模型化、模型的模块化是满足这些要求的基本条件之一。Matlab和Simulink为用户提供了一个强大的、并具有友好界面的建模和动态仿真的环境。并且Simulink借助Matlab在科学计算、图形和图像的处理、甚至各类建模和仿真的代码生成这些优势,可以非常方便地为用户创建和维护一个研究对象的模型、评估各类设计原理和方法,大大加快科学研究的时间、加快企业产品的开发过程。

123 第七章 Simulink建模和仿真 本章小结
本章向读者介绍了Simulink的部分基本知识和操作,包括建模方法、子系统和子系统的封装、回调和S函数,同时还向读者介绍了一些具体的应用实例。使读者通过本章的学习和实际使用Simulink演算本章给出的算例,不但可以进一步掌握计算机仿真的基本概念和理论,也可以初步学会使用Simulink去真正地运用仿真技术解决科研和工程中的实际问题。但是限于篇幅和Simulink本身内容的丰富,本章所介绍的仅仅是Matlab和Simulink的部分入门知识。但目前许多出版社都有大量的Matlab和Simulink的书籍,所以感兴趣的读者可以参考这些资料。

124 第七章 Simulink建模和仿真 习 题 1 利用Matlab求 的状态空间描述
2 一个生长在罐中的细菌简单模型。假设细菌的出生率和当前细菌的总数成正比,死亡率和当前的总数的平方成正比。若以 代表当前细菌的总数,则细菌的出生率可以表示为: 细菌的死亡率可表示为: 细菌数量的变化率可以表示为出生率与死亡率之差。于是该系统可以表示为如下微分方程: 假设 ,当前细菌的总数为100,计算 时候罐中的细菌总数。

125 第七章 Simulink建模和仿真 习 题 3 模拟如图7.5.7所示的弹簧-质量系统的运动状态,其动态方程表示为式(7.5.1)。试先建立单个小车的子系统,然后封装模块。 4 在例7.7.1中,首先创建一个在半球形槽内往复滚动的圆盘的simulink模型,然后利用动画S函数模块来显示圆盘的运动。 5 什么是代数环,当仿真系统中出现代数环时,通常有那些方法来消除代数环。利用Simulink仿真例4.4.4,利用几种不同的方法消除代数环,并比较。 6 在Simulink中,有那些微分方程的解法,试总结它们的算法,并按单步法、多步法、定步长、变步长进行分类。

126 第七章 Simulink建模和仿真 习 题 7 建立下面各个框图给定的控制系统Simulink模型,并在适当的时间范围内,选着合适的算法对它们进行仿真分析,并绘制出不同阶跃输入幅值下的输出曲线。

127 第七章 Simulink建模和仿真 习 题 8 用Simulink建立下面的时变系统模型,并对数值进行仿真分析。


Download ppt "第七章 Simulink建模和仿真 在计算机技术飞速发展的今天,许多科学研究、工程设计由于其复杂性越来越高,因此与计算机的接合日趋紧密。也正是计算机技术的介入,改变了许多学科的结构、研究内容和研究方向。例如,计算流体力学、计算物理学、计算声学等新兴学科的兴起,均与计算机技术的发展分不开。控制理论、仿真技术本身与计算机的接合就十分紧密,而随着专业领域的研究深入和计算机软硬件技术的发展,这种联系呈现更加紧密。计算控制论的建立,足以说明这个问题。而这种发展,又以系统仿真技术的发展分不开的。"

Similar presentations


Ads by Google