计算转移
Stateflow® 使用图中的转移从一个互斥 (OR) 状态转移到另一个互斥 (OR) 状态。对于图执行的 entry
和 execution
工作流,Stateflow 会计算转移以确定它们是否有效。有效转移是其条件标签为 true 且其路径以某状态结束的转移。如果转移有效,Stateflow 将从源状态退出并进入目标状态。要了解在 execution
和 entry
工作流期间何时进行计算,请参阅Stateflow 图的执行和进入图或状态。
计算转移的工作流
转移的计算顺序
如果有多个转移源于单一来源(例如某状态或结点),Stateflow 将使用计算顺序来确定何时测试每个转移。转移源附近的数字是转移顺序。
源的出向转移将按照您创建它们的顺序自动编号。顺序编号从 1
开始,之后使用该源的下一个可用编号。
要更改某个转移的执行顺序,请右键点击该转移,点击执行顺序,然后选择希望该转移执行的顺序。当您更改转移编号时,Stateflow 图会通过保留其他出向转移的相对顺序,自动对这些出向转移重新编号。
指向父状态内部边缘的转移
结束于父状态内部边缘的转移是返回默认转移路径的快捷方式,默认路径是在当前时间步内计算的。在此示例中,从状态 B
发出的转移会立即引发通向状态 A
的默认转移。
如果存在默认转移,则 Stateflow 会立即执行这些路径。如果不存在默认转移,也不存在子级,则为时间步的结束。在这两种情况下,父级都保持激活状态,并且不执行父级的 exit 和 entry 动作。
计算外部转移
在此示例中,Stateflow 图经过初始化并执行了 StateA
的 entry
动作。在一个新时间步,图被唤醒。按照 Stateflow 图执行的工作流,Stateflow 找到从 StateA
的多个外部转移路径。在此时间步,x = 1
、y = 1
且 z = 1
。
按照计算转移的工作流,计算图中转移的步骤顺序如下:
从
StateA
发出的转移 1 被标记为待计算。从
StateA
发出的转移 1 有一个条件。该条件为 true。
从
StateA
发出的转移 1 的目标不是一个状态。结点确实有出向转移。
从结点发出的转移 1 被标记为待计算。
从结点发出的转移 1 有一个条件。
该条件为 false。
从结点发出的转移 2 被标记为待计算。
从结点发出的转移 2 没有条件。
从结点发出的转移 2 的目标是一个状态 (
StateD
)。StateD
被标记为entry
,StateA
被标记为exit
。
要完成该时间步,请对 StateA
执行退出状态的工作流,对 StateE
执行进入图或状态的工作流。
计算带回溯的外部转移
如果从源的所有出向转移都无效或未以终止结点结束,但之前还有未计算的转移,则 Stateflow 会返回到之前的状态或结点以计算所有可能的路径。
在此示例中,Stateflow 图经过初始化并执行了 StateA
的 entry
动作。在一个新时间步,图被唤醒。按照 Stateflow 图执行的工作流,Stateflow 找到从 StateA
的多个外部转移路径。在此时间步,x = 1
、y = 1
且 z = 1
。
按照计算转移的工作流,计算图中转移的步骤顺序如下:
从
StateA
发出的转移 1 被标记为待计算。从
StateA
发出的转移 1 有一个条件。该条件为 true。
从
StateA
发出的转移 1 的目标不是一个状态。结点确实有出向转移。
从结点发出的转移 1 被标记为待计算。
从结点发出的转移 1 有一个条件。
该条件为 false。
从结点发出的转移 2 被标记为待计算。
从结点发出的转移 2 有一个条件。
该条件为 false。
从
StateA
发出的转移 2 被标记为待计算。从
StateA
发出的转移 2 没有条件。从
StateA
发出的转移 2 的目标是一个状态 (StateE
)。StateE
被标记为entry
,StateA
被标记为exit
。
要完成该时间步,请对 StateA
执行退出状态的工作流,对 StateE
执行进入图或状态的工作流。
防止回溯
在此示例中,终止结点防止回溯。Stateflow 图经过初始化并执行了 StateA
的 entry
动作。在一个新时间步,图被唤醒。按照 Stateflow 图执行的工作流,Stateflow 找到从 StateA
的多个外部转移路径。在此时间步,x = 1
、y = 1
且 z = 1
。
按照计算转移的工作流,计算图中转移的步骤顺序如下:
从
StateA
发出的转移 1 被标记为待计算。从
StateA
发出的转移 1 有一个条件。该条件为 true。
从
StateA
发出的转移 1 的目标不是一个状态。结点确实有出向转移。
从结点发出的转移 1 被标记为待计算。
从结点发出的转移 1 有一个条件。
该条件为 false。
从结点发出的转移 2 被标记为待计算。
从结点发出的转移 2 有一个条件。
该条件为 false。
从结点发出的转移 3 被标记为待计算。
从结点发出的转移 3 没有条件。
目标不是一个状态,没有任何出向转移。
要完成该时间步,请从您之前离开的地方开始,对 StateA
按照Stateflow 图执行的工作流进行操作。
计算带条件动作和转移动作的外部转移
此示例同时包含条件动作和转移动作:
在转移标签语法中,条件动作接在转移条件后,并括在花括号 (
{}
) 中。只要条件计算结果为 true,条件动作即开始执行,无论转移至目标的路径是否有效。在转移标签语法中,转移动作以正斜杠 (
/
) 开头,并括在花括号 ({}
) 中。仅在转移路径确定为有效后,转移动作才会执行。
Stateflow 图经过初始化并执行了 StateA
的 entry
动作。在一个新时间步,图被唤醒。存在从 StateA
的多个外部转移路径。在此时间步,x = 1
、y = 1
且 z = 1
。
按照计算转移的工作流,计算图中转移的步骤顺序如下:
从
StateA
发出的转移 1 被标记为待计算。从
StateA
发出的转移 1 有一个条件 ([y >= 1]
)。该条件为 true。
没有条件动作。
从
StateA
发出的转移 1 的目标不是一个状态。结点确实有出向转移。
从结点发出的转移 1 被标记为待计算。
从结点发出的转移 1 有一个条件 (
[x > 2]
)。该条件为 false。
从结点发出的转移 2 被标记为待计算。
从结点发出的转移 2 有一个条件 (
[x >= 1]
)。该条件为 true。
有条件动作 (
{y = 0;}
)。现在y = 0
。结点确实有出向转移。
从结点发出的转移被标记为待计算。
从结点发出的转移 1 有一个条件 (
[z >= 5]
)。该条件为 false。
从
StateA
发出的转移 2 被标记为待计算。从
StateA
发出的转移 2 没有条件。从
StateA
发出的转移 2 的目标是一个状态 (StateD
)。StateD
被标记为entry
,StateA
被标记为exit
。对此有效路径执行转移动作 (/{z = 5}
)。现在z = 5
。
要完成该时间步,请对 StateA
执行退出状态的工作流,对 StateE
执行进入图或状态的工作流。