S函数是simulink动态系统的核心,可以采用m代码,C,C++等语言编写S函数,由一种特定的语法构成,用来描述并实现连续系统,离散系统以及复合系统等动态系统。S函数可以接收来自simulink求解器的相关信息,并对求解器发出的命令做出适当的响应

基础知识

simulink

simulink是MATLAB中的可视化仿真工具,基于MATLAB采用框图方式实现动态系统建模、仿真和分析的过程。每个simulink模块都有三个基本元素:输入向量,状态向量和输出向量。分别用u,x,y表示。

其中状态向量最为重要,可以分为连续状态,离散状态或两者混合状态,实际运用中多用离散状态。

simulink的仿真过程包含两个主要阶段:初始化运行阶段,初始化主要是设置一些基本参数,如系统输入输出个数,状态初值,采样时间等;运行阶段主要是计算输出,更新离散状态,计算连续状态等;
对系统仿真控制是通过系统模型与求解器之间建立对话的方式进行,simulink将系统模型、模块参数和系统方程传递给simulink求解器,求解器将计算出的系统状态与仿真时间通过simulink传递给系统模型本身,通过这样的交互作用方式完成动态系统仿真。

S函数

过零

动态系统仿真过程中,过零是指系统模型中的信号或系统模型特征的某种改变,包括:1)信号在上一个仿真时间步长之内改变了符号。2)系统模块在上个仿真时间步长改变了模式。对于离散模块及其产生的离散信号不需要进行过零检测

直接馈通(direct feedthrough)

直接馈通:表示系统的输出可变采样时间是否受输入控制
在编写S-函数时,初始化函数中需要对sizes.DirFeedthrough 进行设置,如果输出函数mdlOutputs或者对于变采样时间的(mdlGetTimeOfNextVarHit)是输入u的函数,则模块具有直接馈通的特性sizes.DirFeedthrough=1;否则为0。

S-Function建立

1.通过在simulink中双击空白处输入s function,回车确认,添加s函数,打开空白文件

2.通过library Browser打开,找到s-function examples,打开模板文件,更改函数名字与文件名字一致,另存为xiuMS

S函数模板文件详解

function [sys,x0,str,ts,simStateCompliance] = sfuntmpl(t,x,u,flag)
%主函数
%主函数包含四个输出:
%                 sys数组包含某个子函数返回的值(根据flag不同而不同)
%                 x0为所有状态的初始化向量
%                 str是保留参数,总是一个空矩阵(一般置空即可)
%                 Ts返回系统采样时间(是一个1x2的向量,ts(1)是采样周期,ts(2)是偏移量
%函数的四个输入分别为采样时间t、状态x、输入u和仿真流程控制标志变量flag(判断当前状态)
%输入参数后面还可以接续一系列的附带参数simStateCompliance
%%
switch flag,case 0,[sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes;% flag=0,表示当前处于初始化状态,此时调用函数mdlInitializeSizes进行初始化,具体见下面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);otherwiseDAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));end
%主函数结束
%下面是各个子函数,即各个回调过程
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes %初始化回调子函数
%提供状态、输入、输出、采样时间数目和初始状态的值
%初始化阶段,标志变量flag首先被置为0,S-function首次被调用时
%该子函数首先被调用,且为S-function模块提供下面信息
%该子函数必须存在
sizes = simsizes;%生成sizes数据结构,信息被包含在其中
sizes.NumContStates  = 0;%连续状态数,默认为0
sizes.NumDiscStates  = 0;%离散状态数,默认为0
sizes.NumOutputs     = 0;%输出个数,默认为0
sizes.NumInputs      = 0;%输入个数,默认为0
sizes.DirFeedthrough = 1;%是否存在直馈通道,1存在,0不存在
sizes.NumSampleTimes = 1;%采样时间个数,至少是一个
sys = simsizes(sizes);%返回size数据结构所包含的信息
x0  = [];%设置初始状态
str = [];%保留变量,置空即可
ts  = [0 0];%设置采样时间,若采样周期设为0,则为连续系统
simStateCompliance = 'UnknownSimState';function sys=mdlDerivatives(t,x,u)%计算导数回调子函数(计算连续状态的微分)
%给定t,x,u计算连续状态的导数,可以在此给出系统的连续状态方程
%该子函数可以不存在
sys = [];%sys表示状态导数,即dxfunction sys=mdlUpdate(t,x,u)%状态更新回调子函数(计算下一个离散状态)
%给定t、x、u计算离散状态的更新
%每个仿真步内必然调用该子函数,不论是否有意义
%除了在此描述系统的离散状态方程外,还可以在此添加其他每个仿真步内都必须执行的代码
sys = [];%sys表示下一个离散状态,即x(k+1)function sys=mdlOutputs(t,x,u)%计算输出回调函数,给定t,x,u计算输出,可以在此描述系统的输出方程
%该子函数必须存在
sys = [];%sys表示输出,即yfunction sys=mdlGetTimeOfNextVarHit(t,x,u)%计算下一个采样时间,仅在系统是变采样时间系统时调用
sampleTime = 1; %设置下一次采样时间是在1s以后
sys = t + sampleTime;%sys表示下一个采样时间点function sys=mdlTerminate(t,x,u)%仿真结束时要调用的回调函数
%在仿真结束时,可以在此完成仿真结束所需的必要工作
sys = [];

s函数控制流程图

实例

以S函数完成对输入信号运算:y=2u\ y=2 u y=2u
在模板文件中只需将输入输出改为1,在回调函数mdlOutputs中输入状态方程 sys=2∗u\ sys=2*u sys=2∗u即可

function [sys,x0,str,ts,simStateCompliance] = xiuMS(t,x,u,flag)
switch flag,case 0,[sys,x0,str,ts,simStateCompliance]=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);otherwiseDAStudio.error('Simulink:blocks:unhandledFlag', num2str(flag));
end
function [sys,x0,str,ts,simStateCompliance]=mdlInitializeSizes
sizes = simsizes;
sizes.NumContStates  = 0;
sizes.NumDiscStates  = 0;
sizes.NumOutputs     = 1;
sizes.NumInputs      = 1;
sizes.DirFeedthrough = 1;
sizes.NumSampleTimes = 1;   % at least one sample time is needed
sys = simsizes(sizes);
x0  = [];
str = [];
ts  = [0 0];
simStateCompliance = 'UnknownSimState';
function sys=mdlDerivatives(t,x,u)
sys = [];
function sys=mdlUpdate(t,x,u)
sys = [];
function sys=mdlOutputs(t,x,u)
sys = 2*u;
function sys=mdlGetTimeOfNextVarHit(t,x,u)
sampleTime = 1;    %  Example, set the next hit to be one second later.
sys = t + sampleTime;
function sys=mdlTerminate(t,x,u)
sys = [];

建立如图所示simulink框图,得到仿真结果

MATLAB/simulink_S函数相关推荐

  1. matlab matlabpool,Matlab matlabpool函数undefined

    我尝试使用matlab并行计算功能. 我先输入"版本"来检查,如果我已经安装了并行计算工具箱,它确实Matlab matlabpool函数undefined >> ve ...

  2. MATLAB常用函数, 常见问题

    MATLAB常用函数 1.常用取整函数 round(x):四舍五入函数 floor(x) : 向下取整, 即 floor(1.2)=1,  floor(1.8) = 1 ceil(x) : 向上取整, ...

  3. matlab doc函数,matlab常用函数.doc

    matlab常用函数.doc MatLab 常用函数 1. 特殊变量与常数 ans 计算结果的变量名 computer 确定运行的计算机 eps 浮点相对精度 Inf 无穷大 I 虚数单位 name ...

  4. matlab中imresize函数的用法,为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同

    为何 MATLAB imresize 函数和 OpenCV resize 函数结果不同?今年 4 月,我在依照 MATLAB 代码自己写一个卷积神经网络 C++ 实现的过程中,就发现了这个问题,不过那 ...

  5. matlab 数学库,matlab数学函数库

    (n) 求 n 的阶乘 如何用 matlab 配方 没有发现 matlab 有这一命令,不过我们可以调用 maple 的命令,调用方法如下: 首先加载 maple 中的 student 函数库,加载. ...

  6. matlab freqz函数使用

    Matlab freqz函数使用 (2012-10-22 13:42:03) 转载▼ 标签: 杂谈 freqz函数计算线性系统的频率响应,包括幅频响应和相频响应,基本输入为线性系统的AMMA模型系数向 ...

  7. Matlab参考函数

    附录1 常用命令 附录1.1 管理用命令 函数名 功能描述 函数名 功能描述 addpath 增加一条搜索路径 rmpath 删除一条搜索路径 demo 运行Matlab演示程序 type 列出.M文 ...

  8. matlab rbf函数_基于径向基函数(RBF)的无网格伪谱法与程序实现(2)——微分矩阵...

    参考资料 Gregory E. Fasshauer. Meshfree Approximation Methods with MATLAB. P.387 P401 数值实现 Matlab 2019a ...

  9. Matlab自定义函数的几种方法

    Matlab自定义函数的几种方法_czw-CSDN博客_matlab自定义函数 Matlab 定义函数的几种方法_海底小星星的博客-CSDN博客_matlab定义函数

  10. matlab私有函数,MATLAB 嵌套函数,子函数,私有函数,重载函数

    MATLAB函数嵌套 MATLAB中M文件有两种类型,脚本M文件和函数M文件.脚本M文件是将可执行程序语句放入M文件中,就像在命令窗口那样,按其语句顺序及逻辑关系执行,可以理解为一般的顺序执行程序语句 ...

最新文章

  1. deepin更新依赖错误_deepin的踩坑问题与解决方案,以及使用分享(持续更新)
  2. HashMap(Java)
  3. JavaScript学习笔记06【高级——JavaScript中的事件】
  4. 【Linux】库文件
  5. Android之AsyncTask两种线程池分析和总结
  6. jQuery复选框多选问题
  7. PHP7.2的安装与配置(win7)
  8. iSPRINT:Google 最高能的创新加速课程,让你 5 天就能验证创业想法!
  9. sqlplus命令支持上、下翻功能
  10. oracle数据库刷内存语句,Oracle数据库内存助手
  11. 在低版本浏览器内核中适配replaceAll
  12. Fang Fang 思维题
  13. 图片分享和加载失败的原因之一
  14. 程序员为什么一定要学好数学?驻足听一下“老人言”
  15. GVIDO MUSIC向德意志唱片公司成立120周年 Special Gala Concert Presented by 小泽征尔 斋藤纪念管弦乐团提供赞助
  16. 关于Android的方向传感器
  17. Dispose 和 GC 注意点
  18. 华为又走在美国芯片企业前面,将率先发布5nm工艺芯片
  19. SSM框架解决QQ邮箱激活535 Error: ÇëʹÓÃÊÚȨÂëµÇ¼¡£ÏêÇéÇë¿´及端口25被占用问题
  20. 如何使用FTP手机/电脑上传文件到服务器

热门文章

  1. 物理学步入禅境,缘起性空
  2. (转)关于电子书格式比较
  3. 全球最大同性交友网站 GitHub 10 岁了!
  4. POJ 3257 Cow Roller Coaster 二维背包
  5. office2016风格后台管理系统html模板下载-uimaker设计
  6. JavaWeb:(练习)十二、简单的学生管理系统
  7. java初中级程序员面试宝典-蚂蚁课堂
  8. S32K14x MCAL配置之MCU
  9. 华为的哪个字体像苹果的_华为默认字体是什么字体
  10. 没有IOMMU的DMA操作