天气: 晴朗
心情: 正常
1.S-function函数 System function的简称,是对一个动态系统的计算机程序语言描述。
S-function接收来自Simulink解法器的相关信息,并对解法器发出的命令做出适当的响应,这种交互作用类似simulink系统模块与解法器交互作用。
在Matlab中,可以选择M文件,C或MEX文件编写。
最广泛的用途是定制用户自己的simulink模块。
主要用来实现下面几个方面的功能:
①增加一个通用目标的模型
②使用S-function的模块来充当硬件的驱动
③在仿真中嵌入已经存在的C代码
④将系统表示成一系列的数学方程
⑤在simulink中使用动画
2.常用概念
① 直接馈通
指输出(或者是对于变步长采样块的可变步长)直接受控于一个输入口的值。
②动态维矩阵
S-function可编写成支持任意维的输入。当仿真开始时,根据驱动S-function的输入向量的维数动态确定实际输入的维数。
M文件的S-function只可有一个输入端口,而且输入端口只能接受一维(向量)的信号输入。
信号的宽度是可变的。在一个M文件的S-function内,如果要指示输入宽度是动态的,必须在数据结构sizes中相应的域值指定为-1,结构sizes是在调用mdlInitializeSizes时返回的一个结构。
当S-function通过使用length(u)来调用时,可以确定实际输入的宽度。如果指定为0宽度,那么S-function模块中将不出现输入端口。
如果块的其他特性,如输出数量、离散状态数量或连续状态数量,被指定为动态宽度,那么simulink会将这些向量定义为与输入向量具有相同的长度。
③采样时间和偏移量
采样时间选项:
连续采样时间:用于具有连续状态和/或非过零采样的S-function
连续但微步长固定采样时间:需要在每一个主仿真步上执行,但在微步长内值不发生变化的S-function
离散采样时间:如果S-function模块的行为是离散时间间隔的函数,那么可以定 义一个采样时间来控制simulink何时调用该模块。也可以定义一个偏移量来延迟每个采样时间点。偏移量的值不超过相应采样时间的值。
采样时间点发生的时间:
TimeHit=(n*period)+offset
可变采样时间:采样时间间隔变化的离散采样时间。在每步仿真的开始,具有可变采样时间的S-function需要计算下一次采样点的时间。
继承采样时间:从其输入块继承采样时间。
一个块可以从以下几种块中继承采样时间:
①输入块 ;②输出块;③系统中最快的采样时间
采样时间设置为继承:M文件中的S-function中使用-1作为采样时间,C的S-function中使用INHERITED_SAMPLE_TIME作为采样时间。
采样时间是按照固定格式成对指定的:[采样时间,偏移时间]
还可指定采样时间从驱动块继承而来,S-function只能有一个采样时间对
3.S-function模块
S-Function模块在User Defined Function库中
双击S-function模块,打开其参数设置对话框,设置S-Function参数
S-function name(文件名)填写S-function不带扩展名的文件名,文件名文本框不能为空。
S-function parameters(参数编辑框)文本框中填写S-function所需要的参数,参数并列给出,参数间以逗号分隔开。
创建S-Function源代码,单击"Edit"按钮,即可打开源代码M文件的编辑窗口
连接模块,进行仿真
4.S-function工作原理
S-function优点就是可以创建一个通用的模块,在模块中可以多次调用,在不同的场合下仅仅修改它的参数。
仿真流程:
S-function包括主函数和6个功能子函数
mdlInitializeSizes初始化,定义S-function的基本特性,包括采样时间、连续或离散状态的初始条件和Sizes数组
mdlDerivatives连续状态微分
mdlUpdate离散状态更新
mdlOutputs模块输出
mdlGetTimeOfNextVarHit计算下次采样时刻
mdlTerminate仿真结束
仿真过程中,通过Switch-case语句,根据不同阶段对应的flag值(仿真流程标志向量)来调用S-function的不同子函数,以完成对S-function模块仿真流程的控制。
定义S-function的初始信息
S-function的说明信息,这一部分主要是在mdlIntializeSizes子函数里完成。
Sizes数组是S-function函数信息的载体,它的内部字段意义为:
①NumContStates:连续状态的个数(状态向量连续部分的宽度)
②NumDIscStates:离散状态的个数(状态向量离散部分的宽度)
③NumOutputs:输出变量的个数(宽度)
④NumInputs:输入变量的个数(宽度)
⑤DirFeedthrough:有无直接馈入,其是一个布尔代数,0或1两种,0代表没有
⑥NumSampleTimes:采样时间的个数,ts变量的行数
字段代表的向量宽度为动态可变,则可以将它们赋值为-1
由于S-function会忽略端口,所以当有多个输入变量或多个输出变量时,必须用mux模块或demux模块进行合成或分解
输入和输出的参量说明:
默认的4个输入参量:t,x,u,flag,他们次序不能变动
t代表仿真时间;x代表状态向量;u代表输入向量;flag是一个控制在每个仿真阶段调用哪一个子函数的参数;
默认的4个输出参量:sys,x0,str,ts,他们次序不能变动
sys是一个通用的返回参数,它的返回值取决于flag值; x0是初始状态值,这个返回参数只有在flag值为0时才有效;str没有任何意义;ts是一个m*2的矩阵,它的两列分别表示采样时间间隔和偏移。
建立S-function可以分成两个分离的任务:
①初始化模块特性
②将算法放到合适的S-function子函数中去