Main Content

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

ステート

"ステート" とは、リアクティブ システムの動作モードを記述するものです。Stateflow® チャートでは、ステートは、状態遷移図を作成するための順序設計に使用されます。

ステートは、アクティブまたは非アクティブです。ステートのアクティブまたは非アクティブは、イベントと条件によって変化します。イベントが発生すると、ステートがアクティブまたは非アクティブになり、状態遷移図が実行されます。実行中はいつでも、アクティブまたは非アクティブ ステートが存在します。

ステートの階層

マルチレベル ステートの複雑度を管理するには、Stateflow チャートで階層を使用します。階層では、システム内の複数のレベルのサブコンポーネントを表現できます。

ステート階層の例

以下の例では、チャート内に 3 つのレベルをもつ階層があります。あるステートの境界内に別のステートを描画すると、内側のステート (子) は外側のステート (スーパーステート) のサブステートになります。外側のステートは、内側のステートの親です。

この例では、チャートはステート Car_done の親です。ステート Car_done は、Car_made ステートと Car_shipped ステートの親です。ステート Car_made も、Parts_assembled ステートと Painted ステートの親です。言い換えると、ステート Parts_assembledPainted は、Car_made ステートの子です。

Stateflow 階層をテキストで表現するには、スラッシュ (/) を使用してチャートを表現し、ステート階層の各レベルをピリオド (.) で区切ります。以下のリストは、前述の例のオブジェクト階層をテキストによって表したものです。

  • /Car_done

  • /Car_done.Car_made

  • /Car_done.Car_shipped

  • /Car_done.Car_made.Parts_assembled

  • /Car_done.Car_made.Painted

ステートに含めることのできるオブジェクト

ステートには、他のすべての Stateflow オブジェクトが含まれます。Stateflow チャート表記法は、包含構造による Stateflow チャートのグラフィカル オブジェクト階層の表現をサポートしています。他のステートを含んでいるステートは "スーパーステート" です。他のステートに含まれているステートは "サブステート" です。ステートが他のステートのスーパーステートまたはサブステートのどちらでもない場合は、Stateflow チャート自身がそのステートの親になります。

ステートには、非グラフィカルなデータ オブジェクト、イベント オブジェクトおよびメッセージ オブジェクトも含めることができます。この包含階層は、モデル エクスプローラーで表示されます。データ、イベント、メッセージの包含は、親オブジェクトを指定して定義します。

ステート構造

各ステート (またはチャート) には、含めることのできるサブステートの種類を決定する "構造" が含まれています。スーパーステートのすべてのサブステートは、スーパーステートの構造とタイプが一致していなければなりません。ステートの構造は、排他的 (OR) またはパラレル (AND) です。

排他的 (OR) ステート構造

実線の境界をもつサブステートは、排他的 (OR) ステート構造を示しています。この構造は、互いに排他的な動作モードの記述に使用します。ステートに排他的 (OR) 構造が含まれる場合、一度にアクティブにできるサブステートの数は 1 つに限定されます。

以下の例では、ステート A またはステート B がアクティブになります。ステート A がアクティブな場合、ステート A1 またはステート A2 のいずれかをアクティブにできます。

パラレル (AND) ステート構造

破線の境界をもつサブステートは、パラレル (AND) 構造を示しています。この構造は、同時動作モードの記述に使用します。ステートがパラレル (AND) 構造をもつ場合、すべてのサブステートは同時にアクティブになります。

以下の例では、ステート A がアクティブになると、A1A2 の両方が同時にアクティブになります。

パラレル ステート内のアクティビティは、以下の例で示すように、基本的に独立しています。

以下の例では、ステート A がアクティブになると、ステート BC の両方が同時にアクティブになります。ステート C がアクティブになると、ステート C1 またはステート C2 のどちらかがアクティブになります。

ステートのラベル

ステートのラベルは、ステートの四角形の左上隅に以下の一般的な形式で表示されます。

name/
entry:entry actions
during:during actions
exit:exit actions
on event_name:on event_name actions
on message_name:on message_name actions
bind:events

以下の例は、ステートのラベルのコンポーネントを示しています。

ステート ラベルの各アクションは、以降のサブトピックに表示されます。ステート アクションの詳細については、Stateflow チャートの実行を参照してください。

ステート名

ステートのラベルはステート名で始まり、オプションの / 文字が続きます。前述の例では、ステート名は OnOff です。有効なステート名は英数字で構成され、アンダースコア (_) 文字を含めることができます。詳細については、Stateflow オブジェクトの命名のガイドラインを参照してください。

階層では、ある程度柔軟にステート名を指定できます。ステート ラベルに入力した名前は、上位のステート名がその前に追加されて、一意になっている必要があります。Stateflow 階層の名前は、ステート名として入力したテキストの前に、ピリオドで区切った親のステート名が追加されたものです。階層内でフル ネームが一意であれば、各ステートに同じ名前を付けても問題はありません。

以下の例は、一意の名前をステートに付ける方法を示しています。

チャート内の配置により、各ステートは一意の名前をもつことになります。FAN1 および FAN2 のステートのフル ネームは、以下のようになります。

  • PowerOn.FAN1.On

  • PowerOn.FAN1.Off

  • PowerOn.FAN2.On

  • PowerOn.FAN2.Off

ステート アクション

名前に続いて、アクションのタイプを示すキーワード ラベルとともに、オプションのアクション ステートメントを入力します。キーワードの指定は任意です。各キーワードの後には、コロンを入力する必要があります。ステート名に続けてスラッシュをオプションとして入力できます。ただし、スラッシュに続けて、キャリッジ リターンを入力する必要があります。

アクションのタイプごとに、キャリッジ リターン、セミコロン、またはコンマで各アクションを区切ることで、複数のアクションを入力できます。複数のイベントまたはメッセージにアクションを指定するには、on event_name または on message_name の行を追加します。

名前とスラッシュに続けてアクションを直接入力した場合は、そのアクションは entry アクションとして解釈されます。この省略表現は、entry アクションのみを指定する場合に便利です。

以下の表は、様々なステート アクション タイプをまとめたものです。

ステート アクション省略形説明
entryenステートがアクティブになった時点で実行します。
exitexステートがアクティブであり、ステートからの遷移が発生した時点で実行します。
duringduステートがアクティブであり、特定のイベントが発生した時点で実行します。
bindなしイベントまたはデータ オブジェクトをバインドして、イベントのブロードキャストまたはデータ値の変更をステートとその子のみに限定します。

on event_name

なしステートがアクティブであり、event_name のブロードキャストを受信した時点で実行します。

on message_name

なしメッセージ message_name が使用可能なときに実行します。

on after(n,event_name)

on after(n,sec)

on after(n,msec)

on after(n,usec)

なし

次の場合に実行します。

  • 関連付けられたステートがアクティブになってからのイベント event_name の発生回数が n 回以上である。

  • 関連付けられたステートがアクティブになってから経過した時間が n 単位以上である。

詳細については、after を参照してください。

on at(n,event_name)

on at(n,sec)

なし

次の場合に実行します。

  • 関連付けられたステートがアクティブになってからのイベント event_name の発生回数が厳密に n 回である。

  • 関連付けられたステートがアクティブになってからの経過時間が厳密に n 秒である。

詳細については、at を参照してください。

on before(n,event_name)

on before(n,sec)

on before(n,msec)

on before(n,usec)

なし

次の場合に実行します。

  • 関連付けられたステートがアクティブになってからのイベント event_name の発生回数が n 回未満である。

  • 関連付けられたステートがアクティブになってから経過した時間が n 単位未満である。

詳細については、before を参照してください。

on every(n,event_name)

on every(n,sec)

なし

次の時点で実行します。

  • 関連付けられたステートがアクティブになってから、イベント event_namen 回発生するたび

  • 関連付けられたステートがアクティブになってから n 秒ごと

詳細については、every を参照してください。

entry アクション

entry アクションは、ステートがアクティブになると実行されます。entry アクションは、接頭辞 entry (または省略形 en) と、その後にコロン (:) および 1 つ以上のアクションを続けて構成されます。複数の entry アクションを区切るには、セミコロンまたはコンマを使用します。アクションを別々の行に入力することもできます。

前述の例では、チャートがデフォルト遷移を行ってステート A がアクティブになると、entry アクション id = x+y が実行されます。チャートまたはステートに入るを参照してください。

exit アクション

exit アクションは、ステートがアクティブで、そのステートからの遷移が発生すると実行されます。exit アクションは、接頭辞 exit (または省略形 ex) と、その後にコロン (:) および 1 つ以上のアクションを続けて構成されます。複数の exit アクションを区切るには、セミコロンまたはコンマを使用します。アクションを別々の行に入力することもできます。

前述の例では、チャートがステート A からステート B または C への遷移のいずれかを行うと、exit アクション time_out が実行されます。ステートを出るを参照してください。

during アクション

during アクションは、ステートがアクティブで、イベントが発生し、他のステートまたは現在のステートへの有効な遷移が存在しないときに実行されます。during アクションは、接頭辞 during (または省略形 du) とそれに続くコロン (:) および 1 つ以上のアクションで構成されます。複数の during アクションを区切るには、セミコロンまたはコンマを使用します。アクションを別々の行に入力することもできます。

前述の例では、他のステートへの有効な遷移が存在しないので、ステート C がアクティブであると必ず during アクション switch_on() が実行されます。Stateflow チャートの実行を参照してください。

bind アクション

bind アクションを使用すると、データおよびイベントをステートにバインドできます。bind アクションは、接頭辞 bind とそれに続くにコロン (:) および 1 つ以上のイベントまたはデータで構成されます。複数のイベントおよびデータを区切るには、セミコロンまたはコンマを使用します。イベントやデータを別々の行に入力することもできます。

特定のステートにバインドされたデータの変更やイベントのブロードキャストを行えるのは、ステートとその子だけです。他のステートは、バインドされたデータを読み取ったりバインドされたイベントをリッスンできますが、バインドされたデータを変更したり、バインドされたイベントを送信することはできません。

bind アクションは、バインド ステートがアクティブかどうかにかかわらず、チャートに対して適用されます。前述の例では、ステート A に対する bind アクション bind: id, time_out が、データ id とイベント time_out をステート A にバインドします。これにより、チャートの他のステート (およびその子) による id の変更や、イベント time_out のブロードキャストは禁止されます。

データを変更するアクションや、その他のステートにバインドするイベントをブロードキャストするアクションがステートに含まれている場合、コンパイル時エラーが発生します。たとえば、このチャートには、エラーを生成する 2 つのステート アクションが含まれています。

ステート アクションエラーの理由
bind: id ステート B1 つのステートだけが、ステート A にバインドされたデータ id を変更できる
entry: time_out ステート C1 つのステートだけが、ステート A にバインドされたイベント time_out をブロードキャストできる

Function-Call イベントをステートにバインドすると、呼び出し元の Function-Call Subsystem もバインドされます。Function-Call Subsystem は、バインド ステートへ入ると有効になり、バインド ステートから出ると無効になります。この動作に関する詳細は、bind アクションによる Function-Call Subsystem の制御 を参照してください。

bind アクションは、Simulink® モデルの Stateflow でのみサポートされます。

on アクション

on アクションは、ステートがアクティブであり、イベントまたはメッセージを受け取ると実行されます。on アクションは、接頭辞 on とそれに続く一意のイベント event_name またはメッセージ message_name、コロン (:)、および 1 つ以上のアクションで構成されます。複数の on アクションを区切るには、セミコロンまたはコンマを使用します。アクションを別々の行に入力することもできます。

複数のイベントまたはメッセージに対するアクションを指定できます。たとえば、異なるイベントにより異なるアクションをトリガーするには、ステート アクション ラベルに複数の on アクション ステートメントを入力します。

on ev1: action1();
on ev2: action2();
複数のイベントが同時に発生する場合、対応する on アクションは、ステート アクション ラベルでの表示順に実行されます。たとえば、前述の例では、イベント ev1 および ev2 が同時に発生した場合、action1() が最初に実行されて action2() が 2 番目に実行されます。Stateflow チャートの実行を参照してください。

関連するトピック