Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

Simulink コンポーネント間の通信のための C メッセージの生成

Simulink 環境でモデル コンポーネント間のメッセージベースの通信をサポートする C コードを生成するには、Simulink Messages & Events ライブラリ ブロック Send および Receive を使用します。通信をカスタマイズするには、(同じライブラリの) Queue ブロックを使用して、容量、並べ替えポリシー (LIFO、FIFO、および優先順位)、および上書きポリシー (キューが容量を上回ったときの動作) のパラメーターを設定します。Simulink Coder を使用して GRT ベースのシステム ターゲット ファイル用 C コードを生成したり、Embedded Coder を使用して ERT ベースのシステム ターゲット ファイル用 C コードを生成したりできます。

メッセージは、Simulink 内でモデル化できる分散された複雑なシステムに効果的な通信方法です。メッセージベースの通信に対する生成コードのサポートについて理解を深めるために、以下の説明を参照してください。

  • Simulink でメッセージベースの通信用にモデルを準備する方法。

  • モデル コンポーネントでメッセージを渡す方法およびコードでこの動作を実装する方法。

  • 特定のモデル例から C コードを生成して調べる方法。

Simulink でメッセージベースの通信用にモデルを準備する方法

Simulink で、次の手順を使用して、モデル コンポーネント間でメッセージベースの通信をモデル化できます。

  1. Send ブロックを含むモデル (参照モデル) を作成します。

  2. Receive ブロックを含むモデル (参照モデル) を作成します。

  3. 2 つの Model ブロックを含むモデル (最上位モデル) を作成します。

    • 最初の Model ブロックを Send ブロックを含むモデル (手順 1 のモデル) に設定します。

    • 2 番目の Model ブロックを Receive ブロックを含むモデル (手順 2 のモデル) に設定します。

  4. モデルを実行するときに、メッセージ行の上にある上位モデルにキューが自動的に生成されます。キューによって、明示的または暗黙的に、メッセージの通信を制御します。自動的に生成されたキューを使用するか、最上位モデルに Queue ブロックを追加して、通信パラメーターを明示的に指定できます。

モデル コンポーネントでメッセージを渡す方法およびコードでこの動作を実装する方法

概念上、参照モデルは次の方法でメッセージを渡します。

  1. Send ブロックを含むモデルでは、Send ブロックが信号をメッセージに変換します。

  2. キューを含む最上位モデルが、容量、配信順序、およびその他のサービス品質 (QoS) メトリクスを定義するパラメーターに従ってメッセージを管理します。

  3. Receive ブロックを含むモデルでは、Receive ブロックがメッセージから信号へ変換を戻します。

生成された C コードで、最上位モデルは、参照モデルがそれぞれ独自にアクセスできるセット インターフェイスを確立して送信および受信参照モデル間の接続を容易にします。

生成された C コードでは、メッセージの動作が次のように実装されます。

  1. 各モデル境界にサービスが作成されます。サービスには、参照モデルが最上位モデルにメッセージを渡すために使用する、最上位モデルとエントリ ポイント関数 (サービス関数) への参照が含まれます。

  2. 最上位モデルでは、各サービスを初期化して各参照モデルへの接続を作成します。

  3. 参照モデルは、サービス関数を呼び出して最上位モデルにメッセージを渡します。

これらの手順の実装の詳細を、生成されたコード例に示します。

C コードの生成例

この例では、ソフトウェア コンポーネント間におけるメッセージ送受信インターフェイスの確立で指定されたモデルから C コードを生成し、確認します。

C コードの生成:

  1. モデルを開きます。

  2. アプリ ギャラリーで [Embedded Coder] をクリックします。

  3. モデル (最上位モデルと両方の参照モデル) ごとに、[コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成] ペインで、[言語]C に設定し、モデルを保存します。

  4. コードを生成します。[C コード] タブで、[ビルド] をクリックします。

  5. 生成されたコードを表示します。[C コード] タブで、[コードの表示] をクリックします。

C コードの確認:

  1. 各モデル境界にサービスが作成されます。C では、参照モデルでサービスが DWork として表されます。サービスは、最上位モデルのインスタンスへのポインターと、メッセージを渡すために参照モデルが呼び出すサービス関数を提供します。

    1. メッセージを送信するサービスを表示するには、送信参照モデルのヘッダー ファイル mSend.h を開きます。DWork 割り当てを表示します。

    2. 送信メッセージ データ型を表示するには、データ型が共有可能な場合 (たとえば、組み込みデータ型、インポートされたバス型、または指定されたデータ型をもつエクスポートされたバス型)、情報は共有ヘッダー ファイルにあります。データ型が共有可能ではない場合、情報はモデル ヘッダー ファイル mSend.h にあります。この例では、共有ヘッダー ファイル SendData_real_T.h を開いて共有可能なデータ型を表示します。

    3. メッセージを受信するサービスを表示するには、受信参照モデルのヘッダー ファイル mReceive.h を開きます。DWork 割り当てを表示します。

    4. 受信したメッセージ データ型を表示するには、データ型が共有可能な場合 (たとえば、組み込みデータ型、インポートされたバス型、または指定されたデータ型をもつエクスポートされたデータ型)、情報は共有ヘッダー ファイル内にあります。データ型が共有可能ではない場合、情報はモデル ヘッダー ファイル mReceive.h にあります。この例では、共有ヘッダー ファイル RecvData_real_T.h を開いて共有可能なデータ型を表示します。

  2. 最上位モデルでは、各サービスを初期化して各参照モデルへの接続を作成します。C では、最上位モデルが各参照モデルの DWork を初期化します。初期化を確認するには、最上位モデルの C ファイル MessageSendReceiveDefaultBufferModel.c を開きます。

  3. 参照モデルは、サービス関数を呼び出して最上位モデルにメッセージを渡します。C では、参照モデルが、サービス関数のポインターを逆参照し、最上位モデルのインスタンスへのポインターを渡すことでサービス関数を呼び出します。最上位モデルのヘッダー ファイルでサービス関数のプロトタイプを表示し、それらのサービス関数の参照モデル呼び出しを参照モデル C ファイルで表示することができます。

    1. メッセージを送信するサービス関数のプロトタイプを表示するには、最上位モデルのヘッダー ファイル MessageSendReceiveDefaultBufferModel.h を開きます。

    2. メッセージを送信するサービス関数の実装を表示するには、最上位モデルの C ファイル MessageSendReceiveDefaultBufferModel.c を開きます。

    3. 送信参照モデルがサービス関数を呼び出す方法を表示するには、モデルの C ファイル mSend.c を開きます。ステップ関数で、モデルはサービスを呼び出してインスタンス データとメッセージを最上位モデルに送信し、戻りステータスを受信します。

    4. メッセージを受信するサービス関数のプロトタイプを表示するには、最上位モデルのヘッダー ファイル MessageSendReceiveDefaultBufferModel.h を開きます。

    5. メッセージを受信するサービス関数の実装を表示するには、最上位モデルの C ファイル MessageSendReceiveDefaultBufferModel.c を開きます。

    6. 受信参照モデルがサービス関数を呼び出す方法を表示するには、モデルの C ファイル mReceive.c を開きます。ステップ関数で、モデルはサービスを呼び出してメッセージ ペイロードと戻りステータスを受信します。

考慮事項と制限

  • Simulink Coder アプリを使用して、GRT ベースのシステム ターゲット ファイルで C コードをサポートできます。

  • Embedded Coder アプリを使用して、ERT ベースのシステム ターゲット ファイルで C コードをサポートできます。

  • コードを生成するには、最上位モデルと参照モデルで同じ言語 (C) とシステム ターゲット ファイルを選択しなければなりません。

  • 関数プロトタイプ コントロール (FPC) は、ルートのメッセージ端子をもつ最上位モデルには構成できません。

  • 外部モデルとバリアント モデルはサポートされません。

  • シミュレーションでは、SIL/PIL はサポートされません。

関連するトピック