S-functions

1S-function文件作用、简介

 

       S-functionsystem-function的缩写,是一种对模块库进行扩展的工具。当MATLAB提供的基本库模块不能满足用户的要求时,就需要自己创造满足自己的要求的模型。

       S-function,在simulinkUser-defined functions项下。 可以用mCC++AdaFORTRAN语言编写,通过编译生成MEX文件动态链接MATLAB。本文主要介绍m语言编写。

 

2、使用场合

 

    1)生成用户自行研究中可能反复调用的S函数模块

    2)创建代表硬件驱动的模块

3)通过S函数将摸个系统描述成一组数学方程组

4)构建用于图形动画表现的S函数模块

 

3S-function写法

 

为了降低开发人员对S-functionM文件编写投入的精力和时间,Matlab提供了编写S函数的M文件的标准模版,文件名为sfuntmpl.m,保存路径为D:\MATLAB7\toolbox\simulink\blocks。使用模板文件的好处是,比较方便,而且条理清晰,程序员也可以根据自己的思想去写。在调用时,Simulink会根据所处的仿真阶段为flag传入不同的值,而且还会为sys这个返回参数指定不同的角色,也就是说尽管是相同的sys变量,但在不同的仿真阶段其意义却不相同,这种变化由simulink自动完成。

 

1)关于Size数组的介绍

 

Sizes数组是s-function函数信息的载体,它内部的字段意义为:

NumContStates:连续状态的个数(状态向量连续部分的宽度),默认值为0

NumDiscStates:离散状态的个数(状态向量离散部分的宽度),默认值为0

NumOutputs 输出变量的个数(输出向量的宽度),默认值为0

NumInputs:输入变量的个数(输入向量的宽度),默认值为0

DirFeedthrough:有无直接馈入,默认值为1

NumSampleTimes:采样时间的个数,默认值为1

如果字段代表的向量宽度为动态可变,则可以将它们赋值为-1

注意DirFeedthrough是一个布尔变量,它的取值只有01两种,0表示没有直接馈入,此时用户在编写mdlOutputs子函数时就要确保子函数的代码里不出现输入变量u1表示有直接馈入。

NumSampleTimes表示采样时间的个数,也就是ts变量的行数,与用户对ts的定义有关。

需要指出的是,由于s-function会忽略端口,所以当有多个输入变量或多个输出变量时,必须用mux模块或demux模块将多个单一输入合成一个复合输入向量或将一个复合输出向量分解为多个单一输出。

 

(1) 输入输出参数说明

 

S-function默认的4个输入参数为txuflag,它们的次序不能变动,代表的意义分别为:

t:代表当前的仿真时间,这个输入参数通常用于决定下一个采样时刻,或者在多采样速率系统中,用来区分不同的采样时刻点,并据此进行不同的处理。

x 表示状态向量,这个参数是必须的,甚至在系统中不存在状态时也是如此。它具有很灵活的运用。

u:表示输入向量。

flag:是一个控制在每一个仿真阶段调用哪一个子函数的参数,由Simulink在调用时自动取值。

S-function默认的4个返回参数为sysx0strts,它们的次序不能变动,代表的意义分别为:

sys:是一个通用的返回参数,它所返回值的意义取决于flag的值。

x0 是初始的状态值(没有状态时是一个空矩阵[]),这个返回参数只在flag值为0时才有效,其他时候都会被忽略。

str:这个参数没有什么意义,是MathWorks公司为将来的应用保留的,m文件s-function必须把它设为空矩阵。

ts:是一个m×2的矩阵,它的两列分别表示采样时间间隔和偏移。

 

3)模版文件及其详细进行说明:

 

function [sys,x0,str,ts] = sfuntmpl(t,x,u,flag)

%  sfuntmpl为模版对应的文件名称,创建自己的S函数是,应该重新起名

%  前面四个变量是simulink调用s-function时自动传入,一般不要改动

%  根据用户需要可以在里面添加自己的变量,如mysfun(t,x,u,flag,a,b,c)

%  用户将自己的算法放到合适的s-function子函数中去。

%  flag有六个不同取值,用于选择六种不同的子函数进行执行

switch flag, 

  case 0,

    [sys,x0,str,ts]=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

    error(['Unhandled flag = ',num2str(flag)]);

end                                   %结束

 

% 下面对各个子函数进行编写

function [sys,x0,str,ts]=mdlInitializeSizes

 

sizes = simsizes;

 

sizes.NumContStates  = 0;

sizes.NumDiscStates  = 0;

sizes.NumOutputs     = 0;

sizes.NumInputs      = 0;

sizes.DirFeedthrough = 1;

sizes.NumSampleTimes = 1;   % at least one sample time is needed

 

sys = simsizes(sizes);

x0  = [];

str = [];

ts  = [0 0];

 

function sys=mdlDerivatives(t,x,u)

sys = [];

 

function sys=mdlUpdate(t,x,u)

sys = [];

 

function sys=mdlOutputs(t,x,u)

sys = [];

 

function sys=mdlGetTimeOfNextVarHit(t,x,u)

sampleTime = 1; 

sys = t + sampleTime; 

 

function sys=mdlTerminate(t,x,u)

sys = [];

4)举例子

function [sys,x0,str,ts] = limintm(t,x,u,flag,lb,ub,xi)   

switch flag,

    case 0,

        [sys,x0,str,ts]=mdlInitializeSizes(lb,ub,xi);

    case 1,

        sys=mdlDerivatives(t,x,u,lb,ub);

    case {2,9},

        sys = [];

    case 3,

        sys=mdlOutputs(t,x,u);

    otherwise

        error(['Unhandled flag = ',num2str(flag)]);

end

 

function [sys,x0,str,ts]=mdlInitializeSizes(lb,ub,xi)

sizes = simsizes;

 

sizes.NumContStates  = 1;

sizes.NumDiscStates  = 0;

sizes.NumOutputs     = 1;

sizes.NumInputs      = 1;

sizes.DirFeedthrough = 0;

sizes.NumSampleTimes = 1; 

 

sys = simsizes(sizes);

x0  = xi;

str = [];

ts  = [0 0];

 

function sys=mdlDerivatives(t,x,u,lb,ub)

if(x <= lb & u<0) | (x >= ub & u > 0)

    sys = 0;

else

    sys = u;

end

 

function sys=mdlOutputs(t,x,u)

sys = x;

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、付费专栏及课程。

余额充值