s function 使用

function[sys, x0, str, ts] = system_MPC (t,x,u,flag)
%例子,实现的功能:u(1)+u(2)
%%=========================================================================
% t         --simulated time
% x         --inner simulated block
% u         --simulated output
% flag      --operation flage
% sys       --S function output
% x0        --S function initial states
% str       --temp empty vector
% ts        --(2 X 2)time sample matrix,[:,1] sampling time and [:,2] time shifting
%%=========================================================================
% t,x,flag这几个参数在系统调用该函数时会有系统自动赋值;
% u为模块的输入信号,可以是向量即多条信号输入;
%%=========================================================================
%%执行顺序(时序):
%flag=
% 03 -> 1234 ->1234 ->1234 -> ······ 9

%%=========================================================================
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);
  otherwise
        error(['Unhandled flag = ', num2str(flag)])
end
%%=========================================================================
%%flag=0,系统的初始化,只执行一次
%%=========================================================================
function [sys, x0, str, ts] = mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates = 0; % NumContStates: 模块中,连续状态变量的个数。
sizes.NumDiscStates = 1; % NumDiscStates: 模块中,离散状态变量的个数。
sizes.NumOutputs = 1; % 模块输出的个数,调用时用sys(1)、sys(2)...表示各输出。
sizes.NumInputs = 2; % 模块输入信号的路数(个数),调用时用u(1)、u(2)...表示各输入。
sizes.DirFeedthrough = 1; % 输入信号是否直接在输出端口出现,取值0、1。
sizes.NumSampleTimes = 1; % 该模块中,采用周期的个数,因为s-function模块支持多个采样周期参与。
sys = simsizes(sizes);
x0 = [0]; % 状态变量的初始值,离散?连续?
str = []; % 说明变量。
ts = [-1 0]; % 采样周期变量,结构必须是2列的矩阵,每一行表示一种采样周期,
         %行中的第一个量表示采样周期(取-1表示继承输入信号即u的采样周期),第二个量表示偏移量(一般取0)。
%%=========================================================================
%%flag=1,更新连续状态变量,周期执行。
%%========================================================================= 
function sys = mdlDerivatives(t, x, u)
        sys = [];
%%=========================================================================
%%flag=2,更新离散状态变量,周期执行。
%%=========================================================================
function sys = mdlUpdate(t, x, u)
        sys = x;
%%=========================================================================
%%flag=3,求取s-function模块的输出,周期执行。
%%=========================================================================
function sys = mdlOutputs(t, x, u)
        sys = u(1) + u(2); %此时的变量sys为输出。
%%=========================================================================
%%flag=4,计算下一步的仿真时刻,周期执行。
%%=========================================================================
function sys = mdlGetTimeOfNextVarHit(t, x, u)
        sampleTime = 1;
        sys = t + sampleTime; %此时的变量sys为s-function下一次计算的时刻,??不知怎么用?????????
%%=========================================================================
%%flag=9,仿真结束,只执行一次,一般不用返回任何内容。
%%=========================================================================
function sys = mdlTerminate(t, x,u)
        sys = [];
%%=========================================================================

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值