Main Content

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

计算转移

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

计算转移的工作流

Flow chart that shows the steps for evaluating a transition.

转移的计算顺序

如果有多个转移源于单一来源(例如某状态或结点),Stateflow 将使用计算顺序来确定何时测试每个转移。转移源附近的数字是转移顺序。

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

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

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

结束于父状态内部边缘的转移是返回默认转移路径的快捷方式,默认路径是在当前时间步内计算的。在此示例中,从状态 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 执行进入图或状态的工作流

相关主题