Main Content

C Function

外部 C/C++ コードの Simulink モデルからの統合と呼び出し

  • ライブラリ:
  • Simulink / User-Defined Functions

  • C Function block

説明

C Function ブロックは外部 C/C++ コードを Simulink® モデルから統合し、呼び出します。このブロックを使用して、データの前処理または後処理を行うことで、外部コードを定義し、コードの統合をカスタマイズします。また、カスタマイズされたコードをシミュレーションと C コードの生成に指定できます。コードで定義されている関数を条件付きで呼び出すことも、1 つのブロックで複数の関数を呼び出すこともできます。このブロックを使用して、永続データを初期化し、外部関数に渡すことができます。

C Function ブロックは永続データの初期化とブロックのダイアログ ボックスからの外部関数の呼び出しをサポートします。永続データには、カスタム コードで定義されている C++ クラスのオブジェクトを含めることができます。Interface with C++ Classes Using C Function Blockを参照してください。このブロックは、永続データの初期化と終了のみをサポートします。ブロックは、シミュレーション中のデータの更新をサポートしません。連続状態をもつ動的システムをモデル化するには、S-Function ブロックを使用します。S-Function の詳細については、What Is an S-Function?を参照してください。

C Function ブロックによって呼び出されるソース コードとサポート ファイルを、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [シミュレーション ターゲット] ペインで定義します。モデル コンフィギュレーション パラメーター: Simulation Targetを参照してください。

メモ

Simulink へのカスタム C コード統合でサポートされる C 言語の標準バージョンは C99 です。

C ライブラリ関数の呼び出し

C Function ブロックから以下の C Math Library 関数を直接呼び出すことができます。

absacosasinatanatan2ceil
coscoshexpfabsfloorfmod
labsldexploglog10powsin
sinhsqrttantanh  

これらの関数を呼び出すとき、すべての入力引数が明示的に単精度でなければ、倍精度が適用されます。型の不一致が発生した場合、必要な型に入力引数をキャストすると、元の引数が置換されます。たとえば、関数 sin を整数の引数で呼び出した場合は、入力引数を double 型の浮動小数点数にキャストすることで、元の引数が置換されます。

その他の C ライブラリ関数を呼び出すには、その C ライブラリ関数を呼び出す外部ラッパー関数を作成して呼び出します。

関数 abs、関数 fabs、および関数 labs の呼び出し

C Function ブロックでの関数 absfabs および labs の解釈は、以下に示す整数および浮動小数点の引数に対応している点で標準的な C バージョンよりも優れています。

  • x が整数の場合、標準 C 関数 absx に適用され、abs(x) となります。

  • x が double の場合、標準 C 関数 labsx に適用され、labs(x) となります。

  • x が single の場合、標準 C 関数 fabsx に適用され、fabs(x) となります。

型に基づいたコード置換ライブラリ (CRL)

関数の呼び出しでは、関数に渡されるデータ型に基づいて正しい CRL が呼び出されます。CRL が指定されない場合、関数の呼び出しで型固有のライブラリが呼び出されます。C99 の CRL は、型固有の関数を生成します。以下に例を示します。

渡される型コード生成の呼び出し
sin(doubleIn)sin(doubleIn)
sin(floatIn)sinf(floatIn)

制限

Simulink の次の機能は C Function ブロックとは互換性がありません。

  • Simulink Coverage™

    実行カバレッジのみが計測されます。

  • Simulink Code Inspector™

  • Simulink Design Verifier™

  • Simulink Test™

    – テスト ハーネス

C Function ブロックで指定する C コードには次の制限が適用されます。

  • static キーワードを使用するローカルの静的変数はサポートされません。タイム ステップを超えて値をキャッシュするには、シンボルをブロック ダイアログ ボックスの [シンボル] テーブルで [Persistent] として定義します。

  • コードでファイルの #include は実行できません。外部関数を含むファイルは、[コンフィギュレーション パラメーター] ウィンドウの [シミュレーション ターゲット] ペインで指定しなければなりません。

  • [Constant] シンボルのアドレスを取ることはサポートされません。

  • 前述の「C Library 関数の呼び出し」にリストされている C Math Library 関数以外の C ライブラリ関数を直接呼び出すことはサポートされません。その他の C ライブラリ関数を呼び出すには、その C ライブラリ関数を呼び出すラッパー関数を作成して呼び出します。

端子

入力

すべて展開する

入力端子の数は、[ブロック パラメーター] ダイアログ ボックスの [シンボル] テーブルで [Input] スコープまたは [InputOutput] スコープが定義されているシンボルの数で決まります。各入力端子のラベルは、ブロック ダイアログ ボックスの [シンボル] テーブルの [ラベル] フィールドを編集して変更しない限り、[Input] シンボルまたは [InputOutput] シンボルの名前と同じです。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | enumerated | bus

出力

すべて展開する

出力端子の数は、[ブロック パラメーター] ダイアログ ボックスの [シンボル] テーブルで [Output] スコープまたは [InputOutput] スコープが定義されているシンボルの数で決まります。各出力端子のラベルは、ブロック ダイアログ ボックスの [シンボル] テーブルの [ラベル] フィールドを編集して変更しない限り、[Output] シンボルまたは [InputOutput] シンボルの名前と同じです。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | Boolean | enumerated | bus

パラメーター

すべて展開する

ブロックがシミュレーション中に各タイム ステップで実行する出力コード。文字ベクトルまたは string スカラーとして指定します。たとえば、外部 C コードから関数を呼び出し、結果に変更を加え、他のブロックに結果を渡す操作を実行できます。

プログラムでの使用

ブロック パラメーター: OutputCode
型: 文字ベクトルまたは string スカラー
値: "" | C code
既定の設定: ""

ブロックがシミュレーションの開始時に 1 回実行する初期化コード。文字ベクトルまたは string スカラーとして指定します。たとえば、永続シンボルを初期化できます。

プログラムでの使用

ブロック パラメーター: StartCode
型: 文字ベクトルまたは string スカラー
値: "" | C code
既定の設定: ""

ブロックが配置されているサブシステムまたはモデルをイネーブルにする際にブロックが実行する再初期化コード。文字ベクトルまたは string スカラーとして指定します。このコードはシミュレーションの開始時に 1 回実行され、[イネーブル時の状態] パラメーターが [リセット] に設定されている Enable ブロックを含むサブシステムまたはモデル内にこのブロックがある場合、コードはこのサブシステムまたはモデルがディセーブルからイネーブルに切り替わるたびにも実行されます。Enabled Subsystem の使用を参照してください。たとえば、このコードを使用して、初期出力値を設定したり永続変数の値をリセットしたりできます。

プログラムでの使用

ブロック パラメーター: InitializeConditionsCode
型: 文字ベクトルまたは string スカラー
値: "" | C code
既定の設定: ""

ブロックがシミュレーションの終了時に 1 回実行する終了コード。文字ベクトルまたは string スカラーとして指定します。たとえば、このコードを使用して、void ポインターとして指定された永続シンボルについてキャッシュされたメモリを解放します。

プログラムでの使用

ブロック パラメーター: TerminateCode
型: 文字ベクトルまたは string スカラー
値: "" | C code
既定の設定: ""

C コードで使用するシンボルとシンボル プロパティ。table として指定します。各シンボルの次の属性を table で入力する必要があります。

  • 名前 — コード内のシンボル名。

    シンボルが C++ クラス オブジェクトを表す場合、[名前] フィールドはクラス コンストラクターの呼び出しとして機能します。

    ObjectName(Argument1,Argument2,...)

  • スコープ — シンボルのスコープ。次のスコープが使用できます。

    • Input — ブロックへの入力。

    • Output — ブロックへの出力。

    • InputOutput — ブロックへの入力と出力の両方。

      [InputOutput] スコープを使用して、C コードのポインターで渡された入力をマッピングします。[InputOutput] スコープを使用して作成された端子の名前は、入力端子と出力端子で同じです。[InputOutput] スコープを使用すると、入力端子と出力端子のバッファーの再利用が有効になります。バッファーを再利用すると、信号のサイズとブロック レイアウトに応じて、メモリの使用量が最適化され、コードのシミュレーションとコード生成の効率が向上する可能性があります。次のような制限があります。

      • [InputOutput] シンボルは [開始コード][初期化条件コード]、または [終了コード] で使用できません。

      • [InputOutput] シンボルでは void* データ型はサポートされません。

      • [InputOutput] シンボルでは size() 式はサポートされません。

    • Parameter — ブロック パラメーター マスクに表示されるブロック パラメーター。パラメーターの名前は、シンボルの [ラベル] で定義されます。

    • Persistent — シミュレーション中のタイム ステップ間で値が保持される永続ブロック データ。

      Persistent スコープを使用して void ポインターを定義できます。"void ポインター" は、作成する、または割り当てるあらゆる型のデータを格納できるポインターです。

      Persistent スコープのシンボルを定義し、そのシンボルの [タイプ] として Class: ClassName を使用することで、カスタム コードで定義されている C++ クラスのオブジェクトをインスタンス化できます。Interface with C++ Classes Using C Function Blockを参照してください。

    • Constant — 値とサイズの式、または数値式を使用して定義する定数値。

  • ラベル — シンボルのラベル。[Input][InputOutput]、または [Output] スコープのシンボルでは、このラベルはブロックの端子名として表示されます。[Parameter] スコープのシンボルでは、このラベルはブロック パラメーター マスクに表示されます。スコープが [Constant] の場合、ラベルは定数式です。[Persistent] スコープのシンボルにラベルを定義することはできません。

  • タイプ — シンボルのデータ型。ドロップダウン リストからデータ型を選択するか、またはカスタム データ型を指定します。

    カスタム コードで定義されている C++ クラス タイプは、Simulink.Bus型、Simulink Enum 型、およびSimulink.AliasType型と同様にサポートされます。[タイプ] は次の表に示すように入力します。

    カスタム型[タイプ] フィールドでの指定
    C++ クラスClass: C++ClassName
    Simulink.BusBus: BusTypeName
    Simulink.EnumEnum: EnumTypeName
    Simulink.AliasTypeAliasTypeName

  • サイズ — シンボル データのサイズ。サイズ式を使用して出力のサイズを定義することも、-1 を使用してサイズを継承することもできます。

  • 端子 — シンボルの端子インデックス。[Input][InputOutput]、または [Output] シンボルでは、[端子] はシンボルに対応する 1 つ以上の端子のブロックにおける端子インデックスを指定します。[Parameter] シンボルの場合、[端子] はブロック パラメーター マスクにシンボルが表示される順序を指定します。

プログラムでの使用

ブロック パラメーター: SymbolSpec
型: SymbolSpec オブジェクト
値: SymbolSpec オブジェクト
既定の設定: Symbol オブジェクトの空の配列

サンプル周期。秒単位で指定します。サンプル時間のタイプおよびサンプル時間の指定を参照してください。ブロックで永続シンボルが定義されている場合、連続サンプル時間は指定できません。

プログラムでの使用

ブロック パラメーター: SampleTime
: string スカラーまたは文字ベクトル
既定の設定: "-1"

ブロックの特性

データ型

Booleana | busa | doublea | enumerateda | integera | singlea

直達

いいえ

多次元信号

はい

可変サイズの信号

いいえ

ゼロクロッシング検出

いいえ

a 実際のデータ型または機能のサポートは、ブロックの実装に依存します。

拡張機能

バージョン履歴

R2020a で導入