MATLAB/Simulink/S-Function详解

当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.

  • 16
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值