在具有并行状态分解的Stateflow®图表中,子状态可以同时处于活动状态。如果检查状态活动,则可以在两个平行状态下同步子状态。
例如,此图表有两个平行的状态:Place和Tracker。Tracker中的转换会在适当的位置检查状态活动,并保持子状态同步。原地活动子状态的更改会导致跟踪器中活动子状态相应的更改。
如果R变为“ in Place”中的活动子状态,则Moved_Right变为“in Tracker”中的激活子状态。
如果“L”成为“ in Place”中的活动子状态,则Moved_Left将成为“in Tracker”的激活子状态。
in运算符
要在图表执行过程中检查某个状态在给定的时间步长内是否处于活动状态,请使用in运算符:
in(S)
in运算符采用限定的状态名S并返回布尔输出。如果状态S处于活动状态,in将返回值1。否则,中返回的值为0。
可以在状态操作和源自状态的转换中使用in运算符。
活动状态解析
检查状态活动是一个由两部分组成的过程。首先,Stateflow通过在图表层次结构中执行匹配状态的本地化搜索来解析限定状态名。然后,Stateflow确定匹配的状态是否处于活动状态。
搜索从出现合格状态名称的层次结构级别开始:
对于状态操作,起点是包含该操作的状态。
对于转换标签,起点是转换源的父级。
解析过程在图表层次结构的每个级别上搜索状态的路径。如果某个状态与路径匹配,则该过程会将该状态添加到可能匹配的列表中。然后,该过程继续搜索层次结构中更高一级的内容。解析过程在搜索层次结构的图表级别后停止。如果存在唯一匹配,in运算符将检查匹配状态是否处于活动状态。否则,解析过程将失败。模拟停止,您会看到一条错误消息。
检查状态活动的最佳实践
正在解析状态活动:
不会对图表中的所有状态执行详尽的搜索。
找到第一个匹配项后不会停止。
要提高在解析合格数据名称时找到唯一搜索结果的几率,请执行以下操作:
在限定的数据名称中使用特定路径。
为各状态提供唯一的名称。
使用状态和框作为外壳来限制路径分辨率搜索的范围。
状态活动解析示例
搜索查找Substate的本地副本
该图表包含具有相同子状态A1和A2的平行状态A和B。(A1.Y)中的条件监视了A.A2和B.A2中从P到Q的转换。Stateflow将每个限定的状态名称解析为子状态Y的本地副本:
在状态A中,in(A1.Y)检查状态A.A1.Y的活动。
在状态B中,in(A1.Y)检查状态B.A1.Y的活动。
此表列出了状态A.A2中转换条件的解析过程中的不同阶段。
阶段 | 描述 | 结果 |
---|---|---|
1 | 从状态A.A2开始,搜索状态A.A2.A1.Y。 | 找不到匹配项 |
2 | 向上移动到层次结构的下一个级别(状态A)。搜索状态A.A1.Y | 找到匹配项。 |
3 | 向上移动到层次结构的下一个级别(图表级别)。搜索状态A1.Y | 找不到匹配项 |
搜索以找到一个匹配项结束。因为解析算法将搜索范围定位,所以监视A.A2中的转换的内部运算符只检测到状态A.A1.Y。监视B.A2中的过渡的内部运算符仅检测到状态B.A1.Y。
要检查Y的另一个副本的状态活动,请使用更具体的限定状态名称:
在状态 A中, 使用表达式 in(B.A1.Y).
在状态 B中, 使用表达式 in(A.A1.Y).
搜索产生未匹配项
在此图表中,状态A.B中的动作过程包含(Q.R)中的表达式。Stateflow无法解析合法的状态名称Q.R。
此表列出了解析过程中的不同阶段。
阶段 | 描述 | 结果 |
---|---|---|
1 | 从状态A.B开始,搜索状态A.B.Q.R。 | 没有匹配项 |
2 | 向上移动到层次结构的下一个级别(状态A)。搜索状态A.Q.R。 | 没有匹配项 |
3 | 向上移动到层次结构的下一个级别(chart级别)。搜索状态Q.R。 | 找到匹配项 |
搜索在图表级别结束,没有找到与Q.R匹配的项,从而导致错误。
若要避免此错误,请使用更具体的合法状态名。例如,使用(P.Q.R)中的表达式检查状态活动。
搜索产生多个匹配项
在此图表中,状态A.B中的动作过程包含(P.Q.R)中的表达式。Stateflow无法解析合法的状态名称P.Q.R。
此表列出了解析过程中的不同阶段。
阶段 | 描述 | 结果 |
---|---|---|
1 | 从状态A.B开始,搜索状态A.B.P.Q.R。 | 找到匹配项 |
2 | 向上移动到层次结构的下一个级别(状态A)。搜索州A.P.Q.R。 | 没有找到匹配项 |
3 | 向上移动到层次结构的下一个级别(图表级别)。搜索状态P.Q.R。 | 找到匹配项 |
搜索在图表级别结束,找到两个与P.Q.R匹配的项,从而导致错误。
要避免此错误,请执行以下操作:
请使用更具体的合法状态名称。例如:
要检查B内部的子状态活动,请使用(B.P.Q.R)中的表达式。
要检查处于顶级状态P的子状态活动,请使用(\P.Q.R)中的表达式。
重命名其中一个匹配的状态。
将顶级状态P封装在一个框或其他状态中。添加enclosure 可防止搜索进程检测到处于顶级状态的子状态。