Main Content

系统和子系统中的采样时间

纯离散系统

纯离散系统完全由离散模块组成,可以使用定步长或变步长求解器进行建模。要对离散系统进行仿真,需要仿真器在每个采样时间命中点执行一个仿真步。对于多速率离散系统 - Simulink® 以不同速率对其模块进行采样的系统 - 时间步的发生时间必须是每个系统采样时间的整数倍。否则,仿真器可能会漏掉关键的系统状态转移。Simulink 软件选择的步长取决于您用来仿真多速率系统的求解器类型和基础采样时间。

多速率离散系统的基础采样时间是系统实际采样时间的最大双精度整数除数。例如,假设系统的采样时间为 0.25 和 0.50 秒。这种情况下,基础采样时间为 0.25 秒。再假设采样时间为 0.50 和 0.75 秒。基础采样时间还是 0.25 秒。

基础采样时间的重要性直接关系到您指示 Simulink 软件使用定步长还是变步长离散求解器来解算多速率离散系统。定步长求解器将仿真步长设置为等于离散系统的基础采样时间。相反,变步长求解器会调整步长,使其等于实际采样时间命中点之间的距离。

下图说明了定步长和变步长求解器之间的差异。

在上图中,箭头表示仿真步,圆圈表示采样时间命中点。如图所示,执行系统仿真时,如果基础采样时间小于系统的任何实际采样时间,变步长求解器将需要较少的仿真步。而另一方面,如果系统中有一个采样时间等于基础采样时间,则定步长求解器需要的实现内存更少,速度更快。这在需要从 Simulink 模型中生成代码(使用 Simulink Coder™)的应用中,可能算是一个优势。在任一情况下,Simulink 提供的离散求解器均针对离散系统进行了优化;但是,您可以使用任何一种求解器对纯离散系统进行仿真,并获得相同的结果。

假设有下面这样一个简单的多速率系统。在这个示例中,DTF1 Discrete Transfer Fcn 模块的采样时间设置为 [1 0.1],偏移量为 0.1。DTF2 Discrete Transfer Fcn 模块的采样时间设置为 0.7,无偏移量。求解器设置为变步长离散求解器。

运行仿真并使用 stairs 函数绘制输出

set_param(bdroot,'SolverType','Variable-Step','SolverName','VariableStepDiscrete','SaveFormat','Array');
simOut = sim(bdroot,'Stoptime','3');
stairs(simOut.tout,simOut.yout,'-*','LineWidth',1.2);
xlabel('Time (t)');
ylabel('Outputs (out1,out2)');
legend('t_s = [1, 0.1]','t_s = 0.7','location','best')

生成的绘图如下所示。

(有关 sim 命令的信息,请参阅以编程方式运行仿真。)

如图所示,因为 DTF1 模块的偏移量为 0.1,所以直到 t = 0.1DTF1 模块才会开始输出。同样,传递函数的初始条件为零;因此,DTF1 的输出 y(1) 在此时间之前为零。

混合系统

混合系统同时包含离散模块和连续模块,因此同时具有离散状态和连续状态。但是,Simulink 求解器将同时具有连续和离散采样时间的任何系统都视为混合系统。有关为混合系统建模的信息,请参阅混合系统建模

在模块图中,“混合”一词同时适用于混合系统(混合的连续离散系统)和具有多个采样时间的系统(多速率系统)。当您执行更新图并将“采样时间显示”的颜色设置为 'on' 时,此类系统的颜色将变为黄色。例如,假设以下模型中包含一个原子子系统 Discrete Cruise Controller 和一个虚拟子系统 Car Dynamics。

车辆模型

采样时间选项设置为全部时,执行更新图会将虚拟子系统变为黄色,表明它是一个混合子系统。这种情况下,该子系统是一个真正的混合系统,因为它同时具有连续和离散采样时间。如下所示,离散输入信号 D1 与连续速度信号 v 结合,为积分器生成连续输入信号。

更新图之后的车辆模型

更新图之后的车辆动力学子系统

现在,假设有一个多速率子系统包含三个 Sine Wave 源模块,每个模块具有唯一的采样时间,分别为 0.2、0.3 和 0.4。

更新图之后的多速率子系统

更新图操作将子系统变为黄色,因为子系统包含多个采样时间。如模块图中所示,Sine Wave 模块具有离散采样时间 D1、D2 和 D3,输出信号将采用子步中不变。

在评估系统的多个采样时间时,Simulink 不会考虑常量 [inf, 0] 或异步 [–1, –n] 采样时间。因此,如果子系统中有一个模块输出常量值,另一个模块具有离散采样时间,则该子系统不被视为混合系统。

混合注释和颜色设置对于评估您模型中的子系统是否继承了正确的或预期的采样时间非常有用。

子系统中的采样时间

子系统分为两种:触发和非触发。对于触发子系统,一般情况下,子系统从触发信号获取采样时间。当您使用 Trigger 模块创建触发子系统时,将发生一种例外情况。如果您将模块的触发器类型设置为函数调用,并将采样时间类型设置为周期性,将激活 SampleTime 参数。这种情况下,由指定 Trigger 模块的采样时间,然后由该模块确定子系统的采样时间。

有四种非触发子系统:

  • 虚拟

  • 使能

  • 原子

  • 执行

对于虚拟和使能子系统,Simulink 基于各自内容的采样时间计算它们的采样时间。

原子子系统是一种特殊情况,其特殊之处在于子系统模块有 SystemSampleTime 参数。而且,如果采样时间不是默认值 –1,原子子系统内的模块的 Inf 值只能是 –1 或者与子系统的 SampleTime 参数值完全相同(离散)。如果保留原子子系统为继承,Simulink 将按照与虚拟和使能子系统相同的方式计算模块的采样时间。但是,子系统 SampleTime 参数的主要用途是允许在一个原子子系统内同时指定大量模块,它们都设置为继承采样时间。要获取在原子子系统中设置的采样时间,请在命令提示符下使用以下命令:

get_param(AtomicSubsystemBlock,‘SystemSampleTime’);

最后,操作子系统的采样时间由 If 模块或 Switch Case 模块设置。

对于模块具有不同采样率的非触发子系统,Simulink 以子系统中存在的所有采样率的元胞数组形式返回子系统的编译采样时间。要查看此信息,请在 MATLAB 提示符下使用 get_param 命令。

get_param(subsystemBlock,'CompiledSampleTime')

相关主题