このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
実行時の 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) 構造が含まれています。このステートには、Bedroom
と Dining_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_bedroom
と Second_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_in
、Checked_in
、および Executive_suite
のヒストリ ジャンクションには、それらの各ステートで最後にアクティブであったサブステートが記録されます。アクティブ ステートは、最も内側のサブステートから順番に階層の昇順で非アクティブになります。Check_in
が非アクティブになってから、Waiting_area
がアクティブになります。
all_clear
に対するイベント ブロードキャストがチャートに受信されると、Waiting_area
から Check_in
の最後にアクティブであったサブステートへの遷移が発生します。Waiting_area
が非アクティブになってから、Check_in
のサブステートが Check_in
から順番に階層の降順でアクティブになります。
詳細については、イベントに対する Stateflow チャートの対応、ステートを出るおよびチャートまたはステートに入るを参照してください。
参考
Manual Switch (Simulink) | Mux (Simulink) | Multiport Switch (Simulink) | Display (Simulink)