S-Function
参考博客: https://blog.csdn.net/weixin_42650162/article/details/90488610
复制代码
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
88function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag) %主函数 %主函数包含四个输出: % sys数组包含某个子函数返回的值 % x0为所有状态的初始化向量 % str是保留参数,总是一个空矩阵 % Ts返回系统采样时间 %函数的四个输入分别为采样时间t、状态x、输入u和仿真流程控制标志变量flag %输入参数后面还可以接续一系列的附带参数simStateCompliance 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); case 9, sys=mdlTerminate(t,x,u); otherwise DAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag)); end %主函数结束 %下面是各个子函数,即各个回调过程 function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes %初始化回调子函数 %提供状态、输入、输出、采样时间数目和初始状态的值 %初始化阶段,标志变量flag首先被置为0,S-function首次被调用时 %该子函数首先被调用,且为S-function模块提供下面信息 %该子函数必须存在 sizes = simsizes; %生成sizes数据结构,信息被包含在其中 sizes.NumContStates = 0; %连续状态数,缺省为0 sizes.NumDiscStates = 0; %离散状态数,缺省为0 sizes.NumOutputs = 0; %输出个数,缺省为0 sizes.NumInputs = 0; %输入个数,缺省为0 sizes.DirFeedthrough = 1; %是否存在直馈通道,1存在,0不存在 sizes.NumSampleTimes = 1; %采样时间个数,至少是一个 sys = simsizes(sizes); %返回size数据结构所包含的信息 x0 = []; %设置初始状态 str = []; %保留变量置空 ts = [0 0]; %设置采样时间 simStateCompliance = 'UnknownSimState'; function sys=mdlDerivatives(t,x,u) %计算导数回调子函数 %给定t,x,u计算连续状态的导数,可以在此给出系统的连续状态方程 %该子函数可以不存在 sys = []; %sys表示状态导数,即dx function sys=mdlUpdate(t,x,u) %状态更新回调子函数 %给定t、x、u计算离散状态的更新 %每个仿真步内必然调用该子函数,不论是否有意义 %除了在此描述系统的离散状态方程外,还可以在此添加其他每个仿真步内都必须执行的代码 sys = []; %sys表示下一个离散状态,即x(k+1) function sys=mdlOutputs(t,x,u) %计算输出回调函数 %给定t,x,u计算输出,可以在此描述系统的输出方程 %该子函数必须存在 sys = []; %sys表示输出,即y function sys=mdlGetTimeOfNextVarHit(t,x,u) %计算下一个采样时间 %仅在系统是变采样时间系统时调用 sampleTime = 1; %设置下一次采样时间是在1s以后 sys = t + sampleTime; %sys表示下一个采样时间点 function sys=mdlTerminate(t,x,u) %仿真结束时要调用的回调函数 %在仿真结束时,可以在此完成仿真结束所需的必要工作 sys = [];
复制代码
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
266
267
268function [sys,x0,str,ts,simStateCompliance] = Gain(t,x,u,flag,gain) %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,gain); % 因为增益函数是用来计算输出的,所以要在输出部分来进行添加增益 %%%%%%%%%%%%%%%%%%%%%%% % 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 = [0 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,gain) sys = gain * u; % 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
mask封装函数
封装是自定义模块用户界面,它可以隐藏模块内容,使用它的图标和参数对话框将内容以原子块的形式向用户显示
其中:
Icon & Ports 窗格: 创建模块封装图标
Parameters & Dialog 窗格:设计封装对话框
Initialization:使用matlab代码初始化封装模块
Documentation:添加有关模块封装的说明和帮助
对Gain子系统进行mask封装
这里的参数name 是 gain, 要和 下图中的 S-function parameters:后面的参数是保持一致
这样就很方便的对增益参数gain进行设置
最后
以上就是优秀豌豆最近收集整理的关于matlab S-Function的全部内容,更多相关matlab内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复