目录
S-Function函数即系统函数System Function的意思,为什么要使用S函数呢?
因为在研究中,有时需要用到复杂的算法设计等,而这些算法因为其复杂性不适合用普通的Simulink模块来搭建,即matlab所提供的Simulink模块不能满足用户的需求,需要用编程的形式设计出S函数模块,将其嵌入到系统中。如果恰当地使用S函数,理论上,可以在Simulink下对任意复杂的系统进行仿真。S函数具有固定的程序格式,用matlab语言可以编写S函数,此外还允许用户使用C、C++、Fortran和Ada等语言进行编写,用非matlab语言进行编写时,需要采用编译器生成动态链接库DLL文件。
仿真标志位flag
- flag=0。进行系统的初始化过程,调用mdlInitializeSizes函数,对参数进行初始化设置,比如离散状态个数、连续状态个数、模块输入和输出的路数、模块的采样周期个数、状态变量初始数值等。
- flag=1。进行连续状态变量的更新,调用mdlDerivatives函数。
- flag=2。进行离散状态变量的更新,调用mdlUpdate函数。
- flag=3。求取系统的输出信号,调用mdlOutputs函数。
- flag=4。调用mdlGetTimeOfNextVarHit函数,计算下一仿真时刻,由sys返回。
- flag=9。终止仿真过程,调用mdlTerminate函数。
初始化状态子函数
-
dynamically sized inputs,主要给出连续状态的个数、离散状态的个数、输出数目、输入数目和直接馈通否。
-
direct feedthrough,系统的输出是否直接和输入相关联,即输入是否出现在输出端的标志,若是为1,否则为0,一般可以根据在flag=3的时候,mdlOutputs函数是否调用输入u来判断是否直接馈通。我们本例中由于输出函数中调用了u,所以将其值置为1。
-
x0为状态初始数值,str在目前为止的matlab版本中并没有什么作用,一般str=[]即可,ts为一个两列的矩阵,包含采样时间和偏移量两个参数,如果设置为[0 0],表示是连续系统,那么每个连续的采样时间步都运行;[-1 0]则表示按照所连接的模块的采样速率进行;[0.25 0.1]表示仿真开始的0.1s后每0.25s运行一次,采样时间点为TimeHit=n*period+offset。
执行顺序
-
在实际仿真过程中,Simulink会自动将flag设置为0,进行初始化过程
-
然后将flag的数值设置为3,计算模块的输出,一个仿真周期后,Simulink将flag的数值先后设置为1和2,更新系统的连续和离散状态
-
再将其设置为3,计算模块的输出,如此循环直至仿真结束条件满足。
点击下方卡片,加入会员全年无限制学习后台(MPC各矩阵的底层逻辑、MPC纵向控制、模型验证、MPC自适应巡航控制、非线性系统如何线性化及MPC动力学跟踪任何轨迹、约束添加及新求解器的求解、轨迹规划、纵向规划等80个系列)会员专享爆品课程及资源,同时获得分佣资格,可赚回自己的学费!