使用模板编写s-function,用户只需把s-函数名换成期望的函数名称,如果需要额外的输入参量,还需在输入参数列表的后面增加这些参数,因为前面的4个参数是simulink调用s-function时自动传入的 。对于输出参数,最好不做修改 。
接下去的工作就是根据所编s-function要完成的任务,用相应的代码去替代模板里各个子函数的代码即可 。Simulink在每个仿真阶段都会对s-function进行调用,在调用时,Simulink会根据所处的仿真阶段为flag传入不同的值,而且还会为sys这个返回参数指定不同的角色,也就是说尽管是相同的sys变量,但在不同的仿真阶段其意义却不相同,这种变化由simulink自动完成 。
m文件s-function可用的子函数说明如下:mdlInitializeSizes:定义s-function模块的基本特性,包括采样时间、连续或者离散状态的初始条件和sizes数组 。mdlDerivatives:计算连续状态变量的微分方程 。
mdlUpdate:更新离散状态、采样时间和主时间步的要求 。mdlOutputs:计算s-function的输出 。
mdlGetTimeOfNextVarHit:计算下一个采样点的绝对时间,这个方法仅仅是在用户在mdlInitializeSizes 里说明了一个可变的离散采样时间 。mdlTerminate:实现仿真任务必须的结束 。
概括说来,建立s-function可以分成两个分离的任务:初始化模块特性包括输入输出信号的宽度,离散连续状态的初始条件和采样时间 。将算法放到合适的s-function子函数中去 。
2、定义s-function的初始信息为了让Simulink识别出一个m文件s-function,用户必须在s-函数里提供有关s-函数的说明信息,包括采样时间、连续或者离散状态个数等初始条件 。这一部分主要是在mdlInitializeSizes子函数里完成 。
Sizes数组是s-function函数信息的载体,它内部的字段意义为:NumContStates:连续状态的个数(状态向量连续部分的宽度)NumDiscStates:离散状态的个数(状态向量离散部分的宽度)NumOutputs: 输出变量的个数(输出向量的宽度)NumInputs:输入变量的个数(输入向量的宽度)DirFeedthrough:有无直接馈入NumSampleTimes:采样时间的个数如果字段代表的向量宽度为动态可变,则可以将它们赋值为-1 。注意DirFeedthrough是一个布尔变量,它的取值只有0和1两种,0表示没有直接馈入,此时用户在编写mdlOutputs子函数时就要确保子函数的代码里不出现输入变量u;1表示有直接馈入 。
NumSampleTimes表示采样时间的个数,也就是ts变量的行数,与用户对ts的定义有关 。需要指出的是,由于s-function会忽略端口,所以当有多个输入变量或多个输出变量时,必须用mux模块或demux模块将多个单一输入合成一个复合输入向量或将一个复合输出向量分解为多个单一输出 。
3、输入和输出参量说明S-function默认的4个输入参数为t、x、u和flag,它们的次序不能变动,代表的意义分别为:t:代表当前的仿真时间,这个输入参数通常用于决定下一个采样时刻,或者在多采样速率系统中,用来区分不同的采样时刻点,并据此进行不同的处理 。x: 表示状态向量,这个参数是必须的,甚至在系统中不存在状态时也是如此 。
它具有很灵活的运用 。u:表示输入向量 。
flag:是一个控制在每一个仿真阶段调用哪一个子函数的参数,由Simulink在调用时自动取值 。S-function默认的4个返回参数为sys、x0、str和ts,它们的次序不能变动,代表的意义分别为:sys:是一个通用的返回参数,它所返回值的意义取决于flag的值 。
x0: 是初始的状态值(没有状态时是一个空矩阵[]) 。
【sfunction怎么写】