このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
Simulink コンポーネント間のデータ通信のための C++ メッセージの生成
Simulink 環境でモデル コンポーネント間のメッセージベースの通信をサポートする C++ コードを生成するには、Simulink Messages & Events ライブラリ ブロック Send および Receive を使用します。通信をカスタマイズするには、(同じライブラリの) Queue ブロックを使用して、容量、並べ替えポリシー (LIFO、FIFO、および優先順位)、および上書きポリシー (キューが容量を上回ったときの動作) のパラメーターを設定します。Simulink Coder を使用して GRT ベースのシステム ターゲット ファイル用 C++ コードを生成したり、Embedded Coder を使用して ERT ベースのシステム ターゲット ファイル用 C++ コードを生成したりできます。
メッセージは、Simulink 内でモデル化できる分散された複雑なシステムに効果的な通信方法です。
Simulink でメッセージベースの通信用にモデルを準備する方法
Simulink で、次の手順を使用して、モデル コンポーネント間でメッセージベースの通信をモデル化します。
Send ブロックを含むモデル (参照モデル) を作成します。
Receive ブロックを含むモデル (参照モデル) を作成します。
2 つの Model ブロックを含むモデル (最上位モデル) を作成します。
最初の Model ブロックを Send ブロックを含むモデル (手順 1 のモデル) に設定します。
2 番目の Model ブロックを Receive ブロックを含むモデル (手順 2 のモデル) に設定します。
モデルを実行するときに、メッセージ行の上にある最上位モデルにキューが生成されます。キューによって、明示的または暗黙的に、メッセージの通信を制御します。生成されたキューを使用するか、最上位モデルに Queue ブロックを追加して、通信パラメーターを明示的に指定できます。
モデル コンポーネントでメッセージを渡す方法およびコードでこの動作を実装する方法
参照モデルは次のようにメッセージを渡します。
Send ブロックを含むモデルでは、Send ブロックが信号をメッセージに変換します。
キューを含む最上位モデルが、容量、配信順序、およびその他のサービス品質 (QoS) メトリクスを定義するパラメーターに従ってメッセージを管理します。
Receive ブロックを含むモデルでは、Receive ブロックがメッセージから信号へ変換を戻します。
生成された C++ コードで、最上位モデルは、参照モデルがそれぞれ独自にアクセスできるセット インターフェイスを確立して送信および受信参照モデル間の接続を容易にします。
生成された C++ コードでは、メッセージの動作が次のように実装されます。
各モデル境界にサービスが作成されます。サービスには、参照モデルが最上位モデルにメッセージを渡すために使用する、最上位モデルとエントリ ポイント関数 (サービス関数) への参照が含まれます。
最上位モデルでは、各サービスを初期化して各参照モデルへの接続を作成します。
参照モデルは、サービス関数を呼び出して最上位モデルにメッセージを渡します。
C++ コードの生成例
この例では、ソフトウェア コンポーネント間におけるメッセージ送受信インターフェイスの確立で指定されたモデルから C++ コードを生成して確認します。
C++ コードの生成:
モデルを開きます。
アプリ ギャラリーで [Embedded Coder] をクリックします。
各モデル (最上位モデルと両方の参照モデル) に対して、[コンフィギュレーション パラメーター] ダイアログ ボックスで次のパラメーターを設定します。
[コード生成] ペインで、[言語] を
C++
に設定します。[インターフェイス] ペインで、[コード インターフェイスのパッケージ化] を
C++ class
に設定します。
モデルを保存します。
コードを生成します。[C++ コード] タブで、[ビルド] をクリックします。
生成されたコードを表示します。[C++ コード] タブで、[コードの表示] をクリックします。
C++ コードの確認:
各モデル境界にサービスが作成されます。C++ では、サービスは、最上位モデルのインスタンス、およびメッセージを渡すために参照モデルが呼び出すサービス関数を保持するオブジェクトとして表されます。
サービスの作成を確認するには、最上位モデルの C++ ファイル
MessageSendReceiveDefaultBufferModel.cpp
を開きます。コンストラクター メソッドを表示します。コンストラクター メソッド
ReceiveComponentRecvData(*this)
およびSendComponentSendData(*this)
は、最上位モデルのインスタンスへの参照を引数として取ることで、受信および送信サービス オブジェクトをそれぞれ作成します。各サービス オブジェクトは最上位モデルへの参照を保存し、メッセージ インターフェイス (サービス関数RecvData
およびSendData
) を定義します。受信および送信サービス クラスを表示するには、最上位モデルのヘッダー ファイル
MessageSendReceiveDefaultBufferModel.h
を開き、次のセクションを表示します。
最上位モデルでは、各サービスを初期化して各参照モデルへの接続を作成します。初期化を表示するには、最上位モデルの C++ ファイル
MessageSendReceiveDefaultBufferModel.cpp
を開きます。コンストラクター メソッドを表示します。コンストラクター メソッド
Receive_ComponentMDLOBJ0(get_ReceiveComponentRecvData())
は、受信サービスへの参照を受信参照モデルに渡します。コンストラクター メソッドSend_ComponentMDLOBJ1(get_SendComponentSendData())
は、送信サービスへの参照を送信参照モデルに渡します。参照モデルは、サービス関数を呼び出して最上位モデルにメッセージを渡します。C++ では、参照モデルが、最上位モデル (階層内である場合は共通の先祖) のサービス関数を呼び出してメッセージを送信または受信します (具体的には、参照モデルが、手順 2 で作成されたインターフェイスから抽象サービス メソッド (
RecvData
またはSendData
) を呼び出します)。抽象インターフェイス クラスは共有フォルダーに出力されます。各サービスでのサービス関数の実装は、最上位モデルの C++ ファイルで定義されます。メッセージを送信する抽象インターフェイス クラスを表示するには、共有フォルダーからヘッダー ファイル
SendData_real_T.h
を開きます。メッセージを送信するサービス関数の実装を表示するには、最上位モデルの C++ ファイル
MessageSendReceiveDefaultBufferModel.cpp
を開きます。送信参照モデルがサービス関数を呼び出す方法を表示するには、その C++ ファイル
mSend.cpp
を開きます。ステップ関数で、モデルはサービス関数を呼び出して最上位モデルにメッセージを送信し、戻りステータスを受信します。メッセージを受信する抽象インターフェイス クラスを表示するには、共有フォルダーからヘッダー ファイル
RecvData_real_T.h
を開きます。メッセージを受信するサービス関数の実装を表示するには、最上位モデルの C++ ファイル
MessageSendReceiveDefaultBufferModel.cpp
を開きます。受信参照モデルがサービス関数を呼び出す方法を表示するには、その C++ ファイル
mRecieve.cpp
を開きます。ステップ関数で、モデルはサービス関数を呼び出して最上位モデルからメッセージとステータスを受信します。
考慮事項と制限
Simulink Coder アプリを使用して、GRT ベースのシステム ターゲット ファイルで C++ コードをサポートできます。
Embedded Coder アプリを使用して、ERT ベースのシステム ターゲット ファイルで C++ コードをサポートできます。
コードを生成するには、最上位モデルと参照モデルで同じ言語 (C++) とシステム ターゲット ファイルを選択します。
ルートのメッセージ端子をもつ最上位モデルには関数プロトタイプ コントロール (FPC) を構成できません。
外部モデルとバリアント モデルはサポートされません。
ソフトウェアインザループ (SIL) シミュレーションとプロセッサインザループ (PIL) シミュレーションはサポートされません。