使用连接结点表示多条路径

转换段的标签格式

进入交叉口的转换段的标签格式与进入状态的转换段相同,如下例所示。该图表使用传出转换的隐式排序。

在这里插入图片描述
本例中的转换执行如下:
1 当事件发生时,检查状态S1是否有指定匹配事件的传出转换。
2 如果找到具有匹配事件的转换,则评估该转换的转换条件(在括号中)。
3 如果condition_1的计算结果为true,则执行条件操作condition_action(在大括号中)。
4 检查交叉口的输出转换是否有效。由于condition_2为真,因此存在从S1到S2的有效状态到状态的转换。
5 状态S1退出操作执行并完成。
6 状态S1被标记为非活动状态。
7 转换操作transition_action执行并完成。
8 完成从S1到S2的状态到状态的转换。
9 状态S2被标记为活动。
10 状态S2 entry actions执行并完成。

If Then Else决策构造

此示例显示了if-then-else决策构造的行为。该图表使用传出转换的隐式排序。
在这里插入图片描述
最初,图表处于休眠状态。状态A处于活动状态。条件[C_two]为真。事件E_one发生并唤醒图表,图表从根向下通过层次结构处理事件:
1 图表根会检查E_one是否有有效的转换。
存在从状态A到连接点的有效转换段。由于隐式排序适用,因此对从连接点上12点钟位置开始的转换段进行有效性评估。标有条件[C_one]的第一个转换段无效。标记为条件[C_two]的下一个转换段是有效的。从状态A到状态C的完全转换是有效的。
2 状态A退出操作(exitA())执行并完成。
3状态A被标记为非活动状态。
4 状态C被标记为活动状态。
5 状态C条目操作(entC())执行并完成。
6 图表再次进入睡眠状态。
此序列完成了与事件E_one关联的Stateflow®图表的执行。

自循环转换

此示例显示了使用连接结点的自循环转换的行为。该图表使用传出转换的隐式排序。
在这里插入图片描述
最初,图表处于休眠状态。状态A处于活动状态。条件[C_one]为假。事件E_one发生并唤醒图表,图表从根向下通过层次结构处理事件:
1.图表根会检查E_one是否有有效的转换。存在从状态A到连接点的有效转换段。由于隐式排序适用,因此对标记有条件的转换段进行有效性评估。因为条件[C_one]无效,所以从状态A到状态B的完全转换无效。从连接点到状态A的转换段是有效的。
2 状态A exit actions 执行并完成。
3 状态A被标记为非活动状态。
4 转换动作A_two执行并完成。
5 状态A被标记为活动状态。
6 状态A条目操作(entA())执行并完成。
7 图表再次进入睡眠状态。
此序列完成了与事件E_one关联的此状态流程图的执行。

用于循环构建

此示例显示了使用连接点的for循环的行为。该图表使用传出转换的隐式排序。

在这里插入图片描述
最初,图表处于休眠状态。状态A处于活动状态。事件E_one发生并唤醒图表,图表从根向下通过层次结构处理事件:
1 图表根会检查E_one是否有有效的转换。从状态A到连接点有一个有效的转换段。转换段条件动作i=0执行并完成。在离开连接点的两个转换段中,作为返回连接点的自循环的转换段接下来评估有效性。该片段在评估中具有优先权,因为它有一个条件,而另一个片段没有标记。这种评估行为反映了图表中传出转换的隐式排序。
2 条件[i<10]的计算结果为真。条件动作i++和对func1的调用执行并完成,直到条件变为false。因为连接点不是最终目的地,所以转换目的地仍然未知。
3 状态B的无条件段现在有效。从状态A到状态B的完全转换是有效的。
4 状态A退出动作(exitA()) 执行并完成。
5 状态A被标记为非活动状态。
6 状态B被标记为活动状态。
7状态B 进入动作(entB())执行并完成。
8 图表再次进入睡眠状态。
此序列完成了与事件E_one关联的此图表的执行。

流程图符号

此示例显示了使用流程图符号的状态流图的行为。该图表使用传出转换的隐式排序。

在这里插入图片描述
最初,图表处于休眠状态。状态A.A1处于活动状态。条件[C_one()]最初为真。事件E_one发生并唤醒图表,图表从根向下通过层次结构处理事件:
1 图表根会检查E_one是否有有效的转换。没有有效的转换。
2 状态A检查自身是否存在有效的转换,并检测到连接点的有效内部转换。
3 对转换的下一个可能部分进行评估。只存在一个传出转换,并且它定义了一个条件操作。条件操作执行并完成。
4 对下一个可能的分段进行评估。存在两个输出转换:条件自循环转换和无条件转换段。因为隐式排序适用,所以条件转换段优先。由于条件[C_one()]为真,因此进行自循环转换。由于尚未到达最终的转换目标,此自循环将继续,直到[C_one()]为false。
假设经过五次迭代后,[C_one()]为false。
5 评估下一个可能的转换段(到下一个连接点)。它是一个具有条件动作的无条件转换段。转换段被执行,条件动作{d=my_func()}执行并完成。d的返回值是84。
6 评估下一个可能的转换段。存在三个传出的转换段:两个有条件的和一个无条件的。因为隐式排序适用,所以标记有条件[d<100]的段首先根据两个输出条件转换段的几何形状进行计算。因为d的返回值是84,所以条件[d<100]为真,并且向目标状态A.A1的转换是有效的。
7 状态A.A1退出动作(exitA1())执行并完成。
8 状态A.A1被标记为非活动状态。
9 状态A.A1标记为激活。
10 状态A.A1进入动作(entA1())执行并完成。
11 图表再次进入睡眠状态。
此序列完成了与事件E_one关联的此状态流程图的执行。

同源到多个目的地的转换

此示例显示了使用连接连接从公共源转换到多个条件目标的行为。该图表使用传出转换的隐式排序。
在这里插入图片描述
最初,图表处于休眠状态。状态A处于活动状态。事件E_two发生并唤醒图表,图表从根向下通过层次结构处理事件:
1 图表根检查E_two是否有有效的转换。从状态A到连接点存在有效的转换段。由于隐式排序适用,因此具有等效标签优先级的段的评估从连接点上的12点钟位置开始,顺时针进行。标记为事件E_one的第一个转换段无效。标记为事件E_two的下一个转换段是有效的。从状态A到状态C的完全转换是有效的。
2 状态A退出操作(exitA())执行并完成。
3 状态A被标记为非活动状态。
4 状态C被标记为活动状态。
5 状态C进入操作(entC())执行并完成。
6 图表再次进入睡眠状态。
此序列完成了与事件E_two关联的此状态流程图的执行。

解决同等有效的转换路径

什么是冲突转换?

冲突转换是模拟过程中状态流图中来自同一源的两条同样有效的路径。在发生冲突的情况下,Stateflow软件会根据图表中的排序模式(显式或隐式)评估同样有效的转换。
对于显式排序(默认模式),冲突转换的评估将根据您为每个转换指定的顺序进行。
对于C图表中的隐式排序,冲突转换的评估是基于隐式排序中描述的内部规则进行的。

冲突转换示例

下图有两条同样有效的转换路径:
在这里插入图片描述

隐式排序的冲突解决

对于隐式排序,图表从状态上的十二点钟位置开始,以顺时针顺序评估具有相等标签优先级的多个传出转换。在这种情况下,发生从状态A到状态B的转换。

显式排序的冲突解决

对于显式排序,图表通过按照您显式指定的顺序评估传出转换来解决冲突。例如,如果右键单击从状态A到状态C的转换,并从上下文菜单中选择“执行顺序>1”,图表将首先评估该转换。在这种情况下,发生从状态A到状态C的转变。

转换冲突是如何发生的

默认转换到状态A时,数据A等于1,数据b等于10。状态A的动作过程在每个时间步长内递增A并递减b。如果条件[A>4]为真,则从状态A到状态B的转换是有效的。如果条件[b<7]为真,则从状态A到状态C的转换是有效的。在模拟过程中,有一个时间步长,状态a处于活动状态,两个条件都为真。这个问题是一个转换冲突。

从多个源到共同目的地的转换

此示例显示了使用连接连接从多个源转换到单个目标的行为。
在这里插入图片描述
最初,图表处于休眠状态。状态A处于活动状态。事件E_one发生并唤醒图表,图表从根向下通过层次结构处理事件:
1 图表根会检查E_one是否有有效的转换。从状态A到连接点以及从连接点到状态C存在有效的转换段。
2 状态A退出操作(exitA())执行并完成。
3 状态A被标记为非活动状态。
4 状态C被标记为活动状态。
5 状态C进入操作(entC())执行并完成。
6 图表再次进入睡眠状态。
此序列完成了与事件E_one关联的此状态流程图的执行。

基于共同事件从源到目的地的转换

此示例显示了使用连接连接基于同一事件从多个源转换到单个目标的行为。

在这里插入图片描述
最初,图表处于休眠状态。状态B处于活动状态。事件E_one发生并唤醒图表,图表从根向下通过层次结构处理事件:
1 图表根会检查E_one是否有有效的转换。从状态B到连接点以及从连接点到状态C存在有效的转换段。
2 状态B退出操作(exitB())执行并完成。
3 状态B被标记为非活动状态。
4 状态C被标记为活动状态。
5 状态C进入操作(entC())执行并完成。
6 图表再次进入睡眠状态。
此序列完成了与事件E_one关联的此状态流程图的执行。

流程图中的回溯

此示例显示了流程图中强制回溯行为的连接转换行为。该图表使用传出转换的隐式排序。

在这里插入图片描述
最初,状态A处于活动状态,条件c1、c2和c3为真:
1 图表根检查是否存在从状态A的有效转换。
有一个有效的转换段,标记为从状态a到连接点的条件c1。
2 条件c1为真,动作a1执行。
3 条件c3为真,动作a3执行。
4 条件c4不成立,控制流回溯到状态A。
图表根检查是否存在从状态A的另一个有效转换。
5有一个有效的转换段,标记为从状态A到连接点的条件c2。
6条件c2为真,动作a2执行。
7 条件c3为真,动作a3执行。
8 条件c4不成立,控制流回溯到状态A。
9 图表进入休眠状态。

前面的例子显示了执行动作a1和a2的意外行为。另一个意外行为是两次执行动作a3。为了解决这个问题,可以考虑在终端连接处添加无条件转换。

在这里插入图片描述如果c3或c4不为真,则终止结点允许流结束。此设计使状态A处于活动状态,而不执行不必要的操作。

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值