Matlab·Simulink的使用—【S函数的创建与应用】

(〇) 前言

S函数是什么
    S函数是系统函数的英文缩写,指采用一种设计语言(非图形方式)去描述的一个功能模块
如何编写S函数
    可以用Matlab的语言,也可以用其它编程语言入C,C++等
    我只介绍下常用的MATLAB自带“语言”和S函数模板去编写S函数

(一) 编写S函数

①在命令行窗口输入命令: >>edit sfuntmpl.m
    即可打开模板文件
在这里插入图片描述
②模板文件sfuntmpl.m包含了一个主函数和六个子函数

【1】我们先看主函数
  主函数首句——引导语句为:
function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)
     其中,fname是S函数的函数名;
     输入形参t,x,y,flag分别为仿真时间,状态向量,输入向量和调用标志
     输出形参sys表示返回参数;x0是初始状态值;str被设置为空阵;ts是一个两列矩阵,一列为各状态变量的采样周期,另一列是相应采样时间的偏移量。
     【M文件中S函数是这么设置的】

   【2】再看看**子函数**:

  子函数的前缀为mdl,由flag来控制调用情况
常用的四种情况:
   Flag=0:调用初始化子函数 mdlInitializeSizes;
   Flag=1:调用连续状态更新子函数 mdlDerivatives(t,x,u);
   Flag=2: 调用离散状态更新子函数 mdlUpdate(t,x,u);
   Flag=3: 调用输出子函数 mdlOutputs(t,x,u);

(二)S函数的应用:

  举个最简单的栗子:y=kx+b

  (1)定义S函数

        ①初始化主函数

function [sys,x0,str,ts,simStateCompliance] = move(t,x,u,flag)
switch flag,
    case 0,
        [sys,x0,str,ts,simStateCompliance]=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

        ②初始化子函数

function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 1;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 0;
sizes.NumSampleTimes = 1;   % at least one sample time is needed
sys = simsizes(sizes);
x0  = [0];
str = [];
ts  = [0 0];
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u)
sys = u;
function sys=mdlUpdate(t,x,u)
sys=[];
function sys=mdlOutputs(t,x,u)
sys=x;
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 = [];

  (2)Simulink模型中使用S函数

    首先我们需要用模块搭建出这个模型
    新手可能找不到器件,这里我简单说一下:simulink标准模块库中,Sinks下有Scope,Sources下有Sine Wave,User-Defined Functions下有S-Function.连起来就可以了
    这里再说一下如何修改Scope的输入端子数:双击打开Scope界面,点击左上方设置,修改Input参数就可以了,记得修改完点Apply
在这里插入图片描述
建立完模型如下:
在这里插入图片描述
得到结果如下:
在这里插入图片描述
    采样时间:对于Simulink模型来说,解算器中的一个步长决定了整个模型最小的采样时间间隔。

(三)特别注意*——保证能够正确运行

    第一次应用S函数时肯能会碰到很多问题,我就几个常见问题总结接个需要注意的地方,希望大家能一次写对。

    ①注意此处 S函数名一定要和编写的.m文件,否则会报错在这里插入图片描述
    ②注意,一定要把S函数的.m文件和模型的.slx文件放在一个目录下,确保点击Edit时,可以找到并打开对应S函数M文件
在这里插入图片描述
    ③注意,要把matlab的当前工作目录修改为你这两个文件保存的目录下
在这里插入图片描述
    这样基本上就可以保证运行,如果有其他问题,请自行查询或者评论。

发布了7 篇原创文章 · 获赞 21 · 访问量 195

猜你喜欢

转载自blog.csdn.net/Nirvana_Tai/article/details/105439610
今日推荐