Main Content

TCP/IP またはシリアルのエクスターナル モード通信のためのトランスポート層の作成

この節では、ユーザー独自の下位通信層を使用するエクスターナル モードでカスタム ターゲットを接続する方法を説明します。以下のトピックについて説明します。

  • エクスターナル モードの設計と動作の概要

  • エクスターナル モードのソース ファイルの記述

  • エクスターナル モードのソース ファイルを修正し、既定の ext_comm MEX ファイルのタスクを処理するための実行可能ファイルをビルドするためのガイドライン

この節では、ユーザーが Simulink® Coder™ プログラムの実行およびエクスターナル モードの基本的動作に精通していることを想定しています。

エクスターナル モードの設計

Simulink エンジンとターゲット システムとの間のエクスターナル モード通信は、クライアント/サーバー アーキテクチャに基づきます。クライアント (Simulink エンジン) は、サーバー (ターゲット) にパラメーター変更の受け取りまたは信号データのアップロードを要求するメッセージを送信します。サーバーは、要求を実行することで応答します。

下位の "トランスポート層" が、メッセージの物理的伝送を処理します。Simulink エンジンとモデル コードの両方とも、この層から独立しています。トランスポート層とそのトランスポート層に直接接続するコードは両方とも、メッセージとデータ パケットの書式設定、伝送、および受信を行う独立した複数のモジュールに分かれています。

設計がこのようになっているため、ターゲットごとに異なるトランスポート層を使用することができます。GRT、ERT、および RSim の各ターゲットは、TCP/IP 通信と RS-232 (シリアル) 通信を使用することにより、ホスト/ターゲット通信をサポートします。Simulink Desktop Real-Time™ ターゲットは共有メモリ通信をサポートします。Wind River® Systems Tornado® ターゲットは、TCP/IP のみをサポートします。

GRT、ERT、Rapid Simulation および Tornado ターゲットと Simulink Desktop Real-Time 製品および Simulink Real-Time™ 製品と同様に Simulink Coder 製品では、クライアント側とサーバー側のエクスターナル モード モジュールの両者向けにソース コード全体が用意されています。クライアント側の主要モジュールは ext_comm.c です。サーバー側の主要モジュールは ext_svr.c です。

これら 2 つのモジュールは、次のソース ファイルを通じて、指定されたトランスポート層を呼び出します。

組み込みのトランスポート層実装

プロトコル

クライアントかサーバーか

ソース ファイル

TCP/IP

クライアント (ホスト)

サーバー (ターゲット)

シリアル

クライアント (ホスト)

サーバー (ターゲット)

シリアル通信の場合、モジュール ext_serial_transport.crtiostream_serial.c がクライアント側のトランスポート機能を実装し、ext_svr_serial_transport.crtiostream_serial.c が対応するサーバー側の機能を実装します。TCP/IP 通信の場合、rtiostream_interface.c モジュールと rtiostream_tcpip.c モジュールがクライアント側とサーバー側両方の機能を実装します。これらのファイルのコピーを編集することができます (元のファイルは編集できません)。ユーザー独自の下位通信層を使用するエクスターナル モードをサポートすることができます。そのためには、次のテンプレートを使用して同じようなファイルを作成します。

  • クライアント (ホスト) 側: matlabroot/toolbox/coder/rtiostream/src/rtiostreamtcpip/rtiostream_tcpip.c (TCP/IP) または matlabroot/toolbox/coder/rtiostream/src/rtiostreamserial/rtiostream_serial.c (シリアル)

  • サーバー (ターゲット) 側: matlabroot/toolbox/coder/rtiostream/src/rtiostreamtcpip/rtiostream_tcpip.c (TCP/IP) または matlabroot/toolbox/coder/rtiostream/src/rtiostreamserial/rtiostream_serial.c (シリアル)

rtiostream_interface.c ファイルは、エクスターナル モードのプロトコルと rtiostream 通信チャネルとの間のインターフェイスです。rtiostream 通信チャネルの実装とテストの詳細については、以下を参照してください。

そこで説明されているインターフェイスを使用して rtiostream 通信チャネルを実装すれば、rtiostream_interface.c ファイルやその他のエクスターナル モード関連ファイルを変更する必要はありません。

メモ

作業用のソース ファイルを変更しないでください。/custom フォルダーか /rtiostream フォルダーに入っているテンプレートを出発点として使用して、テンプレートに記載されているコメントに従ってください。

必要なのは、下位通信機能を実装するコードを書くことのみです。ホスト/ターゲット間のデータ変換などの問題やメッセージの書式設定に気を遣う必要はありません。これらの機能は、Simulink Coder ソフトウェアが処理します。

クライアント (Simulink エンジン) 側では、通信は ext_comm (TCP/IP の場合) と ext_serial_win32_comm (シリアルの場合) の各 MEX ファイルが処理します。

サーバー (ターゲット) 側では、エクスターナル モードのモジュールはターゲット実行可能ファイルにリンクされます。これがコード生成時に自動的に行われるのは、[エクスターナル モード] を選択し、指定する [トランスポート層] オプションに基づいている場合です。モジュールは、メイン プログラムとモデル実行エンジンから呼び出され、生成されるモデル コードからは独立しています。

ユーザー独自のクライアント側下位トランスポート プロトコルを実装するための一般的手順は、次のとおりです。

  1. rtiostream_tcpip.c テンプレートを編集して、下位通信呼び出しをユーザー独自の通信呼び出しに差し替えます。

  2. ユーザーのカスタム トランスポート用の MEX ファイルを生成します。

  3. 新しいトランスポート層を Simulink ソフトウェアに登録します。これにより、[コンフィギュレーション パラメーター] ダイアログ ボックスの [インターフェイス] ペインを使用してモデルのトランスポートを選択できるようになります。

詳細については、カスタム クライアント (ホスト) のトランスポート プロトコルの作成を参照してください。

ユーザー独自のサーバー側下位トランスポート プロトコルを実装するための一般的手順は、次のとおりです。

  1. rtiostream_tcpip.c テンプレートを編集して、下位通信呼び出しをユーザー独自の通信呼び出しに差し替えます。通常はこの作業には、ターゲット ハードウェア用のデバイス ドライバーを書くか組み込むことが必要になります。

  2. テンプレート makefile を変更し、新しいトランスポートをサポートします。

詳細については、カスタム サーバー (ターゲット) のトランスポート プロトコルの作成を参照してください。

エクスターナル モード通信の概要

この節では、Simulink Coder 生成プログラムが Simulink エクスターナル モードと通信する方法のおおまかな概要を説明します。この説明では、Simulink Coder 製品に同梱されている TCP/IP 版のエクスターナル モードを使用します。

通信が行われるには、サーバー (ターゲット) プログラムと Simulink ソフトウェアの両方が実行中でなければなりません。これは、サーバー システムのモデル コードが実行中でなければならない、という意味ではありません。サーバーは Simulink エンジンがモデルの実行開始コマンドを発行するのを待っている状態でもかまいません。

クライアントとサーバーは双方向ソケット搬送パケットを使用して通信します。パケットの構成要素は、"メッセージ" (コマンド、パラメーター ダウンロード、および応答) か "データ" (信号アップロード) のいずれかです。

ターゲット アプリケーションが -w コマンド ライン オプションで起動された場合、ターゲット アプリケーションはホストからメッセージを受信するまで待機状態に移行します。それ以外の場合は、モデルの実行を開始します。ターゲット アプリケーションが待機状態にある間、Simulink エンジンはパラメーターをターゲットにダウンロードし、データ アップロードを設定することができます。

ユーザーが [シミュレーション] メニューの [ターゲットに接続] をクリックすると、ホストは EXT_CONNECT message を送信してハンドシェイクを開始します。サーバーは自己の情報を返します。この情報は、次の項目を含みます。

  • チェックサム。ホストはモデルのチェックサムを使用して、ターゲット コードが現在の Simulink モデルを正確に表現したものかどうかを判断します。

  • データ形式情報。ホストはこの情報を使用して、ダウンロード対象データの書式を設定したりアップロード済みデータを解釈したりします。

この時点で、ホストとサーバーは接続されています。サーバーはモデルを実行しているか待機状態にあるかのいずれかです (後者の場合、ユーザーは [シミュレーション] メニューの [リアルタイム コードを開始] をクリックして、モデル実行を開始することができます)。

モデル実行の間、メッセージ サーバーはバックグラウンド タスクとして実行されます。このタスクは、パラメーター ダウンロードなどのメッセージを受信し処理します。

データ アップロードは、信号パケットのフォアグラウンド実行とバックグラウンド サービス提供で構成されます。ターゲットはモデル出力を計算すると同時に、信号値をデータ アップロード バッファーにコピーします。この処理は、各タスク識別子 (tid) に関連付けられたタスクの一部として実行されます。したがって、データ収集はフォアグラウンドで行われます。ところが、収集データの伝送はバックグラウンド タスクとして行われます。このバックグラウンド タスクにより、コレクション バッファー内のデータがデータ パケットの形で Simulink エンジンに送信されます。

ホストは大半の交換処理をメッセージとして開始します。ターゲットは通常は、メッセージを受信し処理したことを確認する応答を返します。メッセージとコマンドの例は、以下のとおりです。

  • 接続メッセージ/接続応答

  • ターゲット シミュレーションの開始/応答の開始

  • パラメーター ダウンロード/パラメーター ダウンロード応答

  • データ アップロード用トリガーの装備/トリガー応答の装備

  • ターゲット シミュレーションの終了/ターゲット シャットダウン応答

モデル実行が終了するのは、モデルが最終時間に達するか、ホストが終了コマンドを送信するか、または Stop Simulation ブロックが実行を終了したときです。サーバーはモデル実行が終了するとすぐにホストにモデル実行が停止したことを伝え、ソケットをシャットダウンします。ホストもソケットをシャットダウンし、エクスターナル モードを終了します。

エクスターナル モードのソース ファイル

クライアント (ホスト) 側の MEX ファイル インターフェイスのソース ファイル

MEX ファイル インターフェイス コンポーネントのソース ファイルは、特に記載のない限り、matlabroot/toolbox/coder/simulinkcoder_core/ext_mode/host (開く) フォルダーにあります。

  • common/ext_comm.c

    エクスターナル モード通信の中核を担うのは、このファイルです。ターゲットと Simulink エンジンとの間の中継局として機能します。ext_comm.c は共有データ構造体 ExternalSim を使用して Simulink エンジンと通信します。ターゲットとの通信には、トランスポート層の呼び出しを使用します。

    ext_comm.c によって実行されるタスクには、ターゲットとの接続の確立、パラメーターのダウンロード、およびターゲットとの接続の終了があります。

  • common/rtiostream_interface.c

    このファイルは、エクスターナル モードのプロトコルと rtiostream 通信チャネルとの間のインターフェイスです。rtiostream 通信チャネルの実装の詳細については、Communications rtiostream APIを参照してください。そこで説明されているインターフェイスを使用して rtiostream 通信チャネルを実装すれば、rtiostream_interface.c ファイルやその他のエクスターナル モード関連ファイルを変更する必要はありません。

  • matlabroot/toolbox/coder/rtiostream/src/rtiostreamtcpip/rtiostream_tcpip.c

    このファイルは、必要とされる TCP/IP トランスポート層関数を実装します。Simulink Coder ソフトウェアに同梱されているバージョンの rtiostream_tcpip.c では、recv()send()socket() などの TCP/IP 関数を使用します。

  • matlabroot/toolbox/coder/rtiostream/src/rtiostreamserial/rtiostream_serial.c

    このファイルは、必要とされるシリアル トランスポート層関数を実装します。Simulink Coder ソフトウェアに同梱されているバージョンの rtiostream_serial.c では、ReadFile()WriteFile()CreateFile() などのシリアル関数を使用します。

  • serial/ext_serial_transport.c

    このファイルは、必要とされるシリアル トランスポート層関数を実装します。ext_serial_transport.c には ext_serial_utils.c が含まれます。これは、matlabroot/rtw/c/src/ext_mode/serial (開く) にあり、クライアント側とサーバー側に共通の関数を含んでいます。

  • common/ext_main.c

    このファイルはエクスターナル モード用の MEX ファイル ラッパーです。ext_main.c は標準の mexFunction 呼び出しを使用して、Simulink エンジンとのインターフェイスの役割を果たします (詳細については、関数 mexFunction のリファレンス ページおよび外部プログラミング言語およびシステムと MATLAB の統合を参照してください。) ext_main.c には関数ディスパッチャー esGetAction が含まれます。これは、Simulink エンジンからの要求を ext_comm.c に送信します。

  • common/ext_convert.c および ext_convert.h

    このファイルには、データをホストでの形式からターゲットでの形式に変換 (およびこの反対) するための関数が含まれます。関数としてはたとえば、バイトスワッピング (ビッグ エンディアンからリトル エンディアン)、非 IEEE® 浮動小数から IEEE 倍精度への変換、およびその他の変換があります。これらの関数は、ext_comm.c によって呼び出され、Simulink エンジンによっても直接呼び出されます (関数ポインターを使用)。

    メモ

    ext_convert をカスタマイズしなくても、カスタム トランスポート層を実装することができます。ただし、目的のターゲットに合わせて ext_convert をカスタマイズする場合があります。たとえば、ターゲットが float データ型を Texas Instruments® 形式で表現している場合、Texas Instruments から IEEE への変換を実行するように ext_convert を変更しなければなりません。

  • common/extsim.h

    このファイルは、ExternalSim データ構造体とアクセス マクロを指定します。この構造体は、Simulink エンジンと ext_comm.c との間の通信に使用されます。

  • common/extutil.h

    このファイルには assert マクロをコンパイルするための条件のみ含まれます。

  • common/ext_transport.h

    このファイルはトランスポート層が実装しなければならない関数を指定します。

サーバー (ターゲット) 側のソース ファイル

これらのファイルは model.exe 実行可能ファイルにリンクされます。特に記載のない限り、matlabroot/rtw/c/src/ext_mode (開く) にあります。

  • common/ext_svr.c

    ext_svr.c はホスト上の ext_comm.c に似ていますが、通常はより多くのタスクを担当します。ホストと生成コードとの間の中継局として機能します。ext_comm.c と同様に、ext_svr.c はホストとの接続の確立と終了などのタスクを実行します。ext_svr.c にも、ダウンロードされたパラメーターをターゲット モデルに書き込むか、またはターゲット データ バッファーからデータを抽出しホストに送り返すかのいずれかを行うバックグラウンド タスク関数が含まれます。

  • common/rtiostream_interface.c

    このファイルは、エクスターナル モードのプロトコルと rtiostream 通信チャネルとの間のインターフェイスです。rtiostream 通信チャネルの実装の詳細については、Communications rtiostream APIを参照してください。そこで説明されているインターフェイスを使用して rtiostream 通信チャネルを実装すれば、rtiostream_interface.c ファイルやその他のエクスターナル モード関連ファイルを変更する必要はありません。

  • matlabroot/toolbox/coder/rtiostream/src/rtiostreamtcpip/rtiostream_tcpip.c

    このファイルは、必要とされる TCP/IP トランスポート層関数を実装します。Simulink Coder ソフトウェアに同梱されているバージョンの rtiostream_tcpip.c では、recv()send()socket() などの TCP/IP 関数を使用します。

  • matlabroot/toolbox/coder/rtiostream/src/rtiostreamserial/rtiostream_serial.c

    このファイルは、必要とされるシリアル トランスポート層関数を実装します。ソフトウェアに同梱されているバージョンの rtiostream_serial.c では、ReadFile()WriteFile()CreateFile() などのシリアル関数を使用します。

  • matlabroot/toolbox/coder/rtiostream/src/rtiostream.h

    このファイルは rtiostream_tcpip.c に実装される関数 rtIOStream* を指定します。

  • serial/ext_svr_serial_transport.c

    このファイルは、必要とされるシリアル トランスポート層関数を実装します。ext_svr_serial_transport.c には serial/ext_serial_utils.c が含まれます。これは、クライアント側とサーバー側に共通の関数を含んでいます。

  • common/updown.c

    updown.c はターゲット モデルとの対話の詳細を処理します。パラメーターのダウンロード時に、updown.c は新しいパラメーターをモデルのパラメーター ベクトルにインストールします。データをアップロードするため、updown.c にはモデルの blockio ベクトルからデータを抽出しそのデータをアップロード バッファーに書き込むための関数が含まれます。updown.cext_svr.c とモデル コード (grt_main.c など) の両方にサービスを提供します。これには、ext_svr.c のバックグラウンド タスクを使用して呼び出されるコード、および優先度の高いモデル実行の一部として呼び出されるコードが含まれます。

  • matlabroot/rtw/c/src/dt_info.h (生成されたモデル ビルド ファイル model.h によって含められる)

    これらのファイルには、多様なコンピューター アーキテクチャ全体でマルチ データ型構造体にアクセスできるようにするデータ型移行情報が含まれます。この情報はホストでの形式とターゲットでの形式との間でデータを変換するために使用されます。

  • common/updown_util.h

    このファイルには assert マクロをコンパイルするための条件のみ含まれます。

  • common/ext_svr_transport.h

    このファイルはサーバー (ターゲット) のトランスポート層が実装しなければならない関数 Ext* を指定します。

サーバー フォルダー内のその他のファイル

  • common/ext_share.h

    ホスト モジュールとターゲット モジュールの両方が必要とするメッセージ コード定義やその他の定義を含みます。

  • serial/ext_serial_utils.c

    シリアル プロトコル用のトランスポート層のホスト モジュールとターゲット モジュールの両方が必要とする通信、MEX リンク、および生成コードの関数とデータ構造体を含みます。

  • シリアル トランスポート実装には、次の追加ファイルが含まれます。

    • serial/ext_serial_pkt.c および ext_serial_pkt.h

    • serial/ext_serial_port.h

カスタム トランスポート層の実装

カスタム トランスポート層の要件

  • 既定の設定では、ext_svr.cupdown.cmalloc を使用して、メッセージ、データ収集、および他の目的でターゲット メモリのバッファーを割り当てます。ただし、静的メモリをあらかじめ割り当てるオプションもあります。ターゲットが他のメモリ割り当てスキームを使用する場合は、これらのモジュールを変更しなければなりません。

  • ターゲットは、int32_Tuint32_T データ型の両方をサポートすると仮定されます。

カスタム クライアント (ホスト) のトランスポート プロトコルの作成

低水準のトランスポート プロトコルのクライアント (ホスト) 側を実装するには以下のようにします。

  1. テンプレート ファイル matlabroot/toolbox/coder/rtiostream/src/rtiostreamtcpip/rtiostream_tcpip.c を編集し、低水準の通信呼び出しを独自の通信呼び出しに置き換えます。

    1. ファイルをコピーし、名前を rtiostream_name.c に変更します (name を意味のある名前に置き換えます)。

    2. 低水準の通信プリミティブを呼び出す (同じ名前の) 関数で、関数 rtIOStreamOpenrtIOStreamClosertIOStreamSend、および rtIOStreamRecv を置き換えます。これらの関数は、rtiostream_interface.c を介して他のエクスターナル モードのモジュールから呼び出されます。詳細については、Communications rtiostream APIを参照してください。

    3. rtiostream の実装を、関数 rtIOStreamOpenrtIOStreamClosertIOStreamRecv および rtIOStreamSend をエクスポートする共有ライブラリにビルドします。

  2. MATLAB® の関数 mex を使用して、カスタマイズされた実行可能な MEX ファイルをビルドします。mex 呼び出しの例については、ext_comm and ext_serial_win32 MEX-Files をリビルドする MATLAB コマンドを参照してください。

    機能を保持する場合は、既存の ext_comm MEX ファイルを置き換えないでください。代わりに -output オプションを使用して新しい実行可能ファイルに名前を付けます (たとえば my_ext_comm)。詳細については、mex を参照してください。

  3. 新しいクライアント トランスポート層を Simulink ソフトウェアに登録します。これにより、[コンフィギュレーション パラメーター] ダイアログ ボックスの [インターフェイス] ペインを使用してモデルのトランスポートを選択できるようになります。詳細については、カスタム クライアント (ホスト) のトランスポート プロトコルの登録を参照してください。

エクスターナル モードの MEX ファイルをリビルドするためのサンプル コマンドをext_comm and ext_serial_win32 MEX-Files をリビルドする MATLAB コマンドに示します。

ext_comm and ext_serial_win32 MEX-Files をリビルドする MATLAB コマンド

以下の表は、PC および UNIX® プラットフォームで標準 ext_comm モジュールと ext_serial_win32 モジュールをビルドするコマンドをまとめています。

プラットフォーム

コマンド

Windows®、TCP/IP

cd (matlabroot)
mex toolbox/coder/simulinkcoder_core/ext_mode/host/common/ext_comm.c ...
toolbox/coder/simulinkcoder_core/ext_mode/host/common/ext_convert.c ...
toolbox/coder/simulinkcoder_core/ext_mode/host/common/rtiostream_interface.c ...
toolbox/coder/simulinkcoder_core/ext_mode/host/common/ext_util.c ...
-R2018a ...
-Itoolbox/coder/rtiostream/src ...
-Itoolbox/coder/rtiostream/src/utils_host ...
-Itoolbox/coder/simulinkcoder_core/ext_mode/host/common/include ...
-Irtw/c/src/ext_mode/common ...
-lmwrtiostreamutils -lmwsl_services ...
-DEXTMODE_TCPIP_TRANSPORT ...
-DSL_EXT_DLL -output my_ext_comm

メモ

関数 rtiostream_interface.c は RTIOSTREAM_SHARED_LIB を libmwrtiostreamtcpip として定義し、動的に MathWorks TCP/IP rtiostream 共有ライブラリを読み込みます。異なる rtiostream 共有ライブラリを読み込む必要がある場合は、このファイルを変更します。

Linux®、TCP/IP

Windows コマンドを使用して、以下の変更を行います。

  • -DSL_EXT_DLL-DSL_EXT_SO に変更します。

  • バックスラッシュを通常のスラッシュに置き換えます。

Mac、TCP/IP

Windows コマンドを使用して、以下の変更を行います。

  • -DSL_EXT_DLL-DSL_EXT_DYLIB に変更します。

  • バックスラッシュを通常のスラッシュに置き換えます。

Windows、シリアル

cd (matlabroot)
mex toolbox\coder\simulinkcoder_core\ext_mode\host\common\ext_comm.c ...
toolbox\coder\simulinkcoder_core\ext_mode\host\common\ext_convert.c ...
toolbox\coder\simulinkcoder_core\ext_mode\host\serial\ext_serial_transport.c ...
toolbox\coder\simulinkcoder_core\ext_mode\host\serial\ext_serial_pkt.c ...
toolbox\coder\simulinkcoder_core\ext_mode\host\serial\rtiostream_serial_interface.c ...
toolbox\coder\simulinkcoder_core\ext_mode\host\common\ext_util.c ...
-R2018a ...
-Itoolbox\coder\rtiostream\src ...
-Itoolbox\coder\rtiostream\src\utils_host ...
-Itoolbox\coder\simulinkcoder_core\ext_mode\host\common ...
-Itoolbox\coder\simulinkcoder_core\ext_mode\host\common\include ...
-Irtw\c\src\ext_mode\common ...
-Irtw\c\src\ext_mode\serial ...
-lmwrtiostreamutils -lmwsl_services ...
-DEXTMODE_SERIAL_TRANSPORT -DSL_EXT_DLL ...
-output my_ext_serial_comm

メモ

関数 rtiostream_interface.c は RTIOSTREAM_SHARED_LIB を libmwrtiostreamserial として定義し、動的に MathWorks シリアル rtiostream 共有ライブラリを読み込みます。異なる rtiostream 共有ライブラリを読み込む必要がある場合は、このファイルを変更します。

Linux、シリアル

Windows コマンドを使用して、以下の変更を行います。

  • -DSL_EXT_DLL-DSL_EXT_SO に変更します。

  • バックスラッシュを通常のスラッシュに置き換えます。

Mac、シリアル

Windows コマンドを使用して、以下の変更を行います。

  • -DSL_EXT_DLL-DSL_EXT_DYLIB に変更します。

  • バックスラッシュを通常のスラッシュに置き換えます。

メモ

mex には、MATLAB API でサポートされているコンパイラが必要です。mex 関数の詳細については、mex のリファレンス ページと外部プログラミング言語およびシステムと MATLAB の統合を参照してください。

カスタム クライアント (ホスト) のトランスポート プロトコルの登録

Simulink ソフトウェアを使用してカスタム クライアントのトランスポート プロトコルを登録するには、MATLAB パス上の sl_customization.m ファイルに次の形式のエントリを追加しなければなりません。

function sl_customization(cm)
  cm.ExtModeTransports.add('stf.tlc', 'transport', 'mexfile', 'Level1');
% -- end of sl_customization

ここで

  • stf.tlc は、トランスポートが登録されるシステム ターゲット ファイルの名前です ('grt.tlc' など)。

  • transport はトランスポートの名前です。[コンフィギュレーション パラメーター] ダイアログ ボックスの [インターフェイス] ペインの [トランスポート層] メニューに表示されます ('mytcpip' など)。

  • mexfile は、トランスポートの関連する外部インターフェイス MEX ファイルの名前です ('ext_mytcpip_comm' など)。

追加の cm.ExtModeTransports.add 行を増やすことにより、複数のターゲットまたはトランスポートを指定することができます。次に例を示します。

function sl_customization(cm)
  cm.ExtModeTransports.add('grt.tlc', 'mytcpip', 'ext_mytcpip_comm', 'Level1');
  cm.ExtModeTransports.add('ert.tlc', 'mytcpip', 'ext_mytcpip_comm', 'Level1');
% -- end of sl_customization

トランスポート登録情報を含む sl_customization.m ファイルを MATLAB パス上に配置すると、カスタム クライアントのトランスポート プロトコルが連続する Simulink セッションごとに登録されます。トランスポートの名前は [コンフィギュレーション パラメーター] ダイアログ ボックスの [インターフェイス] ペインの [トランスポート層] メニューに表示されます。モデルに対するトランスポートを選択すると、次の図に示すように、関連する外部インターフェイス MEX ファイルの名前が、編集不可の [MEX ファイル名] フィールドに表示されます。

カスタム サーバー (ターゲット) のトランスポート プロトコルの作成

matlabroot/toolbox/coder/rtiostream/src/rtiostream.h の関数プロトタイプ rtIOStream* は、サーバー (ターゲット) 側とクライアント (ホスト) 側両方のトランスポート層の関数に対して、呼び出しインターフェイスを定義します。

  • TCP/IP 実装は、matlabroot/toolbox/coder/rtiostream/src/rtiostreamtcpip/rtiostream_tcpip.c です。

  • シリアル実装は、matlabroot/toolbox/coder/rtiostream/src/rtiostreamserial/rtiostream_serial.c です。

メモ

matlabroot/rtw/c/src/ext_mode/common/ext_svr_transport.h の関数プロトタイプ Ext* は、matlabroot/rtw/c/src/ext_mode/common/rtiostream_interface.c または matlabroot/rtw/c/src/ext_mode/serial/rtiostream_serial_interface.c で実装されています。ほとんどの場合、カスタム TCP/IP またはシリアル トランスポート層を使用するために、rtiostream_interface.c または rtiostream_serial_interface.c を修正する必要はありません。

低水準 TCP/IP トランスポート プロトコルまたはシリアル トランスポート プロトコルのサーバー (ターゲット) 側を実装するには、次の手順に従います。

  1. テンプレート matlabroot/toolbox/coder/rtiostream/src/rtiostreamtcpip/rtiostream_tcpip.c または matlabroot/toolbox/coder/rtiostream/src/rtiostreamserial/rtiostream_serial.c を編集し、低水準の通信呼び出しを独自の通信呼び出しに置き換えます。

    1. ファイルをコピーし、名前を rtiostream_name.c に変更します (name を意味のある名前に置き換えます)。

    2. 低水準の通信ドライバーを呼び出す (同じ名前の) 関数で、関数 rtIOStreamOpenrtIOStreamClosertIOStreamSend および rtIOStreamRecv を置き換えます。

      rtiostream.h で定義した関数を実装し、実装はそのファイルで定義したプロトタイプに準拠しなければなりません。詳細は元の rtiostream_tcpip.c または rtiostream_serial.c を参照してください。

  2. トランスポート層のエクスターナル モードのソース ファイルをモデルのビルド プロセスに組み込みます。コード生成後のコマンドまたはフック関数 before_make などのビルド プロセスのメカニズムを使用して、トランスポート ファイルをビルド プロセスで使用可能にします。ビルド プロセスのメカニズムの詳細については、コード生成後のビルド プロセスのカスタマイズSTF_make_rtw_hook ファイルによるビルド プロセスのカスタマイズおよびsl_customization.m によるビルド プロセスのカスタマイズを参照してください。

    例:

    • 前の手順で作成したファイルをビルド情報に追加します。

      path/rtiostream_name.c
    • TCP/IP については、次のファイルをビルド情報に追加します。

      matlabroot/rtw/c/src/ext_mode/common/rtiostream_interface.c
    • シリアルについては、次のファイルをビルド情報に追加します。

      matlabroot/rtw/c/src/ext_mode/serial/ext_serial_pkt.c
      matlabroot/rtw/c/src/ext_mode/serial/rtiostream_serial_interface.c
      matlabroot/rtw/c/src/ext_mode/serial/ext_svr_serial_transport.c

メモ

エクスターナル モードの場合、rtIOStreamRecv がブロック実装ではないことを確認します。そうしないと、ホストが comm 層を通じてデータを送信するまで、エクスターナル モード サーバーがブロックされる場合があります。

64 バイト未満のシリアル受信バッファー

シリアル通信では、ターゲットのシリアル受信バッファーが 64 バイトより小さい場合、以下の手順を実行します。

  1. 以下のマクロを実際のターゲット バッファー サイズで更新します。

    #define TARGET_SERIAL_RECEIVE_BUFFER_SIZE 64

    以下のファイルに変更を実装します。

    matlabroot/rtw/c/src/ext_mode/serial/ext_serial_utils.c
    matlabroot/toolbox/coder/simulinkcoder_core/ext_mode/host/serial/ext_serial_utils.c
  2. コマンドを実行して ext_serial_win32 MEX ファイルをリビルドします。ext_comm and ext_serial_win32 MEX-Files をリビルドする MATLAB コマンドを参照してください。

関連するトピック