Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

in 演算子を使用したステート アクティビティのチェック

パラレル ステート構造をもつ Stateflow® チャートでは、サブステートを同時にアクティブにすることができます。複数のパラレル ステートの動作を調整するため、1 つのステートで別のステートのサブステート アクティビティを確認し、適宜反応させることができます。たとえば、一方のステートで、サブステートをもう一方のステートのサブステートと同期することができます。

in 演算子

ステートが特定のタイム ステップでアクティブであるか確認するには、ステートおよび遷移アクションで in 演算子を呼び出します。in 演算子は、修飾ステート名 state_name を取り、boolean 出力を返します。ステート state_name がアクティブな場合、in は値 1 (true) を返します。それ以外の場合、in は値 0 (false) を返します。

in(state_name)

たとえば、次のチャートでは、FanHeater はパラレル (AND) ステートです。各ステートにはサブステートのペア (OnOff) があります。チャートが起動するたびに、ステート Fan のアクティブなサブステートは Fan.OffFan.On の間で切り替わります。ステート Heater では、遷移の条件により Fan のサブステート アクティビティが確認され、ステートが同期されます。Fan 内のアクティブなサブステートを変更すると、Heater 内のアクティブなサブステートが対応して変化します。

ステート アクティビティの解決

ステート アクティビティのチェックは 2 段階のプロセスです。まず、Stateflow チャートは、チャート階層で一致するステートの局所的な検索を実行することにより、修飾ステート名を解決します。次に、チャートは、一致するステートがアクティブかどうかを判定します。

検索は、in 演算子が修飾ステート名で呼び出される階層レベルで開始されます。

  • ステート アクションの場合、開始点はアクションを含むステートです。

  • 遷移ラベルの場合、開始点は遷移元の親です。

解決プロセスでは、チャート階層の各レベルで、ステートへのパスを検索します。パスと一致するステートがある場合は、そのステートが一致候補のリストに追加されます。その後、プロセスは階層の 1 つ上のレベルで検索を続けます。階層のチャート レベルの検索が終了すると、解決プロセスは停止します。一致が 1 つのみ存在する場合、チャートは、一致するステートがアクティブかどうかをチェックします。それ以外の場合、解決プロセスは失敗します。シミュレーションはエラーで停止します。

次のフロー チャートは、ステート アクティビティをチェックするプロセスのさまざまな段階を説明しています。

ステート アクティビティのチェックのベスト プラクティス

ステート アクティビティを解決する場合、Stateflow チャートはすべてのステートに対する網羅的探索は実行せず、また最初の一致が見つかった時点では停止しません。一意な検索結果が見つかる可能性を高くするには、次を行います。

  • 修飾データ名で特定のパスを使用します。

  • ステートに一意の名前を付けます。

  • ステートやボックスを囲いとして使用して、パス解決の検索範囲を制限します。

ステート アクティビティ解決の例

検索でサブステートのローカル コピーが見つかる場合

次のチャートには、AB の 2 つのパラレル ステートがあります。各ステートにはサブステートのペア (A1A2) があります。A1 にはサブステート X および Y があり、A2 にはサブステート P および Q があります。A.A2B.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.Bduring アクションに式 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.Bduring アクションに式 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.Bduring アクションに式 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 を、ボックスまたは別のステートで囲みます。囲いを追加することにより、検索プロセスは最上位のステートのサブステートを検出しなくなります。

参考

|

関連するトピック