ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

パラレル ステート構造をもつ Stateflow® チャートでは、サブステートを同時にアクティブにすることができます。ステート アクティビティをチェックする場合は、サブステートを 2 つのパラレル ステートで同期できます。

たとえば、以下のチャートには、PlaceTracker の 2 つのパラレル ステートが含まれています。Tracker 内の遷移によって、Place 内のステート アクティビティがチェックされ、サブステートの同期が維持されます。Place 内のアクティブなサブステートを変更すると、Tracker 内のアクティブなサブステートが対応して変化します。

  • RPlace 内のアクティブなサブステートになると、Moved_RightTracker 内のアクティブなサブステートになります。

  • LPlace 内のアクティブなサブステートになると、Moved_LeftTracker 内のアクティブなサブステートになります。

in 演算子

チャート実行時に、特定のタイム ステップでステートがアクティブであるかどうかをチェックするには、in 演算子を使用します。

in(S)
in 演算子は、修飾ステート名 S を取り、boolean 出力を返します。ステート S がアクティブな場合、in は値 1 を返します。それ以外の場合、in は値 0 を返します。

in 演算子は、ステート アクションと、ステートから派生する遷移で使用できます。

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

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

検索は、修飾ステート名が表示される階層レベルで開始されます。

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

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

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

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

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

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

  • チャート内のステートすべてを対象とする網羅的探索は実行しません。

  • 最初の一致が見つかった後も停止しません。

修飾データ名を解決するときに一意な検索結果が見つかる可能性を高くするには、次を行います。

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

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

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

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

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

以下のチャートには、同一のサブステート A1 および A2 をもつパラレル ステート A および B が含まれています。条件 in(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階層の 1 つ上のレベル (ステート A) に移動します。ステート A.A1.Y を検索します。一致あり。
3階層の 1 つ上のレベル (チャート レベル) に移動します。ステート 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階層の 1 つ上のレベル (ステート A) に移動します。ステート A.Q.R を検索します。一致なし。
3階層の 1 つ上のレベル (チャート レベル) に移動します。ステート 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階層の 1 つ上のレベル (ステート A) に移動します。ステート A.Q.R を検索します。一致なし。
3階層の 1 つ上のレベル (チャート レベル) に移動します。ステート 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階層の 1 つ上のレベル (ステート A) に移動します。ステート A.P.Q.R を検索します。一致なし。
3階層の 1 つ上のレベル (チャート レベル) に移動します。ステート P.Q.R を検索します。一致あり。

P.Q.R の一致が 2 つ検出されて、検索はチャート レベルで終了し、エラーになります。

このエラーを回避するには、次を行います。

  • より具体的な修飾ステート名を使用します。たとえば、次のようになります。

    • B 内のサブステート アクティビティをチェックするには、式 in(B.P.Q.R) を使用します。

    • 最上位のステート P 内のサブステート アクティビティをチェックするには、式 in(\P.Q.R) を使用します。

  • 一致するステートのいずれかの名前を変更します。

  • 最上位のステート P を、ボックスまたは別のステートで囲みます。囲いを追加することにより、検索プロセスは最上位のステートのサブステートを検出しなくなります。

関連するトピック