Simulink模型的计算顺序是基于时间采样和信号流向的,即按照时间的顺序执行。每一个采样点时间,模型中所有模块的状态和输入/输出值都要计算并更新一下,每个模块的输出值都通过信号连接传递给下一个模块的输入。系统采样时间由解算器类型和步长共同决定,并且作为 Simulink模型仿真的最小粒度。当系统采样时刻到来时,每个模块再根据自身所设定的采样时间方式决定是否在当前这个采样时刻进行计算。允许用户设定采样时间的模块在其参数对话框中都提供 Sample Time这个属性。对于模块的Sample Time属性,常用的值有以下几组:
- -1:继承输人信号采样时间,若没有输人信号,继承父层模型采样时间;如果模块无输人信号且本身处于顶层模型中,则继承系统解算器的步长。
- 0:连续采样时间。
- 非零正数:离散采样时间。
- Inf:无穷大采样时间,即不采样,如常数模块。
当然,也可以通过填人一个包含两个元素的数组[sampletime,offset]来实现采样时刻的偏移,sampletime 就是上述采样时间中的一种,offset是相对于这个采样时刻的时间偏移量例如[0.2,0.01]表示采样类型是离散的,其周期为0.2s,但是采样时刻相对解算器的时钟有一个偏移量,具有此种采样时间向量的模块采样时间序列为0.01s、0.21s、0.41s等时刻进行计算。
一个子系统内部包含多个模块时,模块的计算顺序是怎样的?了解这一点有助于增强我们在模型仿真出错时的分析能力和纠错能力。Simulink的执行顺序是按照信号的流向进行的。子系统的入口采用Inport模块,同其输出连接的模块(非虚拟模块)往往是第一个需要计算的。当存在多个输人端口时,按照输入端口的编号从小到大顺序执行,再顺次更新这个模块的输出信号所连接的模块。如果这个模块的输入端口有多个,那么需要所有输入端口的数据全部准备完毕之后,再计算多输人模块的状态量和输出量。具有多个输入分支的模块,其输入端口决定了输人到其分支上的模块执行顺序。对于Simulink模型,可以通过菜单栏Display→Blocks-Sorted Executed Order 将模块的执行顺序显示出来,如下图所示。
上图中,除In1外每个模块都有红色的时序文字标注,格式为m:n。其中m表示模块在模型中执行的优先度,n表示在同一个采样时刻,模块所处的执行次序号,二者都从0号开始计数,0表示最高优先度,首先必须要将输入In1数据传递给 Gain 模块,作为 Add模块的第一个输入口连接的 Gain 模块先进行计算以得到输出值,接着与 Add模块另一个输入口连接的Constant 模块进行计算,两个模块都计算后,Add 模块的两个输人端口数据便均准备完毕,可以进行 Add模块的计算。待Add模块根据两个输入信号计算完毕之后,再将其输出值通过 Out输出。