S-function入门及案例详解(1)——S-function基础介绍及基本案例-程序员宅基地

技术标签: matlab  simulink  functional programming  MATLAB  

S-function是Simulink最具魅力的地方,为了方便更快速了解Simulink基础知识,本专题将利用五篇文章对S-function进行介绍及其案例详解。欢迎关注~

一、S-Function概述

1.1 简介

S-Function是system-function系统函数的缩写,是指采用非图形化的方式(即计算机语言,却别与Simulink的系统模块)描述的一个功能块。说得简单,S-Function就是用MATLAB所提供的模型不能完全满足用户,而提供给用户自己编写程序来满足自己要求模型的接口。

1.2 特点

S-function具有一下特点:
(1)S-function为Simulink的系统函数;
(2)采用非图形化的方法实现一个动态系统;
(3)可以使用多种语言进行编写;
(4)能够响应Simulink求解器命令;
(5)可以开发新的Simulink模块;
(6)扩展Simulink功能。M文件的S-function可以扩展图形能力,C-MEX的S-function可以提供与操作系统的接口;
(7)可以与已有的代码相结合进行仿真;
(8)可以采用文本方式输入复杂的系统方程;
(9)S-function的语法结构是为实现一个动态系统而设计;

1.3 Level1与Level2形式

M文件形式有两种,Level1和Level2,二者的包装模块是不同的。

类型 优点 缺点
level1 运行速度快,能处理矩阵数据 只能处理点数据,不能处理复数以及基于帧的数据
level2 能够处理的数据类型多,包括矩阵、复数以及基于帧的数据 运行速度慢

1.4 S-function模块

S-function模块,位于Simulink/User-Defined Functions模块库中,是使S-function图形化的模板工具,用于为S-function创建一个定值的对话框和图标。
在这里插入图片描述
S-function模块使得对S-function外部输入参数的修改更加灵活,可以看作是S-function的一个外壳或这面板。S-function模块及其参数对话框如下:
在这里插入图片描述
该模块的参数设置如下:

  • S-function name:填入S-function的函数名称,这样就建立了S-function模块与M文件形式的S-function之间的对应关系;
  • S-function parameters:填入S-function需要输入的外部参数的名称,如果有对各变量,则变量中间用逗号隔开,如a,b,c;
  • S-function modules:仅当S-function是用C语言编写并用MEX工具编译的C-MEX文件时,才需要填写该参数;

设置完这些参数后,S-function模块就成了一个具有指定功能的模块,它的功能取决于S-function的内容,可以通过修改S-function来改变该模块的功能。

二、S-function的几个相关概念

2.1 直接馈通

直接馈通是指输出直接受控于一个输入口的值。有一个很好的经验方法可用于判断输入是否为直接馈通:
如果输出函数(mdlOutputs或flag==3)是输入u的函数,即,如果输入u在mdlOutputs中被访问,则存在直接馈通。

例如,如果系统是y=k*u,其中,u是输入,k是增益,y是输出,这就是具有直接馈通输入的系统。
正确设置直接馈通标志是十分重要的,因为这不仅关系到系统模型中的系统模块的执行顺序,还关系到对代数环的检测和处理。

2.2 采样时间与偏移量

采样时间是按照固定格式成对指定的:[采样时间 偏移时间]

采样时间表示 意义
[0 0] 连续采样时间
[-1 0] 继承S-function输入信号或父层模型的采样时间
[0.5 0.1] 离散采样时间,从0.1s开始每0.5s采样一次

三、S-function仿真流程

S-function包括主函数和6个功能子函数,包括mdlInitializeSizes(初始化)、mdlDerivatives(连续状态微分)、mdlUpdate(离散状态更新)、mdlOutputs(模块输出)、mdlGetTimeOfNextVarHit(计算下次采样时刻)和mdlTerminate(仿真结束)。

在S-function仿真过程中,利用switch-case语句,根据不同阶段对应的flag值(仿真流程标志向量)来调用S-function的不同子函数,以完成对S-function模块仿真流程的控制。
S-function仿真流程如下:
在这里插入图片描述

一个更直观的流程图如下,大家可以好好理解一下:

在这里插入图片描述

四、S-function函数详解

利用命令

edit sfuntmpl

在这里插入图片描述

可以进入sfuntmpl函数中,这个函数由一个主函数和六个子函数构成,下面进行一一介绍。

4.1 sfuntmpl函数介绍

函数名sfuntmpl可以自由定义,但文件名要与函数名一致。函数如下:

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

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);

  % 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

输入量:
t——当前时间;
x——状态向量;
u——输入向量;
flag——标志位(默认为0);
输出量:
sys——一个通用的返回参数。返回值取决于flag的值。例如:flag=3,sys则包含了S-function的输出;
x0——状态初始值(如果系统中没有状态,则向两位空);
str——默认为空,无需设置;
ts——采样时间,包含采样时间和偏移量;
simStateComplicance——附加变量;

case 0:调用mdlInitializeSizes函数,初始化子函数,必须执行;

case1:调用mdlDerivatives函数,连续状态的导数;

case2:对离散状态进行更新,更新到x(n+1);

case3:调用mdlOutputs函数,系统输出y;

case4:调用mdlGetTimeOfNextVarHit函数,下一个采样时间点;

case9:调用mdlTerminate函数,函数终止;


接下来对这五个子函数进行分别介绍。

4.2 mdlInitializeSizes函数

mdlInitializeSizes函数代码如下:

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

% initialize the initial conditions
x0  = [];

% str is always an empty matrix
str = [];

% initialize the array of sample times
ts  = [0 0];

simStateCompliance = 'UnknownSimState';

其中size属性如下:
sizes.NumContStates = 0; %连续状态的数量
sizes.NumDiscStates = 0; %离散状态的数量
sizes.NumOutputs = 0; %输出的数量
sizes.NumInputs = 0; %输入的数量
sizes.DirFeedthrough = 1; %输出y和输入u是否是直通
sizes.NumSampleTimes = 1; %采样时间

x0表示初始状态;ts表示采样时刻;
【注意】:
ts的第一个数字表示采样时间,第二个数字表示偏移量
[0 0]——表示默认采样时间(默认为0.2秒采样一次);
[-1 0] ——表示根据连接模块的采样频率进行采样;

4.3 mdlDerivatives函数

连续状态的导数,默认为空。
函数代码如下:

function sys=mdlDerivatives(t,x,u)

sys = [];

4.4 mdlUpdate函数

离散状态的更新。
函数代码如下:

function sys=mdlUpdate(t,x,u)

sys = [];

4.5 mdlOutputs函数

输出。
函数代码如下:

function sys=mdlOutputs(t,x,u)

sys = [];

4.6 mdlGetTimeOfNextVarHit函数

下一个采样时间点,在一秒钟之后进行下一次采样。
函数代码如下:

function sys=mdlGetTimeOfNextVarHit(t,x,u)

sampleTime = 1;    %  Example, set the next hit to be one second later.
sys = t + sampleTime;

4.7 mdlTerminate函数

终止函数。
函数代码如下:

function sys=mdlTerminate(t,x,u)

sys = [];

小结

flag 子函数 说明
0 mdlInitializeSizes 定义S-function模块的基本特性,包括采样时间,连续和离散状态的初始化条件,以及sizes数组
1 mdlDerivatives 计算连续状态变量的导数
2 mdlUpdate 更新离散状态、采样时间、主步长等必需条件
3 mdlOutputs 计算S-function的输出
4 mdlGetTimeOfNextVarHit 计算下一个采样点的绝对时间,只有当在mdlInitializeSizes中指定了变步长离散采样时间时,才使用该程序
9 mdlTerminate 执行Simulink终止时所需的任何任务

ok!下一篇文章S-function入门及案例详解(2)——S-function基本案例介绍将介绍一下S-function的基础案例。

如果对你有所帮助,记得点个赞哟~

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/didi_ya/article/details/118186847

智能推荐

在ubuntu 8.04下安装Oracle 11g二-程序员宅基地

文章浏览阅读408次。 在ubuntu 8.04下安装Oracle 11g2008年05月22日 星期四 11:02oracle 11g 数据库虽然提供了linux x86的版本,但是支持的linux版本只有Red Hat,Novell and Solaris 这几个,debian 和 ubuntu 不在支持之列,所以在ubuntu下安装就相对麻烦一些,请照着下文的方法一步一步的安装,不

初一计算机知识点下册,初一英语下册语法知识点全汇总-程序员宅基地

文章浏览阅读166次。新东方在线中考网整理了《初一英语下册语法知识点全汇总》,供同学们参考。一. 情态动词can的用法can+动词原形,它不随主语的人称和数而变化。1. 含有can的肯定句:主语+can+谓语动词的原形+其他。2. 含有can的否定句:主语+can't+动词的原形+其他。3. 变一般疑问句时,把can提前:Can+主语+动词原形+其他? 肯定回答:Yes,主语+can。否定回答:No,主语+can't...._七年级下册计算机知识点

NX/UG二次开发—其他—UFUN函数调用Grip程序_uf调用grip-程序员宅基地

文章浏览阅读3k次。在平时开发中,可能会遇到UFUN函数没有的功能,比如创建PTP的加工程序(我目前没找到,哪位大神可以指点一下),可以使用Grip创建PTP,然后用UFUN函数UF_call_grip调用Grip程序。具体如下截图(左侧UFUN,右侧Grip程序):..._uf调用grip

Android RatingBar的基本使用和自定义样式,kotlin中文教程_ratingbar样式修改-程序员宅基地

文章浏览阅读156次。第一个:原生普通样式(随着主题不同,样式会变)第二个:原生普通样式-小icon第三个:自定义RatingBar 颜色第四个:自定义RatingBar DrawableRatingBar 各样式实现===============原生样式原生样式其实没什么好说的,使用系统提供的style 即可<RatingBarstyle="?android:attr/ratingBarStyleIndicator"android:layout_width=“wrap_cont.._ratingbar样式修改

OpenGL环境搭建:vs2017+glfw3.2.1+glad4.5_vs2017的opengl环境搭建(完整篇)-程序员宅基地

文章浏览阅读4.6k次,点赞6次,收藏11次。安装vs2017:参考vs2017下载和安装。安装cmake3.12.3:cmake是一个工程文件生成工具。用户可以使用预定义好的cmake脚本,根据自己的选择(像是Visual Studio, Code::Blocks, Eclipse)生成不同IDE的工程文件。可以从它官方网站的下载页上获取。这里我选择的是Win32安装程序,如图所示:然后就是运行安装程序进行安装就行。配置glfw3...._vs2017的opengl环境搭建(完整篇)

在linux-4.19.78中使用UBIFS_ubifs warning-程序员宅基地

文章浏览阅读976次。MLC NAND,UBIFS_ubifs warning

随便推点

计算机系统内存储器介绍,计算机系统的两种存储器形式介绍-程序员宅基地

文章浏览阅读2.2k次。计算机系统的两种存储器形式介绍时间:2016-1-6计算机系统的存储器一般应包括两个部分;一个是包含在计算机主机中的主存储器,简称内存,它直接和运算器,控制器及输入输出设备联系,容量小,但存取速度快,一般只存放那些急需要处理的数据或正在运行的程序;另一个是包含在外设中的外存储器,简称外存,它间接和运算器,控制器联系,存取速度虽然慢,但存储容量大,是用来存放大量暂时还不用的数据和程序,一旦要用时,就..._计算机存储器系统采用的是主辅结构,主存速度快、容量相对较小,用于 1 分 程序,外

西门子PLC的编程工具是什么?_西门子plc编程软件-程序员宅基地

文章浏览阅读5.6k次。1. STEP 7(Simatic Manager):STEP 7或者Simatic Manager是西门子PLC编程最常用的软件开发环境。4. STEP 7 MicroWin:STEP 7 MicroWn是一款专门针对微型PLC(S7-200系列PLC)的编程软件,是Simatic Manager的简化版。如果需要与PLC系统配合使用,则需要与PLC编程工具进行配合使用。除了上述软件之外,西门子还提供了一些配套软件和工具,如PLC模拟器、硬件调试工具等,以帮助PLC编程人员快速地进行调试和测试。_西门子plc编程软件

HashMap扩容_hashma扩容-程序员宅基地

文章浏览阅读36次。【代码】HashMap扩容。_hashma扩容

Eclipse maven项目中依赖包不全,如何重新加载?_maven资源加载不全,怎么重新加载-程序员宅基地

文章浏览阅读2.9k次。1mvn dependency:copy-dependencies2 项目右键 -> Maven -> Disable Maven Nature3 项目右键 -> Configure -> Convert to Maven Project_maven资源加载不全,怎么重新加载

mysql dml全称中文_MySQL语言分类——DML-程序员宅基地

文章浏览阅读527次。DMLDML的全称是Database management Language,数据库管理语言。主要包括以下操作:insert、delete、update、optimize。本篇对其逐一介绍INSERT数据库表插入数据的方式:1、insert的完整语法:(做项目的过程中将字段名全写上,这样比较容易看懂)单条记录插入语法:insert into table_name (column_name1,......_dml的全称是

【小工匠聊Modbus】04-调试工具-程序员宅基地

文章浏览阅读136次。可以参考: http://git.oschina.net/jrain-group/ 组织下的Java Modbus支持库Modbus-系列文章1、虚拟成对串口(1)下载虚拟串口软件VSPD(可在百度中搜索)image.png(2)打开软件,添加虚拟串口。在设备管理中,看到如下表示添加成功。..._最好用的 modebus调试工具

推荐文章

热门文章

相关标签