このページは前リリースの情報です。該当の英語のページはこのリリースで削除されています。

外部メッセージ プロトコルを使用してメッセージベース通信用に最上位モデルから C++ コードを生成

Simulink の最上位モデルと外部アプリケーション間のメッセージベースの通信をサポートする C++ コードを生成するには、Simulink Messages & Events ライブラリの Send ブロックと Receive ブロックを使用します。

Simulink 環境外でのメッセージ パッシングを容易にするコードを最上位モデルから生成すると、モデル化したアプリケーションは、外部メッセージ プロトコル サービス (DDS、ROS、SOMEIP、または POSIX などのメッセージ) を使用する分散システムで通信できるようになります。

Simulink の最上位モデルは、次の方法でメッセージを渡します。

  1. 最上位モデルには、Simulink 環境外で通信するメッセージ ブロックが含まれています。最上位モデルに、ルートの Outport ブロックに直接接続されている Send ブロックが含まれる場合、ブロックはその信号をメッセージに変換し、それらを Simulink 環境外に渡します。最上位モデルに、ルートの Inport ブロックに直接接続されている Receive ブロックが含まれる場合、ブロックは受信したメッセージを信号に変換します。

  2. 外部メッセージ プロトコルは、その独自の標準 (容量、配信順序、およびその他のサービス品質 (QoS) の動作を制御するポリシー) に従ってメッセージ通信を管理します。

最上位モデルを外部メッセージ プロトコルと統合する方法を理解するために、このトピックでは、最上位モデルを準備して、コードを生成し、そのコードを外部プロトコルと統合する方法を説明します。

最上位モデルの準備

外部メッセージ プロトコルと統合できる C++ コードを最上位モデルから生成するには、次の手順を使用して最上位モデルを準備します。

  1. 最上位モデルに 1 つ以上のメッセージ ブロック (ルートの Outport ブロックに接続されている Send ブロックまたはルートの Inport ブロックに接続されている Receive ブロックなど) が含まれていることを確認します。

  2. [コンフィギュレーション パラメーター] ダイアログ ボックスで、以下のパラメーターを設定します。

    • [コード生成] ペインで、[システム ターゲット ファイル]ert.tlc に設定します。

    • [コード生成] ペインで、[言語]C++ に設定します。

    • [インターフェイス] ペインで、[コード インターフェイスのパッケージ化]C++ class に設定します。

    • [generate an example main] チェック ボックスをオンにします。

最上位モデルである HMI が外部メッセージ プロトコル サービス、ミドルウェア (POSIX など) と統合する方法の概念的な例を以下に示します。

HMI モデルにおいて、メッセージ端子は次のように接続されています。

コードの生成

最上位モデルから C++ コードを生成するには、以下のようにします。

  1. モデルを開きます。

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

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

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

コードの統合

生成された C++ コードは、メッセージを送信、受信するためのサービス クラスと、main のサンプルを提供します。この main は、ロジックでプログラムすることにより、生成された C++ コードをターゲットの外部メッセージ プロトコル サービスと統合することが想定されています。

C/C++ コードの生成により、次のファイルが提供されます。

  • メッセージを送信するために生成されたサービス クラス SendData_real_T.h

  • メッセージを受信するために生成されたサービス クラス RecvData_real_T.h

  • サービス クラス メソッドを含む main ファイル。ロジックでプログラムすることにより、外部メッセージ プロトコル サービスと統合することが想定されています。

    main ファイルは、送信サービス クラスおよび受信サービス クラスを定義し、さらにインスタンス化します。その後、最上位モデル コンストラクターは、各サービス クラスへの参照を渡すことにより、最上位モデルのインスタンスを作成します。

コード統合の例:

サンプルの main ファイルにロジックを実装し、生成されたコードを POSIX メッセージと統合する例を以下に示します。

void sendData_real_T(const real_T* data, int32_T length, int32_T* status)
{
//This is an example of a message send service function
  struct mq_attr attr;
  attr.mq_maxmsg = 1024;
  attr.mq_msgsize = length;
  mqd_t msgQueue = mq_open("/PosixMQ_Example", O_CREAT | O_WRONLY, 0664, NULL);
  if (msgQueue == -1) 
  {
    printf("mq_open failed");
    exit(1);
  }
  
  printf("Sending %f\n", *data);
  mq_send(msgQueue, (char*)data, length, 1);
  mq_close(msgQueue);
}

class mHMIHandlerSendData_real_T : public SendData_real_T 
{
  public:
    void SendData(const real_T* data, int32_T* length, int32_T* status) 
    {
      sendData_real_T(data, length, status);
    }
};
static mHMIHandlerSendData_real_T OutMsgSendData_arg;

void RecvData_real_T(real_T* data, int32_T length, int32_T* status) 
{
//This is an example of a receive service function
  mqd_t msgQueue = mq_open("/PosixMQ_Example, O_RDONLY);
  if (msgQueue == -1) 
  {
    printf("mq_open failed");
    exit(1);
  }

  struct mq_attr attr;
  mq_getattr(msgQueue, &attr);
  *status = mq_receive(msgQueue, (char *)data, attr.mq_msgsize, &priority);
  printf("Received %f", *data);
  mq_close(msgQueue);
}

class mHMIHandlerRecvData_real_T: public RecvData_real_T 
{
  public:
    {
      RecvData_real_T(data, length, status);
    }
};
static mHMIHandlerRecvData_real_T InMsgRecvData_arg;

考慮事項と制限

  • 最上位モデルを外部メッセージ プロトコルと統合するためのコード生成のサポートは、C++ で利用可能です。

  • パラメーター [メイン プログラム例の生成] が選択されていなければなりません。また、静的な main を必要とするアプリケーションはサポートされていません。

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

関連するトピック