我是靠谱客的博主 谨慎煎蛋,这篇文章主要介绍MATLABS-Function s函数简单应用,现在分享给大家,希望可以做个参考。

文章目录

    • 什么叫S函数
    • 用MATLAB语言编写S函数
      • (1)主函数
      • (2)子函数
    • S函数的应用
      • (1)定义s函数
        • 1.主函数
        • 2.初始化子函数
        • 3.输出子函数
      • 完整代码
      • (2)在Simulink模型中使用S函数

参照B站av52613760/p52视频,视频中和我所用的MATLABR20141a不同,改动后在我的版本上运行成功

什么叫S函数

  • s函数是系统函数(System Function)的简称,是指采用一种程序设计语言描述的一个功能模块。
  • 用户可以采用MATLAB语言,也可以采用C、C++或FORTRAN等语言来编写S函数。
  • S函数有自己特定的语法构成规则,可以用来描述并实现连续系统、离散系统以及复合系统。
  • S函数能够接收来自Simulink求解算法的相关信息,并对求解算法发出的命令做出适当的响应,这种交互作用类似于Simulink系统模块与求解算法的相互作用。

用MATLAB语言编写S函数

在MATLAB命令行窗囗输入命令,打开模板文件。

复制代码
1
2
>> edit sfuntmpl.m

模板文件sfuntmpl.m包括:

  • 1个主函数
  • 6个子函数

(1)主函数

主函数的引导语句为:
function [sys,x0,str,ts]=fname(t,x,u,flag)

  • fmame是S函数的函数名.
  • 输入形参t、x、u、flag分别为仿真时间、状态向量、输入向量和子函数调用标志.
  • 输出形参sys代表一种返回参数;×0是初始状态值;对于M文件S函数,str将被置成一个空阵;ts是一个两列矩阵(一列是各状态变量的采样周期,一列是相应的采样时间的偏移量).TS = [0 0] 连续采样 ;TS =[-1 0]继承被连接模块的采样时间

(2)子函数

S函数共有6个子函数,这些子函数的前辍为mdl,由flag的值来控制在仿真的各阶段调用S函数的哪一个子函数.

  • flag取0:调用初始化子函数mdllnitializeSizes.
  • flag取1:调用子函数mdlDerivatives实现连续状态的更新.
  • flag取2:调用子函数mdlUpdate实现离散状态的更新.
  • Flag取3:调用输出子函数mdlOutputs.
  • flag取4,9的情况较少使用

S函数的应用

采用S函数实现y=kx+b.

(1)定义s函数

1.主函数

复制代码
1
2
3
4
5
6
7
8
9
10
function [sys,x0,str,ts]=timekb(t,x,u,flag,k,b) switch flag case 0 [sys,x0,str,ts]=mdlInitializeSizes;%初始化 case 3 sys=mdlOutputs(t.x.u,k.b);%计算输出量 %该段其余代码与模板一致 end

2.初始化子函数

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;%单个采样周期 sys=simsizes(sizes); %给其他返回参数赋值 X0=[];%设置初始状态为零状态 str=[];%将str变量设置为空字符串 ts=[-1,0];%假定继承输入信号的采样周期

3.输出子函数

复制代码
1
2
3
function sys=mdlOutputs(t,x,u,k,b)%t仿真时间,x状态向量,u输入向量,k,b自定义参数 sys=k*u+b;

完整代码

以下代码为在模板按照上述说明做改动,所用软件版本为matlabR2014a且成功运行

复制代码
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
function [sys,x0,str,ts,simStateCompliance] = timeFunctionkb(t,x,u,flag,k,b)%%较模板加入k.b %SFUNTMPL General MATLAB S-Function Template % With MATLAB S-functions, you can define you own ordinary differential % equations (ODEs), discrete system equations, and/or just about % any type of algorithm to be used within a Simulink block diagram. % % The general form of an MATLAB S-function syntax is: % [SYS,X0,STR,TS,SIMSTATECOMPLIANCE] = SFUNC(T,X,U,FLAG,P1,...,Pn) % % What is returned by SFUNC at a given point in time, T, depends on the % value of the FLAG, the current state vector, X, and the current % input vector, U. % % FLAG RESULT DESCRIPTION % ----- ------ -------------------------------------------- % 0 [SIZES,X0,STR,TS] Initialization, return system sizes in SYS, % initial state in X0, state ordering strings % in STR, and sample times in TS. % 1 DX Return continuous state derivatives in SYS. % 2 DS Update discrete states SYS = X(n+1) % 3 Y Return outputs in SYS. % 4 TNEXT Return next time hit for variable step sample % time in SYS. % 5 Reserved for future (root finding). % 9 [] Termination, perform any cleanup SYS=[]. % % % The state vectors, X and X0 consists of continuous states followed % by discrete states. % % Optional parameters, P1,...,Pn can be provided to the S-function and % used during any FLAG operation. % % When SFUNC is called with FLAG = 0, the following information % should be returned: % % SYS(1) = Number of continuous states. % SYS(2) = Number of discrete states. % SYS(3) = Number of outputs. % SYS(4) = Number of inputs. % Any of the first four elements in SYS can be specified % as -1 indicating that they are dynamically sized. The % actual length for all other flags will be equal to the % length of the input, U. % SYS(5) = Reserved for root finding. Must be zero. % SYS(6) = Direct feedthrough flag (1=yes, 0=no). The s-function % has direct feedthrough if U is used during the FLAG=3 % call. Setting this to 0 is akin to making a promise that % U will not be used during FLAG=3. If you break the promise % then unpredictable results will occur. % SYS(7) = Number of sample times. This is the number of rows in TS. % % % X0 = Initial state conditions or [] if no states. % % STR = State ordering strings which is generally specified as []. % % TS = An m-by-2 matrix containing the sample time % (period, offset) information. Where m = number of sample % times. The ordering of the sample times must be: % % TS = [0 0, : Continuous sample time. % 0 1, : Continuous, but fixed in minor step % sample time. % PERIOD OFFSET, : Discrete sample time where % PERIOD > 0 & OFFSET < PERIOD. % -2 0]; : Variable step discrete sample time % where FLAG=4 is used to get time of % next hit. % % There can be more than one sample time providing % they are ordered such that they are monotonically % increasing. Only the needed sample times should be % specified in TS. When specifying more than one % sample time, you must check for sample hits explicitly by % seeing if % abs(round((T-OFFSET)/PERIOD) - (T-OFFSET)/PERIOD) % is within a specified tolerance, generally 1e-8. This % tolerance is dependent upon your model's sampling times % and simulation time. % % You can also specify that the sample time of the S-function % is inherited from the driving block. For functions which % change during minor steps, this is done by % specifying SYS(7) = 1 and TS = [-1 0]. For functions which % are held during minor steps, this is done by specifying % SYS(7) = 1 and TS = [-1 1]. % % SIMSTATECOMPLIANCE = Specifices how to handle this block when saving and % restoring the complete simulation state of the % model. The allowed values are: 'DefaultSimState', % 'HasNoSimState' or 'DisallowSimState'. If this value % is not speficified, then the block's compliance with % simState feature is set to 'UknownSimState'. % Copyright 1990-2010 The MathWorks, Inc. % % The following outlines the general structure of an S-function. % switch flag, %%%%%%%%%%%%%%%%%% % Initialization % %%%%%%%%%%%%%%%%%% case 0, [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes; %%%%%%%%%%%%%%% % Derivatives % %%%%%%%%%%%%%%% case 1, sys=mdlDerivatives(t,x,u); %%%%%%%%%% % Update % %%%%%%%%%% case 2, sys=mdlUpdate(t,x,u); %%%%%%%%%%% % Outputs % %%%%%%%%%%% case 3, sys=mdlOutputs(t,x,u,k,b);%%%%较模板加入k.b %%%%%%%%%%%%%%%%%%%%%%% % GetTimeOfNextVarHit % %%%%%%%%%%%%%%%%%%%%%%% case 4, sys=mdlGetTimeOfNextVarHit(t,x,u); %%%%%%%%%%%%% % Terminate % %%%%%%%%%%%%% case 9, sys=mdlTerminate(t,x,u); %%%%%%%%%%%%%%%%%%%% % Unexpected flags % %%%%%%%%%%%%%%%%%%%% otherwise%出错处理 DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end % end sfuntmpl % %============================================================================= % mdlInitializeSizes % Return the sizes, initial conditions, and sample times for the S-function. %============================================================================= % function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes % % call simsizes for a sizes structure, fill it in and convert it to a % sizes array. % % Note that in this example, the values are hard coded. This is not a % recommended practice as the characteristics of the block are typically % defined by the S-function parameters. % 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); % % initialize the initial conditions % x0 = []; % % str is always an empty matrix % str = []; % % initialize the array of sample times % ts = [-1 0]; % Specify the block simStateCompliance. The allowed values are: % 'UnknownSimState', < The default setting; warn and assume DefaultSimState % 'DefaultSimState', < Same sim state as a built-in block % 'HasNoSimState', < No sim state % 'DisallowSimState' < Error out when saving or restoring the model sim state simStateCompliance = 'UnknownSimState'; % end mdlInitializeSizes % %============================================================================= % mdlDerivatives % Return the derivatives for the continuous states. %============================================================================= % function sys=mdlDerivatives(t,x,u) sys = []; % end mdlDerivatives % %============================================================================= % mdlUpdate % Handle discrete state updates, sample time hits, and major time step % requirements. %============================================================================= % function sys=mdlUpdate(t,x,u) sys = []; % end mdlUpdate % %============================================================================= % mdlOutputs % Return the block outputs. %============================================================================= % function sys=mdlOutputs(t,x,u,k,b)%%t仿真时间,x状态向量,u输入向量,k,b自定义参数 sys=k*u+b; % end mdlOutputs % %============================================================================= % mdlGetTimeOfNextVarHit % Return the time of the next hit for this block. Note that the result is % absolute time. Note that this function is only used when you specify a % variable discrete-time sample time [-2 0] in the sample time array in % mdlInitializeSizes. %============================================================================= % function sys=mdlGetTimeOfNextVarHit(t,x,u) sampleTime = 1; % Example, set the next hit to be one second later. sys = t + sampleTime; % end mdlGetTimeOfNextVarHit % %============================================================================= % mdlTerminate % Perform any end of simulation tasks. %============================================================================= % function sys=mdlTerminate(t,x,u) sys = []; % end mdlTerminate

(2)在Simulink模型中使用S函数

做好了s函数后,simulink–user-defined function下拖一个S-Function到你的模型,就可以用了;在simulink——-user-defined function还有个s-Function Builder,他可以生成用c语言写的s函数;
在matlab的workspace下打sfundemos,可以看到很多演示s函数的程序
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置完之后,点击运行,再点击查看波形可得如下结果
运行之后得出此波形

最后

以上就是谨慎煎蛋最近收集整理的关于MATLABS-Function s函数简单应用的全部内容,更多相关MATLABS-Function内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部