1 何为S-Function
S-Function是System Function的缩写。当MATLAB提供的模型不能完全满足用户需要时,就可以通过S-函数提供给用户自己编写程序来满足自己要求模型的接口。可以使用MATLAB、C、C++、Ada和Fortran语言编写。
S-函数使用的是一种比较特殊的调用格式,可以和Simulink求解器进行交互式操作,这种交互式与Simulink求解器和内置固有模块交互式操作相同。S-函数功能非常全面,适用于连续、离散以及混合系统。
2 在模型中使用S-函数
为了在Simulink中使用S-函数,必须从Simulink中的User-Defined Functions模块库中向Simulink模型文件窗口中拖放S-Function模块。然后在S-Function模块的对话框中的S-Function name文本框中输入S-函数的文件名。
S-函数所起的作用:向Simulink模型中增加一个通用目的的模块;使用S-函数的模块来充当硬件的驱动;在仿真中嵌入已经存在的C代码;将系统表示成一系列的数学方程;在Simulink中使用动画。
3 S-函数工作原理
Simulink模型的处理过程:(1)初始化(传递参数给MATLAB进行求值;得到的数值作为实际的参数使用;展开模型的层次,每个子系统被它们所包含的块替代;检查好相邻模块间的连接;确定状态初值和采样时间);(2)运行阶段(计算输出;更新离散状态;计算连续状态,连续状态的计算过程;计算输出,过零可能被激活)。
S-函数方法主要完成:(1)初始化(初始化结构体SimStruct,它包含了S-函数的所有信息;设置输入输出端口数;设置采样时间;分配存储空间);(2)计算下一个采样时间点;(3)计算下一个时间步的输出;(4)更新状态;(5)数值积分(用于连续状态的求解和非采样过零点)。
4 M文件S-函数的编写
既可以是M文件,也可以是MEX文件。仿真过程说明:
仿真阶段 | S-函数过程 | Flag |
初始化 | mdlInitializeSizes mdlInitializeConditions mdlInitializeSampleTimes | flag=1 |
计算下一个采样时间 | mdlGetTimeOfNextVarHit | flag=4 |
计算输出 | mdlOutputs | flag=3 |
更新离散状态 | mdlUpdate | flag=2 |
计算导数 | mdlDerivatives | flag=1 |
计算任务结束 | mdlTerminate | flag=9 |
5 M文件S-函数模板
S-函数模板文件sfuntmpl.m。
用户可以输入edit sfuntmpl对该模板函数进行编辑和修改,以达到要求实现的结果,其主要参数说明如下:
t——当前时刻,是一个采用绝对计量的时间值,就是从仿真开始模型运行时间的计量值。
x——模块的状态向量,包括连续状态向量和离散状态向量。
u——模块的输入向量。
flag——执行不同操作的标记变量。其取值如上表。
case不一定都是必要的,有的情况下,我们可以进行剪裁。
用户对S-函数进行裁剪,但是不能修改输入和输出参数的名称、顺序,不过可以增加输入参数的数量。
6 连续、离散和混合系统M文件S-函数