S-Function 使用及应用举例

本文深入解析MATLAB S-Function的概念及使用方法,包括直接馈通、动态尺寸输入、采样时间和偏移设置等内容,并提供了S-Function模板函数的详细解释。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

S-FUNCTIONS的书写之一

s-function也就是system-function的缩写。说得简单,s-function就是用MATLAB所提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口。要了解 s-function,必须了解以下知识:
(1)direct feedthrough
(2)dynamically sized inputs
(3)setting sample times and offsets
[由于我也不知道怎么把上面三句话精确的翻译成中文,因此在此不加翻译,大家自己理解,也许更好]由于上面三部分的重要性,在此详细进行分析。

一.direct feedthrough
direct feedthrough意思是说系统的输出或可变采样时间是否受到输入的控制。大家清楚有的系统是受到输入控制如:
 y=k*u (u是输入,k是放大因子,y是输出)
而有的系统输出是不受到输入影响,如:
输出:y=x
dx=u
x表示状态

二.dynamically sized inputs
主要是给出:输入连续状态数目(size.NumContStates),离散状态数目(size.NumDiscStates)
,输出数目(size.NumOutputs),输入数目(size.NumInputs),Direct Feedthrough(size.Dir Feedthrough)。
三.setting sample times and offsets  

setting smaple times and offsets主要设置采样时间 MATLAB为了用户方便,已经书写了S-FUNCTIONS模板函数sfuntmpl.m。为了更好的写S-FUNCTIONS,大家来看一下,该函数sfuntmpl.m内容如下:(我通过在该内容加注释来说明,以$开头)

function [sys,x0,str,ts] sfuntmpl(t,x,u,flag)
$输出变量就此四个,大家必须注意它的顺序。$输入变量可以为t,x,u,flag,p1,...,pn等,但是前面的四个变量不能变,特此说明。

%SFUNTMPL General M-file S-function template
  With M-file 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 Simulink block diagram.
%
$上面是其功能
  The general form of an M-File S-function syntax is:
      [SYS,X0,STR,TS] SFUNC(T,X,U,FLAG,P1,...,Pn)
%
$调用格式
  What is returned by SFUNC at 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
  -----  ------             --------------------------------------------
       [SIZES,X0,STR,TS]  Initialization, return system sizes in SYS,
                            initial state in X0, state ordering strings
                            in STR, and sample times in TS.
$具体怎样实现,大家参看后面的函数mdlInitializeSizes
       DX                 Return continuous state derivatives in SYS.
       DS                 Update discrete states SYS X(n+1)
                        Return outputs in SYS.
       TNEXT              Return next time hit for variable step sample
                            time in SYS.
                          Reserved for future (root finding).
       []                 Termination, perform any cleanup SYS=[].
%
$参看后面相应函数
%
  The state vectors, 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 is used during the FLAG=3
              call. Setting this to is akin to making promise that
              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的顺序不能乱
%
     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 number of sample
              times. The ordering of the sample times must be:
%
              TS [0      0,      Continuous sample time.
                         1,      Continuous, but fixed in minor step
                                     sample time.
                    PERIOD OFFSET, Discrete sample time where
                                     PERIOD 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 than one
              sample time, you must check for sample hits explicitly by
              seeing if
                 abs(round((T-OFFSET)/PERIOD) (T-OFFSET)/PERIOD)
              is within 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) and TS [-1 0]. For functions which
              are held during minor steps, this is done by specifying
              SYS(7) and TS [-1 -1].

  Copyright (c) 1990-1998 by The MathWorks, Inc. All Rights Reserved.
  $Revision: 1.12 $

%
The following outlines the general structure of an S-function.
%
switch flag,  
  %%%%%%%%%%%%%%%%%%
  Initialization %
  %%%%%%%%%%%%%%%%%%
  case 0,[sys,x0,str,ts]=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);
  %%%%%%%%%%%%%%%%%%%%%%%
  GetTimeOfNextVarHit %
  %%%%%%%%%%%%%%%%%%%%%%%
  case 4,sys=mdlGetTimeOfNextVarHit(t,x,u);
  %%%%%%%%%%%%%
  Terminate %
  %%%%%%%%%%%%%
  case 9,sys=mdlTerminate(t,x,u);
  %%%%%%%%%%%%%%%%%%%%
  Unexpected flags %
  %%%%%%%%%%%%%%%%%%%%
  otherwise, error(['Unhandled flag ',num2str(flag)]);
end
end sfuntmpl

%
%=============================================================================
mdlInitializeSizes
Return the sizes, initial conditions, and sample times for the S-function.
%=============================================================================
%
function [sys,x0,str,ts]=mdlInitializeSizes
%
call simsizes for 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.
%
$关于函数simsizes大家必须遵循,因为把是内部函数,不得随便改变,其作用是返回未初始化的size结构。
sizes simsizes;
$number of continuous states
sizes.NumContStates  0;
$number of discrete states
sizes.NumDiscStates  0;
$number of outputs
sizes.NumOutputs     0;
number of inputs
sizes.NumInputs      0;
$Flag for direct feedthrough
sizes.DirFeedthrough 1;
$number of sample times
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];
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)
sys [];  % 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 sampleTime;  % end mdlGetTimeOfNextVarHit
%
%=============================================================================
mdlTerminate
Perform any end of simulation tasks.
%=============================================================================
%
function sys=mdlTerminate(t,x,u)
sys [];   % end mdlTerminate

S-Function 可以使用MATLAB®,C,C ,Ada,或Fortran 语言来编写。使用MEX 实用工具,将C,C ,Ada,和Fortran 语言的S-Function 编译成MEX-文件,在需要的时候,它们可与其它的MEX-文件一起动态地连接到MATLAB 中。 S-Function 使用一种特殊的调用格式让你可以与Simulink 方程求解器相互作用,这与发生在求解器和内置Simulink 块之间的相互作用非常相似。S-Function 的形式是非常通用的,且适用于连续、离散和混合系统。 S-function 为你提供了一种在Simulink 模型中增加自制块的手段,你可以使用MATLAB,C,C ,Ada,或Fortran 语言来创建自己的块。按照下面一套简单的规则,你可以在S-function 中实现自己的算法。在你编写一个S-Functin 函数,并将函数名放置在一个S-Functin 块中(在用户定义的函数块库中有效)之后,通过使用masking 定制用户界面。 目录 S-FUNCTION 概述.......... 1 什么是 S-FUNCTION...... 2 在模型中使用S-FUNCTION...... 3 向 S-Function 传递参数....... 3 何时使用 S-Function 4 S-FUNCTION 的工作原理.......... 5 Simulink 块的数学关系........ 5 仿真过程......... 5 S-Function 回调程序. 6 S-FUNCTION 的实现...... 8 M-文件的S-Function.......... 8 MEX 文件的S-function ....... 8 MEX 文件与M-文件的S-function 比较... 9 S-FUNCTION 的概念..... 10 直接馈通....... 10 动态维矩阵... 10 设置采样时间和偏移量.......11 S-FUNCTION 范例........ 14 M 文件S-function 范例...... 15 C S-Function 范例... 16 Fortran S-Function 范例.... 18 C S-Function 范例......... 18 Ada S-Function 范例......... 18 编写 M S-FUNCTION.... 19 概述........ 20 S-Function 参数...... 20 S-Function 的输出... 20 定义 S-FUNCTION 块特性....... 22 处理 S-FUNCTION 参数 22 M 文件的S-FUNCTION 范例... 23 范例 1——简单的M 文件S-Function ... 23 范例 2——连续状态S-Function . 25 范例 3——离散状态S-Function . 27 范例 4——混合系统S-Function . 28 范例 5——变步长S-Function ..... 31 ii 使用C 语言编写S-FUNCTION .......... 33 概述........ 34 创建 C MEX S-Function.... 35 自动生成 S-FUNCTION 36 配置生成的 S-Function...... 37 S-Function Builder 如何生成S-Function......... 37 设置 include 路径.... 37 S-FUNCTION BUILDER 的对话窗........ 39 Initialization 选卡..... 39 Data Properties 选卡......... 40 Libraries 选卡.......... 42 Outputs 选卡 43 Continuous Derivatives 选卡....... 45 Discrete Update 选卡........ 46 Build Info 选卡........ 47 一个基本的 C MEX S-FUNCTION 范例....... 48 定义与包含... 49 回调函数的实现...... 50 Simulink/Real-Time Workshop 接口..... 51 Building Timestwo 范例..... 51 C S-FUNCTION 模板..... 52 S-Function 源文件必需的内容..... 52 SimStruct...... 53 编译 C S-Function.. 53 SIMULINK 如何与C S-FUNCTION 相互作用 54 进程层面....... 54 数据层面....... 56 编写回调函数... 59 将 LEVEL 1 C MEX S-FUNCTION 转换到LEVEL 2 . 60 创建 C S-FUNCTION 63 创建 ADA S-FUNCTION.......... 64 创建 FORTRAN S-FUNCTION 65 实现块特性 67 对话框参数....... 68 iii 可调参数....... 68 运行参数 70 创建运行参数.......... 70 更新运行参数.......... 71 创建输入和输出端口... 72 创建输入端口.......... 72 创建输出端口.......... 73 输入的标量扩展...... 74 掩码多端口 S-Function...... 75 自定义数据类型.......... 76 采样时间 77 基于块的采样时间... 77 指定基于端口的采样时间.. 79 基于块与基于端口的混合采样时间 ........ 81 多速率 S-Function 块......... 82 多速率 S-Function 块的同步........ 83 工作向量 84 工作向量与过零检测.......... 85 包括指针工作向量的范例.. 85 内存分配....... 86 FUNCTION-CALL 子系统.......... 87 错误处理 89 防超程代码... 89 SsSetErrorStatus 的终止条件..... 90 数组边界检查.......... 90 S-FUNCTION 范例........ 91 连续状态的 S-Function 范例........ 92 离散状态的 S-Function 范例........ 93 混合系统的S-Function 范例........ 93 变步长的 S-Function 范例. 94 过零检测的 S-Function 范例........ 94 时变连续传递函数的 S-Function 范例... 94
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值