ドキュメンテーション

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

ステート

ステートとは

"ステート" とは、リアクティブ システムの動作モードを記述するものです。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

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

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

ステート名

ステートのラベルはステート名で始まり、オプションの / 文字が続きます。前述の例では、ステート名は 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 アクションのみを指定する場合に便利です。

entry アクション-  接頭辞 entry または en (省略形) が前に追加されます。前述の例では、ステート On には entry アクション on_count=0 が含まれています。これは、ステート On がアクティブになる (ステート On に移行する) たびに、on_count の値は 0 にリセットされることを意味します。

during アクション-  接頭辞 during または du (省略形) が前に追加されます。前述のラベルの例では、ステート On には light_on() および on_count++ という 2 つの during アクションが含まれています。ステート On が既にアクティブになっている状況で何らかのイベントが発生するたびに、これらのアクションが実行されます。

exit アクション-  接頭辞 exit または ex (省略形) が前に追加されます。前述のラベルの例では、ステート Off には light_off() という exit アクションが含まれています。ステート Off がアクティブになっている状況から非アクティブになった (ステートが終了した) 場合、このアクションが実行されます。

on アクション-  接頭辞 on event_name または on message_name が前に追加されます。前述のラベルの例では、ステート On には on power_outage アクションが含まれています。ステート On がアクティブになっている状況でイベント power_outage が発生した場合、アクション handle_outage() が実行されます。

bind アクション-  接頭辞 bind が前に追加されます。ステートにバインドされたイベントは、そのステートまたはその子によってのみブロードキャストが可能です。