找回密码
 注册
Simdroid-非首页
查看: 122|回复: 8

【原创分享】浅谈S函数(包括其概念、使用及相关问题)

[复制链接]
发表于 2014-5-4 16:12:51 | 显示全部楼层 |阅读模式 来自 重庆沙坪坝区
本帖最后由 Nicky_小牛 于 2014-5-17 18:09 编辑

声明:转自本人在中国振动联盟论坛发表的原创帖!!)首先,什么是S函数?S函数是系统函数(System Function)的简称,其可以使用MATLAB或者C语言写成,包括连续、离散和混合系统,因此,几乎所有的Simulink模型都可以描述为S函数。
接下来,就介绍S函数的作用与原理,也就是我们为什么要使用S函数呢?原因很简单:在研究中,有时需要用到复杂的算法设计等,而这些算法因为其复杂性不适合用普通的Simulink模块来搭建,即matlab所提供的Simulink模块不能满足用户的需求,需要用编程的形式设计出S函数模块,将其嵌入到系统中。如果恰当地使用S函数,理论上,可以在Simulink下对任意复杂的系统进行仿真。使用S函数的一个优点是可以创建一个通用的模块,在模型中可以多次使用它,使用时只需要改变它的参数值即可。
S函数最通常的用法是创建一个定制的Simulink模块,可以在许多应用程序中使用S函数,包括:
(1)Simulinkl中加进新的通用模块;
(2)将已存在的C代码融合并入一个仿真中;
(3)将一个系统描述为一系列的数学方程;
(4)使用图形动画。
Simulink模型中的每一个模块都有如下的共同特征:一个输入向量U,一个输入向量Y,以及一个状态向量X。而状态向量可能包括连续状态、离散状态或连续状态的组合。Simulink将状态向量分为两部分:连续状态和离散状态。连续状态占据着向量的第一部分,离散状态占据第二部分。对于没有状态的模块,x是一个控的向量。
再者,介绍S函数在Simulink模块中的相关操作。点击Simulink->User-DefinedFunctions->S-Function Examples,即可出现如图1所示的界面,可以选择对应的编程语言查看演示文件。
   
  图1   S函数范例库
Matlab为了用户使用方便,有一个S函数的模板sfuntmpl.m,一般来说,我们仅需要在sfuntmpl.m的基础上进行修改即可。具体操作:matlab的workspace里输入editsfuntmpl(我们可以详细地观察其帮助说明以便更好地了解S函数的工作原理),我们来具体分析s函数的结构。
模板函数的定义形式为function[sys,x0,str,ts]=sfuntmpl(t,x,u,flag)。
一般来说,S函数的定义形式为[sys,x0,str,ts]=sfunc(t,x,u,flag,p1,…Pn)。其中,sfunc为自己定义的函数名称,以上参数中,t、x、u分别对应时间、状态、输入信号,flag为标志位,其取值不同,S函数执行的任务和返回的数据也是不同的,pn为额外的参数,sys为一个通用的返回参数值,其数值根据flag的不同而不同,x0为状态初始数值,str在目前为止的matlab版本中并没有什么作用,一般str=[]即可,ts为一个两列的矩阵,包含采样时间和偏移量两个参数,如果设置为[0 0],那么每个连续的采样时间步都运行,[-1 0]则表示按照所连接的模块的采样速率进行,[0.25 0.1]表示仿真开始的0.1s后每0.25s运行一次,采样时间点为TimeHit=n*period+offset。
在S函数的使用过程中需要注意2个概念:(1)directfeedthrough,系统的输出是否直接和输入相关联,即输入是否出现在输出端的标志,若是为1,否则为0,一般可以根据在flag=3的时候,mdlOutputs函数是否调用输入u来判断是否直接馈通;(2)dynamicallysized inputs,主要给出连续状态的个数、离散状态的个数、输入数目、输出数目和直接馈通否。
S函数中目前支持的flag选择有0、1、2、3、4、9等几个数值,下面说一下在不同的flag情况下S函数的执行情况。1)flag=0。进行系统的初始化过程,调用mdlInitializeSizes函数,对参数进行初始化设置,比如离散状态个数、连续状态个数、模块输入和输出的路数、模块的采样周期个数、状态变量初始数值等。2)flag=1。进行连续状态变量的更新,调用mdlDerivatives函数。3)flag=2。进行离散状态变量的更新,调用mdlUpdate函数。4)flag=3。求取系统的输出信号,调用mdlOutputs函数。5)flag=4。调用mdlGetTimeOfNextVarHit函数,计算下一仿真时刻,由sys返回。6)flag=9。终止仿真过程,调用mdlTerminate函数。

  图2   不同flag情况下S函数执行情况
在实际仿真过程中,Simulink会自动将flag设置为0,进行初始化过程,然后将flag的数值设置为3,计算模块的输出,一个仿真周期后,Simulink将flag的数值先后设置为1和2,更新系统的连续和离散状态,再将其设置为3,计算模块的输出,如此循环直至仿真结束条件满足。
在S函数的编写过程中,首先需要搞清楚模块中有多少个连续和离散状态,离散模块的采样周期是如何的,同时需要了解模块的连续和离散的状态方程分别是什么,输出如何表示。【附件_S函数实例】以实例说明S函数的具体应用。附件中还有其他S函数资料,对于S函数的学习十分有帮助。


来自群组: 重庆大学

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×

点评

恒润的资料不全吧,是不是还有包没传上来  发表于 2014-5-5 11:03

评分

1

查看全部评分

发表于 2014-5-4 20:48:36 | 显示全部楼层 来自 重庆沙坪坝区
Simdroid开发平台
谢谢LZ无私分享啊!不用仿真币,太好了!学习了~
回复 不支持

使用道具 举报

发表于 2014-5-4 20:49:28 | 显示全部楼层 来自 重庆沙坪坝区
不管怎样,先下载再说!!!谢了~
回复 不支持

使用道具 举报

 楼主| 发表于 2014-5-5 11:06:27 | 显示全部楼层 来自 重庆沙坪坝区
本帖最后由 Nicky_小牛 于 2014-5-5 11:13 编辑

恒润的资料已经上传完毕,两个压缩分卷!!@ ljelly


点评

你自己试试,下载下来解不开  发表于 2014-5-6 07:30
回复 不支持

使用道具 举报

发表于 2014-5-5 11:17:01 | 显示全部楼层 来自 重庆沙坪坝区
Nicky_小牛 发表于 2014-5-5 11:06
恒润的资料已经上传完毕,两个压缩分卷!!@ ljelly

好贴啊!!支持自我总结的帖子以及分享经验贴!!顶
回复 不支持

使用道具 举报

 楼主| 发表于 2014-5-13 15:19:46 | 显示全部楼层 来自 重庆沙坪坝区
由于之前受附件大小限制,无法完整上传部分文件,可能有些打不开。故此,将不能打开的文件再次上传……

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
回复 不支持

使用道具 举报

发表于 2017-7-18 19:56:37 | 显示全部楼层 来自 广东深圳
好贴啊!!支持自我总结的帖子以及分享经验贴!!顶
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-3-29 21:12 , Processed in 0.045135 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表