S-Fucntion 模块核心干货及易错点归纳总结入门学员必学
Posted Jeossirey
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了S-Fucntion 模块核心干货及易错点归纳总结入门学员必学相关的知识,希望对你有一定的参考价值。
一、S-Function 模块概况
S-Function 函数即系统函数(System Function)的意思,为什么要使用 S 函数呢?
因为在研究中,有时候我们需要用到复杂的算法设计等,而这些算法因为其复杂性不适合用普通的 Simulink 模块来搭建,也就是说 matlab 所提供的 Simulink 模块不能满足用户的需求,需要用编程的形式设计出 S 函数模块,将其嵌入到系统中。如果恰当地使用S函数,理论上,可以在 Simulink 下对任意复杂的系统进行仿真。
二、仿真标志位 flag
-
flag=0。调用mdlInitializeSizes函数,进行系统的初始化过程,对参数进行初始化设置,比如离散状态量的个数、连续状态量的个数、S-Function 模块输入和S-Function 输出的路数、模块的采样周期、状态量初始数值等。
-
flag=1。调用mdlDerivatives函数,更新连续状态变量。
-
flag=2。调用mdlUpdate函数,更新离散状态变量。
-
flag=3。调用mdlOutputs函数,计算 S-Function 的输出。
-
flag=4。调用mdlGetTimeOfNextVarHit函数,计算下一仿真时刻,由sys返回。
-
flag=9。终止仿真过程,调用mdlTerminate函数。
三、初始化状态子函数
定义 S-Function 的初始信息是为了让 Simulink 识别出一个 m 文件的 S-Function 函数,用户必须在 S-Function 函数里提供有关 S-Function 函数的说明信息,包括采样时间、连续状态量个数、离散状态量个数等等初始条件。这一部分主要在mdlInitializeSizes 子函数里完成。
-
sizes,sizes 数组是 S-Function 函数信息的载体,它内部的字段意义主要是给出连续状态量的个数、离散状态量的个数、输出量的数目、输入量的数目和是否直接馈通。具体如下:NumContStates表示模块连续状态量的个数;NumDiscStates表示模块离散状态量的个数;NumOutputs表示模块输出量的数目;NumInputs表示模块输入量的数目;DirFeedthrough表示是否直接馈通;NumSampleTimes表示采样时间的个数,有无代数循环标志。
-
DirFeedthrough,系统的输出是否直接和输入相关联,即输入是否出现在输出端的标志,若是则令其数值为 1,否则为 0,一般可以根据在 flag=3 的时候,mdlOutputs 函数是否调用输入 u 来判断是否直接馈通。我们本例中由于输出函数中调用了 u,所以将其值置为 1。
-
x0 为状态量初始数值,一般 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,计算模块的输出,如此循环直至仿真结束条件满足。
五、输入和输出参量说明
S-function 中默认的 4 个输入参数为 t、x、u 和 flag,它们的次序不能变动,代表的意义分别为:
-
t:代表当前的仿真时间,这个输入参数通常用于决定下一个采样时刻,或者在多采样速率系统中,用来区分不同的采样时刻点,并据此进行不同的处理。
-
x:表示状态向量,这个参数是必须的,甚至在系统中不存在状态时也是如此。它具有很灵活的运用。
-
u:表示模块输入量。在我们 Carsim-Simulink 联合仿真时 S-function 模块的参数 u 就来自我们的 Carsim 输出来的车辆的状态量。
-
flag:是一个控制在每一个仿真阶段调用哪一个子函数的参数,由 Simulink 在调用时自动取值。
S-function 默认的 4 个返回参数(即输出参数)为 sys、x0、str、ts 它们的次序不能变动,其中 sys、x0 代表的意义分别为:
-
sys:是一个通用的返回参数,它所返回的值的意义取决于 flag 的值,在每一个阶段调用不同函数的时候,返回值都是不同的。
-
x0:是初始的状态值(没有状态时是一个空矩阵[ ]),这个返回参数只在 flag 值为 0 时才有效,其他时候都会被忽略。
-
需要长期系统性学习的朋友可加入会员,享有会员专属爆品课程及资源!
六、易错点总结
易错点一:当 flag=3,计算完 mdlOutputs 输出子函数后,有很多学员除了输出我们二次规划算出来的控制量之外还输出了一些其他的量,这个时候就很容易犯错。比如:
% 以跟踪圆形轨迹为例,这位同学想在原来基础上多输出一个误差量
u_real(1)=U(1)+vd1;
u_real(2)=U(2)+vd2;
sys=u_real; %只输出我们最优的前轮转角控制量和速度控制量
% 输出三项,分别是前轮转角控制量//速度控制量//跟踪误差
sys=[u_real;LatError];
那么这个时候就必须在 S-Function 初始化子函数模块做一下修改:
切记:调节 S-Function 模块的输出和调节 MPC 算法部分的 Ny 不是一个概念。
易错点二:S-Function 原先接收了 Carsim 三个数据,如果你想让 S-Function再多接收两个 Carsim 传来的数据,就在原来的基础上做一下修改:
以上是关于S-Fucntion 模块核心干货及易错点归纳总结入门学员必学的主要内容,如果未能解决你的问题,请参考以下文章