in
演算子を使用したステート アクティビティのチェック
パラレル ステート構造をもつ Stateflow® チャートでは、サブステートを同時にアクティブにすることができます。複数のパラレル ステートの動作を調整するため、1 つのステートで別のステートのサブステート アクティビティを確認し、適宜反応させることができます。たとえば、一方のステートで、サブステートをもう一方のステートのサブステートと同期することができます。
in
演算子
ステートが特定のタイム ステップでアクティブであるか確認するには、ステートおよび遷移アクションで in
演算子を呼び出します。in
演算子は、修飾ステート名 state_name
を取り、boolean 出力を返します。ステート state_name
がアクティブな場合、in
は値 1 (true
) を返します。それ以外の場合、in
は値 0 (false
) を返します。
in(state_name)
たとえば、次のチャートでは、Fan
と Heater
はパラレル (AND) ステートです。各ステートにはサブステートのペア (On
と Off
) があります。ステート Fan
のアクティブなサブステートは 1 秒おきに Fan.Off
と Fan.On
の間で切り替わります。ステート Heater
では、遷移の条件により Fan
のサブステート アクティビティが確認され、ステートが同期されます。Fan
内のアクティブなサブステートを変更すると、Heater
内のアクティブなサブステートが対応して変化します。
ステート アクティビティの解決
ステート アクティビティのチェックは 2 段階のプロセスです。まず、Stateflow チャートは、チャート階層で一致するステートの局所的な検索を実行することにより、修飾ステート名を解決します。次に、チャートは、一致するステートがアクティブかどうかを判定します。
検索は、in
演算子が修飾ステート名で呼び出される階層レベルで開始されます。
ステート アクションの場合、開始点はアクションを含むステートです。
遷移ラベルの場合、開始点は遷移元の親です。
解決プロセスでは、チャート階層の各レベルで、ステートへのパスを検索します。パスと一致するステートがある場合は、そのステートが一致候補のリストに追加されます。その後、プロセスは階層の 1 つ上のレベルで検索を続けます。階層のチャート レベルの検索が終了すると、解決プロセスは停止します。一致が 1 つのみ存在する場合、チャートは、一致するステートがアクティブかどうかをチェックします。それ以外の場合、解決プロセスは失敗します。シミュレーションはエラーで停止します。
次のフロー チャートは、ステート アクティビティをチェックするプロセスのさまざまな段階を説明しています。
ステート アクティビティのチェックのベスト プラクティス
ステート アクティビティを解決する場合、Stateflow チャートはすべてのステートに対する網羅的探索は実行せず、また最初の一致が見つかった時点では停止しません。一意な検索結果が見つかる可能性を高くするには、次を行います。
修飾データ名で特定のパスを使用します。
ステートに一意の名前を付けます。
ステートやボックスを囲いとして使用して、パス解決の検索範囲を制限します。
ステート アクティビティ解決の例
検索でサブステートのローカル コピーが見つかる場合
次のチャートには、A
と B
の 2 つのパラレル ステートがあります。各ステートにはサブステートのペア (A1
と A2
) があります。A1
にはサブステート X
および Y
があり、A2
にはサブステート P
および Q
があります。A.A2
と B.A2
で、条件 in(A1.Y)
は P
から Q
への遷移をガードします。
チャートは各修飾ステート名をサブステート Y
のローカル コピーとして解決します。
ステート
A
では、条件in(A1.Y)
はステートA.A1.Y
のアクティビティをチェックします。ステート
B
では、条件in(A1.Y)
はステートB.A1.Y
のアクティビティをチェックします。
たとえば、次の表は、ステート A
内の遷移条件の解決プロセスにおけるさまざまな段階を示しています。
段階 | 説明 | 結果 |
---|---|---|
1 | チャートは、まずステート A.A2 で、ステート A.A2.A1.Y を検索します。 | 一致なし。 |
2 | チャートは階層の次のレベル (ステート A ) に移動し、ステート A.A1.Y を検索します。 | 一致あり。 |
3 | チャートは階層の次のレベル (チャート レベル) に移動し、ステート A1.Y を検索します。 | 一致なし。 |
単一の一致が検出されて、検索が終了します。解決アルゴリズムによって検索のスコープがローカライズされるため、A.A2
内の遷移をガードする in
演算子は、ステート A.A1.Y
のみを検出します。B.A2
内の遷移をガードする in
演算子は、ステート B.A1.Y
のみを検出します。
Y
のもう一方のコピーのステート アクティビティをチェックするには、より具体的な修飾ステート名を使用します。
ステート
A
では、式in(B.A1.Y)
を使用します。ステート
B
では、式in(A.A1.Y)
を使用します。
検索で一致が見つからない場合
以下のチャートでは、ステート A.B
の during
アクションに式 in(Q.R)
が含まれています。Stateflow は、修飾ステート名 Q.R
を解決できません。
次の表は、解決プロセスのさまざまな段階を示しています。
段階 | 説明 | 結果 |
---|---|---|
1 | チャートは、まずステート A.B で、ステート A.B.Q.R を検索します。 | 一致なし。 |
2 | チャートは階層の次のレベル (ステート A ) に移動し、ステート A.Q.R を検索します。 | 一致なし。 |
3 | チャートは階層の次のレベル (チャート レベル) に移動し、ステート Q.R を検索します。 | 一致なし。 |
Q.R
の一致が検出されずに、検索はチャート レベルで終了し、エラーになります。
このエラーを回避するには、より具体的な修飾ステート名を使用します。たとえば、式 in(P.Q.R)
を使用してステート アクティビティをチェックします。
検索で誤ったステートが検出される場合
以下のチャートでは、ステート A.B
の during
アクションに式 in(Q.R)
が含まれています。修飾ステート名 Q.R
を解決するとき、Stateflow は、サブステート A.B.P.Q.R
を検出できません。
次の表は、解決プロセスのさまざまな段階を示しています。
段階 | 説明 | 結果 |
---|---|---|
1 | チャートは、まずステート A.B で、ステート A.B.Q.R を検索します。 | 一致なし。 |
2 | チャートは階層の次のレベル (ステート A ) に移動し、ステート A.Q.R を検索します。 | 一致なし。 |
3 | チャートは階層の次のレベル (チャート レベル) に移動し、ステート Q.R を検索します。 | 一致あり。 |
単一の一致が検出されて、検索が終了します。in
演算子は、最上位ステート Q
のサブステート R
のみを検出します。
A.B.P.Q.R
のステート アクティビティをチェックするには、より具体的な修飾ステート名を使用します。たとえば、式 in(P.Q.R)
を使用します。
検索で複数の一致が見つかる場合
以下のチャートでは、ステート A.B
の during
アクションに式 in(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
の一致が 2 つ検出されて、検索はチャート レベルで終了し、エラーになります。
このエラーを回避するには、次を行います。
より具体的な修飾ステート名を使用します。たとえば、
B
内のサブステート アクティビティをチェックするには、式in(B.P.Q.R)
を使用します。一致するステートのいずれかの名前を変更します。
最上位のステート
P
を、ボックスまたは別のステートで囲みます。囲いを追加することにより、検索プロセスは最上位のステートのサブステートを検出しなくなります。