C Function
外部 C/C++ コードの Simulink モデルからの統合と呼び出し
ライブラリ:
Simulink /
User-Defined Functions
説明
C Function ブロックは外部 C/C++ コードを Simulink® モデルから統合し、呼び出します。このブロックを使用して、データの前処理または後処理を行うことで、外部コードを定義し、コードの統合をカスタマイズします。また、カスタマイズされたコードをシミュレーションと C コードの生成に指定できます。コードで定義されている関数を条件付きで呼び出すことも、1 つのブロックで複数の関数を呼び出すこともできます。このブロックを使用して、永続データを初期化し、外部関数に渡すことができます。
C Function ブロックは永続データの初期化とブロックのダイアログ ボックスからの外部関数の呼び出しをサポートします。永続データには、カスタム コードで定義されている C++ クラスのオブジェクトを含めることができます。Interface with C++ Classes Using C Function Blockを参照してください。このブロックは、永続データの初期化と終了のみをサポートします。ブロックは、シミュレーション中のデータの更新をサポートしません。連続状態をもつ動的システムをモデル化するには、S-Function ブロックを使用します。S-Function の詳細については、S-Function とはを参照してください。
メモ
Simulink へのカスタム C コード統合でサポートされる C 言語の標準バージョンは C99 です。
カスタム コードの指定
R2024a 以降では、このブロックに、ブロックのカスタム C/C++ コードを指定するためのさまざまなオプションが用意されています。
ブロック内でカスタム コードをローカルに指定できるため、単一のブロックに完全に含まれるコード コンポーネントを統合できます。たとえば、C/C++ コードを使用して定義されたカスタム フィルターをモデルに統合するには、このオプションを使用してカスタム コードをローカルに指定します。これにより、ブロックは指定されたフィルターと同様に動作します。
R2026a 以降のバージョンの場合:
ローカルに指定されたカスタム コードをもつ C Function ブロックをデバッグする場合、そのブロックを含むモデルのシミュレーション モードに関係なく、ローカル カスタム コードは MATLAB® の外部にある別のプロセスで実行されます。これは、"アウトプロセス" シミュレーションと呼ばれます。カスタム コードが別の実行可能ファイル内に組み込まれるため、このモードはより安全です。結果として、カスタム コードで問題が生じても MATLAB がクラッシュすることはありません。カスタム C/C++ コードのデバッグの詳細については、Debug Custom C/C++ Codeを参照してください。
ローカルに指定されたカスタム コードをもつ C Function ブロックを含むモデルをシミュレーションすると、次のようになります。
ノーマル モードでは、ローカル カスタム コードはアウトプロセス シミュレーションでシミュレーションを実行します。
アクセラレータ モードでは、ローカル カスタム コードはダイナミック ライブラリに組み込まれ、MATLAB と同じプロセス内でシミュレーションを実行します。これは、"インプロセス" シミュレーションと呼ばれます。このモードはアウトプロセス シミュレーションより高速ですが、カスタム コードで生じた問題により MATLAB がクラッシュする可能性があります。
以前は、C Function ブロックを含むモデルのシミュレーション モードに関係なく、ローカルに指定されたカスタム コードのデバッグとシミュレーションはどちらもアウトプロセス シミュレーションで実行されました。
カスタム コードは、モデル内の他のブロックまたは複数のモデルで共有できます。複数のモデルでカスタム コードを共有するには、Simulink ライブラリ モデルの [コンフィギュレーション パラメーター] ダイアログ ボックスでカスタム コードを定義する必要があります。その後、ライブラリ内のブロックでコードを使用し、他のモデルでそのライブラリからそのブロックを取得します。
詳細については、[カスタム コード設定を構成します] を参照してください。
Simulink でのランタイム エラーと警告のレポート
C Function ブロックで指定するカスタム C コードで、関数 slError と slWarning を使用して、ランタイム エラーと警告をそれぞれレポートします。エラーが発生するとシミュレーションが終了します。シミュレーションを続行する前にエラーを解決する必要があります。警告はコードに潜在的な問題があることを示しますが、シミュレーションは終了しません。
関数 slError と slWarning はどちらも、C と似た各種データ型書式指定子 (たとえば、整数の場合は %d 、浮動小数点の場合は %f ) をサポートしています。
次に例を示します。
slError("Error message");slError("Input %f should be non-negative", x);slWarning("Warning message");slWarning("Input %d should be non-zero", y);
次のコードがシミュレーションの開始時に実行されます。関数 slError を使用して、シミュレーションの開始時にデータ ストアの初期化に失敗した場合にエラー メッセージを出します。

カスタム コードで行優先および列優先の配列レイアウトを指定
slSetRowMajor 関数と slSetColumnMajor 関数を使用して、それぞれ行優先と列優先の配列レイアウトを指定します。これらの関数は、[コンフィギュレーション パラメーター] ダイアログ ボックスの [シミュレーション ターゲット] ペインで指定します。C Function ブロックのダイアログ ボックスから [コンフィギュレーション パラメーター] ダイアログ ボックスにアクセスするには、[カスタム コード設定を構成します]
パラメーターを [コンフィギュレーション パラメーターのカスタム コードを使用] に設定します。
行優先レイアウトでは、行列の行要素がメモリに連続して格納されます。同様に、列優先レイアウトでは、行列の列要素がメモリに連続して格納されます。詳細については、行優先および列優先の配列レイアウト (MATLAB Coder)を参照してください。
[カスタム コード設定を構成します]
パラメーターを [コンフィギュレーション パラメーターのカスタム コードを使用] に設定すると、ブロックでは、シミュレーションとコード生成のどちらにおいても行優先と列優先の両方の構成を使用できます。
[カスタム コード設定を構成します]
パラメーターを [ブロックのカスタム コードを使用] に設定すると、ブロックでは、シミュレーションに行優先、コード生成に列優先を使用します。
関数プロトタイプ:
void slSetRowMajor(const char* functionName)void slSetColumnMajor(const char* functionName)
functionName は文字列リテラルでなければならず、完全修飾されている必要があります。
たとえば、以下のコードについて考えます。
namespace NS1 { class ACLASS{ public: void foo_row(); }; namespace NS2{ void foo_col(double*, double*); } }
完全修飾関数名については、次のとおりです。
関数が名前空間内にある場合は、入れ子にされたすべての名前空間が関数名 string に含まれている必要があります。上記のコードに基づくと、列優先関数
foo_colの場合、コンフィギュレーション パラメーターのカスタム コードでslSetColumnMajor("NS1::NS2::foo_col")を使用します。すべてのクラス メンバーについて、クラス名と入れ子にされた名前空間が関数名 string に含まれている必要があります。上記のコードに基づくと、行優先関数
foo_rowの場合、コンフィギュレーション パラメーターのカスタム コードでslSetRowMajor("NS1::ACLASS::foo_row")を使用します。
クラスを使用する C Function ブロックでは、コンストラクターで優先方向を受け取る場合、優先方向を [開始] コードで指定する必要があります。
例
制限
C Function ブロックで Simulink の次の機能を使用する場合、制限が適用されます。
一般的な制限事項
以下はすべての Simulink バージョンに適用される一般的な制限事項です。
R2025a 以降では、コード カバレッジがサポートされます。
R2025a より前のバージョンでは、Simulink Coverage™ はサポートされていません。C Function ブロックの実行カバレッジのみが計測されます。
Simulink Design Verifier™
Simulink Design Verifier は C Function ブロック内のカバレッジ オブジェクティブのテスト ケースを生成しません。C/C++ S-Function に適用される制限は C Function ブロックの C/C++ コードにも適用されます。特に、外部関数またはライブラリ関数の呼び出しは分析のためにスタブに置き換えられます。これらの制限の詳細については、S-Function と C/C++ コードに対する Simulink Design Verifier の制限事項と考慮事項 (Simulink Design Verifier)を参照してください。
Simulink Code Inspector™
Simulink Code Inspector は、C Function ブロックから生成されたコードを検査しません。
ローカル カスタム コードを使用する C Function ブロックは、Dataflow Subsystem (DSP System Toolbox) 内ではサポートされていません。
C および C++言語の制限事項
以下の制限事項は、R2025b 以前のバージョンの C Function ブロックで指定する C および C++ コードに適用されます。以下のブロック設定の場合は、R2026a 以降のバージョンにもこれらの制限が適用されます。
[カスタム コード設定を構成します]
パラメーターが [コンフィギュレーション パラメーターのカスタム コードを使用]に設定されている。[カスタム コード設定を構成します]
パラメーターが [ブロックのカスタム コードを使用]に設定され、[ブロック コードの解析 (下位互換性を有効にする)] パラメーターが選択されている。
メモ
これらの制限は、R2026a 以降のバージョンにおいて、既定の設定の C Function ブロックで指定した C/C++ コードには適用されません。既定の設定は、[カスタム コード設定を構成します]
パラメーターが [ブロックのカスタム コードを使用] に設定され、[ブロック コードの解析 (下位互換性を有効にする)] パラメーターが選択されていない場合に適用されます。
C Function ブロックが上記の制限の条件に当てはまる場合、ブロックは以下の C 数学ライブラリ関数のみをサポートします。
abs | acos | asin | atan | atan2 | ceil |
cos | cosh | exp | fabs | floor | fmod |
labs | ldexp | log | log10 | pow | sin |
sinh | sqrt | tan | tanh |
これらの関数を呼び出すとき、すべての入力引数が明示的に単精度でなければ、倍精度が適用されます。型の不一致が発生した場合、必要な型に入力引数をキャストすると、元の引数が置換されます。たとえば、関数 sin を整数の引数で呼び出した場合は、入力引数を double 型の浮動小数点数にキャストすることで、元の引数が置換されます。
R2025a 以降のバージョンを使用している場合、C function ブロック内で以下の文字列ライブラリ関数を呼び出すことができます。
strlen | strncpy | strncat | strcmp | strncmp | strstr |
詳細については、Use Simulink Strings Inside C Function Block to Model Scrolling Displayを参照してください。
その他の C ライブラリ関数を呼び出すには、その C ライブラリ関数を呼び出す外部ラッパー関数を作成して呼び出します。
abs、fabs、labs 関数C Function ブロックでの関数 abs、fabs および labs の解釈は、以下に示す整数および浮動小数点の引数に対応している点で標準的な C バージョンよりも優れています。
xが整数の場合、標準 C 関数absはxに適用され、abs(x)となります。xが double の場合、標準 C 関数labsはxに適用され、labs(x)となります。xが single の場合、標準 C 関数fabsはxに適用され、fabs(x)となります。
関数の呼び出しでは、関数に渡されるデータ型に基づいて正しい CRL が呼び出されます。CRL が指定されない場合、関数の呼び出しで型固有のライブラリが呼び出されます。C99 の CRL は、型固有の関数を生成します。以下に例を示します。
| 渡される型 | コード生成の呼び出し |
|---|---|
sin(doubleIn) | sin(doubleIn) |
sin(floatIn) | sinf(floatIn) |
R2023a 以降のバージョンを使用している場合、C Function ブロックで printf、memcpy、および memset 関数を呼び出すことができます。
staticキーワードを使用するローカルの静的変数はサポートされません。タイム ステップを超えて値をキャッシュするには、シンボルをブロック ダイアログ ボックスの [シンボル] テーブルで[Persistent]として定義します。[Constant]シンボルのアドレスを取ることはサポートされません。C ライブラリ関数にリストされている C 数学ライブラリ関数以外の C ライブラリ関数を直接呼び出すことはサポートされません。その他の C ライブラリ関数を呼び出すには、その C ライブラリ関数を呼び出すラッパー関数を作成して呼び出します。
端子
入力
出力
パラメーター
ブロックの特性
ヒント
インポートされた型が C++ 名前空間で定義されている場合は、次のいずれかのオプションを使用します。
Simulink.importExternalCTypes関数のSimulinkTypeAliasHeader引数を使用して、インポートされたヘッダー ファイルの型シグネチャに対応する型エイリアスを含む型エイリアス ヘッダーを生成します。次に、[シミュレーションのカスタム コード] タブの [ヘッダー] セクションで、生成したヘッダー ファイルを指定します。詳細については、SimulinkTypeAliasHeaderを参照してください。Simulink.importExternalCTypes関数のUseFullyQualifiedName引数を使用して、一意の型名で型を再インポートします。たとえば、異なる名前空間に定義されている同じ型をインポートする場合に、この引数を使用できます。詳細については、UseFullyQualifiedNameを参照してください。Simulink.importExternalCTypes関数のDataDictionarySection引数を使用して、ヘッダーから Simulink データ ディクショナリの [Architectural Data] セクションに型をインポートします。型をインポートすると、その対応する名前空間が自動的に同期されます。ただし、1 つの名前空間に同じ名前の型を 2 つインポートすることはできません。詳細については、DataDictionarySectionを参照してください。






