S-Function 使用(一)
撒
function [sys,x0,str,ts] = SecondOrderSystem(t,x,u,flag,zeta,wn) switch flag case 0 [sys,x0,str,ts] = mdlInitializeSizes; % initialize block case 1 sys = mdlDerivatives(t,x,u,zeta,wn); % define xdot=f(t,x,u) % case 2 没有,例程中没有差分方程 case 3 sys = mdlOutputs(t,x,u,wn); % define xup=h(t,x,u) otherwise sys=[]; end %========================================================================== function [sys,x0,str,ts] = mdlInitializeSizes sizes = simsizes; sizes.NumContStates = 2; % 连续状态变量的个数 sizes.NumDiscStates = 0; sizes.NumOutputs = 1; % 输出变量的个数 sizes.NumInputs = 1; % 输入变量的个数 sizes.DirFeedthrough = 0; % 输入是否前馈到输出,是=1,否=0 sizes.NumSampleTimes = 1; % 采样时间 sys = simsizes(sizes); x0 = [0; 0]; % 状态初值 str = []; % 设置一个空矩阵str,功能未知 ts = [0 0]; % 时间初始化 [period; offset], period=0指连续时间,offset=0指系统从0时刻开始 %========================================================================== function xdot = mdlDerivatives(t,x,u,zeta,wn) xdot(1) = -2 * zeta * wn * x(1) - wn^2 * x(2) + u; xdot(2) = x(1); %========================================================================== function y = mdlOutputs(t,x,u,wn) y = wn^2 * x(2);
以上是一个标准的2阶系统的S-Function的m.file
对于传递函数要先转化成状态方程形式,参见《现代控制理论》能控标准型和能观标准型部分
在Simulink中调用 S-Function,位置在 Simulink / User-Defined Function
Parameters中填入的是自己定义的 Zeta,wn这两个变量,其他的如 t , x , u ,flag 这些是系统默认调用参数,不用填;
第三行 module 中只有在调用C语言编写的文件时才填,否则空着。(C语言文件后面补充,目前建模没用到)
传递函数G(s) 位置在 Simulink / Continuous / Transfer Function
冲击函数delta 位置在 Simulink / Source / Pulse Generator