数学模型的simulink实现子系统S函数.ppt
MATLAB教程 simulink-电气工程系研究生,Simulink建模的基础知识(简介,模块)open_system(simulink)%打开模型库 或 simulinkSimulink建模与仿真(步骤、仿真算法与控制参数)除了用simulink菜单启动系统仿真的进程外,还可以调用sim()函数来进行仿真分析,调用格式为:t,x,y=sim(模型名,仿真终止时间,options)其中仿真控制参数options可通过simset()函数来设置,调用格式为:options=simset(参数名1,参数值1,参数名2,参数值2,)例如,如果希望把相对误差限RelTol由默认值10-3修改为10-7,则 options=simset(RelTol,1e-7)或options.RelTol=1E-7 然后,在使用sim()函数时使用options即可实现修改。,MATLAB教程 simulink-电气工程系研究生,非线性微分方程的框图求解例5-2用框图形式表示出该方程:使用三个out端口,将仿真数据输出到工作空间,仿真时间100s,(m51.mdl),MATLAB教程 simulink-电气工程系研究生,Out端口可向MATLAB工作空间中返回两个变量,tout和yout,其中tout为列向量,表示各个仿真时刻,yout为列向量(本例中使用三个单信号out口,则为三列)。该电路仿真完成后,可以在MATLAB命令窗口使用绘图语句显示波形:,MATLAB教程 simulink-电气工程系研究生,如要另外打开一个figure窗口显示第一个out口得曲线则:,MATLAB教程 simulink-电气工程系研究生,系统的相空间表示:,MATLAB教程 simulink-电气工程系研究生,如要另外打开一个figure窗口显示第一个out口得曲线则:,MATLAB教程 simulink-电气工程系研究生,对于上例,也可使用向量化的结构实现,simulink的模块中很多是支持向量化输入的,可以用Mux模块将若干路信号组织成一路信号,这一路信号的各个分量为原来的各路信号。(m52.mdl)其中三个fcn的设置自上而下为:0.2+(u1-5.7)*u(3)u1+0.2*u2-u2-u3,MATLAB教程 simulink-电气工程系研究生,运行该系统,在命令窗口查看波形,MATLAB教程 simulink-电气工程系研究生,Simulink提供了向量型模块的修饰方法:,MATLAB教程 simulink-电气工程系研究生,选中该两项后原系统变化:多路信号线变粗,且显示维数,MATLAB教程 simulink-电气工程系研究生,多变量时间延迟系统的仿真例5-3(c5mmimo.mdl),MATLAB教程 simulink-电气工程系研究生,多变量时间延迟系统的仿真例5-3,MATLAB教程 simulink-电气工程系研究生,计算机控制系统的仿真例5-4假设受控对象和控制器都已经给定,MATLAB教程 simulink-电气工程系研究生,首先在simulink平台搭建系统并保存为c5mcompc.mdl(文件名在后面要进行调用),MATLAB教程 simulink-电气工程系研究生,然后在MATLAB命令窗口进行:,MATLAB教程 simulink-电气工程系研究生,如需改变参数,只需要在MATLAB命令窗口重新输入即可,例如T即采样周期改为1,仿真时间改为30s,则,MATLAB教程 simulink-电气工程系研究生,时变系统的仿真例5-5已知受控对象模型考虑一个PI控制系统模型如图其中Kp=200,Ki=10,饱和非线性的宽度为试分析闭环系统的阶跃响应曲线。首先先要将被控对象变换成一阶微分方程组取状态变量得一阶微分方程组,MATLAB教程 simulink-电气工程系研究生,在simulink中搭建模型,MATLAB教程 simulink-电气工程系研究生,然后在MATLAB命令窗口进行,MATLAB教程 simulink-电气工程系研究生,多采样速率系统的仿真例5-6假设在如图给出的双环电机控制系统中,内环为电流环,采样速率为T1=0.001s,控制器模型为D1(z)=(0.0967z-0.0965)/(z-1),控制器外环的采样周期为T2=0.01s,控制器模型为D2(z)=(5.2812z-5.2725)/(z-1).,MATLAB教程 simulink-电气工程系研究生,搭建simulink模型:注意:此时要将第一个零阶保持器和D1(z)的采样时间设置为0.01,第二个零阶保持器和D2(z)的采样时间设置为0.001,MATLAB教程 simulink-电气工程系研究生,在MATLAB命令窗口进行:此时在simulink中,双击示波器,也能看到波形。如果两个采样周期不是整数倍关系,则需要用Rate Transition模块进行转换。,MATLAB教程 simulink-电气工程系研究生,系统的脉冲响应分析例5-7可以对例5-5求其脉冲响应,MATLAB中没有提供单位脉冲信号模块,可用阶跃模块通过参数设置来近似,令阶跃时间为a,a取很小,则将阶跃初始值设置为1/a,终止值为0,即可近似为单位脉冲。(c5mtimva.mdl),MATLAB教程 simulink-电气工程系研究生,非线性系统分析与仿真分段线性的非线性环节 从simulink所提供的非线性模块来看,数量不多,但利用simulink模块可以搭建出任意的非线性模块。单值分段线性的非线性环节可用look-up table来建立。设起始点、各个拐点以及终点为x0,y0,x1,y1xn,yn,那么只需将各个x值设置在向量输入值,各个y设置在向量输出值栏中即可。,MATLAB教程 simulink-电气工程系研究生,实际设置方式:双击lookup table模块打开参数设置窗口,在Vector of input values栏输入输入值序列,在Table data栏输入对应输出值序列,MATLAB教程 simulink-电气工程系研究生,如果非线性中存在回环或多值属性,则要将它分解成多个条件单值属性:例5-8:产生继电回环回环 图中有两个查表模块,上边的规定了输入上升时的路线,下边的规定了输入下降时的路线。使用memory模块记录上个计算点的值,它与当前输入进行比较,如果当前值大于上个值,则switch接通上边的查表模块,按照上升路线变化,如当前值小于上个值,switch接通下边的查表模块,按照下降路线变化(c5mloop.mdl),MATLAB教程 simulink-电气工程系研究生,其中两个查表环节的参数为,MATLAB教程 simulink-电气工程系研究生,例如实现饱和继电回环(c5mloopa.mdl)上下两个查表模块的参数如下:,MATLAB教程 simulink-电气工程系研究生,例5-9使用饱和继电回环进行如下仿真:在正弦波得幅值分别为2、4、8时的仿真结果:(c5msin.mdl),MATLAB教程 simulink-电气工程系研究生,非线性系统的极限环研究 有时非线性系统在没有外界作用的情况下,可能会出现一种叫做“自激振荡”的等幅振荡现象。例5-10下面这个含有回环非线性环节的系统(c5mlimcy.mdl),MATLAB教程 simulink-电气工程系研究生,可在simulink窗口直接运行,也可在MATLAB命令窗口进行:可以从相平面图中看出,相平面最终稳定在一个封闭的曲线上。这个封闭曲线成为极限环,是非线性系统响应的一个特点。,MATLAB教程 simulink-电气工程系研究生,非线性系统的线性化 实际系统中往往存在非线性环节,这时常需要对系统进行线性化,以简化系统的分析和设计。系统的线性化实际是在系统的工作点附近的领域内提取系统的线性特征,从而对系统进行分析设计。通常非线性系统的一般格式为:所谓工作点,就是当状态变量的导数趋于0时的状态变量值。即令得到的状态变量值。MATLAB提供了Simulink模型的工作点求取函数trim(),其调用格式为:x,u,y,xd=trim(模型名,x0,u0)其中“模型名”是Simulink模型的文件名,变量x0,u0为数值算法所要求的 起始搜索点,是用户应该指定的状态初值和工作点的输入信号。对不含非线性环节的系统,不需x0,u0的设置。实际的工作点在x,u,y变量中返回,而状态变量的导数值在xd中返回(理论上,状态变量在工作点处的一阶导数都应为0)。,MATLAB教程 simulink-电气工程系研究生,得到x0后,非线性系统在此工作点附近,在u0输入信号作用下可近似表示为 选择新的状态变量,令 且则可将上式写成线性形式:其中,MATLAB教程 simulink-电气工程系研究生,MATLAB中给出了Simulink模型线性化的linmod2()等函数,用以在工作点附近提取系统的线性化模型。使用这些函数可直接获得系统的状态方程模型。调用格式如下:A,B,C,D=linmod2(模型名,x0,u0);一般连续系统线性化 A,B,C,D=linmod(模型名,x0,u0);一般连续延迟系统线性化 A,B,C,D=dlinmod(模型名,x0,u0);含离散环节的系统线性化 其中x0,u0为工作点的状态与输入值,可由trim()函数求出。对只由线性模块构成的Simulink模型来说,可省略这两个参数。调用了这些函数后,将自动返回输入到输出之间的线性状态方程模型。linmod2()和linmod()两者功能相似,但算法不同,前者可处理延迟环节的Pade近似,而后者不能。,MATLAB教程 simulink-电气工程系研究生,例5-11考虑例5-3多变量系统模型,此时将其输入用输入端口替代。对于时间延迟模块,将Pade order(for linearization)栏目设置为2,可自动用二阶Pade近似取代原来的时间延迟环节。(c5mmdly.mdl),MATLAB教程 simulink-电气工程系研究生,保存,在MATLAB命令窗口执行:,MATLAB教程 simulink-电气工程系研究生,续:,MATLAB教程 simulink-电气工程系研究生,续:,MATLAB教程 simulink-电气工程系研究生,例5-12,对于前面例5-4的计算机控制系统,在线性化之前,需要改写simulink模型,用输入端子代替阶跃输入或给该环节添加一路输入端子,去掉连续输出信号得:保存为c5mcomp2.mdl 则可在MATLAB命令窗口使用语句进行线性化:,MATLAB教程 simulink-电气工程系研究生,即:,MATLAB教程 simulink 子系统模块-电气工程系研究生,子系统与模块封装技术子系统概念及构成方法 直接建立子系统:子系统的输入端由Source模块中的In来表示,输出端由Out来表示。由已有simulink系统建立子系统:选中子系统部分,通过Edit-Create Subsystem菜单项来建立。此时simulink自动将流入选中区的信号依次设置为输入信号,流出信号设置为输出信号。,MATLAB教程 simulink 子系统模块-电气工程系研究生,子系统的封装 不进行封装的子系统,要想设置其中参数,需双击打开子系统,逐个对系统内的模块进行参数设置。在子系统比较复杂时,就比较麻烦。在simulink中,所谓封装(masking),就是将其对应的子系统内部结构隐含起来,以便访问该模块时只出现一个参数设置对话框,将模块中所需的参数用该对话框来输入。建立子系统封装的第一步,就是将子系统模块选中,再选择Edit-Mask Subsystem子菜单项,这时就打开了模块封装编辑程序界面。在这个界面中,对子系统的图标,参数等进行设置:,MATLAB教程 simulink 子系统模块-电气工程系研究生,封装编辑界面,MATLAB教程 simulink 子系统模块-电气工程系研究生,第二步:对图标的外形进行设置1、Drawing commands 允许给该模块图标上绘制图形,如可以使用MATLAB的plot()函数画出线状的图形,使用disp()函数在图标上写字符串名,还允许用image()函数来绘制图像。一旦进行过编辑的子模块,需重新进一步进行编辑时要通过Edit-Edit Mask进入编辑界面。,MATLAB教程 simulink 子系统模块-电气工程系研究生,如:,MATLAB教程 simulink 子系统模块-电气工程系研究生,如:,MATLAB教程 simulink 子系统模块-电气工程系研究生,2、Icon options 可对边框透明与否,图标是否旋转等进行设置。,MATLAB教程 simulink 子系统模块-电气工程系研究生,第三步:建立封装的内部变量和封装对话框之间的联系 1、Parameters,MATLAB教程 simulink 子系统模块-电气工程系研究生,例:建立如下子系统模块,其中有四个参数Kp,Ti,Td,N,一般N10,MATLAB教程 simulink 子系统模块-电气工程系研究生,打开封装编辑界面,选择parameters,点击 四次,在窗口中未四个参数准备位置。单击各个参数位置,可在Prompt(提示)中填写该参数的提示信息,如Proportional(Kp),然后在Variable(变量)栏目中填写相关联的 参数名Kp(该名称必须与框图中参数一致)。,MATLAB教程 simulink 子系统模块-电气工程系研究生,按以上步骤继续设置Kd,Ki.还可以采用相应的方式编辑其他变量的关联关系。在Type栏选择popup,在下面popups中输入弹出取值。则可得到如图参数N的弹出设置方式。,MATLAB教程 simulink 子系统模块-电气工程系研究生,3、Initialization 对此模块进行初始化处理4、Documentation 对模块进行说明,MATLAB教程 simulink 子系统模块-电气工程系研究生,在打开子模块的情况下(look undermask)重新命名输入输出口的名称,即可改变子模块的口的标示名称(保证封装对话框的Transparency属性必须为Transparent),MATLAB教程 simulink 子系统模块-电气工程系研究生,例5-14(c5mli14.mdl)对于前面的分段非线性环节,该模型可认为是其一般描述形式,单值非线性可认为上下两路的非线性形状完全一致。在封装之前将两路非线性查表模块的参数分别设置为(xu,yu)和(xd,yd),MATLAB教程 simulink 子系统模块-电气工程系研究生,封装设置:,MATLAB教程 simulink 子系统模块-电气工程系研究生,封装完毕,搭建一个正弦输入的系统,正弦幅值设置为4,双击回环子模块,打开参数设置窗口按照例5-8的参数设置,设置方式如图:,MATLAB教程 simulink 子系统模块-电气工程系研究生,在simulink中启动仿真:,MATLAB教程 simulink 子系统模块-电气工程系研究生,模块集的构造(未实现)第一步:在simulink窗口选择File-New-Library,建立一个模块子的空白窗口,并将该窗口存盘。第二步:将用户自己建立的simulink模块复制到该模块集中。利用相应的方法,还可以将模块集再分级建立子模块集。第三步:确认复制的模块和原来的模块所在窗口没有链接关系,具体的方法是,选中该模块,右击鼠标查看Link options菜单项为灰色则没有链接关系。如果高亮可选,则通过该菜单本身断开链接。第四步:如想在simulink的模块浏览器上显示该模块集,则需在该目录中建立一个!,MATLAB教程 simulink M函数-电气工程系研究生,M函数编写及应用 编写(第二章已介绍)应用例:使用第二章所建立的my_factor.m文件(在当前路径上),建立simulink模型计算5!,MATLAB教程 simulink S函数-电气工程系研究生,S函数的编写及应用 S函数的基本结构:S函数是有固定格式的,MATLAB语言和C语言编写的S函数的格式是不一样的。用MATLAB语言编写的S函数的引导语句为:function sys,x0,str,ts=fun(t,x,u,flag,p1,p2,)其中fun为S函数的函数名,t,x,u分别为时间、状态和输入信号,flag为标志位,其取值不同,S函数执行的任务与返回的数据也不同:1、flag=0时,启动S函数所描述的系统的初始化过程。此时调用一个名为mdlInitializeSizes()的子函数,对一些参数进行初始设置。如离散(连续)状态变量的个数,输入输出的路数,采样周期及其个数,状态变量的初始向量等。首先通过sizes=simsizes语句获得默认的系统参数变量sizes。得到的sizes实际上是一个结构体变量,其常用成员为:,MATLAB教程 simulink S函数-电气工程系研究生,.NumContStates表示S函数描述的模块中连续状态的个数.NumDiscStates表示离散状态的个数.NumInputs和.NumOutputs分别表示模块输入和输出的个数.DirFeedthrough为输入信号是否直接在输出端出现,取值可为0,1.NumSampleTimes为模块采样周期的个数,S函数支持多采样周期系统 按照要求设置好的结构体sizes应该在通过sys=simsizes(sizes)语句赋给sys参数。另外还应设置系统的初始状态变量x0、说明变量str和采样周期变量ts,其中ts变量应该为双列的矩阵,其中每一行对应一个采样周期。对于连续系统和有单个采样周期的系统来说,该变量为t1,t2,其中t1为采样周期,如果取t1=-1则将继承输入信号的采样周期,参数t2为偏移量,一般取为0。2、flag=1时,做连续状态变量的更新,调用mdlDerivatives()函数,更新后的连续状态变量由sys变量返回。3、flag=2时,做离散状态变量的更新,调用mdlUpdate()函数,更新后的状态变量由sys变量返回。,MATLAB教程 simulink S函数-电气工程系研究生,4、flag=3时求取系统的输出信号,调用mdlOutputs()函数,将计算得出的输出信号由sys变量返回。5、flag=4时调用mdlGetTimeOfNextVarHit()函数,计算下一步的仿真时刻,并将计算得出的下一步仿真时间由sys返回。6、flag=9时调用mdlTerminate()函数,终止仿真过程,不返回任何变量。S函数目前不支持其他的flag取值。形成S函数的模块后,就可以将其嵌入到系统的仿真模型中进行仿真了。仿真过程中,simulink自动将flag设置为0,进行初始化,然后将flag设置为3,计算输出,一个仿真周期后,将flag的值分别设置为1和2,更新状态,再将flag设置为3计算模块输出,如此一个周期接一个周期,直至仿真结束条件满足,simulink将flag设置为9,终止仿真过程。,MATLAB教程 simulink S函数-电气工程系研究生,S函数编写 初始化需要确定的信息是:输入、输出信号是什么,模块中有多少连续状态、离散状态,离散模块的采样周期 系统状态方程、离散状态更新及模块输出计算:应知道:该模块连续和离散的状态方程分别是什么,如何用MATLAB语句表示,如何从模块的状态和输入信号计算输出。例:,MATLAB教程 simulink S函数-电气工程系研究生,例:微分-跟踪器,离散形式为:式中T为采样周期,u(k)为第k时刻的输入信号,r为决定跟踪快慢的参数,而h为输入信号被噪声污染时,决定滤波效果的参数。fst函数可以由下面的式子计算:,MATLAB教程 simulink S函数-电气工程系研究生,对于如此复杂的这么一套公式,simulink模块搭建困难。使用S函数。从方程中能够得到的信息:离散状态x1(k),x2(k),无连续状态,有一路输入u(k),输出应有两路,一路是原输入的跟踪信号y1(k)=x1(k),另一路是其微分y2(k)=x2(k),系统采样周期T,系统的输出可由状态计算出,不直接涉及输入信号u(k),r、h、T应理解为该模块的附加参数。则根据这些条件写出S函数:,MATLAB教程 simulink S函数-电气工程系研究生,续:,MATLAB教程 simulink S函数-电气工程系研究生,续该函数输入完成后,保存为han_td.m,MATLAB教程 simulink S函数-电气工程系研究生,从模块库中选取S-function模块,双击模块打开参数设置窗口,设置如图:取r=30 h=0.01 T=0.001,MATLAB教程 simulink S函数-电气工程系研究生,搭建simulink 模型,仿真结果如图:,MATLAB教程 simulink S函数-电气工程系研究生,S函数的封装,右击S函数模块,选中Mask s-function,进入封装界面,修改模块的参数设置界面。与子模块的封装用法相同。,MATLAB教程 simulink S函数-电气工程系研究生,做了如上封装后,再双击该模块,打开参数设置界面,