您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > simulink建模仿真_.
第12章编写M语言S-函数12.1S-函数12.2在模型中创建S-函数12.3S-函数的概念12.4编写M语言S-函数12.5M文件S-函数范例第12章编写M语言S-函数12.1S-函数12.1.1S-函数的定义S-函数是系统函数(SystemFunction)的简称,是指采用非图形化的方式描述一个模块。S-函数使用特定的调用语法,这种语法可以与Simulink中的方程求解器相互作用,S-函数中的程序从求解器中接收信息,并对求解器发出的命令做出适当的响应。这种作用方式与求解器和内嵌的Simulink模块之间的作用很相似。S-函数的格式是通用的,它们可以用在连续系统、离散系统和混合系统中。第12章编写M语言S-函数完整的S-函数结构体系包含了描述一个动态系统所需的全部能力,所有其他的使用情况(比如用于显示目的)都是这个默认体系结构的特例。S-函数允许用户向Simulink模型中添加用户自己的模块,它作为与其他语言相结合的接口程序,可以用MATLAB、C、C++、Fortran或Ada语言创建自己的模块,并使用这些语言提供的强大功能,用户只需要遵守一些简单的规则即可。例如,M语言编写的S-函数可以调用工具箱和图形函数;C语言编写的S-函数可以实现对操作系统的访问。用户还可以在S-函数中实现用户算法,编写完S-函数之后,用户可以把S-函数的名称放在S-Function模块中,并利用Simulink中的封装功能自定义模块的用户接口。第12章编写M语言S-函数第12章编写M语言S-函数下面的方程表示了模块输入、状态和输出之间的数学关系:),,(ouxtfy(输出)),,(dcuxtfx(微分)),,(ud1uxtfxi(更新)这里,dcxxx。第12章编写M语言S-函数x(状态)u(输入)y(输出)图12-1第12章编写M语言S-函数2.Simulink仿真过程Simulink模型的仿真执行过程包括两个阶段。第一个阶段是初始化阶段,在这个过程中,模块的所有参数都被传递给MATLAB进行求值,因此所有的参数都被确定下来,并且模型的层次被展开,但是原子子系统仍被作为单独的模块进行对待。另外,Simulink把库模块结合到模型中,并传递信号宽度、数据类型和采样时间,确定模块的执行顺序,并分配内存,最后确定状态的初值和采样时间。然后Simulink进入第二个阶段,仿真开始,也就是仿真循环过程。仿真是由求解器控制的,它计算模块的输出,更新模块的离散状态,计算连续状态,在采用变步长求解器时,求解器还需要确定时间步长。求解器计算连续状态时包含下面几个步骤:第12章编写M语言S-函数(1)每个模块按照预先确定的顺序计算输出,求解器为待更新的系统提供当前状态、时间和输出值,反过来,求解器又需要状态导数的值。(2)求解器对状态的导数进行积分,计算新的状态的值。(3)状态计算完成后,模块的输出更新再进行一次。这里,一些模块可能会发出过零警告,促使求解器探测出发生过零的准确时间。第12章编写M语言S-函数在每个仿真时间步期间,模型中的每个模块都会重复这个循环过程,Simulink会按照初始化过程所确定的模块执行顺序来执行模型中的模块。而对于每个模块,Simulink都会调用函数,以计算当前采样时间中的模块状态、微分和模块输出。这个过程会一直继续下去,直到仿真结束。第12章编写M语言S-函数这里把系统和求解器在仿真过程之间所起的作用总结一下。求解器的作用是传递模块的输出,对状态导数进行积分,并确定采样时间,求解器传递给系统的信息包括时间、输入和当前状态。系统的作用是计算模块的输出,对状态进行更新,计算状态的导数和生成过零事件,并把这些信息提供给求解器。在S-函数中,求解器和系统之间的对话是通过不同的标志来控制的。求解器在给系统发送标志的同时也发送数据,系统使用这个标志来确定所要执行的操作,并确定所要返回的变量的值。求解器和系统之间的这种关系可以用图12-2描述。第12章编写M语言S-函数传递模块输出对状态导数积分确定采样时间时间、输入、状态输出、导数Simulink计算模块输出计算状态导数计算状态更新产生过零事件求解器系统图12-2第12章编写M语言S-函数3.S-函数的控制流S-函数的调用顺序是通过flag标志来控制的。在仿真初始化阶段,通过设置flag标志为0来调用S-函数,并请求提供数量(包括连续状态、离散状态和输入、输出的个数)、初始状态和采样时间等信息。然后,仿真开始,设置flag标志为4,请求S-函数计算下一个采样时间,并提供采样时间。接下来设置flag标志为3,请求S-函数计算模块的输出。然后设置flag标志为2,更新离散状态。当用户还需要计算状态导数时,可设置flag标志为1,由求解器使用积分算法计算状态的值。计算出状态导数和更新离散状态之后,通过设置flag标志为3来计算模块的输出,这样就结束了一个时间步的仿真。当到达结束时间时,设置flag标志为9,结束仿真。这个过程如图12-3所示。第12章编写M语言S-函数设置初始条件计算下一个采样时间(只用于变采样时间模块)Flag=0mdlInitializeConditionsmdlInitializeSizesmdlInitializeSampleTimes计算输出更新离散状态计算输出计算微分结束,执行其它任务Flag=4mdlGetTimeNextVarHitFlag=3mdlOutputsFlag=2mdlUpdateFlag=3mdlOutputsFlag=1mdlDerivativesFlag=9mdlTerminate图12-3第12章编写M语言S-函数4.S-函数回调方法S-函数是由一组S-函数回调方法组成的,这些回调方法在每个仿真阶段执行不同的任务。在模型仿真过程中,在每次仿真阶段,Simulink都会为模型中的每个S-Function模块调用合适的方法。S-函数回调方法可以执行的任务包括:初始化—在首次仿真循环开始之前,Simulink会初始化S-函数。在这个过程中,Simulink会执行下面的操作:初始化SimStruct,这是一个包含S-函数信息的仿真结构;设置输入端口和输出端口的个数及维数;设置模块采样时间;分配空间和sizes数组。第12章编写M语言S-函数计算下一个采样时间点—如果用户已经创建了一个变采样时间模块,那么此时会计算下一个采样点的时间,也就是计算下一个步长。以最大时间步计算输出—在本次调用结束后,所有模块的输出端口在当前时间步上都是有效的。以最大时间步更新离散状态—在本次调用中,所有模块都应该执行一次更新,也就是为下一次仿真循环更新一次离散状态。第12章编写M语言S-函数积分——这主要应用于具有连续状态和/或非采样过零的模型。如果用户的S-函数带有连续状态,那么Simulink会在最小时间步上调用S-函数的输出和微分部分,因此Simulink也就可以为用户的S-函数计算状态。如果用户的S-函数(只是对CMEX文件)带有非采样的过零,那么Simulink会在最小时间步上调用用户S-函数的输出和过零部分,因此也就可以确定过零产生的具体位置。第12章编写M语言S-函数第12章编写M语言S-函数S-Function1对话框S-Function对话框S函数源文件M文件CMEX文件或/**MYSFUN**//*Thefollo#defineS_FU...function[sys%mysfunM-file%switch(flag)...图12-4第12章编写M语言S-函数12.2.2向S-函数中传递参数S-Function模块参数对话框内有一个S-functionparameters参数,在其下面的文本框内用户可以指定传送到相应S-函数中的参数值。当然,用户必须知道S-函数要求的参数和这些参数的调用顺序,然后按照S-函数要求的顺序输入参数,并用逗号分隔,参数值可以是常数、在模型工作区中定义的变量名称或MATLAB表达式。图12-5说明了如何使用S-functionparameters文本框输入用户定义的参数。第12章编写M语言S-函数图12-5中的模型调用了名称为limintm的采样S-函数,函数的源代码存储在toolbox/simulink/blocks目录中。limintm函数包括三个参数:下限值、上限值和初始条件。如果时间积分在上限和下限之间,则函数输出输入信号的时间积分;如果时间积分小于下限,则输出下限值;如果时间积分大于上限,则输入上限值。从图中的S-Function模块对话框中可以看到,这里分别指定下限、上限和初始条件为2、3和2.5。当输入信号是幅值为1的正弦波时,示波器的输出结果见图12-5所示。用户利用Simulink中的封装功能为S-函数模块创建用户对话框和图标后,封装后的对话框可以很容易地为S-函数指定其他的参数。第12章编写M语言S-函数图12-5第12章编写M语言S-函数12.2.3何时使用S-函数对于大多数系统来说,使用Simulink提供的现成模块就能够实现系统功能,而不需要借助S-函数,但在开发一个新的通用模块时,应当使用S-函数。S-函数会将已有的代码结合进来,而不需要在Simulink中重新实现算法。此外,在S-函数中,公式是由文本输入的,当表达一个复杂系统时很适合,尤其是随时间而变化的系统。利用S-函数用户还可以实现在仿真过程的每个阶段进行微调。第12章编写M语言S-函数因此,如果用户想要创建自定义的Simulink模块,则可以考虑使用S-函数。对于下面的应用都可以使用S-函数,它们包括:向Simulink中添加新的通用模块;添加用来表示硬件设备驱动的模块;把已有的代码合并到Simulink中进行仿真;把一个系统描述为一组数学方程时,利用S-函数可以采用文本方式输入复杂的方程,而不必花太多的时间绘制方程;在模型中使用图形动画。第12章编写M语言S-函数12.3S-函数的概念S-函数有一些非常关键的概念,理解这些概念对于正确创建S-函数是非常重要的。这些概念包括:直接馈通;动态确定输入数组的维数;设置采样时间和偏差值。第12章编写M语言S-函数第12章编写M语言S-函数具有变采样时间的S-函数中的mdlGetTimeOfNextVarHit函数(或flag== 4)直接读取输入u,则模块具有直接馈通特性。举一个直接馈通的例子,如果系统的输入和输出关系为y=k×u,这里,u是输入,k是增益,y是输出,那么系统的输出直接受输入值的影响。举一个非直接馈通的例子,如果系统的输出和输入满足下列这个简单的积分算法:输出:微分:第12章编写M语言S-函数这里,x是状态,是对应时刻的状态微分,u是输入,y是输出。需要说明的是,是Simulink积分的一个变量,它对于正确设置直接馈通标志是非常重要的,因为它影响着模型中模块的执行顺序,而且还用来检测代数环。第12章编写M语言S-函数12.3.2动态设置数组维数用户编写的S-函数可以支持任意维数的输入数组,既然如此,当开始仿真时,在求取驱动S-函数的输入向量的维数时,用户可以动态确定实际输入的维数。输入维数也可以用来确定函数中连续状态的个数、离散状态的个数和输出的个数。M文件S-函数只有一个输入端口,这个输入端口也只能接收一维(向量)信号,但是,这个信号的宽度可以是不同的。在M文件S-函数内,为了表示输入的信号宽度是动态指定的,可以在sizes结构中指定属性为-1值,这个结构在mdlInitializeSizes调用时被返回。第12章编写M语言S-函数例如,如果想要在仿真运行时由输入向量的维数确定输入或输出的维数,则可以指定sizes.NumInputs=-1或sizes.NumOutputs=-1,也可以动态指定连续状态和离散状态的数目。如果使用length(u)函数调用S-函数,那么用户可以确定S-Function模块中实际输入的宽度,如果指定宽度值为0,则输入端口被从S-Function模块中删除。例如,图12-6中的模型有两个相同的S-Function模块,上面的S-F
本文标题:simulink建模仿真_.
链接地址:https://www.777doc.com/doc-2858587 .html