Matlab/Simulink-S-function函数(MATLAB版本2020a)

目录

一、S函数简介

二、分功能讲解各case下功能

三、实例应用


一、S函数简介

 system functions,是一种系统函数,可以实现连续、离散、混合系统仿真。

模块适合场合

S-Function通常用来实现Level-1的函数,MATLAB语言
Level-2 MATLAB S-Function比S-Function功能更强大,推荐使用Level-2,使用函数调用功能
S-Function Builder使用C语言或者C++语言

双击S-Function Examples,可以看到几种类型的栗子~

 关于MATLAB file S-functions 中包括Level-1 和Level-2一般选用Level-2。

Level-2库函数,是不能更改的,需要另存为--

二、分功能讲解各case下功能

虽然推荐Level2,但是,栗子,栗子是Level1,因为这个栗子比较好理解,Level2流程都是一样滴。

将库文件另存为level1_Example.m文件。

 输入输出参数及注意事项如下:

 S函数主体为Switch函数,通过flag标志位来对函数进行功能区分。

switch flag,

case0:系统初始化

%主体函数
switch flag,

%初始化 flag=0

case 0,

[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;

%%%%%%%%%%%%%系统调用子函数mdlInitializeSizes。
%%%%%然后我们就直接JUMP到这个被调用的子函数了~~%%%%%%%


%%%%%被调用子函数mdlInitializeSizes,对就是下面这个,懵逼……
输出参数和系统输出参数一致,但是我们%%
%%%%%本来就是要给系统初始化,不一致,就见了鬼了,但是这个只在初始化执行一次!
[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;   % 定义采样时间,至少需要一种采样时间

sys = simsizes(sizes); %结构体数组,将包装好的数组,返回给function函数sys,完成sys初始化

x0  = [];%系统初始状态,没有则为空

str = [];%保留参数,永远为空

ts  = [0 0];%初始化采样时间矩阵,包括采样时间,采样时间偏移值,连续系统[0 0]

simStateCompliance = 'UnknownSimState';%没有必要修改,保持默认即可

后面 flag=1,就进入case1子功能

case1:对相应的输入量进行微分操作

case 1,
    sys=mdlDerivatives(t,x,u);

%%%%JUMP一下%%%%%%

function sys=mdlDerivatives(t,x,u)  %x:状态量,u:输入量,
%如果不存在状态量x,则求微分没有意义,让输出值等于空即可

sys = [];

%%%如果有相应的状态量,则需要写自己写代码…………自己写。
%%%这里就是我们需要更改的地方

 case2:对相应的输入量进行更新Update操作

case 2,
    sys=mdlUpdate(t,x,u);%%%状态更新函数
%%%%%%重复一下JUMP……PPP

function sys=mdlUpdate(t,x,u)
sys = [];
%%%Yammm……,不存在微分的话,就不需要更新

 case3:对相应的输出量进行操作

case 3,
    sys=mdlOutputs(t,x,u);

%%%%%%%%%这也如出一辙%%%%%%%%%
function sys=mdlOutputs(t,x,u)

sys = [];

%%%如果对输出没有操作就不用动,end!!!TT

 case4:对相应的输出量进行操作

case 4,
    sys=mdlGetTimeOfNextVarHit(t,x,u);%%%只针对离散系统

%%%%%再跨越一下,虽然后面还有一跳%%%%%%%%%%%%%%%快捷键:CTRL+D%%%

%%%%GOOD NEWs:如果是连续系统可以直接Delete!!!

function sys=mdlGetTimeOfNextVarHit(t,x,u)

sampleTime = 1;    % 采样时间间隔
sys = t + sampleTime; %

后面的case5-9就不重要了,只要你case了5-8就有问题了。

 case9:函数结束后,清理需要清理的现场(划掉),是数据或者状态或释放内存。

case 9,
    sys=mdlTerminate(t,x,u);

%%%%%%%最后一跃了%%%%%%
function sys=mdlTerminate(t,x,u)
sys = [];
%%%看你想清理啥了……一般来说,这个函数没啥用

三、实例应用

实现一个简单y=k*u功能,Q一下流程

再用不到的case均被删除后,我们得到一个简短的代码:

function [sys,x0,str,ts,simStateCompliance] = level1_Example(t,x,u,flag,gain)%需要一个k,增加一个变量gain...
%
% The following outlines the general structure of an S-function.
%
switch flag,

  %初始化
  case 0,
    [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;

  %输出
  case 3,
    sys=mdlOutputs(t,x,u,gain);%%在这里也要增加gain
  case {1 2 4 9}  %%%这几种情况,对于这个功能都用不到,可以返回空
    sys=[];
  %%%%%%%%%%%%%%%%%%%%
  % Unexpected flags %
  %%%%%%%%%%%%%%%%%%%%
  otherwise
    DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));

end

%=============================================================================
% mdlInitializeSizes
% 初始化
%=============================================================================
%
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes

sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;   % at least one sample time is needed

sys = simsizes(sizes);
x0  = [];
str = [];
ts  = [0 0];
simStateCompliance = 'UnknownSimState';

%=============================================================================
% mdlOutputs
% 输出
%=============================================================================
%
function sys=mdlOutputs(t,x,u,gain)%%%这里也要+gain

sys = gain*u;
% end mdlOutputs

准备好了,S函数,我们就可以开始用simulink调用了!

S-Function函数调用过程中,需要注意三点;

1.除了系统默认的t,x,u,flag以外,如果你增加了新的输入变量,那么要在S-function中声明。

2.S-function name需要和你.m文件名一毛一样,否则调用会出错。歪头

3.Simulink的运行路径必须和你保存.m的路径保持一致,必须保持一致。

具体设置在这里~~

END~~~ 

 

 

 

  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ayuan0211

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值