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 

posted @ 2020-06-29 11:25  中年二班  阅读(1455)  评论(0编辑  收藏  举报