C Function
ライブラリ:
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 とはを参照してください。
カスタム コード設定を構成します。パラメーターのオプションを使用して、C Function ブロックによって呼び出すソース コードとサポート ファイルを定義します。
メモ
Simulink へのカスタム C コード統合でサポートされる C 言語の標準バージョンは C99 です。
C ライブラリ関数の呼び出し
C Function ブロックから以下の C Math Library 関数を直接呼び出すことができます。
abs | acos | asin | atan | atan2 | ceil |
cos | cosh | exp | fabs | floor | fmod |
labs | ldexp | log | log10 | pow | sin |
sinh | sqrt | tan | tanh |
これらの関数を呼び出すとき、すべての入力引数が明示的に単精度でなければ、倍精度が適用されます。型の不一致が発生した場合、必要な型に入力引数をキャストすると、元の引数が置換されます。たとえば、関数 sin
を整数の引数で呼び出した場合は、入力引数を double
型の浮動小数点数にキャストすることで、元の引数が置換されます。
その他の 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) |
C Function ブロックでは関数 printf
、memcpy
、および memset
を呼び出すことができます。 (R2023a 以降)
Simulink でのランタイム エラーと警告のレポート
R2024a 以降
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
を使用して、シミュレーションの開始時にデータ ストアの初期化に失敗した場合にエラー メッセージを出します。
カスタム コードで行優先および列優先の配列レイアウトを指定
R2024a 以降
カスタム コードで関数 slSetRowMajor
と slSetColumnMajor
を使用して、それぞれ行優先と列優先の配列レイアウトを指定します。
行優先レイアウトでは、行列の行要素がメモリに連続して格納されます。同様に、列優先レイアウトでは、行列の列要素がメモリに連続して格納されます。詳細については、行優先および列優先の配列レイアウト (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 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 Code Inspector™
Simulink Code Inspector は、C Function ブロックから生成されたコードを検査しません。
C Function ブロックで指定する C コードには次の制限が適用されます。
static
キーワードを使用するローカルの静的変数はサポートされません。タイム ステップを超えて値をキャッシュするには、シンボルをブロック ダイアログ ボックスの [シンボル] テーブルで[Persistent]
として定義します。[Constant]
シンボルのアドレスを取ることはサポートされません。前述の「C Library 関数の呼び出し」にリストされている C Math Library 関数以外の C ライブラリ関数を直接呼び出すことはサポートされません。その他の C ライブラリ関数を呼び出すには、その C ライブラリ関数を呼び出すラッパー関数を作成して呼び出します。
ローカル カスタム コードを使用する C Function ブロックは、Dataflow Subsystem (DSP System Toolbox) 内ではサポートされていません。