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

 

处理内部转移的事件

 

考虑下图所示的状态图。

状态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

 

 

  • 16
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: 在Stateflow中调用function函数,可以使用Stateflow中的Function-Call Action来实现。具体步骤如下: 1. 在Stateflow中创建一个State或者Subchart。 2. 在State或者Subchart中添加一个Function-Call Action。 3. 在Function-Call Action中选择要调用的function函数。 4. 在Function-Call Action中设置输入参数和输出参数。 5. 在Stateflow中添加一个Transition,将State或者Subchart与下一个State或者Subchart连接起来。 6. 在Transition中设置Transition Action,将Function-Call Action放入Transition Action中。 7. 运行Stateflow模型,当State或者Subchart进入Transition时,Function-Call Action会自动调用function函数,并将输入参数传递给function函数,同时将输出参数传递给Transition Action。 注意:在Stateflow中调用function函数时,需要确保function函数已经被定义并且可用。同时,需要注意输入参数和输出参数的类型和数量要与function函数的定义相匹配。 ### 回答2: Stateflow是一种建模工具,它可以模拟系统的状态转移和事件响应。在Stateflow中,可以使用多种方法来实现功能。其中一个方法是使用Function函数,可以将一段具有独立功能的代码封装成一个函数,让Stateflow中的状态图调用。 使用Stateflow调用Function函数的步骤如下: 首先,在Stateflow中创建一个function函数。可以在模型中右键单击选择「Add Function」,或者在Stateflow Editor的Function库中选择要使用的函数: 其次,在要使用该函数的状态中,使用「Action」和「Function」组合框。 最后,在「Function」组合框中选择之前创建的function函数,将其添加到状态行为中即可。 在Stateflow中调用Function函数的好处是实现了代码复用,可以避免代码的重复编写和错误。此外,这种方法与其他方法相比,代码更易读、更易维护,也让代码更具有可移植性。 需要注意的是,在Stateflow中调用Function函数时,函数的返回值类型和参数类型应该与调用函数的状态或过渡的输入/输出相匹配。 总之,使用Stateflow调用Function函数是一个非常实用和高效的方法,在设计复杂系统模型时可以减少工作量,提高效率和可维护性。 ### 回答3: 在使用Stateflow时,可以使用Function函数对模型中的代码进行封装和重用。通过使用Function函数,我们可以将多个StateTransition中共同执行的代码放在一个Function中,并且让这些StateTransition直接调用Function。这样可以减少模型的复杂性,提高代码的可读性和可维护性。 在Stateflow中,可以使用以下步骤进行Function函数的调用: 1. 创建Function:在模型文件中,使用Function图标创建一个Function并编写需要执行的代码。 2. 在需要调用Function的StateTransition中添加Function Caller:通过将Function Caller组件拖放到需要调用Function的StateTransition中,从而将Function与StateTransition关联起来。 3. 配置Function Caller:在Function Caller的参数配置界面中,选择需要调用的Function。在这里,可以将输入参数、输出参数以及调用时机等信息进行配置。 4. 在StateTransition的Action中调用Function Caller:在StateTransition的Action中,使用Function Caller的名称调用Function。在执行Action时,Function Caller将自动调用Function并传递输入参数。调用完成后,如果Function有输出参数,则可以使用Function Caller中对应的输出变量进行访问。 总的来说,使用Stateflow调用Function函数不仅可以提高模型的效率和可读性,还可以减少代码重复。但是,在使用Function函数时,需要注意变量名、类型和作用域等问题,以确保程序的正确性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值