ドキュメンテーション センター

  • 評価版
  • 製品アップデート

目次

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

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

ステート アクティビティをチェックする場合

同時にアクティブになる可能性があるパラレル ステート内にサブステートを設定している場合は、ステート アクティビティをチェックします。たとえば、ステート アクティビティをチェックすると、2 つのパラレル ステート内のサブステートを同期するのに役立ちます。

ステート アクティビティをチェックする方法

ステートがアクティブであるかどうかをチェックするには、in 演算子を使用します。この演算子は、ステート アクションと、ステートから派生する遷移で使用できます。

in 演算子

目的

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

構文

in(S)

S は完全修飾のステート名です。

説明

ステート S がアクティブになるたびに、in 演算子は真になり、値 1 を返します。そうでない場合は、値 0 を返します。

以下に図示しているのは、遷移条件で in 演算子を使用した例です。

上記のチャートでは、ステート アクティビティをチェックする in 演算子を使用して、パラレル ステート PlaceTracker のサブステートを同期します。たとえば、入力位置 u が正になった時点で、Place.L から Place.R へのステート遷移が発生します。この遷移によって条件 [in(Place.R)] が真になり、Tracker.Moved_Left から Tracker.Moved_Right への遷移が発生します。

ステート アクティビティのチェック方法

ステート アクティビティのチェックは、2 段階で処理されます。最初に、in 演算子は、対象のステートを検出しなければなりません。次に、演算子は、対象のステートがアクティブであるかどうかを判別します。

  • in 演算子は、引数に一致する可能性のあるチャート内のステートすべてを対象とする全件検索は実行しません。局所的な検索を実行して、停止します。

  • in 演算子は、1 件の一致を検出した後でも、検索を停止しません。チャート レベルに達するまで、検索を続行します。

以下の図は、ステート アクティビティのチェック処理の詳細を示しています。

in 演算子を使用して、ステート アクティビティをチェックすると、以下の 3 つのアクションが発生します。

  1. in 演算子を使用したステートを対象として検索が開始されます。

    • in 演算子をステート アクションで使用した場合は、そのステートが始点になります。

    • in 演算子を遷移ラベルで使用した場合は、遷移元のステートの親が始点になります。

  2. in 演算子は、対象のステートと一致するステートへのパスを取得するため、階層の上記のレベルを検索します。演算子が一致を検出した場合は、そのステートを一致候補のリストに追加します。

  3. 演算子は、次に上位の階層へ移動します。移動したレベルで、演算子は、対象のステートと一致するステートへのパスを検索します。演算子が一致を検出した場合は、そのステートを一致候補のリストに追加します。

  4. in 演算子は、チャート レベルに達するまで前述の手順を繰り返します。

  5. チャート レベルで、演算子は、対象のステートと一致するステートへのパスを検索します。演算子が一致を検出した場合は、そのステートを一致候補のリストに追加します。これで検索が終了します。

  6. 検索が終了すると、以下のいずれかの処理が発生します。

    • 一意な検索結果が検出された場合は、in 演算子はそのステートがアクティブであるかどうかをチェックし、値 0 または 1 を返します。

    • 目的のステートに対する一致が検出されなかった場合や、複数の一致が検出された場合は、エラー メッセージが表示されます。

同じ名前が設定されたサブステートのステートの関連付け

パラレル スーパーステートで同じ名前が設定されたサブステートでは、そのチャート レベルのスーパーステートに関しては、in 演算子のスコープはローカルのままです。in 演算子は、サブステートのアクティビティをチェックするときに、パラレル スーパーステートに存在する同じ名前のサブステートを自動的に検出しません。

以下の例は、同じ名前が設定されたサブステートを含むチャートで、in 演算子がどのように機能するかを示しています。

  • スーパーステート AB には、同じサブステート A1A2 が設定されています。

  • 条件 in(A1.Y) は、ステート A.A2B.A2 で、P から Q への遷移をガードします。

  • ステート A.A2 では、条件 in(A1.Y) はステート A.A1.Y を参照します。

  • ステート B.A2 では、条件 in(A1.Y) はステート B.A1.Y を参照します。

A.A2 の遷移条件では、in 演算子は以下の検索アクションを実行します。

手順in 演算子のアクション一致の検出
1A.A2 を始点として、ステート A.A2.A1.Y を検索いいえ
2階層の次の上位レベルに移動して、ステート A.A1.Y を検索はい
3チャート レベルに移動して、ステート A1.Y を検索いいえ

単一のステート A.A1.Y が検出されて、検索が終了します。in 演算子は、ステートがアクティブであるかどうかをチェックし、値 0 または 1 を返します。

in 演算子のスコープをローカル に設定することで、一意な検索結果が得られます。たとえば、検索アルゴリズムによって演算子のスコープはローカルに設定されるため、A.A2in 演算子はステート B.A1.Y を検出しません。同様に、B.A2in 演算子は、ステート B.A1.Y のみを検出し、ステート A.A1.Y を検出しません。

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

特定の検索パスの使用

チェックするアクティビティを含むステートのパスは、具体的に定義してください。詳細については、以下の例を参照してください。

in 演算子の引数に一致するステートが存在しない場合の例-  

ステート A.B では、during アクションは in 演算子を呼び出します。ステート A.B.Other.C.D のアクティビティをチェックすると仮定します。in 演算子は、以下の検索アクションを実行します。

手順in 演算子のアクション一致の検出
1A.B を始点として、ステート A.B.C.D を検索いいえ
2階層の次の上位レベルに移動して、ステート A.C.D を検索いいえ
3チャート レベルに移動して、ステート C.D を検索いいえ

検索が終了し、一致が存在しないので、エラー メッセージが表示されます。

このエラーを防ぐには、より具体的なパスを指定してステート アクティビティをチェックします。 in(Other.C.D).

in 演算子の引数に一致するステートが不適切である場合の例-  

ステート A.B では、during アクションは in 演算子を呼び出します。ステート A.B.Other.Q.R のアクティビティをチェックすると仮定します。in 演算子は、以下の検索アクションを実行します。

手順in 演算子のアクション一致の検出
1A.B を始点として、ステート A.B.Q.R を検索いいえ
2階層の次の上位レベルに移動して、ステート A.Q.R を検索いいえ
3チャート レベルに移動して、ステート Q.R を検索はい

単一のステート Q.R が検出されて、検索が終了します。in 演算子は、ステートがアクティブであるかどうかをチェックし、値 0 または 1 を返します。

上記の例では、in 演算子は不適切なステートのステータスをチェックしています。このエラーを防ぐには、より具体的なパスを指定してステート アクティビティをチェックします in(Other.Q.R).

一意なステート名の使用

チャート内のステートに名前を設定する際には、一意な名前を使用します。

in 演算子の引数に一致するステートが複数存在する場合の例-  

ステート A.B では、during アクションは in 演算子を呼び出します。ステート A.B.P.Q.R のアクティビティをチェックすると仮定します。in 演算子は、以下の検索アクションを実行します。

手順in 演算子のアクション一致の検出
1A.B を始点として、ステート A.B.P.Q.R を検索はい
2階層の次の上位レベルに移動して、ステート A.P.Q.R を検索いいえ
3チャート レベルに移動して、ステート P.Q.R を検索はい

検索が終了し、複数の一致が存在するので、エラーが表示されます。

このエラーを排除するには、以下の改善策のいずれかを実行します。

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

  • 対象のステートに対する具体的なパスを指定します (in(B.P.Q.R))。 in(B.P.Q.R).

  • 以下に示すように、外部ステート P.Q.R をボックスまたは別のステートで囲みます。

    枠を追加することで、ステート A.Bin 演算子による外部ステートの検出は回避されます。

この情報は役に立ちましたか?