Main Content

実行時の Stateflow オブジェクトの相互作用

実行時、Stateflow® オブジェクトは相互に作用して実世界での動作をシミュレートします。この例では、ホテルへのチェックイン プロセスを使用して、Stateflow チャート内の一般的なグラフィカル オブジェクトと非グラフィカル オブジェクトが実行時にどのように相互作用するかを説明します。

ホテルへのチェックイン プロセスのモデル

このモデルには、Hotel という Stateflow チャートが含まれています。チャートは、以下について切り替える 4 つのManual Switch (Simulink)ブロックから入力イベントを受信します。

  • ホテルへのチェックイン

  • ルーム サービスの呼び出し

  • 火災警報器の作動

  • 火災警報器が作動した後の警報解除信号の送信

Mux (Simulink)ブロックは、これらの入力イベントを結合し、チャートの上側のトリガー端子に接続される入力のベクトルにします。

チャートは、Multiport Switch (Simulink)ブロックから room_type という入力信号も受信します。この信号の値は、宿泊する部屋のタイプに対応します。選択可能なオプションは、エグゼクティブ スイートの "Executive"、ファミリ スイートの "Family"、シングル ルームの "Single" です。

シミュレーション時に、ルーム サービスの料金を含む合計請求額がDisplay (Simulink)ブロックに表示されます。

Hotel チャートには、ステートやヒストリ ジャンクションなどのグラフィカル オブジェクトと、データやイベントなどの非グラフィカル オブジェクトが含まれています。このチャートのオブジェクトにラベルを付けたイメージを確認するには、Stateflow オブジェクトを参照してください。

シミュレーションを開始した後、いずれかの入力イベントの立ち上がりエッジまたは立ち下がりエッジが検出されるまでチャートは起動しません。

Manual Switch ブロックを切り替えると、チャートを起動する入力イベントがトリガーされます。チャートが起動すると、チャートの入力 room_type の値が Multiport Switch ブロックから読み取られ、有効なステート アクションまたは遷移アクションが実行されて、fee の新しい値が Display ブロックに出力されます。

可能性のある実行フェーズがすべて完了すると、チャートはスリープ状態に戻り、次の入力イベントまで待機します。

チャートの初期化

シミュレーションを開始し、いずれかの入力イベントをトリガーします。このアクションは、ホテルに入ってフロント デスクで立ち止まることに相当します。

チャートのプロパティ [初期化時に指定されたチャートを実行 (入力)] が無効になっているため、いずれかの入力イベントの立ち上がりエッジまたは立ち下がりエッジが検出されるまでチャートはスリープ状態のままになります。その後、チャートが起動し、デフォルト遷移が実行されます。ステート Check_in へのデフォルト遷移が発生し、このステートがアクティブになります。次に、サブステート Front_desk へのデフォルト遷移が発生し、このステートがアクティブになります。その後、チャートはスリープ状態に移行します。詳細については、チャートの初期化実行およびチャートまたはステートに入るを参照してください。

ステート間の遷移

サブステート Front_desk がアクティブな状態で、入力イベント check_in をトリガーします。このアクションは、ホテルにチェックインすることに相当します。荷物を手に取って、フロント デスクから部屋まで移動し、荷物を降ろします。

チャートでは、check_in イベントによって、サブステート Front_desk からサブステート Checked_in への出力遷移がガードされます。このイベントをトリガーすると遷移が有効になります。Front_desk の exit アクションによってローカル データ オブジェクト move_bags の値が 1 に設定され、そのサブステートが非アクティブになります。その後、Checked_in がアクティブになり、entry アクションによって move_bags が 0 に設定されます。詳細については、イベントに対する Stateflow チャートの対応ステートを出るおよびチャートまたはステートに入るを参照してください。

デフォルト遷移のパスの評価

チャートは、Checked_in ステートの entry アクションを実行した後、デフォルト遷移のパスをいずれかのサブステートに評価します。アクティブになるサブステートは部屋のタイプに対応します。エグゼクティブ スイートを選択した場合、基本料金は 1500 ドルです。ファミリ スイートを選択した場合、基本料金は 1000 ドルです。シングル ルームを選択した場合、基本料金は 500 ドルです。

チャートは、デフォルト遷移のパスの分岐を次の順序でテストします。

  • チャートの入力 room_type"Executive" に等しい場合、一番上の遷移が有効です。条件アクションによってチャートの出力 fee が 1500 に設定され、サブステート Executive_suite がアクティブになります。

  • チャートの入力 room_type"Family" に等しい場合、中間の遷移が有効です。条件アクションによって fee が 1000 に設定され、サブステート Family_suite がアクティブになります。

  • それ以外の場合、チャートの入力 room_type"Single" に等しく、一番下の遷移が有効です。条件アクションによって fee が 500 に設定され、サブステート Single_room がアクティブになります。

詳細については、一連のフロー チャートの実行順序を参照してください。

排他的サブステートをもつステートの実行

チャートの入力 room_type の値が "Executive" である場合に入力イベント check_in をトリガーすると、サブステート Executive_suite がアクティブになります。このサブステートは、エグゼクティブ スイートに宿泊することに相当します。このスイートはベッドルームとダイニング エリアに分かれているため、スイート ルームの複数のエリアに同時にいることはできません。エグゼクティブ スイートに着いたら、まずベッドルームに入ります。ルーム サービスを注文したら、ダイニング エリアに入って食事をします。ダイニング エリアでとった食事の後片付けをしてほしい場合は、再びルーム サービスを注文し、ベッドルームに戻ります。

ステート Executive_suite には排他的 (OR) 構造が含まれています。このステートには、BedroomDining_area の 2 つのサブステートがあります。最初に Executive_suite がアクティブになると、Bedroom へのデフォルト遷移が発生し、そのサブステートがアクティブになります。入力イベント room_service のブロードキャストで Bedroom から Dining_area への遷移がトリガーされ、Bedroom が非アクティブになり、Dining_area がアクティブになります。room_service の次のブロードキャストで Dining_area から Bedroom に戻る遷移がトリガーされ、Bedroom がアクティブになり、Dining_area が非アクティブになります。詳細については、チャートまたはステートに入るを参照してください。

パラレル サブステートをもつステートの実行

チャートの入力 room_type の値が "Family" である場合に入力イベント check_in をトリガーすると、サブステート Family_suite がアクティブになります。このサブステートは、ファミリ スイートに宿泊することに相当します。ファミリ スイートに着いたら、家族は 2 つのベッドルームで時間を過ごすことができます。たとえば、子供たちが一方のベッドルームで眠っているときに、両親はもう一方のベッドルームで映画を楽しむことができます。

ステート Family_suite にはパラレル (AND) 構造が含まれています。このステートには、First_bedroomSecond_bedroom の 2 つのサブステートがあります。Family_suite がアクティブになると、各ステートの右上隅に番号で示された実行順序に従ってパラレル ステートが起動します。これらのサブステートは同時にアクティブなまま維持されます。詳細については、パラレル ステートの実行順序およびチャートまたはステートに入るを参照してください。

ステート アクションからの関数呼び出し

サブステート Checked_in がアクティブな状態で、入力イベント room_service をトリガーします。このアクションは、ルーム サービスを呼び出すことに相当します。ホテルからの請求額は、部屋のタイプとルーム サービスの注文回数に基づきます。

入力イベント room_service の立ち上がりエッジまたは立ち下がりエッジがチャートで検出されると、このイベントの on アクションが Checked_In ステートで実行されます。ステートでローカル データ オブジェクト service がインクリメントされ、MATLAB® 関数 expenses が呼び出されます。この関数は、ルーム サービスの合計注文回数を入力として受け取り、現在のホテルの請求額を出力として返します。詳細については、スーパーステートでのイベント アクションの使用によるチャートの実行制御を参照してください。

ヒストリ ジャンクションをもつステートの実行

サブステート Checked_in がアクティブな状態で、火災警報器の作動に対応する入力イベント fire_alarm をトリガーします。建物から外に出て、指定の待ち合い場所で待機します。次に、警報解除信号の送信に対応する入力イベント all_clear をトリガーします。これで、ホテル内のもといた場所に戻ることができます。

fire_alarm に対するイベント ブロードキャストがチャートに受信されると、Check_in から Waiting_area への遷移が発生します。Check_inChecked_in、および Executive_suite のヒストリ ジャンクションには、それらの各ステートで最後にアクティブであったサブステートが記録されます。アクティブ ステートは、最も内側のサブステートから順番に階層の昇順で非アクティブになります。Check_in が非アクティブになってから、Waiting_area がアクティブになります。

all_clear に対するイベント ブロードキャストがチャートに受信されると、Waiting_area から Check_in の最後にアクティブであったサブステートへの遷移が発生します。Waiting_area が非アクティブになってから、Check_in のサブステートが Check_in から順番に階層の降順でアクティブになります。

詳細については、イベントに対する Stateflow チャートの対応ステートを出るおよびチャートまたはステートに入るを参照してください。

参考

(Simulink) | (Simulink) | (Simulink) | (Simulink)

関連するトピック