本文转载自 Simulink之——S函数 - 只是学电的的文章 - 知乎
在此向作者表示感谢。
一.什么是S函数?
S-函数是系统函数(System Function)的简称,在Simulink中用非图形化的方式来描述一个模块。一个完整的S-函数结构体系包含了描述一个动态系统所需要的全部能力。使用S-函数用户可以向Simulink模型中添加自己的模块,可以自由选择使用MATLAB、C、C++等语言来创建自己的模块。
二. S-函数的工作方式
-
若要创建属于自己的S-函数,必须先知道S-函数的工作方式,而要理解S-函数的工作方式,先得了解simulink仿真模型的过程。
Simulink 中的每个模块都有三个基本元素:输入向量、状态向量和输出向量。分别表示为
u ,
x 和
y .
在 Simulink 模块的三个元素中,
状态向量是最重要的,也是三者之中最灵活的一个概念。在 Simulink 中状态向量可以分为
连续状态、离散状态或两者的结合。输入、输出及状态的关系可以用状态方程描述:
- 输出方程 y=fo(t,x,u) y = f o ( t , x , u )
- 连续状态方程 dx=fd(t,x,u) d x = f d ( t , x , u )
- 离散状态方程 xk+1=fu(t,x,u) x k + 1 = f u ( t , x , u )
Simulink 在仿真时,将上述方程对应不同的仿真阶段,它们分别是计算模块的输出、更新离散状态、计算连续状态的微分。在仿真开始和结束,还包括初始化和结束仿真两个阶段。在每个阶段,Simulink都反复地调用模块。
为了深入了解 S-函数的工作原理,还需了解一个概念:仿真循环(Simulation loop)。
一个仿真循环就是由仿真阶段按一定顺序组成的执行序列。对于每个模块,经过一次仿真循环就是一个仿真步长, 而在同一个仿真步长中, 模型中各模块的仿真按照事先排好的顺序依次执行。
在仿真开始时Simulink 首先对模型进行初始化,此阶段不属于仿真循环的部分。在所有模块都初始化后,模块进入仿真循环,在仿真循环的每个阶段,Simulink 都要调用模块或者 S函数。
在调用模型中的S函数时,Simulink会调用用户定义的S函数的例程来实现每个仿真阶段要完成的任务。这些任务包括:
一、初始化:仿真开始前,Simulink 在这个阶段初始化S函数,完成的主要工作包括:
1 、初始化包含S函数所有信息的结构体SimStruct;
2、确定输入输出端口的数目和大小;
3、确定模块的采样时间;
4、分配内存和 Sizes 数组。
二、计算下一个采样时刻。如果模型使用变步长求解器,那么就需要在当前仿真步长内确定下一个采样点的时间,也即下一个仿真步长的大小;
三、计算输出:计算所有输出端口的输出值。
四、更新离散状态:此例程在每个仿真步长处都要执行一次,为当前时间的仿真循环更新离散状态;
五、数值积分:这个阶段只有模块具有连续状态和非采样过零点时才会存在。如果S函数存在连续状态,Simulink 就在细化的小时间步长中调用S函数的输出 mdlOutputs和微分 (mdlDerivatives)例程。如果存在非采样过零点,Simulink将调用 S函数中的输出 (mdlOutputs)和过零检测(mdlZeroCrossngs)例程,以定位过零点。