function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)
% SFUNTMPL 是 M-文件 S 函数模板
%
%
能
%
%
%
%
%
%
%
%
%
%
%
%
通过剪裁,用户可以生成自己的 S 函数,不过一定要重新命名
利用 S 函数可以生成连续、离散混合系统等,实现任何模块的功
M-文件 S 函数的语法为:
[SYS,X0,STR,TS] = SFUNC(T,X,U,FLAG,P1,...,Pn)
参数含义:
t 是当前时间
x 是 S 函数相应的状态向量
u 是模块的输入
flag 是所要执行的任务
FLAG
结果
-----
------
功能
-------------
-------------------------------
%
%
0
1
模块导数
%
2
[SIZES,X0,STR,TS]
模块初始化
DX
DS
计算
更新
模块离散状态
%
3
模块输出
%
4
个采样时间点
Y
TNEXT
%
9
[]
计算
计算下一
结束
仿真
%
%
%
%
动
%
用户切勿改动输出参数的顺序、名称和数目
输入参数的数目不能小于 1,这四个参数的名称和排列顺序不能改
用户可以根据自己的要求添加额外的参数,位置依次为第 5,6,7,
8,9 等。
%
S 函数的 flag 参数是一个标记变量,具有 6 个不同值,分别为 0,
1,2,3,4,9
%
%
flag 的 6 个值分别指向 6 个不同的子函数
flag 所指向的子函数也成为回调方法(Callback Methods)
switch flag,
%初始化,调用“模块初始化”子程序%
case 0,
[sys,x0,str,ts]=mdlInitializeSizes;
%连续状态变量计算,调用“计算模块导数”子函数%
case 1,
sys=mdlDerivatives(t,x,u);
%更新,调用“更新模块离散状态”子函数%
case 2,
sys=mdlUpdate(t,x,u);
%输出,调用“计算模块输出”子函数%
case 3,
sys=mdlOutputs(t,x,u);
%计算下一时刻采样点,调用“计算下一个采样时刻点”子函数%
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
%结束,调用“结束仿真”子函数%
case 9,
sys=mdlTerminate(t,x,u);
%其他的 flag%
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
% end sfuntmpl
%=============================================================================
% “模块初始化”子函数
% 返回大小、初始条件和样本
function [sys,x0,str,ts]=mdlInitializeSizes
%
%
调用 simsizes 函数,返回规范格式的 sizes 构架
这条指令不要修改
sizes = simsizes;
%
%
模块的连续状态个数,0 是默认值
用户可以根据自己的要求进行修改
sizes.NumContStates
= 0;
%
%
模块的离散状态个数,0 是默认值
用户可以根据自己的要求进行修改
sizes.NumDiscStates
= 0;
%
%
模块的输出个数,0 是默认值
用户可以根据自己的要求进行修改
sizes.NumOutputs
= 0;
%
%
模块的输入个数,0 是默认值
用户可以根据自己的要求进行修改
sizes.NumInputs
= 0;
%
%
模块中包含的直通前向馈路个数,1 是默认值
用户可以根据自己的要求进行修改
sizes.DirFeedthrough = 1;
%
%
模块中采样时间的个数,1 是默认值,至少需要一个样本时间
用户可以根据自己的要求进行修改
sizes.NumSampleTimes = 1;
%
%
初始化后的构架 sizes 经 simsizes 函数处理后向 sys 赋值
这条指令不要修改
sys = simsizes(sizes);
%
%
x0
%
%
给模块初始值变量赋值,[]是默认值
用户可以根据自己的要求进行修改
= [];
系统保留变量
切勿改动,保持为空
str = [];
%
%
%
“二元对”描述采样时间及偏移量。[0 0]是默认值
[0 0]适用于连续系统
[-1 0]则表示该模块采样时间继承其前的模块采样时间设置
ts
= [0 0];
% end mdlInitializeSizes
%=============================================================================
% 计算导数向量
function sys=mdlDerivatives(t,x,u)
%
%
%
此处填写计算导数向量的指令
[]是模块的默认值
用户必须把算得的离散状态的导数向量赋给 sys
sys = [];
% end mdlDerivatives
%=============================================================================
% 计算离散状态向量
function sys=mdlUpdate(t,x,u)
%
%
%
此处填写计算离散状态向量的指令
[]是模块的默认值
用户必须把算得的离散状态向量赋给 sys
sys = [];
% end mdlUpdate
%=============================================================================
% 计算模块输出向量
function sys=mdlOutputs(t,x,u)
%
%
%
此处填写计算模块输出向量的指令
[]是模块的默认值
用户必须把算得的模块输出向量赋给 sys
sys = [];
% end mdlOutputs
%=============================================================================
% 计算下一采样时刻
function sys=mdlGetTimeOfNextVarHit(t,x,u)
%
%
%
该子函数仅在“采样时间”情况下使用
sampleTime = 1 是模块默认设置,表示在当前时间 1 秒后再调用本模块
用户可以根据自己的要求修改
sampleTime = 1;
%
%
将计算得到的下一采样时刻赋给 sys
切勿改动
sys = t + sampleTime;
% end mdlGetTimeOfNextVarHit
%=============================================================================
function sys=mdlTerminate(t,x,u)
%
模板默认设置,一般情况不要改动
sys = [];
% end mdlTerminate