本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

控制和显示执行顺序

模型的执行顺序是 Simulink® 在仿真期间调用模块输出方法的顺序。Simulink 在模型更新过程中确定此顺序,您可以通过点击 Modeling 选项卡上的 Update Model 来启动此顺序。Simulink 还会在仿真期间更新模型。

您不能设置执行顺序,但您可以为非虚拟模块分配优先级,以指示这些对应的模块图中的模块相对于其他模块的执行顺序。在不存在数据依存关系冲突的情况下,Simulink 会尽量遵循模块优先级设置。要确认您已设置的优先级结果或调试您的模型,请显示并检查您的非虚拟模块和子系统的执行顺序。

注意

有关模块方法和执行的详细信息,请参阅:

Execution Order 查看器

Debug 选项卡上,选择 Information Overlays > Execution Order。Execution Order 查看器在 Simulink Editor 右侧的窗格中打开。

Execution Order 查看器显示当前系统的任务列表。

每个 System Index 值对应于一组独立于其他模块执行的模块,例如非虚拟子系统中的模块。在一个模型中,System Index 值是唯一的。在模型引用层次结构中,可以多次使用同一 System Index 值,但在该层次结构的每个模型内保持唯一。要确定某个模型中的子系统是否属于同一系统,请比较其 System Index 值。

Task ID 列中列出的每个任务对应于一组共享同一采样率的模块。对于固定步长大小,Treat each discrete rate as a separate task 配置参数决定 Simulink 是否在一个或多个任务中以离散速率执行模块。

在 Execution Order 查看器中选择一项任务会突出显示属于该任务的模块并显示其执行顺序。默认情况下,Simulink 选择与活动模块图对应的第一个任务。

当活动模块图不包含作为给定任务的一部分执行的任何模块时,您无法在 Execution Order 查看器中选择该任务。活动模块图可能包含作为此任务的一部分的虚拟模块,如 Inport 模块。

要隐藏突出显示和执行顺序,请点击 Clear Highlighting 按钮

从模块导航到任务

要显示在其中执行模块的任务,请点击模块。

The selected Subsystem block has an information overlay that says "Task: 0,1." The information overlay contains a link for each task number.

标签中的任务编号显示为链接,您可以点击这些链接以在 Execution Order 查看器中选择对应的任务。当一个模型有许多任务时,您可以点击这些链接而无需在 Execution Order 查看器中滚动任务列表。

要比较模块之间的任务,请选择多个模块。

执行顺序的表示

Simulink 在每个非虚拟模块的右上角显示一个数字。这些数字表示模块的执行顺序。要执行的第一个模块具有最小执行顺序值,通常是 1。显示的执行顺序可以是不连续数字,但模块始终按可见数字的顺序执行。假设一个任务显示执行顺序 1、2 和 4。标记为 1 的模块在标记为 2 的模块之前执行,标记为 2 的模块在标记为 4 的模块之前执行。

例如,在 vdp 模型中,模块执行顺序的范围是从 19,每个非虚拟模块都会收到一个执行顺序。

虚拟和非虚拟子系统

虚拟 Subsystem 模块只是在图形层面存在的模块,并不执行。因此,它们不是执行顺序的一部分。虚拟子系统中的模块在根级模型的上下文中有一个执行顺序。对于虚拟子系统,该子系统内的模块执行顺序列在花括号 {} 内。

非虚拟 Subsystem 模块是在功能意义上存在的模块,会作为一个单元来执行。它们有单一执行顺序和不同于父模型的系统索引。非虚拟子系统中的模块有自己的执行顺序,它们独立于父模型。

例如,以下模型包含一个名为 Car Dynamics 的虚拟子系统和一个名为 Discrete Cruise Controller 的非虚拟原子子系统。

虚拟 Car Dynamics 子系统将它所包含的模块的执行顺序列表显示在花括号内。它包含的模块在根级执行。Integrator 模块首先执行,并将其输出发送到根级模型中的 Scope 模块,后者第二个执行。

非虚拟 Discrete Cruise Controller 子系统只有一个执行顺序 (5),表明该子系统和其中的模块是相对于根级的模块执行的第五个。

注意

根据您的模型配置,Simulink 可以在您的模型中插入隐藏的非虚拟子系统。结果,隐藏的 Subsystem 模块内部的可见模块具有的系统索引可能不同于当前系统索引。例如,如果您选择 Conditional input branch execution 配置参数,Simulink 将创建隐藏的非虚拟子系统,这可能影响已排序的执行顺序。

代数环

代数环中的模块会移到一个隐藏的非虚拟子系统中。该隐藏子系统的执行顺序是在其他模块的上下文中确定的;然后,系统会确定该隐藏子系统内的模块的执行顺序。

函数调用和执行子系统

对于函数调用和执行子系统,子系统的执行与发起方的执行绑定在一起。因此,该子系统及其发起方具有相同的执行顺序。

在导出函数模型的根级,函数调用执行顺序有 F 前缀。

有关详细信息,请参阅导出函数模型概述

总线和多个发起方

当一个模块基于指向该模块的不同执行路径执行多次时,该模块具有多个执行顺序。例如:

  • 连接到总线的模块的执行顺序对应于总线包含的每个信号。

  • 具有多个发起方的函数调用或执行子系统的执行顺序对应于每个发起方。

Simulink 如何确定执行顺序

Simulink 使用基于任务的排序,根据其派生的采样时间信息设置模块和端口的执行顺序。通过基于任务的排序,可以简单高效地确定模块的执行顺序。

使用基于任务的排序可以:

  • 根据采样时间单独排序任务。

  • 生成多个排序列表,而不是为所有任务中的模块生成一个扁平化排序列表。

  • 简化速率转换处理。

  • 避免误报不同任务中关联模块的数据依存关系冲突。

  • 代码生成结果实现高效的速率分组。

  • 一个子系统可以属于多个任务中的不同排序列表。

直接馈通端口对执行顺序的影响

为了确保排序执行顺序反映模块之间的数据依存关系,Simulink 根据模块输出对模块输入端口的依赖性对模块输入端口进行分类。如果某个输入端口的当前值确定了一个模块输出的当前值,则该输入端口为直接馈通端口。具有直接馈通端口的模块示例包括:

具有非直接馈通输入的模块示例包括:

  • Integrator - 输出是表明其状态的一个函数。

  • Constant - 没有输入。

  • Memory - 输出取决于其上一个时间步的输入。

确定模块执行顺序的规则

Simulink 使用下列规则对模块进行排序:

  • 如果一个模块驱动另一个模块的直接馈通端口,则在执行顺序中此模块必须显示在它所驱动的模块之前。

    此规则可确保当 Simulink 调用需要当前输入的模块方法时模块的直接馈通输入是有效的。

  • 没有直接馈通输入的模块可以显示在执行顺序中的任何位置,只要它们位于它们所驱动的任何直接馈通模块之前即可。

    将没有直接馈通端口的所有模块放置在执行顺序的开头可满足此规则。这种排列可让 Simulink 在排序过程中忽略这些模块。

应用这些规则后即可得出执行顺序。没有直接馈通端口的模块以非特定顺序显示在列表的开头。这些模块后跟具有直接馈通端口的模块,其排列要求前面的模块可以为它们所驱动的模块提供有效输入。

以下模型展示了这种结果。下列模块没有直接馈通,因此显示在根级系统执行顺序的开头:

  • Car Dynamics 虚拟子系统中的 Integrator 模块

  • 根级模型中的 Speed 模块

在 Discrete Cruise Controller 子系统内,具有直接馈通端口的所有 Gain 模块都在它们所驱动的 Sum 模块之前运行。

用于确定包含异步任务的模型中模块执行顺序的规则

在仿真中,在确定任务中的模块排序顺序时,异步函数调用发起方具有最高优先级。有关详细信息,请参阅异步采样时间Rate Transitions and Asynchronous Blocks (Simulink Coder)

为了确定包含异步采样时间的模型中的模块执行顺序,Simulink 使用以下规则:

  • 如果异步函数调用发起方由对应的速率转换模块共享的离散速率触发,则在具有公共离散速率的任务中,异步函数调用发起方将排在执行顺序的最前面。

    例如,在以下模型中,有一个异步函数调用发起方,它由离散速率 D1 触发。在离散任务中,异步函数调用发起方排在执行顺序的最前面。Rate Transition 模块在异步速率 A1 和离散速率 D1 之间转换。

  • 如果 Rate Transition 模块缩减到 NoOp,则 Rate Transition 模块不会执行,且在离散任务的排序顺序位置会转移到与其连接的上游或下游离散模块。

    例如,在上述模型中,RTB2 缩减到 NoOp,因此它在排序顺序中的位置转移到下游 Gain 模块。

  • 如果两个异步函数调用发起方执行同一公共离散速率任务,则优先级较高的异步函数调用发起方在该离散速率任务中先执行。

    例如,在以下模型中,两个异步函数调用发起方由同一离散速率 D1 触发。任务优先级高的函数调用发起方排在执行顺序的最前面。

  • 基于任务的排序不支持异步采样时间的并集。包含多个异步采样时间的并集的模型默认采用全局执行顺序,其中的所有模块在单个任务中统一排序。

检查是否有涉及 Data Store Memory 模块的执行顺序更改

使用基于任务的排序而不是模块排序可以更改涉及 Data Store Memory 模块的相对执行顺序。Upgrade Advisor 检查会检测更改,并提供选项以允许在升级模型时保持原始执行顺序。

  1. 打开 Upgrade Advisor。在 Modeling 选项卡中,选择 Model Advisor > Upgrade Advisor

  2. 选中 Check relative execution orders for Data Store Read and Data Store Write blocks 复选框。

  3. 点击 Run This Check 按钮。

  4. 查看 Result 表中的任何更改。如果您要保留原始执行顺序,请点击 Modify 按钮。

相关主题