Main Content

メッセージを使用して通信する温度制御システム

この例では、分散システム内でメッセージ通信を使用する方法を示します。ここで、コントローラーはさまざまな送信元から反復する複数の受信メッセージを管理し、さまざまな受信者へコマンドを通信するメッセージを送信します。この例では、別個のサーモスタットを使用して 2 つの異なる部屋の温度を管理する制御システムのモデルを使用します。コンポーネントのアルゴリズム モデル化は、基本的に Stateflow の例バンバン温度制御システムのモデル化 (Stateflow)に従いますが、コンポーネント間の通信は Simulink® のメッセージと SimEvents® ブロックを使用してモデル化されます。青色で表現されている参照モデル Controller と Thermometer は、スタンドアロン コードを生成すると想定されるソフトウェア コンポーネントであり、他のコンポーネントは環境をモデル化します。

モデルの概要

モデルにはサーモスタット付きの N 個の同一の部屋 (複数のインスタンス化されたモデル ブロックによってモデル化される) が含まれています。ここで、N = 2 は、最上位モデルと参照モデルに関連付けられている Simulink データ ディクショナリ ファイル slddMsg.sldd で定義されている Simulink パラメーターです。それぞれの部屋で、設定点温度を別個に設定できます。部屋のサーモスタットは、すべてのサーモスタットについて同じ制御アルゴリズムを使用して、1 つのコントローラーでリモート制御されます。

サーモスタットは 0.2 秒ごとにコントローラーに温度メッセージを送信し、コントローラーは 1 秒ごとにサーモスタットにコマンド メッセージを送信して、暖房のオンまたはオフを行います。Entity Output Switch (SimEvents)ブロックは、メッセージのバスのデータ フィールド deviceID に従って、コントローラーからサーモスタットの 1 つへのメッセージを経路指定します (バスもデータ ディクショナリで定義され、すべてのモデルで共有されます)。Message Mergeブロックは、さまざまなサーモスタットからコントローラーへのメッセージを経路指定します。

最初は、モデルはデータ ディクショナリ ファイル slddMsg.sldd で定義された浮動小数点型フィールドをもつバス タイプを使用して構成されます。浮動小数点から固定小数点に切り替えるには、モデルのデータ ディクショナリを slddMsg.sldd から slddMsgFixpt.sldd に変更します。[モデル化] タブで [モデル設定][モデル プロパティ][外部データ] に移動します。

モデルは、N の値の変更、モデル ブロックへのインスタンスの追加、Entity Output Switch ブロックおよび Message Merge ブロックでの端子数の増加によって、簡単に拡張できます。Room モデル内の各 Thermometer モデルには引数 ID があり、Entity Output Switch の出力端子インデックスに一致する値が設定されていなければなりません。

コントローラー モデルの前のQueueブロック (FIFO、上書きタイプのキュー) はメッセージをバッファーします。これはコントローラーのメッセージ ミドルウェア内のキューをモデル化します。ここで、それぞれの送信元からの新しいメッセージで最も古いメッセージが上書きされるようにキューに対して N の容量が十分に確保されており、いずれのメッセージも送信中に失われないものとします。5*N の容量はメッセージが失われる最悪のシナリオのために必要です。ここで、5 はコントローラーのサンプル時間をサーモスタットのサンプル時間で除算したものです。さらに、各サーモスタットの前の容量 1 のキューが自動的に挿入され、サンドイッチされた "1" のバッジ アイコンが表示されます。これは、意図的に Queue ブロックを配置しない場合には容量 1 のキューが自動的に挿入されるためです。Queue ブロックを使用したメッセージの管理を参照してください。

メッセージとイベントのシーケンスを表示するには、Simulink ツールストリップで、[シミュレーション] タブの [結果の確認] セクションの [シーケンス ビューアー] をクリックします。シーケンス ビューアーを参照してください。

Controller モデル

Controller モデルでは、Inport ブロックと接続された Update Temperature サブシステムが、部屋からの温度の情報を含むすべてのメッセージを最初に受信します。サブシステムはその情報を、温度の設定点と現在の温度の 2 つのベクトルに格納します。次に、For Each サブシステムがそのベクトルを読み取り、信号を処理し、制御メッセージを Simulink 関数 sendCtrlMsg を介して送信します。

Update Temperature サブシステムは do-while 型のサブシステムであり、その終了条件端子は Receive ブロックの状態端子から入力を受け取ります。これは、(最上位モデルの) 外部キューからのメッセージを受け取れなくなるまで実行されることを意味します。メッセージ データは DeviceMsg バス型であり、データ ディクショナリ ファイルで定義され、temperature および deviceID の 2 つのフィールドがあります。したがって、Receive ブロックの出力信号の伝播先である Enabled Subsystem で、イネーブル端子が Receive ブロックの状態端子に接続されている場合、Bus Selector ブロックは信号を deviceID 信号、temperature 信号、および setpoint 信号に分解します。setpoint 信号と temperature 信号は、続いて、deviceID に関連付けられているそれぞれのベクトル要素に代入されます。最後に、Unit Delay ブロックによって維持されるベクトルは、Enabled Subsystem および Update Temperature サブシステムによって、For Each サブシステムに対して信号として出力されます。

上記のブロック設定の For Each サブシステムは N 回の反復をもつよう設定されており、その入力端子は両方とも分割されています。Stateflow チャートが Bang-Bang Controller をモデル化します。これは、バンバン温度制御システムのモデル化 (Stateflow)で説明しているものに類似しています。その出力端子で、暖房をオンにするかしないかを示す Boolean 信号が出力されます。この信号は、Bus Creator ブロックで、反復回数 (0 ベース) からの deviceID (1 ベース) をもつ非バーチャル信号にパックされます。信号は Function Caller ブロックに渡され、それによって Simulink 関数 SendCtrlMsg (For Each Subsystem の外部に配置) が呼び出されて、モデルからメッセージが送出されます。

Room モデル

Room モデルで、Thermostat サブシステムは環境と相互に作用します。Thermostat には制御メッセージと設定点温度信号の 2 つの入力と、加熱レートとコントローラーへの温度メッセージの 2 つの出力があります。Gain ブロックと Integrator ブロックは、加熱レートと部屋のサイズを基準に、部屋の暖房と冷房の物理現象のシミュレーションを行います。

Thermostat サブシステムは、Thermometer Sensor サブシステム、Thermometer Software モデル ブロック、Temperature Actuator サブシステムで構成されています。Thermometer Software モデル ブロックはコントローラーから制御メッセージを定期的に受け取り、それを Temperature Actuator サブシステムへの Boolean コマンド (オン/オフ) にアンパックします。ここで加熱レートが決定されます。Thermometer Software も Thermometer Sensor サブシステムから温度信号を入力します。ここではアナログの温度を検知し、デジタル信号に変換し、そのメッセージをコントローラーに返送します。

Thermometer モデル

Thermometer モデルで、Receive ブロックは Inport ブロックと接続され、各タイム ステップで外部キューからの制御メッセージを受信します。メッセージ データは、出力であるコマンド信号と、モデルの ID 引数と一致しなければならない deviceID 信号に分解されます。ID 引数は最上位モデルのモデル ブロックで設定されていなければなりません。Receive ブロックの初期値は、モデル引数 ID に等しい deviceID フィールドと、false の値をとる command フィールドをもつ MATLAB® 構造体に設定されます。その一方で、デジタル温度、設定点、および deviceID の信号が非バーチャル バス信号にパックされ、Outport ブロックへのメッセージとして送出されます。

コード生成

コード生成と展開については、参照モデル Controller および Thermometer (青色で表示) はスタンドアロンの組み込みターゲット C++ コードを生成することができ、メッセージ ミドルウェアを備えた組み込みデバイスに別個に展開できます。詳細については、Generate C++ Messages to Communicate Data Between Simulink and an Operating System or Middleware (Embedded Coder)およびModel Message-Based Communication Integrated with POSIX Message Queues (Embedded Coder)を参照してください。

メッセージのルートレベルの Inport/Outport は C コードの生成およびコードのカスタマイズをサポートしていません。C コードを生成してメッセージ ミドルウェア API を呼び出してメッセージ送信を行う必要がある場合は、Simulink 関数 sendCtrlMsg を最上位モデルに移動して名前を適切にカスタマイズし、参照モデルがカスタマイズ可能な外部関数の呼び出しサイトを生成することを検討してください。受信側でも同様に、Receive ブロックを含む Simulink 関数を最上位モデルで使用し、参照モデルで Function Caller ブロックを使用して Receive ブロックを置き換えることを検討してください。

参考

| | | | |