概述
目录
一、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~~~
最后
以上就是阔达裙子为你收集整理的Matlab/Simulink-S-function函数(MATLAB版本2020a)的全部内容,希望文章能够帮你解决Matlab/Simulink-S-function函数(MATLAB版本2020a)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复