s function 是matlab中经常使用的一个元件,当然也包括 level 2 s function
下面是在学习 sfunction 中的一些心得,整理于下:
在matlab中查看 s function的帮助文件:
可以在命令行窗口使用如下指令:
doc s-function
doc Level-2 MATLAB S-Function (msfunction)
下面搭建一个sfunction 的环境
输入 s function 然后找到对应的模块然后选中
sfunction 默认的名字是 system
双击后可以进行相关的更改,sfunction 需要在路径下建立一个同模块名字相同的函数作为 s函数,该函数在matlab中有模板,可以调出模板,然后拷贝一份进行相应的 更改:
获得模板的命令:
edit sfuntmpl
edit msfuntmpl
sfunction 对应的函数如何编写
首先看模板中的解释可以知道,在sfunction 中可以定义自己的 ode 微分方程,离散方程或者其他类的算法。
通常情况下matlab S function的格式如下:
[SYS,X0,STR,TS,SIMSTATECOMPLIANCE] = SFUNC(T,X,U,FLAG,P1,...,Pn)
按照官方的解释是:
t 是当前的时间变量;
Flag 是一个判断的标志
X :是是当前的状态变量
U: 是当前的输入变量
不同flag 对应的函数说明,以及需要返回的变量关系:
- Flag==0
需要返回的变量 [SIZES,X0,STR,TS]
描述:
当flag==0 是系统的初始话函数,该函数要 通过 SYS 返回 系统的sizes ;
同时要返回初始状态 X0 ,返回状态顺序字串变量STR 通常STR=[], 返回采样时间TS
- flag==1
需要返回的变量 DX
描述;
返回连续状态变量X 的导数
- flag==2
需要返回的变量 Ds
描述;
更新离散状态 SYS=X(n+1)
- flag == 3
需要返回的变量 Y
描述:
返回系统的输出变量
- flag == 4
需要返回的变量 Tnext
描述:
返回系统的变量步长采样时间
- flag == 5
为系统预留
- flag == 9
无需返回变量
描述:
系统终止,执行相关析构
对于每个flag 值对应的执行的函数,下面来看下不同函数返回的值具体细节
状态向量X和X0由连续状态和离散状态组成。
可选择变量 P1...Pn 也可以应用在s function中,并且任何的flag 下都可使用
当 sfunction 的flag 等于0 时,需要返回的SYS 变量说明:
此时的SYS 的长度是7
SYS(1): 连续状态的 num
SYS(2) :离散状态的num
SYS(3) = Number of outputs.
SYS(4) = Number of inputs.
注意,前四个变量也可以设置为-1, 这样会根据变量的个数进行动态调整
% 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(5): 是系统预留的变量所以该数值必须为0
% 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.
SYS(7) : 采样时间的个数
X0 = Initial state conditions or [] if no states.
X0 代表状态的初始条件,如果没有初始值可以设置为[]
STR = State ordering strings which is generally specified as [].
STR 通常是[]
TS = 是一个mx2 的矩阵包括采样时间
% (period, offset) information. Where m = number of sample
% times. The ordering of the sample times must be:
%
% TS = [0 0, : 连续采样时间
% 0 1, : 连续,但在小步进采样时间内固定。
% PERIOD OFFSET, : 离散采样时间
% PERIOD > 0 & OFFSET < PERIOD.
% -2 0]; : 可变步长离散采样时间,其中 FLAG=4 用于获取下一次命中的时间。
%
% 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].
U:
该变量是mux 中输入的变量可以使用索引进行使用
如: U(1) U(2)...
s function 的输入需要使用 mux 进行将多个输入合并, s function 的输出需要使用 demux将其分开成为多个信号:
类似这样:
如:当flag ==3 时可以使用这样来写函数:
% flag==3
function sys=mdlOutputs(t,x,u)
global val_golbal
disp(u)
sys = [u(1) 3 3 val_golbal];
当然在sfuntion 中也可以使用 全局变量