1.打开s函数模板
edit sfuntmpl
2.代码中文注释
function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)
%作用定义常微分方程;离散方程;算法
%
% The general form of an MATLAB S-function syntax is:
% [SYS,X0,STR,TS,SIMSTATECOMPLIANCE] = SFUNC(T,X,U,FLAG,P1,...,Pn)
%
% SFUNC在给定时间T返回的值取决于FLAG,状态向量x和输入向量u
P1,...,Pn用到的一些参数
%
%
%
% FLAG RESULT DESCRIPTION
% ----- ------ --------------------------------------------
% 0 [SIZES,X0,STR,TS] 初始化,系统大小设置,初始状态X0,状态排序字符串STR,采样时间Ts
% 1 DX 在SYS返回连续状态导数
% 2 DS 更新离散状态 SYS = X(n+1)
% 3 Y 返回输出
% 4 TNEXT 返回变步长采样时间下一次命中(我也不懂,用的比较少吧)
% 5 为未来保留(查找根)
% 9 [] 终止,执行清除 SYS=[].
%
%
FLAG==0时候的一些参数返回值
%
% SYS(1) = Number of continuous states. 连续状态个数
% SYS(2) = Number of discrete states. 离散状态个数
% SYS(3) = Number of outputs. 输出数量
% SYS(4) = Number of inputs. 输入数量
%前面四个如果值==-1,表示可以动态调整大小,值为输入u的长度
% SYS(5) = 0
% SYS(6) = 直接馈通标志,即在FLAG==3的时候是否使用到U,有的话=1,否=0
% SYS(7) = 采样次数,Ts行数
%
%
% X0 = 初始化状态,没有==[]
%
% STR = [].
%
% TS = (周期, 偏移量)
%
%
% TS = [0 0, : 连续采样时间
% 0 1, : 小定步长连续
% PERIOD OFFSET, : Discrete sample time where
% PERIOD > 0 & OFFSET < PERIOD.
% -2 0]; : 变步长离散采样
% FLAG==4获取下一次命中时间
%
% 可以有一个以上的采样时间,只要它们是有序的,使它们单调递增。只需要在TS中指定所需的采样时间。当指定多个采样时间时,必须通过查看abs(round((T-OFFSET)/PERIOD) - (T-OFFSET)/PERIOD)是否在指定的公差范围内(通常为1e-8)来显式检查样本命中。这个公差取决于你的模型的采样次数和模拟时间。
还可以指定s函数的采样时间继承自驱动块。对于在小步骤中发生变化的函数,可以通过指定SYS(7) = 1和TS =[-1 0]来完成。对于在次要步骤中保存的函数,可以通过指定SYS(7) = 1和TS =[-1 1]来完成。
%
% SIMSTATECOMPLIANCE = 'DefaultSimState','HasNoSimState' or 'DisallowSimState'. 值未被只定 'UknownSimState'.
% Copyright 1990-2010 The MathWorks, Inc.
switch flag,
%%%%%%%%%%%%%%%%%%
% Initialization %
%%%%%%%%%%%%%%%%%%
case 0,
[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;
%%%%%%%%%%%%%%%
% Derivatives %
%%%%%%%%%%%%%%%
case 1,
sys=mdlDerivatives(t,x,u);与后面定义的函数名一致
%%%%%%%%%%
% Update %
%%%%%%%%%%
case 2,
sys=mdlUpdate(t,x,u);
%%%%%%%%%%%
% Outputs %
%%%%%%%%%%%
case 3,
sys=mdlOutputs(t,x,u);
%%%%%%%%%%%%%%%%%%%%%%%
% GetTimeOfNextVarHit %
%%%%%%%%%%%%%%%%%%%%%%%
case 4,
sys=mdlGetTimeOfNextVarHit(t,x,u);
%%%%%%%%%%%%%
% Terminate %
%%%%%%%%%%%%%
case 9,
sys=mdlTerminate(t,x,u);
%%%%%%%%%%%%%%%%%%%%
% Unexpected flags %
%%%%%%%%%%%%%%%%%%%%
otherwise
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0;//连续状态数量
sizes.NumDiscStates = 0;//离散状态数量
sizes.NumOutputs = 0;//输出
sizes.NumInputs = 0;//输入
sizes.DirFeedthrough = 1;//是否直接馈通
sizes.NumSampleTimes = 1; % at least one sample time is needed
sys = simsizes(sizes);
x0 = [];
str = [];
ts = [0 0];
% 'UnknownSimState', < 默认设置; warn and assume DefaultSimState
% 'DefaultSimState', < Same sim state as a built-in block(内置模块)
% 'HasNoSimState', < No sim state
% 'DisallowSimState' <保存或恢复模型sim状态时出错
simStateCompliance = 'UnknownSimState';
%连续状态微分
function sys=mdlDerivatives(t,x,u)
sys = [];
%处理离散状态更新,采样时间,最大时间步长
function sys=mdlUpdate(t,x,u)
sys = [];
%输出
function sys=mdlOutputs(t,x,u)
sys = [];
% end mdlOutputs
%
返回该块下一次命中的时间。注意,结果是绝对时间。注意,只有当您在mdlinitializesize的样本时间数组中指定一个变量离散样本时间[-2 0]时,才会使用此函数。
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1; % Example, set the next hit to be one second later.
sys = t + sampleTime;
%终止
function sys=mdlTerminate(t,x,u)
sys = [];