Simulink为用户提供了许多内置的基本库模块,通过这些模块进行连接而构成系统的模型。对于那些经常使用的模块进行组合并封装可以构建出重复使用的新模块,但它依然是基于Simulink原来提供的内置模块。 自动控制网www.eadianqi.com版权所有 而Simulinks-function是一种强大的对模块库进行扩展的新工具。 本文来自www.eadianqi.com 一、s-function的概念 本文来自www.eadianqi.com s-function是一个动态系统的计算机语言描述,在MATLAB里,用户可以选择用m文件编写,也可以用c或mex文件编写,在这里只给大家介绍如何用m文件编写s-function。 自动控制网www.eadianqi.com版权所有 S-function提供了扩展Simulink模块库的有力工具,它采用一种特定的调用语法,使函数和Simulink解法器进行交互。 本文来自www.eadianqi.com S-function最广泛的用途是定制用户自己的Simulink模块。它的形式十分通用,能够支持连续系统离散系统和混合系统。 自动控制网www.eadianqi.com版权所有 二、建立m文件s-function 自动控制网www.eadianqi.com版权所有 (一)使用模板文件:sfuntmp1.m 本文来自www.eadianqi.com 该模板文件位于MATLAB根目录下toolbox/simulink/blocks目录下。 自动控制网www.eadianqi.com版权所有 模板文件里s-function的结构十分简单,它只为不同的flag的值指定要相应调用的m文件子函数。比如当flag=3时,即模块处于计算输出这个仿真阶段时,相应调用的子函数为sys=mdloutputs(t,x,u)。 本文来自www.eadianqi.com 模板文件使用switch语句来完成这种指定,当然这种结构并不唯一,用户也可以使用if语句来完成同样的功能。而且在实际运用时,可以根据实际需要来去掉某些值,因为并不是每个模块都需要经过所有的子函数调用。 本文来自www.eadianqi.com 模板文件只是Simulink为方便用户而提供的一种参考格式,并不是编写s-function的语法要求,用户完全可以改变子函数的名称,或者直接把代码写在主函数里,但使用模板文件的好处是,比较方便,而且条理清晰。 本文来自www.eadianqi.com
使用模板编写s-function,用户只需把s-函数名换成期望的函数名称,如果需要额外的输入参量,还需在输入参数列表的后面增加这些参数,因为前面的4个参数是simulink调用s-function时自动传入的。对于输出参数,最好不做修改。接下去的工作就是根据所编s-function要完成的任务,用相应的代码去替代模板里各个子函数的代码即可。 本文来自www.eadianqi.com Simulink在每个仿真阶段都会对s-function进行调用,在调用时,Simulink会根据所处的仿真阶段为flag传入不同的值,而且还会为sys这个返回参数指定不同的角色,也就是说尽管是相同的sys变量,但在不同的仿真阶段其意义却不相同,这种变化由simulink自动完成。 自动控制网www.eadianqi.com版权所有
m文件s-function可用的子函数说明如下: 自动控制网www.eadianqi.com版权所有 1)mdlInitializeSizes:定义s-function模块的基本特性,包括采样时间连续或者离散状态的初始条件和sizes数组。 本文来自www.eadianqi.com 2)mdlDerivatives:计算连续状态变量的微分方程。 本文来自www.eadianqi.com 3)mdlUpdate:更新离散状态采样时间和主时间步的要求。 自动控制网www.eadianqi.com版权所有 4)mdlOutputs:计算s-function的输出。 自动控制网www.eadianqi.com版权所有
5)mdlGetTimeOfNextVarHit:计算下一个采样点的绝对时间,这个方法仅仅是在用户在mdlInitializeSizes里说明了一个可变的离散采样时间。 自动控制网www.eadianqi.com版权所有 6)mdlTerminate:实现仿真任务必须的结束。 本文来自www.eadianqi.com 概括说来,建立s-function可以分成两个分离的任务: 自动控制网www.eadianqi.com版权所有 a初始化模块特性包括输入输出信号的宽度,离散连续状态的初始条件和采样时间。 自动控制网www.eadianqi.com版权所有 b将算法放到合适的s-function子函数中去。 自动控制网www.eadianqi.com版权所有
(二)定义s-function的初始信息 自动控制网www.eadianqi.com版权所有
为了让Simulink识别出一个m文件s-function,用户必须在s-函数里提供有关s-函数的说明信息,包括采样时间连续或者离散状态个数等初始条件。这一部分主要是在mdlInitializeSizes子函数里完成。 本文来自www.eadianqi.com Sizes数组是s-function函数信息的载体,它内部的字段意义为: 自动控制网www.eadianqi.com版权所有 a)NumContStates:连续状态的个数(状态向量连续部分的宽度) 自动控制网www.eadianqi.com版权所有 b)NumDiscStates:离散状态的个数(状态向量离散部分的宽度) 自动控制网www.eadianqi.com版权所有
c)NumOutputs:输出变量的个数(输出向量的宽度) 自动控制网www.eadianqi.com版权所有
d)NumInputs:输入变量的个数(输入向量的宽度) 本文来自www.eadianqi.com
e)DirFeedthrough:有无直接馈入 自动控制网www.eadianqi.com版权所有 f)NumSampleTimes:采样时间的个数 自动控制网www.eadianqi.com版权所有 (三)输入和输出参量说明 本文来自www.eadianqi.com S-function默认的4个输入参数为txu和flag,它们的次序不能变动,代表的意义分别为: 本文来自www.eadianqi.com t:代表当前的仿真时间,这个输入参数通常用于决定下一个采样时刻,或者在多采样速率系统中,用来区分不同的采样时刻点,并据此进行不同的处理。 自动控制网www.eadianqi.com版权所有 x:表示状态向量,这个参数是必须的,甚至在系统中不存在状态时也是如此。它具有很灵活的运用。 本文来自www.eadianqi.com u:表示输入向量。 本文来自www.eadianqi.com
flag:是一个控制在每一个仿真阶段调用哪一个子函数的参数,由Simulink在调用时自动取值。 自动控制网www.eadianqi.com版权所有
S-function默认的4个返回参数为sysx0str和ts,它们的次序不能变动,代表的意义分别为: 本文来自www.eadianqi.com
sys:是一个通用的返回参数,它所返回值的意义取决于flag的值。 自动控制网www.eadianqi.com版权所有 x0:是初始的状态值(没有状态时是一个空矩阵[]),这个返回参数只在flag值为0时才有效,其他时候都会被忽略。 本文来自www.eadianqi.com str:这个参数没有什么意义,是MathWorks公司为将来的应用保留的,m文件s-function必须把它设为空矩阵。 本文来自www.eadianqi.com ts:是一个m×2的矩阵,它的两列分别表示采样时间间隔和偏移。 本文来自www.eadianqi.com 例1csfunc.m(连续状态s-function) 自动控制网www.eadianqi.com版权所有 例2dsfunc.m(离散状态s-function) 本文来自www.eadianqi.com 例3mixedm.m(混合系统s-function) 本文来自www.eadianqi.com 例4vsfunc.m(可变步长仿真系统) 本文来自www.eadianqi.com
例5filt.m,rect.m,rload.m(非模板文件形式) 本文来自www.eadianqi.com |