声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 4325|回复: 5

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

[复制链接]
发表于 2014-3-1 19:20 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
本帖最后由 牛小贱 于 2014-4-2 16:47 编辑

首先,什么是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函数的学习十分有帮助。

图1

图1

图2

图2

MATLAB中S函数编辑流程及相关.doc

217.5 KB, 下载次数: 3

S-Function_使用及应用举例.pdf

124.86 KB, 下载次数: 10

s函数说明书(自编).pdf

268.83 KB, 下载次数: 2

售价: 2 点体能  [记录]

关于matlab中s-function参数设置的两个例子讲解.pdf

162.96 KB, 下载次数: 2

如何编写S函数.doc

22 KB, 下载次数: 1

横润科技《MATLAB的S-Function编写指导》.rar

738.99 KB, 下载次数: 3

售价: 2 点体能  [记录]

【附件】S函数实例.doc

338 KB, 下载次数: 2

售价: 2 点体能  [记录]

点评

如果有不足之处,还请大家补充指正!!  发表于 2014-3-19 09:21

评分

1

查看全部评分

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2014-3-5 18:14 | 显示全部楼层
这帖子,果断收藏!!!
 楼主| 发表于 2014-3-6 09:18 | 显示全部楼层
Nicky_ONE 发表于 2014-3-5 18:14
这帖子,果断收藏!!!

有什么不足之处,还望你补充、更正!!
发表于 2014-3-6 09:38 | 显示全部楼层
这帖子太好了!!谢谢楼主啊!!
发表于 2014-3-6 09:38 | 显示全部楼层
这帖子太好了!!谢谢楼主啊!!
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-12-23 06:18 , Processed in 0.058960 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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