S-function入门及案例详解(1)——S-function基础介绍及基本案例
S-function是Simulink最具魅力的地方,为了方便更快速了解Simulink基础知识,本专题将利用五篇文章对S-function进行介绍及其案例详解。欢迎关注~
目录
- 一、S-Function概述
- 1.1 简介
- 1.2 特点
- 1.3 Level1与Level2形式
- 1.4 S-function模块
- 二、S-function的几个相关概念
- 2.1 直接馈通
- 2.2 采样时间与偏移量
- 三、S-function仿真流程
- 四、S-function函数详解
- 4.1 sfuntmpl函数介绍
- 4.2 mdlInitializeSizes函数
- 4.3 mdlDerivatives函数
- 4.4 mdlUpdate函数
- 4.5 mdlOutputs函数
- 4.6 mdlGetTimeOfNextVarHit函数
- 4.7 mdlTerminate函数
- 小结
一、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 %otherwiseDAStudio.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 neededsys = 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的基础案例。
如果对你有所帮助,记得点个赞哟~
S-function入门及案例详解(1)——S-function基础介绍及基本案例相关推荐
- Redis最全详解(一)——基础介绍
Redis介绍 redis是基于内存可持久化的日志型.Key-Value数据库.redis安装在磁盘,但是数据存储在内存.非关系型数据库NoSql.开源免费,遵守BSD协议,不用关注版权问题. red ...
- python编程入门与案例详解-自学Python 编程基础、科学计算及数据分析
自学Python 编程基础.科学计算及数据分析 epub pdf mobi txt 下载 自学Python 编程基础.科学计算及数据分析 epub pdf mobi txt 下载 ☆☆☆☆☆ 李金 著 ...
- Ajax基本案例详解之$.getjson的实现
Ajax的$.gethson实现: 看这篇之前建议大家去看看前面两篇文章: 1.Ajax基本案例详解之$.ajax的实现 2.Ajax基本案例详解之$.get的实现 现在写一下$.getjson里面的 ...
- Ajax基本案例详解之$.post的实现
Ajax的post实现: 看这篇之前建议大家去看看前面两篇文章: 1.Ajax基本案例详解之$.ajax的实现 2.Ajax基本案例详解之$.get的实现 现在写一下$.post()里面的主要内容: ...
- Ajax基本案例详解之load的实现
Ajax的load实现: 看这篇之前建议大家去看看前面两篇文章: 1.Ajax基本案例详解之$.ajax的实现 2.Ajax基本案例详解之$.get的实现 现在写一下$.load()里面的主要内容: ...
- 【MATLAB图像处理实用案例详解】目录
未来一个月的任务主要是GAN生成对抗网络理论部分+代码实战和MATLAB图像处理实用案例详解. 做生成对抗网络主要是因为我的研究方向涉及到这个部分,因此将其作为主要研究内容,但由于研究方向的私密性问题 ...
- S-function入门及案例详解(2)——S-function基本案例介绍
目录 一.案例1--对波形的幅值进行放大 1.1 案例分析 1.2 案例详解 1.3 输出波形 二.案例2--对波形的幅值进行放大拓展 2.1 案例分析 2.2 案例详解 2.3 输出波形 三.案例3 ...
- S-function入门及案例详解(3)——S-function进阶案例
目录 1.案例描述 2.案例详解 3.输出波形 4.对输入参数进行Mask打包 1.案例描述 设计一个蹦极系统 h为离地面高度,输入参数为长度.质量.离地面高度. 2.案例详解 步骤1.可以修改sfu ...
- 《微信小程序:开发入门及案例详解》—— 3.4 小结
本节书摘来自华章出版社<微信小程序:开发入门及案例详解>一 书中的第3章,第3.4节,作者李骏 边思,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 3.4 小 ...
- python编程入门与案例详解-干货|| 清华大佬推荐的python400集入门资料
�大家好!我又来了~之前我写了两篇笔记,分享了我是如何从一个0基础的小白自学python的❗️ - 今天再给大家分享一些学习python的干货❗️ - �首先, 在学python之前你要明确为什么要学 ...
最新文章
- linux acl 权限 给任何用户或用户组设置任何文件/目录的访问权限
- 机器学习(MACHINE LEARNING)MATLAB灰色预测模型
- Qt Designer设置背景图片、颜色不影响其它组件小技巧,控件层级设置,组件的继承,styleSheet设置样式。
- 窥探黑盒-卷积神经网络的可视化
- 五、JavaScript基础知识,学会操作元素的简单事件(一)
- java课程总结_java课程总结报告.doc
- Vue warn Failed to mount component: template or render function not defined
- de-emphasis
- 在Windows 2000下优化Oracle9i性能
- css的背景图片不显示,wepback打包时,css的背景图片显示不出来,求教!
- 【Hadoop】HDFS三组件:NameNode、SecondaryNameNode和DataNode
- 雅虎的flickr相册Host解析
- 顶级域名、一级域名、二级域名、子域名、父域名
- 计算机cmd测试命令,[cmd测试网速]cmd指令测试网速技巧
- Java邮箱正则匹配
- Illegal command:debug错误
- STM32HAL库-内部Flash在指定页读写保护示例
- CDS软件语音测试,cds测试软件
- 1224 红魔馆的纸牌游戏 (计算24点,dfs)
- Virgin Voyages将提供按需香槟配送服务“Shake for Champagne™”