我是靠谱客的博主 阔达裙子,这篇文章主要介绍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:系统初始化

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
%主体函数 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:对相应的输入量进行微分操作

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
case 1, sys=mdlDerivatives(t,x,u); %%%%JUMP一下%%%%%% function sys=mdlDerivatives(t,x,u) %x:状态量,u:输入量, %如果不存在状态量x,则求微分没有意义,让输出值等于空即可 sys = []; %%%如果有相应的状态量,则需要写自己写代码…………自己写。 %%%这里就是我们需要更改的地方

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

复制代码
1
2
3
4
5
6
7
case 2, sys=mdlUpdate(t,x,u);%%%状态更新函数 %%%%%%重复一下JUMP……PPP function sys=mdlUpdate(t,x,u) sys = []; %%%Yammm……,不存在微分的话,就不需要更新

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

复制代码
1
2
3
4
5
6
7
8
9
case 3, sys=mdlOutputs(t,x,u); %%%%%%%%%这也如出一辙%%%%%%%%% function sys=mdlOutputs(t,x,u) sys = []; %%%如果对输出没有操作就不用动,end!!!TT

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
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:函数结束后,清理需要清理的现场(划掉),是数据或者状态或释放内存。

复制代码
1
2
3
4
5
6
7
case 9, sys=mdlTerminate(t,x,u); %%%%%%%最后一跃了%%%%%% function sys=mdlTerminate(t,x,u) sys = []; %%%看你想清理啥了……一般来说,这个函数没啥用

三、实例应用

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

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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
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)内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(58)

评论列表共有 0 条评论

立即
投稿
返回
顶部