function [sys,x0,str,ts,simStateCompliance] = s_td(t,x,u,flag)
%[sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag,p1,…pn)
% flag result 描述
% —– —— ——————————————–
% 0 [sizes,x0,str,Ts] 初始化,返回SYS的大小,初始状态x0,str,采样时间Ts
% 1 DX 返回连续状态微分SYS.
% 2 DS 更新离散状态 SYS = X(n+1)
% 3 Y 返回输出SYS.
% 4 TNEXT Return next time hit for variable step sample time in SYS.
% 5 Reserved for future (root finding).
% 9 [] 结束 perform any cleanup SYS=[].
% 当flag=0时,以下信息必须赋值回传
% SYS(1) = 连续状态个数
% SYS(2) = 离散状态个数
% SYS(3) = 输出量个数
% SYS(4) = 输入量个数 注:上述4个变量可以赋值为-1,表示其值可变
% SYS(5) = 保留值。为0.
% SYS(6) = 直接馈通标志(1=yes, 0=no).如果u在flag=3时被使用,说明S函数是直接馈通,赋值为1. 否则为0.
% SYS(7) = 采样时间个数,Ts的行数
%
% X0 = 初始状态。没有则赋值为[].除flag=0外,被忽略。
% STR = 系统保留,设为[].
% TS = m*2 矩阵。(采样周期,偏移量)
% TS = [0 0, : 连续采样
% 0 1, : 在1个Ts后连续采样
% PERIOD OFFSET, : Discrete sample time where
% PERIOD > 0 & OFFSET < PERIOD.
% -2 0]; : 变步长离散采样,
% flag=4用于决定下一个采样时刻
% 注:
% 若希望每个时间步都运行,则设Ts=[0,0]
% 若希望继承采样时间运行,则设Ts=[-1,0]
% 若希望继承采样时间运行,且希望在微步内不变化,应该设Ts=[-1,1]
% 若希望仿真开始0.1s后每隔0.25秒运行,则设Ts=[0.25,0.1]
% 若希望按照不同速率执行不同任务,则Ts应按照升序排列。
% 即:每隔0.25秒执行一个任务,同时在开始0.1秒后,每隔1秒执行另一个任务
% Ts=[0.25,0; 1.0,0.1],则simulink将在下列时刻执行s函数[0,0.1,0.25,0.5,0.75,1,1.1,…]
% 以下是S函数的主函数
switch flag
case 0 % 初始化
[sys,x0,str,ts,simStateCompliance]=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);
case{1 4 9}
sys=[];
otherwise % 未知flag值
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end % S函数主程序结束
%=============================================================================
% mdlInitializeSizes
% 返回s函数的sizes、初始条件、采样时刻
%=============================================================================
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
% 调用simsizes函数为sizes结构赋值
% simsizes函数是S函数模块特有的。它的结构和代码是固定的。
sizes = simsizes;
sizes.NumContStates = 0; %连续状态个数
sizes.NumDiscStates = 2; %离散状态个数
sizes.NumOutputs = 2; %输出量个数
sizes.NumInputs = 1; %输入量个数
sizes.DirFeedthrough = 1; %直接馈通标志
sizes.NumSampleTimes = 1; % 至少有一个采样时刻
sys = simsizes(sizes);
x0 = [0;0]; % 状态初始化
str = []; % str 始终为空
ts = [0 0];% 初始化采样时间
% 指定simStateCompliance的值.
% ‘UnknownSimState’, < 默认值; warn and assume DefaultSimState
% ‘DefaultSimState’, < Same sim state as a built-in block
% ‘HasNoSimState’, < No sim state
% ‘DisallowSimState’ < Error out when saving or restoring the model sim state
simStateCompliance = 'UnknownSimState';
% 子函数mdlInitializeSizes 结束
end
%=============================================================================
% mdlDerivatives
% 返回连续状态量的导数
%=============================================================================
% function sys=mdlDerivatives(~,x,u)
% v1=x(1);
% v2=x(2);
% ud=u(1);
% % h=0.01;
% sys(1)=v2;
% sys(2)=-10000*(v1-ud)-2*100*v2;
% end
% 子函数mdlDerivatives结束
%=============================================================================
% mdlUpdate
%更新离散时间状态,采样时刻和主时间步的要求。
%=============================================================================
function sys=mdlUpdate(~,x,u)
% v1=x(1);
% v2=x(2);
% ud=u(1);
h=0.0001;
sys(1,1)=x(1)+h*x(2);
sys(2,1)=x(2)+h*fhan(x(1)-u,x(2),10,0.1);
end
% 子函数 mdlUpdate 结束
%=============================================================================
% mdlOutputs
% 计算并返回模块输出量
%=============================================================================
function sys=mdlOutputs(~,x,~)
sys(1)=x(1);
sys(2)=x(2);
end
% 子函数 mdlOutputs 结束
%=============================================================================
% mdlGetTimeOfNextVarHit
% 返回下一个采样时刻。注意返回结果是一个绝对时间,只在Ts=[-2,0]时使用。
%=============================================================================
% function sys=mdlGetTimeOfNextVarHit(t,x,u)
%
% sampleTime = 1; % 例子。设置下一个采样时刻为1s后。
% sys = t + sampleTime;
%
% % 子函数 mdlGetTimeOfNextVarHit 结束
%
% %=============================================================================
% % mdlTerminate
% % 仿真结束
% %=============================================================================
% %
% function sys=mdlTerminate(t,x,u)
%
% sys = [];
%
% % 子函数 mdlTerminate结束
end