simulink动态系统建模仿真 第9章.ppt_第1页
simulink动态系统建模仿真 第9章.ppt_第2页
simulink动态系统建模仿真 第9章.ppt_第3页
simulink动态系统建模仿真 第9章.ppt_第4页
simulink动态系统建模仿真 第9章.ppt_第5页
已阅读5页,还剩191页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、,第9章 使用子系统,9.1 创建子系统 9.2 创建条件执行子系统 9.3 控制流语句,9.1 创建子系统当用户模型的结构非常复杂时,可以通过把多个模块组合在子系统内的方式来简化模型的外观。利用子系统创建模型有如下优点:减少了模型窗口中显示的模块数目,从而使模型外观结构更清晰,增强了模型的可读性;在简化模型外观结构图的基础上,保持了各模块之间的函数关系;可以建立层级方块图,Subsystem模块是一个层级,组成子系统的其他模块在另一层上。,9.1.1 Simulink子系统定义1虚拟子系统虚拟子系统在模型中提供了图形化的层级显示。它简化了模型的外观,但并不影响模型的执行,在模型执行期间,Si

2、mulink会平铺所有的虚拟子系统,也就是在执行之前就扩展子系统。这种扩展类似于编程语言,如C或C+中的宏操作。,2非虚拟子系统(1) 原子子系统(Atomic Subsystem)。原子子系统与虚拟子系统的主要区别在于,原子子系统内的模块作为一个单个单元执行,Simulink中的任何模块都可以放在原子子系统内,包括以不同速率执行的模块。用户可以在虚拟子系统内通过选择Treat as atomic unit选项来创建原子子系统。,(2) 使能子系统(Enabled Subsystem)。使能子系统的动作类似原子子系统,不同的是它只有在驱动子系统使能端口的输入信号大于零时才会执行。用户可以通过在

3、子系统内放置Enable模块的方式来创建使能子系统,并通过设置使能子系统内Enable端口模块中的States when enabling参数来配置子系统内的模块状态。此外,利用Outport输出模块的Output when disabled参数可以把使能子系统内的每个输出端口配置为保持输出或重置输出。,(3) 触发子系统(Triggered Subsystem)。触发子系统只有在驱动子系统触发端口的信号的上升沿或下降沿到来时才会执行,触发信号沿的方向由Trigger端口模块中的Trigger type参数决定。Simulink限制放置在触发子系统内的模块类型,这些模块不能明确指定采样时间,也

4、就是说,子系统内的模块必须具有-1值的采样时间,即继承采样时间,因为触发子系统的执行具有非周期性,即子系统内模块的执行是不规则的。用户可以通过在子系统内放置Trigger模块的方式来创建触发子系统。,(4) 函数调用子系统(Function-Call Subsystem)。函数调用子系统类似于用文本语言(如M语言)编写的S-函数,只不过它是通过Simulink模块实现的。用户可以利用Stateflow图、函数调用生成器或S-函数执行函数调用子系统。Simulink限制放置在函数调用子系统内的模块类型,这些模块不能明确指定采样时间,也就是说,子系统内的模块必须具有-1值的采样时间,即继承采样时间

5、,因为函数调用子系统的执行具有非周期性。用户可以通过把Trigger端口模块放置在子系统内,并将Trigger type参数设置为function-call的方式来创建函数调用子系统。,(5) 触发使能子系统(Enabled and Triggered Subsystem)。触发使能子系统在系统被使能且驱动子系统触发端口的信号的上升沿或下降沿到来时才执行,触发边沿的方向由Trigger端口模块中的Trigger type参数决定。Simulink限制放置在触发使能子系统内的模块类型,这些模块不能明确指定采样时间,也就是说,子系统内的模块必须具有-1值的采样时间,即继承采样时间,因为触发使能子系

6、统的执行具有非周期性。用户可以通过把Trigger端口模块和Enable模块放置在子系统内的方式来创建触发使能子系统。,(6) Action子系统。Action子系统具有使能子系统和函数调用子系统的交叉特性,其只能限制一个采样时间,即连续采样时间、离散采样时间或继承采样时间。Action子系统必须由If模块或Switch Case模块执行,与这些子系统模块连接的所有Action子系统必须具有相同的采样时间。用户可以通过在子系统内放置Action端口模块的方式来创建Action子系统,子系统图标会自动反映执行Action子系统的模块类型,也就是If模块或Switch Case模块。,Action

7、子系统至多执行一次,利用Output端口模块的Output when disabled参数,Action子系统也可以控制是否保持输出值,这是与使能子系统类似的地方。Action子系统与函数调用子系统类似,因为函数调用子系统在任何给定的时间步内可以执行多于一次,而Action子系统至多执行一次。这种限制就表示Action子系统内可以放置非周期性的模块,而且也可以控制状态和输出的行为。,(7) While-子系统。While-子系统在每个时间步内可以循环多次,循环的次数由While Iterator模块中的条件参数控制。用户可以通过在子系统内放置While Iterator模块的方式来创建Whil

8、e-子系统。While-子系统与函数调用子系统相同的地方在于它在给定的时间步内可以循环多次,不同的是它没有独立的循环指示器(如Stateflow图),而且,通过选择While Iterator模块中的参数,While-子系统还可以存取循环次数,通过设置States when starting参数还可以控制当子系统开始执行时状态是否重置。,(8) For-子系统。For-子系统在每个模型时间步内可执行固定的循环次数,循环次数可以由外部输入给定,或者由For Iterator模块内部指定。用户可以通过在子系统内放置For Iterator模块的方式来创建For-子系统。For-子系统也可以通过选择

9、For Iterator模块内的参数来存取当前循环的次数。For-子系统在给定时间步内限制循环次数上与While-子系统类似。,9.1.2 创建子系统在Simulink中创建子系统的方法有两种:把Ports /* 设置第一个输出分量 */ssSetCallSystemOutput (S, 1);/* 设置第二个输出分量 */,在mdlInitializeSampleTimes函数中指定S-函数是否能够使能或关闭函数调用子系统。只有明确地指出使能和关闭函数调用子系统的S-函数,才能重置系统的状态和输出,就如同函数调用子系统中的Trigger模块和Outport模块所定义的那样。例如:ssSetE

10、xplicitFCSSCtrl (S, 1);这条语句表示在mdlInitializeSampleTimes函数中指定S-函数能够使能和关闭函数调用子系统,这样,S-函数在使用ssCallSystemWithTid函数执行子系统前必须调用ssEnableSystemWithTid。,在mdlOutputs或mdlUpdate的S-函数程序中执行子系统。例如:static void mdlOutputs ()if (int)*uPtrs0) % 2 = 1) if (!ssCallSystemWithTid (S, 0, tid) /* Error occurred, which will be

11、 reported by Simulink*/return; else if (!ssCallSystemWithTid (S, 1, tid) /* Error occurred, which will be reported by Simulink*/return;,需要注意的是,在发出函数调用信号的S-函数输出中不要用ssSetOutputPortDataType或ssGetOutputPortDataType函数,Simulink会控制这些输出信号的数据类型。,9.3 控制流语句控制流模块用来在Simulink中执行类似C语言的控制流语句。控制流语句包括:for;if-else;swi

12、tch;while (包括while和do-while控制流)。虽然以前所有的控制流语句都可以在Stateflow中实现,但Simulink中控制流模块的作用实际是想为Simulink用户提供一个满足简单逻辑要求的工具。用户可以用子系统和表9-1中Ports break; case u1=2 or u1=3: Action Subsystem2; break; default: Action Subsystem2;,构造Simulink中Switch控制流语句的步骤如下:(1) 在当前系统中放置Switch Case模块,并为Switch Case模块的变量输入端口提供输入数据。标签为u1的输

13、入端口的输入数据是switch控制流语句的变量,这个值决定了执行的case条件,这个端口的非整数输入均被四舍五入。(2) 打开Switch Case模块的参数对话框,如图9-44所示,在对话框内设置模块的参数。,图9-44, Case conditions:在该参数文本框内输入case值,每个case值可以是一个整数或一个整数组,用户也可以添加一个可选的缺省case值。例如,输入1,7,9,4,表示当输入值是1时,执行输出端口case1;当输入值是7、9或4时,执行输出端口case7 9 4。用户也可以用冒号指定case条件的执行范围,例如,输入1:5,表示当输入值是1、2、3、4或5时,执行

14、输出端口case1 2 3 4 5。 Show default case:选择该复选框后,将在Switch Case模块上显示缺省的case输出端口。如果所有的case条件均为否,则执行缺省的case条件。, Enable zero crossing detection:选择该复选框后,表示启用过零检测。 Sample time(-1 for inherited):指定模块的采样时间,若设置为-1,则表示使用继承采样时间。(3) 向系统中添加Switch Case Action Subsystem子系统模块。Switch Case模块的每个case端口与子系统连接,这些子系统内包含Action

15、 Port模块,当在子系统内放置Action Port模块时,这些子系统就成为原子子系统,并带有标签为Action的输入端口。,(4) 把Switch Case模块中的每个case输出端口和缺省输出端口与Switch Case Action Subsystem子系统模块中的Action端口相连,被连接的子系统就成为一个独立的case语句体。这些子系统的Action端口被重新命名为case,在仿真Switch控制流语句时,从Switch Case模块到Switch Case Action Subsystem子系统模块的Action信号线会由实线变为虚线。(5) 在每个Switch Case Ac

16、tion Subsystem子系统中添加执行相应case条件的Simulink模块。在Switch Case Action Subsystem子系统中的所有模块必须与其驱动模块Switch Case模块运行在相同的速率上,做到了这一点,可以把每个模块的采样时间设置为-1(继承采样时间),或者都设置为Switch Case模块的采样时间。,例9-6 Switch控制流系统。要求:利用Switch Case Action Subsystem子系统模块建立一个执行如下算法的Switch控制流系统:,求解: 按照系统要求,输入的控制信号可以选择为梯形波,这里可以利用Signal Builder模块创建

17、波形。,根据系统要求选择的Simulink模块如下:Sources模块库中的Signal Builder模块和Sine Wave模块;Ports iteration_number = 0;cond = (max_sum 0);while (cond != 0) iteration_number = iteration_number + 1; sum = sum + iteration_number; if (sum max_sum OR iteration_number max_iterations) cond = 0;,例9-7 利用Newton法求取非线性方程。 要求:利用Newton迭代

18、法求取非线性方程的根,直到满足|f(x)|10-8为止。求解:牛顿迭代公式为,因此,如果给出x1和f(x),先找到f(x1),再通过f(x1)作切线,则可求出x2,即,图9-50,在仿真参数对话框内选择变步长ode1(Euler)求解器,将Fixed step size参数设置为1,运行仿真,最后在Display模块中显示的结果值为-7.4e-014。这个模型相当于执行下列语句:,9.3.4 For控制流语句Ports iterations = 20;sum_increment = 10;for (i = 0; i iterations; i+) sum = sum + sum_increme

19、nt;,例9-8 利用For子系统或While子系统求取1N的累加和。要求:利用For子系统循环累加求取1N的累加和,即Sum = 1+2+3+N。求解:根据系统要求选择的Simulink模块如下:Sources模块库中的Constant模块;Ports & Subsystems模块库中的For Iterator Subsytem模块;Discrete模块库中的Unit Delay模块;Sinks模块库中的Display模块。,从数学的角度来看,这个公式很容易求得,即Sum = (N*(N+1)/2。利用For子系统建立的Simulink模型如图9-55所示。模型中添加了一个Fcn模块,该模块

20、的表达式参数Expression为(u*(u+1)/2,这个模块在模型中不起什么作用,只是用来验证For子系统的循环结果。模型还有一个Data Type Conversion模块,如果选择模型窗口中Format菜单下的Port data types命令就会发现,For Iterator模块输出的是int32型数据,而其驱动模块的输入数据类型却是double型,因此添加了Data Type Conversion模块进行数据类型转换。,设置For Iterator模块参数对话框中的State when starting参数为reset,Iteration limit source参数为extern

21、al,给定常值N为10,这是一个时间步内循环变量的最大限制值。设置Unit Delay模块中的Initial conditions为0,模块当前时间步的输出是前一个时间步的输入值。,图9-55,在仿真参数对话框内选择定步长离散求解器,设置仿真时间为10个时间单位,定步长参数Fixed step size为1,这样,仿真步数为11。运行仿真,从结果可以看到,Display模块中显示的是55,这与(N*(N+1)/2公式求得的结果相同。但是,如果把State when starting参数设置为held,那么在一个时间步内循环10次,循环的累加结果为55,这个结果值不再改变,而是一直保持到下一个时

22、间步开始,这样经过11步仿真后最后的输出结果就会是605。如果利用While控制流子系统执行该任务,则建立的系统模型如图9-56所示,模型的运行结果与图9-55中的模型相同。,图9-56,用户也可以把For Iterator模块和Assignment模块结合在一起使用,这样可以在向量或矩阵内重新赋值,从而更佳地执行程序。图9-57就是For Iterator模块和Assignment模块结合在一起使用的例子。,图9-57,这个模型用包含Assignment模块的For Iterator Subsystem子系统输出sin值,输入是25矩阵。模型的执行过程如下:(1) 将一个25矩阵输入到Sel

23、ector模块和Assignment模块。(2) Selector模块用For Iterator模块的当前循环值指定的列位置把输入矩阵变为21矩阵。(3) 求取21矩阵的正弦值。(4) 将21矩阵的正弦值传递到Assignment模块。(5) Assignment模块用原25矩阵作为该模块的一个输入,并把21矩阵按循环值指定的列位置赋值回原矩阵。,在这个模型中,Assignment模块参数对话框中指定的重新分配的行是1,2,因为原矩阵只有两行,也可以指定-1值,也就是重新分配所有行。注意:sin模块本身就可以求取矩阵的正弦值,这里使用sin模块只是在Assignment模块和For Itera

24、tor模块结合使用中作为改变矩阵中每个分量的一个例子。,9.3.5 Stateflow图和控制流语句的比较如果Simulink模型中包含Stateflow图,那么在仿真运行时,Stateflow图与模块一样被执行。模型中的Stateflow模块通过输入和输出信号与其他模块相连,利用这种连接方式,Stateflow和Simulink共享数据,并对模型和Stateflow图之间传递的事件进行响应。Stateflow已经具有Simulink控制流语句的逻辑功能,它可以依条件调用Function-Call子系统或循环调用Function-Call子系统。但是,由于Stateflow提供了大量繁杂的逻辑功能,如果用户的要求很简单,可能会发现只使用Simulink控制流模块的功能就可以充分满足用户要求。此外,控制流语句也有如下一些优势:,1采样时间Stateflow可以调用的Function-Call子系统是触发子系统,触发子系统从调用模块中继承采样时间。但是,在if-else和switch控制流语句中使用的Action子系统,以及构成While和For控制流语句的While和For子系统却都是使能子系统,使能子系统不依赖于调用模块,而是有它们自己的采样时间。这样,它就允许用户在循环子系统内使用比Functi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论