ドキュメンテーション

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

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

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

同時にアクティブになる可能性があるパラレル ステート内にサブステートを設定している場合は、ステート アクティビティをチェックします。たとえば、ステート アクティビティをチェックすると、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 演算子による外部ステートの検出は回避されます。

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