必威体育Betway必威体育官网
当前位置:首页 > IT技术

Stateflow学习笔记之状态图的内部转移(inner transition)

时间:2019-10-02 20:44:31来源:IT技术作者:seo实验室小编阅读:82次「手机版」
 

stateflow

 

处理内部转移的事件

考虑下图所示的状态图。

状态A有一个内部转移。转移动作为A_two。

状态B有一个指向自身的外部转移(自循环转移self loop transition)。注意,这个不是内部转移!后面将会看到差别。

初始化完成后,状态A为活动状态。然后状态图进入休眠。

发生事件时,不转移到外部状态

假设条件C_one为FALSE。

当事件E_one发生时,状态图被激活,该事件的处理步骤如下:

  1. 图表根目录检查是否存在事件E_one的有效的转换。检测到从状态A到状态B的潜在有效转换。但是,转换无效,因为条件[C_one]为假
  2. 执行状态A的during动作:durA()
  3. 状态A检查其子状态是否存在有效转移,并检测有效的内部转移
  4. 状态A仍然保持为活动状态。执行内部转移的转移动作A_two因为它是内部转移,所以不执行状态A的退出和进入动作
  5. 图表又回到睡眠状态。

发生事件,转移到外部状态

还是上面那张图。假设初始化已经完成,状态A为活动状态。

但这一次,假设条件C_one为TRUE。

当事件E_one发生时,状态图被激活,该事件的处理步骤如下:

  1. 图表根目录检查是否存在事件E_one的有效转移

    从状态A到状态B的转移现在是有效的,因为条件[C_one]为真

  2. 执行状态A的退出动作:exitA()。

  3. 状态A标记为无效。

  4. 执行转移动作:A_one

  5. 状态B标记为活动。

  6. 执行状态B的进入动作:entB()

  7. 图表又回到睡眠状态。

自循环外部转移

还是这张图。不过,起始条件不一样。假设已经进入了状态B。条件C_two为FALSE。

当事件E_two发生时,状态表被唤醒,该图表从根向下的层次结构来处理事件:

  1. 图表根目录检查是否存在事件E_two的有效的转移。

    检测到从状态B到状态A的潜在有效转移。但转换无效,因为条件[C_two]为假。但是,活动状态B具有有效的自循环转移。

  2. 执行状态B退出动作(exitB())并完成。

  3. 状态B标记为无效。

  4. 执行自循环转移操作A_four,并完成。

  5. 状态B标记为活动。

  6. 执行状态B的进入动作(entB())并完成。

  7. 图表又回到了睡眠状态。

此序列完成了与事件E_two关联的Stateflow图表的执行。此示例显示内部转移和自循环转移之间的行为差​​异

处理事件:包含指向节点的内部转移

考虑以下状态图。父状态A包括3个子状态:A1,A2和A3。其中A1为默认状态。

同时,状态A还有一个内部转移,该内部转移先指向一个结点,再根据条件转移到子状态。

 

切换子状态的内部转移

假设初始化已经完成,A1为活动状态。条件C_two为TRUE

事件E_one发生并唤醒图表,该图表从根向下的层次结构来处理事件:

  1. 图表检查根级别是否存在事件E_one的有效转移。没有有效的转移。
  2. 执行状态A的during动作:durA()。
  3. 状态A检查自身是否存在有效转移。检测到有效的内部转移,该转移的目标对象是连接点。

    评估条件以确定其中一个转换是否有效。因为条件[C_two]为真,经过连接点再到状态A.A2的内部转移是有效的

  4. 执行状态A.A1的退出动作:exitA1()

  5. 状态A.A1被标记为无效。

  6. 状态A.A2标记为活动。

  7. 执行状态A.A2的进入动作:entA2()

  8. 图表又回到睡眠状态。

不切换子状态的内部转移

现在,活动状态是A2。条件C_two仍然为TRUE

事件E_one发生并唤醒图表,该图表从根向下的层次结构来处理事件:

  1. 状态图检查根级别是否存在事件E_one的有效转移。没有有效的转移。

  2. 执行状态A的during动作:durA()。

  3. 状态A检查自身的有效转移,并检测到指向连接点的有效内部转移。

    评估条件以确定其中一个转移是否有效。因为条件[C_two]是真,经过结点然后到状态A.A2的内部转移是有效的。

  4. 执行状态A.A2的退出动作:exitA2()

  5. 状态A.A2被标记为无效。

  6. 状态A.A2标记为活动。

  7. 执行状态A.A2的进入动作:entA2()

  8. 图表又回到睡眠状态。

可以看出,对于具有有效内部转移的状态,活动子状态可以先退出并立即重新进入。

指向历史结点的内部转移

考虑以下状态图。父状态A包含2个子状态A1和A2,并且还包含一个历史状态结点。当事件E_one发生时,状态A发生内部转移到该历史状态结点。

初始化完成后,状态A.A1为活动状态。当事件E_one发生时,唤醒状态图,该图从根向下的层次结构来处理事件:

  1. 状态图检查根级别是否存在事件E_one的有效的转移。没有有效的转移。

  2. 执行状态A的during动作:durA()

  3. 状态A检查自身是否存在有效转移,并检测到有效的指向历史结点的内部转移。根据历史信息,最后一个活动状态A.A1是目标状态。

  4. 执行状态A.A1的退出动作exitA1()并完成。

  5. 状态A.A1标记为无效。

  6. 状态A.A1标记为活动。

  7. 执行状态A.A1的进入动作entA1()并完成。

  8. 图表又回到了睡眠状态。

同样地,对于具有有效内部转移的状态,活动子状态可以先退出并立即重新输入。


参考资料

Process Events Using Inner Transitions

https://ww2.mathworks.cn/help/stateflow/ug/inner-transition-examples.html

相关阅读

机器学习 - 无监督学习-多元高斯模型

(一)异常检测---基于高斯(正态)分布 m个训练样本,每个样本有n个features 即m个样本的每个属性集都呈现高斯分布,因此有以下计算: 例

学习笔记--霍夫曼树与霍夫曼编码解码

先摘一下百科的说法“哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种编码方式,哈夫曼编码是可变字长编码(VLC)的一种。Huffman于

Oracle DBA学习基础篇(一) Oracle体系结构 学习笔记

这里是我通过Oracle DBA实战这本书学习的 Oracle体系结构,大部分是我对书中的内容做的总结,还有遇到不理解的知识点,通过查询资料做

机器学习-代价函数

注:代价函数(有的地方也叫损失函数,Loss Function)在机器学习中的每一种算法中都很重要,因为训练模型的过程就是优化代价函数的过程,代

Android Firebase 学习与实践

本篇文章主要记录Firebase在Android上的学习实践,对Firebase进行实践与测试其在中国的使用情况、GCM迁移到FCM、及Firebase与Googl

分享到:

栏目导航

推荐阅读

热门阅读