马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
本帖最后由 牛小贱 于 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[sys,x0,str,ts]=sfuntmpl(t,x,u,flag)。 一般来说,S函数的定义形式为[sys,x0,str,ts]=sfunc(t,x,u,flag,p1,…Pn)。其中,sfunc为自己定义的函数名称,以上参数中,t、x、u分别对应时间、状态、输入信号,flag为标志位,其取值不同,S函数执行的任务和返回的数据也是不同的,pn为额外的参数,sys为一个通用的返回参数值,其数值根据flag的不同而不同,x0为状态初始数值,str在目前为止的matlab版本中并没有什么作用,一般str=[]即可,ts为一个两列的矩阵,包含采样时间和偏移量两个参数,如果设置为[0 0],那么每个连续的采样时间步都运行,[-1 0]则表示按照所连接的模块的采样速率进行,[0.25 0.1]表示仿真开始的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函数的学习十分有帮助。
|