1 建立模型
2 模型参数设置
注意设置0.001s的延时,因为s-fun中是0.01的步长
3 s-function代码
%函数的总入口,收到信号后,首先进入这个函数.这个函数包含一个switch语句,根据情况进入不同的子函数
function [sys,x0,str,ts] = exp_pidf(t,x,u,flag)
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
DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
%S-function进行基本的设置,相当于构造函数,定义S函数的基本特性,包括采样时间、连续或者离散状态的初始条件和Sizes数组
function [sys,x0,str,ts]=mdlInitializeSizes
sizes = simsizes; %调用构造函数,生成一个默认类
sizes.NumContStates = 0; %设置系统连续状态的数量,如果是2个输出,则设为2
sizes.NumDiscStates = 3; %设置系统离散状态的数量
sizes.NumOutputs = 1; %设置系统输出的数量,如果是2个输出,则设为2
sizes.NumInputs = 2; %设置系统输入的数量
sizes.DirFeedthrough = 1; %设置系统直接通过量的数量,一般为1
sizes.NumSampleTimes = 1; % At least one sample time is needed
% 采样时间个数,1表示只有一个采样周期.
% 猜测为如果为n,则下一时刻的状态需要知道前n个状态的系统状态
sys = simsizes(sizes); %将sizes结构体中的信息传递给sys
x0 = [0;0;0]; % 系统初始状态
str = []; % 保留变量,保持为空
ts = [-1 0]; % 采样时间
%该函数仅在连续系统中被调用,计算连续状态变量的微分方程,求所给表达式的等号左边状态变量的积分值的过程
function sys=mdlDerivatives(t,x,u) %Time-varying model
sys = [];
%sys=mdlUpdate(t,x,u); 该函数仅在离散系统中被调用,用于产生控制系统的下一个状态;更新离散状态、采样时间和主时间步的要求
function sys=mdlUpdate(t,x,u) %更新离散状态
T=0.001;
sys=[u(1); %P部分-本次偏差
x(2)+u(1)*T;%I部分,偏差的累加
(u(1)-u(2))/T];%D部分,偏差的变化
%产生(传递)系统输出
function sys=mdlOutputs(t,x,u)
kp=20;
ki=0.0;
kd=0.5;
sys=kp*x(1)+ki*x(2)+kd*x(3);
% sys=mdlGetTimeOfNextVarHit(t,x,u) 获得下一次系统执行(next hit)的时间,该时间为绝对时间 此函数仅在采样时间数组中指定变量离散时间采样时间[-2 0]时会被调用。
function sys=mdlGetTimeOfNextVarHit(t,x,u)
% sampleTime = 1; %设置下一个采样时间在1s之后
% sys = t + sampleTime;
sys = [];
% sys=mdlTerminate(t,x,u) 相当于构析函数,结束该仿真模块时被调用
function sys=mdlTerminate(t,x,u)
sys = [];
4 仿真结果
参考材料《MATLAB_SIMULINK系统仿真》