概述
处理内部转移的事件
考虑下图所示的状态图。
状态A有一个内部转移。转移动作为A_two。
状态B有一个指向自身的外部转移(自循环转移self loop transition)。注意,这个不是内部转移!后面将会看到差别。
初始化完成后,状态A为活动状态。然后状态图进入休眠。
发生事件时,不转移到外部状态
假设条件C_one为FALSE。
当事件E_one发生时,状态图被激活,该事件的处理步骤如下:
- 图表根目录检查是否存在事件E_one的有效的转换。检测到从状态
A
到状态B的潜在有效转换。但是,转换无效,因为条件[C_one]为假
。 - 执行状态A的during动作:durA()。
- 状态
A
检查其子状态是否存在有效转移,并检测有效的内部转移。 - 状态
A
仍然保持为活动状态。执行内部转移的转移动作A_two
。因为它是内部转移,所以不执行状态A的退出和进入动作。 - 图表又回到睡眠状态。
发生事件,转移到外部状态
还是上面那张图。假设初始化已经完成,状态A为活动状态。
但这一次,假设条件C_one为TRUE。
当事件E_one发生时,状态图被激活,该事件的处理步骤如下:
-
图表根目录检查是否存在事件
E_one的有效转移
。从状态
A
到状态B的转移现在是有效的,因为条件[C_one]为真
。 -
执行状态
A的
退出动作:exitA()。 -
状态
A
标记为无效。 -
执行转移动作:A_one
。 -
状态B
标记为活动。 -
执行状态
B的进入
动作:entB()
。 -
图表又回到睡眠状态。
自循环外部转移
还是这张图。不过,起始条件不一样。假设已经进入了状态B。条件C_two为FALSE。
当事件E_two发生时,状态表被唤醒,该图表从根向下的层次结构来处理事件:
-
图表根目录检查是否存在事件E_two的有效的转移。
检测到从状态
B
到状态A的潜在有效转移。但转换无效,因为条件[C_two]为
假。但是,活动状态B
具有有效的自循环转移。 -
执行状态
B
退出动作(exitB()
)并完成。 -
状态
B
标记为无效。 -
执行自循环转移操作
A_four
,并完成。 -
状态B
标记为活动。 -
执行状态
B的进入
动作(entB()
)并完成。 -
图表又回到了睡眠状态。
此序列完成了与事件E_two关联的Stateflow图表的执行。此示例显示内部转移和自循环转移之间的行为差异。
处理事件:包含指向节点的内部转移
考虑以下状态图。父状态A包括3个子状态:A1,A2和A3。其中A1为默认状态。
同时,状态A还有一个内部转移,该内部转移先指向一个结点,再根据条件转移到子状态。
切换子状态的内部转移
假设初始化已经完成,A1为活动状态。条件C_two为TRUE。
事件E_one
发生并唤醒图表,该图表从根向下的层次结构来处理事件:
- 图表检查根级别是否存在事件E_one的有效转移。没有有效的转移。
- 执行状态A的during动作:durA()。
-
状态
A
检查自身是否存在有效转移。检测到有效的内部转移,该转移的目标对象是连接点。评估条件以确定其中一个转换是否有效。因为条件
[C_two]为
真,经过连接点再到状态A.
A2的内部转移是有效的
。 -
执行状态
A.
A1的退出动作:
exitA1()
。 -
状态
A.
A1
被标记为无效。 -
状态A.
A2
标记为活动。 -
执行状态
A.
A2的进入动作:
entA2()
。 -
图表又回到睡眠状态。
不切换子状态的内部转移
现在,活动状态是A2。条件C_two仍然为TRUE。
事件E_one
发生并唤醒图表,该图表从根向下的层次结构来处理事件:
-
状态图检查根级别是否存在事件E_one的有效转移。没有有效的转移。
-
执行状态A的during动作:durA()。
-
状态
A
检查自身的有效转移,并检测到指向连接点的有效内部转移。评估条件以确定其中一个转移是否有效。因为条件
[C_two]
是真,经过结点然后到状态A.A2的内部转移是有效的。 -
执行状态
A.
A2的退出动作:
exitA2()
。 -
状态
A.
A2
被标记为无效。 -
状态
A.
A2
标记为活动。 -
执行状态
A.
A2的进入动作:
entA2()
。 -
图表又回到睡眠状态。
可以看出,对于具有有效内部转移的状态,活动子状态可以先退出并立即重新进入。
指向历史结点的内部转移
考虑以下状态图。父状态A包含2个子状态A1和A2,并且还包含一个历史状态结点。当事件E_one发生时,状态A发生内部转移到该历史状态结点。
初始化完成后,状态A.A1为活动状态。当事件E_one发生时,唤醒状态图,该图从根向下的层次结构来处理事件:
-
状态图检查根级别是否存在事件E_one的有效的转移。没有有效的转移。
-
执行状态
A的during动作:durA()
。 -
状态
A
检查自身是否存在有效转移,并检测到有效的指向历史结点的内部转移。根据历史信息,最后一个活动状态A.A1
是目标状态。 -
执行状态
A.A1的
退出动作exitA1()并完成。 -
状态
A.A1
标记为无效。 -
状态A.A1
标记为活动。 -
执行状态
A.A1的
进入动作entA1()并完成。 -
图表又回到了睡眠状态。
同样地,对于具有有效内部转移的状态,活动子状态可以先退出并立即重新输入。
参考资料
Process Events Using Inner Transitions
https://ww2.mathworks.cn/help/stateflow/ug/inner-transition-examples.html
最后
以上就是成就铅笔为你收集整理的Stateflow学习笔记之状态图的内部转移(inner transition) 处理内部转移的事件处理事件:包含指向节点的内部转移指向历史结点的内部转移参考资料的全部内容,希望文章能够帮你解决Stateflow学习笔记之状态图的内部转移(inner transition) 处理内部转移的事件处理事件:包含指向节点的内部转移指向历史结点的内部转移参考资料所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复