概述
当Simulink中的模型不能完全的描述所需模型时,可以用S函数来写,其功能非常全面,适用于连续、离散以及混合系统(笔者只用过连续的,后续会举例子)
一、编辑S函数
在matlab命令窗口输入edit sfuntmpl,便出现S函数的模板
对于绿色标注,读者可自行阅读
二、S函数调用格式模板
function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(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);%计算下一步的仿真时刻,由sys变量返回
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 = 0;%连续状态变量个数
sizes.NumDiscStates = 0;%离散状态变量个数
sizes.NumOutputs = 0;%输出个数
sizes.NumInputs = 0;%输入个数
sizes.DirFeedthrough = 1;%输入信号是否直接在输出端出现,取值1或0
sizes.NumSampleTimes = 1;%采样周期个数,默认为1 % at least one sample time is needed
sys = simsizes(sizes);
x0 = [];%设置初始值
str = [];% str is always an empty matrix
ts = [0 0];%[0 0]用于连续系统;[-1 0]表示继承其前的采样时间设置
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u)%计算导数子函数
sys = [];
function sys=mdlUpdate(t,x,u)%离散状态变量更新子函数
sys = [];
function sys=mdlOutputs(t,x,u)%计算输出子函数
sys = [];
function sys=mdlGetTimeOfNextVarHit(t,x,u)%计算下一仿真时刻子函数
sampleTime = 1;%Example, set the next hit to be one second later.%设置本函数的调用时间
sys = t + sampleTime;%计算下一采样时刻由sys变量返回
function sys=mdlTerminate(t,x,u)%终止仿真子函数
sys = [];
% end mdlTerminate
三、S函数的使用
在simulink中,找到S-Function,双击打开
将system更改为所设S函数名称即可。比如本例子用的自带名称(即上述红色字符sfuntmpl),因此,将system更改为sfuntmpl即可。
注意:S函数保存路径应与simulink保存路径一致!!
参考文献:王海英,李双全,管宇.控制系统的MATLAB仿真与设计[M].高等教育出版社.2019.
最后
以上就是懵懂水壶为你收集整理的MATLAB/Simulink/S-Function详解一、编辑S函数二、S函数调用格式模板三、S函数的使用的全部内容,希望文章能够帮你解决MATLAB/Simulink/S-Function详解一、编辑S函数二、S函数调用格式模板三、S函数的使用所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复