ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

C Caller ブロックを使用した C コードの統合

C Caller ブロックを使用して Simulink® に新規または既存の C コードを統合できます。Simulink モデルでカスタム ブロックを作成するには、C Caller ブロックによって、外部のソース コードおよびライブラリで指定された外部 C 関数を呼び出すことができます。the C Caller ブロックのメリットには次のものがあります。

  • 単純な C 関数の自動化された統合

  • Simulink Coverage™Simulink Test™、および Simulink Design Verifier™ との統合

  • Simulink Coder™ との統合

The C Caller ブロックにより C アルゴリズムを Simulink に持ち込むことができます。動的システムをモデル化するには、代わりに S-Function Builder を使用します。次のステップでは、C Caller ブロックを使用して Simulink に C コードを統合するワークフローを説明します。

ソース コードと依存関係の指定

C 関数を含む外部ソース コード ファイルを指定します。

  1. Simulink ツールストリップから [コンフィギュレーション パラメーター] を開きます。

  2. 左側のペインで [シミュレーション ターゲット] を選択します。

  3. C Caller ブロックによる解析を有効にするには [カスタム コードのインポート] ボックスがオンになっていることを確認します。

    ディレクトリとファイル パスは、絶対パスでもモデル ディレクトリまたは現在の作業ディレクトリへの相対パスでもかまいません。カスタム コードの相対パスの指定 (Stateflow)を参照してください。

  4. [ヘッダー ファイル] を選択して、ヘッダー ファイルの名前を #include タグと共に入力します。

  5. [追加のビルド情報] の下で [インクルード ディレクトリ] を選択し、ヘッダー ファイルなどの追加のビルド情報が格納されているフォルダーを入力します。

  6. [ソース ファイル] を選択して、ソース ファイルのパスと名前を入力します。モデルとソース ファイルが異なるディレクトリにある場合、ファイル名の前にソース ファイルが含まれているディレクトリを入力します。

メモ

関数がヘッダー ファイルで宣言されていてソース コードで実装されていない場合、シミュレーションとモデルのコンパイルのために空のスタブ関数が自動的に生成されます。

既定の関数配列レイアウトの定義

Simulink で行列データが格納される順序を指定できます。C 関数へ、または C 関数から渡される行列データは、指定した既定の関数配列レイアウトに変換されます。関数配列レイアウトが指定されていない場合、行列データは C Caller を通じて Simulink データと同じ順序で渡され、行優先と列優先の乱れにより計算エラーが発生することがあります。すべての Simulink データについて同じ既定の関数配列レイアウトに従うようにしてください。

  • Column-Major — The C Caller block handles Simulink data in column-major order. Suppose that you have a 3-by-3 matrix. In the C Caller block, this matrix is stored in the sequence: first column, second column, and third column.

  • Row-Major — The C Caller block handles Simulink data in row-major order. Suppose that you have a 3-by-3 matrix. In C Caller block, this is stored in the sequence: first row, second row, and third row.

  • Any — Array data can be stored both in column-major and row-major in the C Caller block. You can generate code both in column and row-major settings.

  • Not specified — Array data can be stored in both column-major and row-major order. Compared to Any setting, you can only generate code in column-major setting.

To learn more about the row and column major array layouts in Simulink , see 既定の関数配列のレイアウト.

  1. [既定の関数配列のレイアウト] の下の配列レイアウト オプションを選択します。

  2. 特定の配列レイアウトをコードの関数のいくつかに適用する必要がある場合、[関数別に指定] をクリックしてこれらの関数を選択します。

  3. [適用] をクリックして変更を受け入れます。

  4. [OK] をクリックして [コンフィギュレーション パラメーター] を閉じます。

C Caller ブロックの呼び出しと端子の指定

Simulink キャンバスに C Caller を入力するだけで、Simulink へのカスタム C コード統合を簡単に開始できます。または、C Caller ブロックを [ライブラリ ブラウザー][User-Defined Functions]からドラッグします。ブロックをダブルクリックして [ブロック パラメーター] ダイアログ ボックスを開いて、関数の名前と端子の指定を確認します。

  1. [Refresh custom code] をクリックしてソース コードとその依存関係をインポートします。

  2. C 関数が [関数名] の下に表示されます。関数の完全なリストが表示されない場合は、 をクリックしてソース コードを再インポートします。

  3. 関数宣言を表示する、または関数への入力/出力変数をヘッダー ファイル内で表示するには、[Go to function declaration] をクリックしてソース ファイルを移動します。

  4. ソース ファイルとその依存関係を変更する、または関数配列レイアウトを定義し選択するには、[Custom code settings] をクリックして、[コンフィギュレーション パラメーター] の [シミュレーション ターゲット] タブを開きます。

C 関数の引数の Simulink 端子へのマッピング

C Caller ブロックの [端子仕様] を使用して C 関数の引数をソース コードから Simulink 端子にマッピングできます。ソース コードで、ヘッダー ファイルには Simulink 端子に接続される C 関数の引数が含まれています。

extern void mean_filter(const unsigned char* src,
                           unsigned char* dst,
                           unsigned int width, unsigned int height,
                           unsigned int filterSize);

[Port specification] によって、引数の詳細とそれらが Simulink で C Caller ブロックにどのように接続されるかが表示されます。

引数名 — 入力および出力引数の名前を指定します。[引数名] は、ソース コードからの C 関数で定義されている、関数の引数またはパラメーターの名前です。この列は参考のみを目的としています。

スコープ — C 関数の引数が Simulink のスコープにどのようにマッピングされるかを指定します。引数には関数の定義により既定のスコープがあり、そのスコープをソース コードの関数定義によって変更できます。

Simulink スコープC 引数
入力ブロック入力端子
出力ブロック出力端子
パラメーターブロックの調整可能なパラメーター
定数定数値

const double *u のような定数の修飾子定義がある場合、引数は入力またはパラメーターのみです。定数の修飾子がない場合、引数は既定で出力であり、それを入力またはパラメーターに変更できます。この場合、C 関数がポインターで示されるメモリを変更しないようにしてください。引数が出力タイプである場合、このポインターで示される各要素はこの関数の呼び出しのたびに再割り当てされます。

C 引数

Simulink スコープ

関数の戻り

出力

double u

double *u

double u[]

double u[][2]

double u[2][3]

出力 (既定)、入力、パラメーター

const double *u

const double u[]

const double u[][2]

const double u[2][3]

入力 (既定)、パラメーター

ラベル — Simulink ブロックの対応する引数のラベルを示します。既定では、引数のラベルは、変更しない限り引数名と同じです。

Simulink スコープラベル

入力、出力

端子の名前

パラメーター

パラメーター名

定数

定数値の式。

入力引数の名前のサイズ式。例: size(in1,1)

タイプ — C 関数の引数データ型に一致する Simulink のデータ型を示します。

C 引数のデータ型Simulink データ型
符号付き文字int8
符号なし文字uint8
charint8 または uint8 (コンパイラによる)
int*int32
符号なし整数*uint32
short *int16
long *int32 または fixdt(1,64,0) (オペレーティング システムによる)
floatsingle
doubledouble
int8_t*int8
uint8_t*int8
int16_t*int16
uint16_t*uint16
int32_t*int32
uint32_t*uint32
typedef struct {…} AStruct**Bus:AStruct
typedef enum {..} AnEnum**Enum:AnEnum

* C Caller が整数型を取る場合 (例: int16_t)、一致する基本データ型の固定小数点型 (例: fixdt(1, 16, 3)) に変更できます。

** C Caller 同期ボタンによって、C 関数によって使用される構造体または列挙型を Simulink バスおよび列挙型としてインポートできます。

サイズ — 引数のデータの次元を指定します。

C 引数の次元Simulink 端子の次元

double u

スカラー (1)

double *u

double u[]

double u[][2]

継承 (-1) (既定)

引数が出力端子用の場合、サイズを指定する必要があります。出力端子のサイズは継承できません。

double u[2][3]

サイズは [2, 3]

カスタム C Caller ライブラリの作成

ライブラリ モデルを作成して C Caller ブロックをグループ化し、モデルを整理した状態に維持できます。

  1. [ファイル][新規作成][ライブラリ] から新しいライブラリ モデルを開いて、[空のライブラリ] をクリックします。

  2. [ツール表示][ライブラリのカスタム コードの設定][シミュレーション ターゲット]から [シミュレーション ターゲット] を開きます。

  3. コードによって [言語] オプションで C または C++ を選択し、[カスタム コードのインポート] ボックスがオンになっていることを確認します。

  4. ソース コードと依存関係の指定 の説明に従ってソース ファイルとその依存関係を追加します。

  5. C Caller ブロックを作成して C 関数を呼び出します。

  6. ライブラリ モデルから Simulink モデルにブロックを挿入するには、単純にブロックをモデルにドラッグします。

制限

  • C の状態のグローバルな初期化 — C 関数がグローバルな、または静的な変数の読み書きを行う場合は、使用に注意してください。たとえば、複数の C 関数が同じ一連のグローバル変数にアクセスしている場合、ブロックの実行順序によっては予期しない結果となる可能性があります。

  • カスタム コード設定の初期化/終了 — カスタム コードにメモリを割り当てたり割り当て解除したりする必要がある場合、メモリの割り当てと割り当て解除は、カスタム コード設定の [初期化関数] および [終了関数] フィールドに挿入します。

  • 複素数データのサポートC Caller ブロックは Simulink の複素数データ型をサポートしません。

  • 連続サンプル時間C Caller ブロックは連続サンプル時間をサポートしません。

  • 可変引数 — C の可変引数はサポートされません。例: int sprintf(char *str, const char *format, ...)

  • C++ 構文C Caller ブロックはネイティブの C++ 構文を直接サポートしません。C++ コードとインターフェイスする C 関数ラッパーを記述する必要があります。

C Caller ブロックを含むモデルをテストする場合は、Test Integrated C Code (Simulink Test) を参照してください。

参考

| | | |

関連するトピック