Main Content

インラインでない S-Function の記述

インラインでない S-Function は、Simulink® エンジンおよび生成コードによって同一のものとして処理される C または C++ MEX S-Function です。アルゴリズムは S-Function API に従って 1 回実装します。Simulink エンジンおよび生成コードは、モデルの実行中に S-Function ルーチン (mdlOutputs など) を呼び出します。

インラインでない S-Function は、S-Function の sfunction.tlc ファイルが存在しないことによって識別されます。ファイル名はプラットフォームによって異なります。たとえば、64 ビットの Microsoft® Windows® システムの場合、ファイル名は sfunction.mexw64 です。MATLAB® コマンド ウィンドウで mexext と入力し、お使いのシステムで使用されている拡張子を確認します。

インラインでない S-Function の記述に関するガイドライン

  • MEX ファイルは MATLAB 関数を呼び出せません。

  • MEX ファイルで MATLAB 外部インターフェイス ライブラリの関数を使用する場合は、mex.h または simulink.c の代わりにヘッダー ファイル cg_sfun.h を含めます。ヘッダー ファイル cg_sfun.h の場合、S-Function の末尾に次の行を含めます。

    #ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
    #include "simulink.c"  /* MEX-file interface mechanism */
    #else
    #include "cg_sfun.h"   /* Code generation registration function */
    #endif
  • コード ジェネレーターがサポートする MATLAB API 関数のみを使用します。サポートされている API 関数は次のとおりです。

    • mxGetDoubles

    • mxGetEps

    • mxGetInf

    • mxGetM

    • mxGetN

    • mxGetNaN

    • mxGetPr (推奨されません。代わりに mxGetDoubles を使用してください。)

    • mxGetScalar

    • mxGetString

    • mxIsEmpty

    • mxIsFinite

    • mxIsInf

  • MEX ライブラリの呼び出しは、生成コードでサポートされません。生成コードではなく MEX ファイルでこのような呼び出しを使用するには、次の条件を付けます。

    #ifdef MATLAB_MEX_FILE
    #endif
  • 実際のデータのみを含んでいる非スパース行列だけを使用します。

  • 関数 mxGetString の呼び出しに戻り値を指定しないでください。戻り値を指定すると、MEX ファイルがコンパイルされません。代わりに、関数の 2 番目の入力引数を使用します。これは文字ベクトルにポインターを返します。

  • 正しい #define s-function_name ステートメントを使用します。指定する S-Function の名前は、S-Function のファイル名と一致していなければなりません。

  • 可能であれば、データ型は doubleint ではなく real_Tint_T を使用してください。データ型 real_T および int_T はより一般的で、複数の環境で使用することが可能です。

  • S-Function の作成に使用するモジュールの名前を含めてビルド プロセスを行います。テンプレート make ファイル、関数 set_param または S-Function ブロック パラメーター ダイアログ ボックスの S-function modules フィールドを使用します。たとえば、このコマンドで S-Function をビルドするとします。

    mex sfun_main.c sfun_module1.c sfun_module2.c

    続いて、次の set_param の呼び出しを使用して必要とされるモジュールを含めます。

    set_param(sfun_block, "SFunctionModules","sfun_module1 sfun_module2")

    コードを生成する準備ができたら、コード ジェネレーターで最上位モデルを強制的にリビルドします。詳細については、最上位モデル コードの再生成の制御を参照してください。

インラインでない S-Function パラメーターのタイプについての制約

インラインでない S-Function パラメーターには次のタイプがあります。

  • 倍精度

  • スカラー、ベクトルまたは 2 次元行列の文字列

S-Function や S-Function での演算に指定できるパラメーターにより柔軟性をもたせるには、S-Function をインライン化し、mdlRTW S-Function ルーチンを使用することを検討してください。

MATLAB matrix.h API やその他の mex.hmat.h などの MATLAB API からの他の関数の使用はサポートされていません。S-Function ソース ファイルからサポートされていない API を呼び出すと、コンパイラ エラーが発生します。サポートされている MATLAB API 関数の詳細については、ファイル matlabroot/rtw/c/src/rt_matrx.h および matlabroot/rtw/c/src/rt_matrx.c を参照してください。

空の行列で関数 mxGetPr を使用すると、関数は NULL を返しません。これは乱数値を返します。そのため、mxIsEmpty を使用して mxGetPr の呼び出しを保護しなければなりません。

関連するトピック