このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
外部 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 | 関数の引数 |
|
外部環境への生成コードのエクスポート
生成コードを外部コードにエクスポートするには、外部の呼び出しコードと生成コード間のデータ交換を参照してください。
C データ型と構造の Simulink 表現
構造体、列挙型、typedef
エイリアスなどのカスタム C データをモデル化して再利用するには、次の表の情報を使用します。
外部 C コードの一致するデータのモデル化パターン
C データ型または構造 | C コード例 | Simulink 等価 | 詳細 |
---|---|---|---|
プリミティブ型のエイリアス ( |
typedef float mySinglePrec_T; |
エイリアスのデータ型を使用するコードの生成には、Embedded Coder® が必要です。 | モデルのカスタム データ型の定義の詳細については、 生成コードを外部コードにエクスポートする方法を示す例については、Replace and Rename Simulink Coder Data Types to Conform to Coding Standards (Embedded Coder)を参照してください。 |
配列 |
int myArray[6]; | 信号の次元の決定で説明されている信号とパラメーターの次元を指定します。 生成コードは、行列を含む多次元データを列優先のシリアル化されたベクトルとして定義し、アクセスします。外部コードで異なる形式が使用されている場合は、代替手法を使用して生成コードを統合することを検討してください。行列および配列のコード生成を参照してください。 | 生成コードが非スカラー データ (制限を含む) を格納する方法の詳細については、行列および配列のコード生成を参照してください。 生成コードを外部コードにエクスポートする方法を示す例については、異なるデータ型のコンテキストでパラメーター データを再利用を参照してください。 ルックアップ テーブルをモデル化するには、 |
列挙型 |
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; | 構造体型に対応する 構造化された信号や状態データを作成するには、モデル内の複数の信号線を単一の非バーチャル バス信号にパッケージ化します。 構造化されたパラメーター データを作成するには、MATLAB 構造体を格納するパラメーター オブジェクト ( ルックアップ テーブルのデータを構造体にパッケージ化するには、 | バス信号の詳細については、バーチャル バスへの信号またはメッセージのグループ化を参照してください。パラメーターの構造体の詳細については、関連するブロック パラメーター定義を構造体に整理を参照してください。 レガシ コード ツールを使用して外部コードをモデルにインポートする方法を示す例については、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)を参照してください。 ルックアップ テーブルのデータを構造体にパッケージ化するには、 生成コード内での構造体の作成に関する一般的な情報については、生成されたコードにおける構造体へのデータの整理を参照してください。 |
コード生成のその他のモデル化パターン (Embedded Coder)
C データ型または構造 | C コード例 | Simulink 等価 | 詳細 |
---|---|---|---|
マクロ |
#define myParam 9.8 | ストレージ クラス この手法には Embedded Coder が必要です。 | マクロ定義 (#define) (Embedded Coder) |
const や volatile などのストレージ型修飾子 | const myParam = 9.8; | ストレージ クラス | キーワード const と volatile を使用したグローバル データの保護 |
ビット フィールド |
typedef struct myBitField { unsigned short int MODE : 1; unsigned short int FAIL : 1; unsigned short int OK : 1; } myBitField |
この手法には 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(); | ストレージ クラス この手法には Embedded Coder が必要です。 | Access Data Through Functions with Storage Class GetSet (Embedded Coder) |
その他のモデル化の目的に関する考慮事項
目的 | 考慮事項および詳細情報 |
---|---|
Simulink を使用して生成コードを実行および操作する | SIL、PIL、およびエクスターナル モードのシミュレーションを使用して、シミュレーション用に生成された対応するアプリケーションにモデルを接続できます。外部コードからパラメーター データをインポートする場合、以下のようになります。
SIL と PIL の詳細については、SIL アプローチまたは PIL アプローチの選択 (Embedded Coder)を参照してください。エクスターナル モード シミュレーションの詳細については、エクスターナル モード シミュレーションによるパラメーター調整、信号監視、コード実行プロファイリングを参照してください。 |
エクスポートされたデータの属性 (物理単位、実際の初期値、データ型を含む) について説明するコード コメントを生成する | こうしたコメントを生成することで、手書きの統合コードの作成中にデータ インターフェイスを一致させやすくなります。Add Custom Comments for Variables in the Generated Code (Embedded Coder)を参照してください。 |