s函数基础

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 = [];


  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值