【分享】浅谈S函数(包括其概念、使用及相关问题)
本帖最后由 牛小贱 于 2014-4-2 16:47 编辑首先,什么是S函数?S函数是系统函数(System Function)的简称,其可以使用MATLAB或者C语言写成,包括连续、离散和混合系统,因此,几乎所有的Simulink模型都可以描述为S函数。接下来,就介绍S函数的作用与原理,也就是我们为什么要使用S函数呢?原因很简单:在研究中,有时需要用到复杂的算法设计等,而这些算法因为其复杂性不适合用普通的Simulink模块来搭建,即matlab所提供的Simulink模块不能满足用户的需求,需要用编程的形式设计出S函数模块,将其嵌入到系统中。如果恰当地使用S函数,理论上,可以在Simulink下对任意复杂的系统进行仿真。使用S函数的一个优点是可以创建一个通用的模块,在模型中可以多次使用它,使用时只需要改变它的参数值即可。S函数最通常的用法是创建一个定制的Simulink模块,可以在许多应用程序中使用S函数,包括:(1)Simulinkl中加进新的通用模块;(2)将已存在的C代码融合并入一个仿真中;(3)将一个系统描述为一系列的数学方程;(4)使用图形动画。Simulink模型中的每一个模块都有如下的共同特征:一个输入向量U,一个输入向量Y,以及一个状态向量X。而状态向量可能包括连续状态、离散状态或连续状态的组合。Simulink将状态向量分为两部分:连续状态和离散状态。连续状态占据着向量的第一部分,离散状态占据第二部分。对于没有状态的模块,x是一个控的向量。再者,介绍S函数在Simulink模块中的相关操作。点击Simulink->User-DefinedFunctions->S-Function Examples,即可出现如图1所示的界面,可以选择对应的编程语言查看演示文件。 图1 S函数范例库Matlab为了用户使用方便,有一个S函数的模板sfuntmpl.m,一般来说,我们仅需要在sfuntmpl.m的基础上进行修改即可。具体操作:在matlab的workspace里输入editsfuntmpl(我们可以详细地观察其帮助说明以便更好地了解S函数的工作原理),我们来具体分析s函数的结构。模板函数的定义形式为function=sfuntmpl(t,x,u,flag)。一般来说,S函数的定义形式为=sfunc(t,x,u,flag,p1,…Pn)。其中,sfunc为自己定义的函数名称,以上参数中,t、x、u分别对应时间、状态、输入信号,flag为标志位,其取值不同,S函数执行的任务和返回的数据也是不同的,pn为额外的参数,sys为一个通用的返回参数值,其数值根据flag的不同而不同,x0为状态初始数值,str在目前为止的matlab版本中并没有什么作用,一般str=[]即可,ts为一个两列的矩阵,包含采样时间和偏移量两个参数,如果设置为,那么每个连续的采样时间步都运行,[-1 0]则表示按照所连接的模块的采样速率进行,表示仿真开始的0.1s后每0.25s运行一次,采样时间点为TimeHit=n*period+offset。在S函数的使用过程中需要注意2个概念:(1)directfeedthrough,系统的输出是否直接和输入相关联,即输入是否出现在输出端的标志,若是为1,否则为0,一般可以根据在flag=3的时候,mdlOutputs函数是否调用输入u来判断是否直接馈通;(2)dynamicallysized inputs,主要给出连续状态的个数、离散状态的个数、输入数目、输出数目和直接馈通否。S函数中目前支持的flag选择有0、1、2、3、4、9等几个数值,下面说一下在不同的flag情况下S函数的执行情况。1)flag=0。进行系统的初始化过程,调用mdlInitializeSizes函数,对参数进行初始化设置,比如离散状态个数、连续状态个数、模块输入和输出的路数、模块的采样周期个数、状态变量初始数值等。2)flag=1。进行连续状态变量的更新,调用mdlDerivatives函数。3)flag=2。进行离散状态变量的更新,调用mdlUpdate函数。4)flag=3。求取系统的输出信号,调用mdlOutputs函数。5)flag=4。调用mdlGetTimeOfNextVarHit函数,计算下一仿真时刻,由sys返回。6)flag=9。终止仿真过程,调用mdlTerminate函数。 图2 不同flag情况下S函数执行情况在实际仿真过程中,Simulink会自动将flag设置为0,进行初始化过程,然后将flag的数值设置为3,计算模块的输出,一个仿真周期后,Simulink将flag的数值先后设置为1和2,更新系统的连续和离散状态,再将其设置为3,计算模块的输出,如此循环直至仿真结束条件满足。 在S函数的编写过程中,首先需要搞清楚模块中有多少个连续和离散状态,离散模块的采样周期是如何的,同时需要了解模块的连续和离散的状态方程分别是什么,输出如何表示。【附件_S函数实例】以实例说明S函数的具体应用。附件中还有其他S函数资料,对于S函数的学习十分有帮助。
Matlab及ADAMS集中营 这帖子,果断收藏!!!{:{39}:} Nicky_ONE 发表于 2014-3-5 18:14
这帖子,果断收藏!!!
有什么不足之处,还望你补充、更正!!{:{04}:} 这帖子太好了!!谢谢楼主啊!!{:{39}:} 这帖子太好了!!谢谢楼主啊!!{:{39}:}
页:
[1]