このレッスンでは、ステートチャートを使用して制御システム・コンポーネントのハイレベルの振る舞いを指定し、全モデルをシミュレートします。
初期設計では、ステートチャートを使用して、ControlSystem の振る舞いを指定しました。 コンポーネントによる ControlSystem の構造の指定が終わったため、各コンポーネント・ブロックのステートチャートを追加してその振る舞いを反映し、協調的振る舞いを反映するように ControlSystem ステートチャートを変更する必要があります。
コンポーネント・ブロックのステートチャートを作成
センサーのステートチャートを追加するには、次の手順を行います。
- ブラウザーで、センサー・ブロックを選択し、を選択します。
- 「状態」ツール
を使用して、idle および reading という名前の 2 つの状態を追加します。
- 「デフォルト遷移」ツール
を使用して、idle 状態へのデフォルト遷移を追加します。
- 「遷移」ツール
を使用して、idle 状態から reading 状態への遷移を追加します。この遷移に表示されるプレースホルダーに、evRead という名前のイベントを追加します。
- 読み取り状態からアイドル状態へ戻る遷移を追加します。
evRead イベントを受信すると、センサー・パーツはアイドル状態から読み取り状態に遷移します。次に、これは ControlSystem (cs) の温度値を温度属性に転送し、アイドルに戻ります。
作成されたセンサー・ステートチャートは、次の例のようになります。
注: reading 状態の右上隅にあるシンボル

は、この状態の「入状時アクション」フィールドまたは「退状時アクション」フィールドにテキストが存在することを示します。
このシンボルをクリックすると、状態シンボル上にある反応コンパートメントのテキストの表示と非表示が切り替わります。上の例では、反応コンパートメントのテキストが表示されています。
この分析レベルでは、アクチュエーターは命令に応じて、熱の定格量のオンとオフを切り替えます。熱は ControlSystem に委任され、SystemUnderControl に流れます。
アクチュエーターのステートチャートを追加するには、次の手順を行います。
- ブラウザーで、アクチュエーター・ブロックを選択し、を選択します。
- 「状態」ツールを使用して、idle、heating_on、および heating_off という名前の 3 つの状態を追加します。
- 「デフォルト遷移」をアイドル状態に追加します。
- 「条件コネクター」ツール
を使用して、条件コネクターをダイアグラムに追加します。
- アイドルから条件、条件から heating_on、および条件から heating_on への遷移を追加します。
- heating_on からアイドルおよび heating_off からアイドルへの遷移を追加します。
- アイドルから条件への遷移をダブルクリックします。「フィーチャー」ウィンドウで、「トリガー:」 tm(750) を設定します。「OK」をクリックします。
- 条件から heating_on への遷移をダブルクリックします。
「フィーチャー」ウィンドウで、「ガード:」 heat_data を設定し、アクションのコードとして cs->setHeat(rating); と入力します。
「OK」をクリックします。
- 条件から heating_off への遷移をダブルクリックします。
「フィーチャー」ウィンドウで、「ガード:」 else を設定し、アクションのコードとして cs->setHeat(0.0); と入力します。
「OK」をクリックします。
完成したアクチュエーターのステートチャートは、次の例のように表示されます。
注: 「フィーチャー」ウィンドウを使用して遷移のトリガー、ガード、およびアクションを指定すると、遷移構文の要素である大括弧とスラッシュ文字を Rational® Rhapsody® が自動的に追加します。または、図の遷移プレースホルダーにテキストを直接入力する場合は、ユーザー自身がこれらの文字を入力する必要があります。
コントローラー・ステートチャートの作成
設計のこの段階では、 コントローラーに必要なことは、操作のモード変更に反応することのみです。ここでは、待機モードになるとヒーターを使用不可にし、通常モードになるとヒーターを使用可能にする必要があります。 後で、設計が進展するにつれて、コントローラーには制御アルゴリズムが必要になります。
- ブラウザーでコントローラー・ブロックを選択し、を選択します。
- 「状態」ツールを使用して、controlling および standingby という名前の 2 つの状態を図に追加します。
- controlling 状態へのデフォルト遷移を追加します。
- controlling 状態から standingby 状態への遷移を追加し、イベント・プレースホルダーを evStandby という新しいイベントに設定します。
- standingby 状態からcontrolling 状態への遷移を追加し、evNormal という新しいイベントを設定します。
- controlling 状態をダブルクリックして、「フィーチャー」ウィンドウを開きます。次のテキスト行を「入状時のアクション」に追加します。setHeat_data(ENABLED);
- 「OK」をクリックします。
- standingby 状態をダブルクリックします。次のテキスト行を「退状時のアクション」に追加します。setHeat_data(DISABLED);
- 「OK」をクリックします。
改訂されたコントローラー・ステートチャートは、次の例のように表示されます。
ControlSystem ステートチャートの更新
ここで、ControlSystem のステートチャートに指定した初期の振る舞いは、そのコンポーネントによって提供される振る舞いを反映するように変更される必要があります。
特に、温度感知はセンサー・コンポーネントによって行われるため、ControlSystem は温度フローをセンサーに委任する必要があります。同様に、ここでコントローラーは、ControlSystem に委任を戻す熱フローを生成するようにアクチュエーターに命令します。
ControlSystem は、モード変更イベントをコントローラーに委任する必要もあります。
- ダイアグラムの描画領域をクリアするには、を選択します。
- ブラウザーで、ControlSystem のステートチャートを開きます。
- パネル・エレメントの周囲に選択囲み枠を描画し、それらを 1 つのグループとしてダイアグラム・フレームの下部に移動します。これにより、オン状態で約 50% 拡張することが可能になります。
- Alt キーを押しながら、オン状態のシンボルを下に約 50%、右に約 50% 拡大します。
- 「And 線」ツールを使用して、オン状態の左端をクリックして And 線をアンカーし、オン状態を水平に横切り、垂直方向に 2 つ目のコンパートメントを作成します。
オン状態の右側をクリックして線を完成させます。
待機状態の真下になるように And 線を移動します。
- 上部のコンパートメントの空白をダブルクリックして、そのコンパートメント (状態) の「フィーチャー」ウィンドウを開きます。「名前:」delegating_mode を設定します。
「OK」をクリックします。下部のコンパートメントに同じことを実行してその名前に delegating_temperature を設定します。 各コンパートメントの「表示オプション」に「名前」を設定します。
- 待機状態を右に移動して、オン状態の右端の近くに配置します。
- 2 つの evMode 遷移を削除するには、遷移を右クリックし、「モデルからの削除」を選択します。
- 「アクションの送信」ツール
を使用して、通常状態と待機状態の間を垂直方向に間隔をあけて 2 つのアクション送信を追加します。
アクション送信を定義するには、以下の手順に従ってください。- 上部のアクションの送信をダブルクリックして、「フィーチャー」ウィンドウを開きます。「ターゲット:」 itsController を設定し、「イベント:」 evStandby を設定します。
「OK」をクリックします。
- 通常状態から上部のアクション送信への遷移と、 そのアクション送信から待機状態への別の遷移を追加します。
- 通常状態から出ている遷移を右クリックし、を選択します。
- 下部のアクション送信をダブルクリックして、「フィーチャー」ウィンドウを開きます。「ターゲット:」 con を設定し、「イベント:」 evNormal を設定します。
「OK」をクリックします。
- 待機状態から下部のアクション送信への遷移と、 そのアクション送信から通常状態への別の遷移を描画します。 アクション送信シンボルの方向については考慮しないでください。
重要なのは、遷移の方向のみです。
- 待機状態から出ている遷移を右クリックし、を選択します。
- delegating_temperature コンパートメントの左側に状態を追加し、それにアイドルと名前を付けます。
- そのコンパートメントの右側にアクション送信を追加します。
「ターゲット:」 sen を設定し、「イベント:」 evRead を設定します。
「OK」をクリックします。
- 遷移をアイドル状態からアクション送信に接続します。
遷移を右クリックし、を選択します。
- 遷移をアクション送信からアイドル状態に接続します。
完成したステートチャートは、次の例のように表示されます。
全モデルのシミュレーション
全モデルのシミュレーション用構成を生成してビルドするには、以下の手順を行います。
- を選択します。
- 「出力」ウィンドウの「ビルド」ページで「ビルドが完了しました」というメッセージを確認してください。
- DOS ウィンドウにモデルが「実行中」というメッセージが表示されます。
- シミュレーションを開始するには、「アイドルまで進む」ボタン
をクリックします。アニメーション化されたステートチャートや他の成果物をセットアップしてその実行を見ることができるように、シミュレーションが自動的に停止します。
- を選択し、ControlSystem ステートチャートの Context[0]->cs インスタンスを選択します。
このステートチャートを展開して、トレース/アニメーション設定パネル・エレメントを表示します。
- を選択し、コントローラー・ステートチャートの Context[0]->cs->con インスタンスを選択します。
- を選択し、アクチュエーター・ステートチャートの Context[0]->cs->act インスタンスを選択します。
を選択し、センサー・ステートチャートの Context[0]->cs->sen
インスタンスを選択することもできますが、この図はシミュレーション操作に必要ありません。
- ウィンドウをタイル表示することで、ステートチャートを整列します。ズーム係数を 75% に減少しても、図表のほとんどの情報を読み取ることができることに注目してください。
- シミュレーション制御パネルの「進む」ボタン
をクリックしてアニメーションを再開し、コントローラー・ステートチャートのパネル・ボタン (「電源」および「モード」) を使用して、システムの振る舞いをコンポーネント・レベルで駆動します。ControlSystem をオンにするには、「電源」ボタンを 2 回クリックすることが必要な場合があります。
- 温度属性と熱属性の値を観察するには、ブラウザーからコンポーネントのインスタンスの「フィーチャー」ウィンドウを開きます。
例えば、ブラウザーで SystemUnderControl ブロックのインスタンス Context[0]->s を見つけます。このインスタンスをダブルクリックし、次の例のように「フィーチャー」ウィンドウをピンします。