Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

计算转移

Stateflow® 使用图中的转移从一个互斥 (OR) 状态转移到另一个互斥 (OR) 状态。对于图执行的 entryexecution 工作流,Stateflow 会计算转移以确定它们是否有效。有效转移是其条件标签为 true 且其路径以某状态结束的转移。如果转移有效,Stateflow 将从源状态退出并进入目标状态。要了解在 executionentry 工作流期间何时进行计算,请参阅Stateflow 图的执行进入图或状态

计算转移的工作流

Flow chart that shows the steps for evaluating a transition.

转移的计算顺序

如果有多个转移源于单一来源(例如某状态或结点),Stateflow 将使用计算顺序来确定何时测试每个转移。根据图使用的动作语言,您可以显式或隐式创建转移顺序。无论是显式还是隐式排序,转移都会在转移源附近显示一个数字以指定转移顺序。

注意

在编辑图时,请使用显式排序,以避免更改转移的顺序。

显式排序

当您打开新 Stateflow 图时,源的所有出向转移将按照您创建它们的顺序自动编号。顺序编号从 1 开始,之后使用该源的下一个可用编号。

要更改转移的执行顺序,请右键点击转移,将光标放在执行顺序上,然后选择希望转移执行的顺序。当您更改转移编号时,Stateflow 图会通过保留其他出向转移的相对顺序,自动对这些出向转移重新编号。

隐式排序

对于隐式排序模式下的 C 语言状态图,Stateflow 图基于以下因素计算来自单一源的一组出向转移:

  • 层次结构。

    图根据每个转移的父项层级,按顺序计算一组出向转移。

  • 标签。

    图根据标签按以下优先级顺序计算一组具有相同层次结构优先级的出向转移:

    1. 带事件和条件的标签

    2. 带事件的标签

    3. 带条件的标签

    4. 无标签

    有关使用事件时图行为的详细信息,请参阅通过使用隐式事件控制图行为

  • 转移源上的角位。

    图根据源对象表面上的角度位置,计算一组具有相同层次结构和标签优先级的出向转移。具有最小时钟位置的转移具有最高优先级。例如,相对源对象具有 2 点钟时钟位置的转移的优先级高于具有 4 点钟时钟位置的转移。相对源对象具有 12 点钟时钟位置的转移的优先级最低。

指向父状态内部边缘的转移

结束于父状态内部边缘的转移是返回默认转移路径的快捷方式,默认路径是在当前时间步内计算的。在此示例中,从状态 B 发出的转移会立即引发通向状态 A 的默认转移。

Chart that shows a transition to the inner edge of a state.

如果存在默认转移,则 Stateflow 会立即执行这些路径。如果不存在默认转移,也不存在子级,则为时间步的结束。在这两种情况下,父级都保持激活状态,并且不执行父级的 exit 和 entry 动作。

计算外部转移

在此示例中,Stateflow 图经过初始化并执行了 StateAentry 动作。在一个新时间步,图被唤醒。按照 Stateflow 图执行的工作流,Stateflow 找到从 StateA 的多个外部转移路径。在此时间步,x = 1y = 1z = 1

Stateflow chart with states called StateA, StateC, StateD, and StateE.

按照计算转移的工作流,计算图中转移的步骤顺序如下:

  1. StateA 发出的转移 1 被标记为待计算。

  2. StateA 发出的转移 1 有一个条件。

  3. 该条件为 true。

  4. StateA 发出的转移 1 的目标不是一个状态。

  5. 结点确实有出向转移。

  6. 从结点发出的转移 1 被标记为待计算。

  7. 从结点发出的转移 1 有一个条件。

  8. 该条件为 false。

  9. 从结点发出的转移 2 被标记为待计算。

  10. 从结点发出的转移 2 没有条件。

  11. 从结点发出的转移 2 的目标是一个状态 (StateD)。

  12. StateD 被标记为 entryStateA 被标记为 exit

要完成该时间步,请对 StateA 执行退出状态的工作流,对 StateE 执行进入图或状态的工作流

计算带回溯的外部转移

如果从源的所有出向转移都无效或未以终止结点结束,但之前还有未计算的转移,则 Stateflow 会返回到之前的状态或结点以计算所有可能的路径。

在此示例中,Stateflow 图经过初始化并执行了 StateAentry 动作。在一个新时间步,图被唤醒。按照 Stateflow 图执行的工作流,Stateflow 找到从 StateA 的多个外部转移路径。在此时间步,x = 1y = 1z = 1

Stateflow chart with states called StateA, StateC, StateD, and StateE.

按照计算转移的工作流,计算图中转移的步骤顺序如下:

  1. StateA 发出的转移 1 被标记为待计算。

  2. StateA 发出的转移 1 有一个条件。

  3. 该条件为 true。

  4. StateA 发出的转移 1 的目标不是一个状态。

  5. 结点确实有出向转移。

  6. 从结点发出的转移 1 被标记为待计算。

  7. 从结点发出的转移 1 有一个条件。

  8. 该条件为 false。

  9. 从结点发出的转移 2 被标记为待计算。

  10. 从结点发出的转移 2 有一个条件。

  11. 该条件为 false。

  12. StateA 发出的转移 2 被标记为待计算。

  13. StateA 发出的转移 2 没有条件。

  14. StateA 发出的转移 2 的目标是一个状态 (StateE)。

  15. StateE 被标记为 entryStateA 被标记为 exit

要完成该时间步,请对 StateA 执行退出状态的工作流,对 StateE 执行进入图或状态的工作流

防止回溯

在此示例中,终止结点防止回溯。Stateflow 图经过初始化并执行了 StateAentry 动作。在一个新时间步,图被唤醒。按照 Stateflow 图执行的工作流,Stateflow 找到从 StateA 的多个外部转移路径。在此时间步,x = 1y = 1z = 1

Stateflow chart with states called StateA, StateC, StateD, and StateE.

按照计算转移的工作流,计算图中转移的步骤顺序如下:

  1. StateA 发出的转移 1 被标记为待计算。

  2. StateA 发出的转移 1 有一个条件。

  3. 该条件为 true。

  4. StateA 发出的转移 1 的目标不是一个状态。

  5. 结点确实有出向转移。

  6. 从结点发出的转移 1 被标记为待计算。

  7. 从结点发出的转移 1 有一个条件。

  8. 该条件为 false。

  9. 从结点发出的转移 2 被标记为待计算。

  10. 从结点发出的转移 2 有一个条件。

  11. 该条件为 false。

  12. 从结点发出的转移 3 被标记为待计算。

  13. 从结点发出的转移 3 没有条件。

  14. 目标不是一个状态,没有任何出向转移。

  15. 返回 Stateflow 图执行的工作流

要完成该时间步,请从您之前离开的地方开始,对 StateA 按照Stateflow 图执行的工作流进行操作。

计算带条件动作和转移动作的外部转移

此示例同时包含条件动作和转移动作:

  • 在转移标签语法中,条件动作接在转移条件后,并括在花括号 ({}) 中。只要条件计算结果为 true,条件动作即开始执行,无论转移至目标的路径是否有效。

  • 在转移标签语法中,转移动作以正斜杠 (/) 开头,并括在花括号 ({}) 中。仅在转移路径确定为有效后,转移动作才会执行。

Stateflow 图经过初始化并执行了 StateAentry 动作。在一个新时间步,图被唤醒。存在从 StateA 的多个外部转移路径。在此时间步,x = 1y = 1z = 1

Stateflow chart with states called StateA, StateC, StateD, and StateE.

按照计算转移的工作流,计算图中转移的步骤顺序如下:

  1. StateA 发出的转移 1 被标记为待计算。

  2. StateA 发出的转移 1 有一个条件 ([y >= 1])。

  3. 该条件为 true。

  4. 没有条件动作。

  5. StateA 发出的转移 1 的目标不是一个状态。

  6. 结点确实有出向转移。

  7. 从结点发出的转移 1 被标记为待计算。

  8. 从结点发出的转移 1 有一个条件 ([x > 2])。

  9. 该条件为 false。

  10. 从结点发出的转移 2 被标记为待计算。

  11. 从结点发出的转移 2 有一个条件 ([x >= 1])。

  12. 该条件为 true。

  13. 有条件动作 ({y = 0;})。现在 y = 0

  14. 结点确实有出向转移。

  15. 从结点发出的转移被标记为待计算。

  16. 从结点发出的转移 1 有一个条件 ([z >= 5])。

  17. 该条件为 false。

  18. StateA 发出的转移 2 被标记为待计算。

  19. StateA 发出的转移 2 没有条件。

  20. StateA 发出的转移 2 的目标是一个状态 (StateD)。

  21. StateD 被标记为 entryStateA 被标记为 exit。对此有效路径执行转移动作 (/{z = 5})。现在 z = 5

要完成该时间步,请对 StateA 执行退出状态的工作流,对 StateE 执行进入图或状态的工作流

相关主题