Main Content

外部 C/C++ コードと Simulink モデルまたは生成コード間のデータ交換

外部コードを Simulink® モデルにインポートする場合でも (たとえば、レガシ コード ツールを使用)、あるいは生成コードを外部環境にエクスポートする場合でも、モデルまたは生成コードは通常、ユーザーのコードとデータ (信号、状態、パラメーター) を交換します。

C または C++ コードの関数 (独自の外部関数を含む) は、呼び出し側または呼び出された関数と次を使用してデータを交換できます。

  • 関数の引数 (仮パラメーター)。関数が引数を使用してデータを交換する場合、アプリケーションは関数を複数回呼び出すことができます。呼び出された関数の各インスタンスは、インスタンス同士が干渉し合わないように、自身の独立したデータセットを操作できます。

  • グローバル変数への直接アクセス。グローバル変数では次のことが可能です。

    • さまざまなアルゴリズム (関数) および同じアルゴリズムのインスタンスが、キャリブレーション パラメーターやエラー ステータスなどのデータを共有できる。

    • マルチタスク システムのさまざまなレート (関数) がデータを交換できる。

    • さまざまなアルゴリズムが非同期でデータを交換できる。

Simulink では、モデルがこうした交換メカニズムを使用して、ご利用のコードへのデータの提供、抽出、共有を実現するため、データを整理および構成できるようにします。

全体的な統合方法を選択するには、データ インターフェイスの一致を試みる前に、外部コード統合ワークフローの選択を参照してください。

外部コードのモデルへのインポート

モデルと外部関数の間でデータを交換するには、関数を統合するために選択した手法に基づいて、交換メカニズムを選択します。

  • 外部関数の引数を使用してデータを交換するには、モデルを構成および設定して、引数のデータ型に従ってデータを作成およびパッケージ化します。その後、関数を呼び出す、または表現するブロックを接続して構成し、モデルのデータを受信、生成または参照します。

    たとえば、関数を呼び出す S-Function ブロックをレガシ コード ツールを使用して生成する場合、ブロックの端子とパラメーターは関数の引数に対応しています。上流ブロックの出力信号を入力端子に接続し、ブロック マスクでパラメーター値を設定します。その後、ブロックの出力端子から信号線を作成し、その信号を下流ブロックに接続できます。

  • 外部コードで既に定義されているグローバル変数を使用してデータを交換するベスト プラクティスは、Stateflow® チャートを使用して関数を呼び出し、変数にアクセスすることです。シミュレーション中または生成コードの実行中にモデルが変数に対して読み取りと書き込みを行うように、アルゴリズム C コードをチャートに記述します。

    このようなグローバル変数をモデル内の別の場所でパラメーター データの項目 (信号や状態データではない) として使用するために、MATLAB® の数値変数または変数を表す Simulink.Parameter オブジェクトを作成できます。シミュレーション実行の間に C コード変数の値を変更した場合、Simulink 変数またはオブジェクトの値を手動で同期させなければなりません。アルゴリズム コード (関数) がシミュレーション中に C コード変数の値を変更した場合、対応する Simulink 変数またはオブジェクトは変更されません。

    C コード変数の Simulink 表現を作成することを選択した場合、生成コードが変数に対して読み取りと書き込みを行うが、変数定義の複製は行わないように Simulink 表現を構成できます。ストレージ クラスを Simulink 表現に適用します。

外部関数の統合手法モデルとのデータ交換メカニズム例と詳細
S-Function ブロック

関数の引数

レガシ コード ツールを使用して作成した S-Function を通じて関数を呼び出すには、Integrate C Functions into Simulink Models with Legacy Code Toolを参照してください。

Stateflow チャート

関数の引数と、グローバル変数への直接アクセス

関数を呼び出して、Stateflow チャートのグローバル変数にアクセスするには、Stateflow チャート内のカスタム コードの変数および関数へのアクセス (Stateflow)を参照してください。(関数に引数として渡すことができる) チャート内でのデータ項目の作成の詳細については、Stateflow データの追加 (Stateflow)を参照してください。

MATLAB Function ブロックの coder.ceval

関数の引数

coder.ceval を使用して MATLAB Function ブロック内で関数を呼び出すには、MATLAB Function ブロックを使用した C コードの統合を参照してください。(関数に引数として渡すことができる) MATLAB Function ブロック内でのデータ項目の作成の詳細については、MATLAB Function ブロックの変数の作成と定義を参照してください。

外部環境への生成コードのエクスポート

生成コードを外部コードにエクスポートするには、外部の呼び出しコードと生成コード間のデータ交換を参照してください。

C データ型と構造の Simulink 表現

構造体、列挙型、typedef エイリアスなどのカスタム C データをモデル化して再利用するには、次の表の情報を使用します。

外部 C コードの一致するデータのモデル化パターン

C データ型または構造C コード例Simulink 等価詳細

プリミティブ型のエイリアス (typedef)

typedef float mySinglePrec_T;

Simulink.AliasType オブジェクトを作成します。オブジェクトを使用して、次を実行できます。

  • モデル内の信号とブロック パラメーターのデータ型を設定する。

  • コード生成のデータ型置換を設定する。

エイリアスのデータ型を使用するコードの生成には、Embedded Coder® が必要です。

モデルのカスタム データ型の定義の詳細については、Simulink.AliasTypeManage Replacement of Simulink Data Types in Generated Code (Embedded Coder)を参照してください。

生成コードを外部コードにエクスポートする方法を示す例については、Replace and Rename Simulink Coder Data Types to Conform to Coding Standards (Embedded Coder)を参照してください。

配列

int myArray[6];

信号の次元の決定で説明されている信号とパラメーターの次元を指定します。

生成コードは、行列を含む多次元データを列優先のシリアル化されたベクトルとして定義し、アクセスします。外部コードで異なる形式が使用されている場合は、代替手法を使用して生成コードを統合することを検討してください。行列および配列のコード生成を参照してください。

生成コードが非スカラー データ (制限を含む) を格納する方法の詳細については、行列および配列のコード生成を参照してください。

生成コードを外部コードにエクスポートする方法を示す例については、異なるデータ型のコンテキストでパラメーター データを再利用を参照してください。

ルックアップ テーブルをモデル化するには、Simulink.LookupTable を参照してください。

列挙型

typedef enum myColorsType {
  Red = 0,
  Yellow,
  Blue
} myColorsType;

列挙型定義に対応する Simulink 列挙型を定義します。Simulink 列挙型を使用して、モデル内のデータ型を設定します。

Simulink モデルで列挙データを使用するには、生成されたコードにおける列挙型データの使用を参照してください。

列挙パラメーター データの生成方法を示す例については、列挙型 (Embedded Coder)を参照してください。

列挙データを交換することで生成コードを外部コードにエクスポートする方法を示す例については、Exchange Structured and Enumerated Data Between Generated and External Code (Embedded Coder)を参照してください。

構造体

typedef struct myStructType {
    int count;
    double coeff;
} myStructType;

構造体型に対応する Simulink.Bus オブジェクトを作成します。

構造化された信号や状態データを作成するには、モデル内の複数の信号線を単一の非バーチャル バス信号にパッケージ化します。

構造化されたパラメーター データを作成するには、MATLAB 構造体を格納するパラメーター オブジェクト (Simulink.Parameter など) を作成します。バス オブジェクトをパラメーター オブジェクトのデータ型として使用します。

ルックアップ テーブルのデータを構造体にパッケージ化するには、Simulink.LookupTable オブジェクトと、必要に応じて Simulink.Breakpoint オブジェクトを使用します。

バス信号の詳細については、バーチャル バスへの信号またはメッセージのグループ化を参照してください。パラメーターの構造体の詳細については、関連するブロック パラメーター定義を構造体に整理を参照してください。

レガシ コード ツールを使用して外部コードをモデルにインポートする方法を示す例については、Integrate C Function Whose Arguments Are Pointers to Structuresを参照してください。

生成コードを外部コードにエクスポートする方法を示す例については、Exchange Structured and Enumerated Data Between Generated and External Code (Embedded Coder)Access Structured Data Through a Pointer That External Code Defines (Embedded Coder)を参照してください。

ルックアップ テーブルのデータを構造体にパッケージ化するには、Simulink.LookupTable を参照してください。

生成コード内での構造体の作成に関する一般的な情報については、生成されたコードにおける構造体へのデータの整理を参照してください。

コード生成のその他のモデル化パターン (Embedded Coder)

C データ型または構造C コード例Simulink 等価詳細

マクロ

#define myParam 9.8

ストレージ クラス Define および ImportedDefine をパラメーターに適用します。マクロを使用すると、アルゴリズム内の複数の場所でパラメーター値を再利用したり、値を保存するためにメモリを消費することなくコードのコンパイル間にパラメーター値を変更することができます。一般的に、マクロはコードの実行中に変更することを予定していないエンジニアリング定数を表します。

この手法には Embedded Coder が必要です。

マクロ定義 (#define) (Embedded Coder)

constvolatile などのストレージ型修飾子
const myParam = 9.8;

ストレージ クラス ConstVolatile、および ConstVolatile をデータ項目に適用します。

キーワード const と volatile を使用したグローバル データの保護

ビット フィールド

typedef struct myBitField {
    unsigned short int MODE : 1;
    unsigned short int FAIL : 1;
    unsigned short int OK : 1;
} myBitField

  • データ型が boolean、固定小数点、または整数である信号、状態、パラメーターに対して、ストレージ クラス BitField を適用します。

  • モデル コンフィギュレーション パラメーターを使用して、boolean データをビット フィールドに集約します。

この手法には Embedded Coder が必要です。

ビットフィールド (Embedded Coder)

boolean データをビットフィールドにパッキングすることによる生成コードの最適化 (Embedded Coder)

データに対する読み取りと書き込みを行うカスタム外部関数の呼び出し

外部コード:

/* Call this function
to acquire the value of
the signal. */
double get_inSig(void)
{
    return myBigGlobalStruct.inSig;
}

生成されるアルゴリズム コード:

algorithmInput = get_inSig();

ストレージ クラス GetSet を信号、状態、パラメーターに適用します。各データ項目は、ターゲット データに対する読み取りと書き込みを行うカスタム関数の呼び出しとして、生成コードに表示されます。

この手法には Embedded Coder が必要です。

Access Data Through Functions with Storage Class GetSet (Embedded Coder)

その他のモデル化の目的に関する考慮事項

目的考慮事項および詳細情報
Simulink を使用して生成コードを実行および操作する

SIL、PIL、およびエクスターナル モードのシミュレーションを使用して、シミュレーション用に生成された対応するアプリケーションにモデルを接続できます。外部コードからパラメーター データをインポートする場合、以下のようになります。

  • エクスターナル モード シミュレーションの開始時に、外部の実行可能ファイルは、ユーザーのコードがパラメーター データを初期化するために使用する値を使用します。ただし、シミュレーション中に Simulink で対応する値を変更する (たとえば、対応するパラメーター オブジェクトの Value プロパティを変更する) ときは、Simulink は新しい値を実行可能ファイルにダウンロードします。

  • SIL および PIL シミュレーションではパラメーター値をコードからインポートすることはありません。代わりに、シミュレーションでは Simulink のパラメーター値が使用されます。外部コードを Simulink Coder™ ビルド プロセスに含める場合は、データの定義の重複により生成コードのコンパイルが妨げられる可能性があります。

SIL と PIL の詳細については、SIL アプローチまたは PIL アプローチの選択 (Embedded Coder)を参照してください。エクスターナル モード シミュレーションの詳細については、エクスターナル モード シミュレーションによるパラメーター調整、信号監視、コード実行プロファイリングを参照してください。

エクスポートされたデータの属性 (物理単位、実際の初期値、データ型を含む) について説明するコード コメントを生成する

こうしたコメントを生成することで、手書きの統合コードの作成中にデータ インターフェイスを一致させやすくなります。Add Custom Comments for Variables in the Generated Code (Embedded Coder)を参照してください。

関連するトピック