s-function and msfunction 学习 matlab/simulink

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 中也可以使用 全局变量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值