(〇) 前言
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的当前工作目录修改为你这两个文件保存的目录下
这样基本上就可以保证运行,如果有其他问题,请自行查询或者评论。