メインコンテンツ

mdlInitializeSizes

C MEX S-Function の入力、出力、状態、パラメーター、およびその他の特性の数を指定する

必須

はい

言語

C、C++

構文

#define MDL_INITIAL_SIZES
void mdlInitializeSizes(SimStruct *S)

引数

S

S-Function ブロックを表す SimStruct。

説明

これは、Simulink® エンジンが呼び出す最初の S-Function コールバック メソッドです。このメソッドで実行されるタスクは次のとおりです。

  • ssSetNumSFcnParams を使用して、この S-Function でサポートされるパラメーターの数を指定する。

    パラメーターをシミュレーション中に変更することができない場合は ssSetSFcnParamTunable(S,paramIdx, 0) を使用します。ここで、paramIdx0 から始まります。パラメーターが調整不可として指定されている場合にパラメーターの変更が試行されると、エンジンはシミュレーション中 (Simulink Coder™ 製品を使用している場合はエクスターナル モードのとき) にエラーを発行します。

  • ssSetNumContStatesssSetNumDiscStates を使用して、この関数の状態の数を指定する。

  • ブロックの入力端子について次の構成を行う:

    • ssSetNumInputPorts を使用して、この S-Function の入力端子の数を指定する。

    • 入力端子の次元を指定する。

      詳細については、ssSetInputPortDimensionInfo を参照してください。

    • 各入力端子に対して、ssSetInputPortDirectFeedThrough を使用して、直達をもつかどうかを指定する。

      入力が mdlOutputs 関数または mdlGetTimeOfNextVarHit 関数のいずれかで使用されている場合、その端子は直達をもちます。各入力端子の直達のフラグは 1=yes または 0=no に設定できます。入力 umdlOutputs ルーチンまたは mdlGetTimeOfNextVarHit ルーチンで使用されている場合は 1 に設定しなければなりません。直達のフラグを 0 に設定すると、u がそれらの S-Function ルーチンのいずれにも使用されないことが Simulink エンジンに伝えられます。これに違反すると、予期しない結果につながることがあります。

  • ブロックの出力端子について次の構成を行う:

    S-Function の出力が離散の場合 (たとえば、出力が 0、1、2 などの特定の値のみを取る場合)、SS_OPTION_DISCRETE_VALUED_OUTPUT を指定します。

  • ブロックが動作するサンプル時間の数 (つまりサンプル レート) を設定する。

    サンプル時間を指定する方法は 2 つあります。

    • 端子ベースのサンプル時間

    • ブロックベースのサンプル時間

    サンプル時間の問題の詳細については、Specify S-Function Sample Timesを参照してください。

    マルチレート S-Function の場合、サンプル時間を設定する方法として端子ベースのサンプル時間の方式が推奨されます。マルチレート S-Function を作成する際は、より低速のタスクがプリエンプトされるときに競合状態が発生しないように、S-Function でデータが正しく管理されることを慎重に検証する必要があります。端子ベースのサンプル時間が指定されている場合、ブロックはいずれの端子でもサンプル時間 Inf を継承できません。

  • ssSetNumRWorkssSetNumIWorkssSetNumPWorkssSetNumModesssSetNumNonsampledZCs を使用して、ブロックの作業ベクトルのサイズを設定する。

  • ssSetOptions を使用して、このブロックで実装するシミュレーション オプションを設定する。

    オプションの形式はいずれも SS_OPTION_<name> です。各オプションの詳細については、C/C++ S-Function 機能の構成を参照してください。複数のオプションを設定するには、次のようにビット単位 OR 演算子を使用します。

    ssSetOptions(S, (SS_OPTION_name1 | SS_OPTION_name2))
    

メモ

Simulink Coder を所有している場合、このメソッドを含むインラインでない S-Function のコードを生成する際は、メソッドが #if defined(MATLAB_MEX_FILE) ステートメントでラップされていないことを確認してください。以下に例を示します。

#if defined(MATLAB_MEX_FILE) 
static void mdlInitializeSizes(SimStruct *S) 
{ 
   /* Add mdlInitializeSizes code here *
} 
#endif 

define ステートメントでは、mdlInitializeSizes メソッドを MATLAB® MEX ファイルでのみ使用できるようにします。S-Function がインライン化されていない場合、Simulink Coder 製品はこのメソッドを使用できず、リンク エラーまたはランタイム エラーが発生します。

動的にサイズが変化するブロック機能

パラメーター NumContStatesNumDiscStatesNumInputsNumOutputsNumRWorkNumIWorkNumPWorkNumModesNumNonsampledZCs については、固定の非負の整数に設定するか、それらのサイズを動的に設定するように Simulink エンジンに指示できます。

  • DYNAMICALLY_SIZED -- 状態や作業ベクトルなどの長さを駆動ブロックから継承される値に設定します。幅については、mdlSetWorkWidths を使用して幅を設定していない限り、スカラー拡張ルールに従って実際の入力幅に設定されます。

  • 0 または正の数値 -- 長さ (または幅) を指定された値に設定します。既定の設定は 0 です。

MATLAB S-Function の初期化

C MEX S-Function の mdlInitializeSizes メソッドとほぼ同じタスクが Level-2 MATLAB S-Function の setup メソッドで実行されます。

static void mdlInitializeSizes(SimStruct *S)
{
    int_T nInputPorts  = 1;  /* number of input ports  */
    int_T nOutputPorts = 1;  /* number of output ports */
    int_T needsInput   = 1;  /* direct feedthrough     */

    int_T inputPortIdx  = 0;
    int_T outputPortIdx = 0;

    ssSetNumSFcnParams(S, 0);  /* Number of expected parameters */
    if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
        /*
         * If the number of expected input parameters is not
         * equal to the number of parameters entered in the 
         * dialog box, return. The Simulink engine generates an
         * error indicating that there is aparameter mismatch.
         */
        return;
    }else {
		     mdlCheckParameters(S);

		     if (ssGetErrorStatus(S) != NULL)
		        return;
	   }


    ssSetNumContStates(    S, 0);
    ssSetNumDiscStates(    S, 0);


    /*
     * Configure the input ports. First set the number of input
     * ports. 
     */
    if (!ssSetNumInputPorts(S, nInputPorts)) return;    
    /*
     * Set input port dimensions for each input port index 
     * starting at 0.

    */
     if(!ssSetInputPortDimensionInfo(S, inputPortIdx,
        DYNAMIC_DIMENSION)) return;
    /*
     * Set direct feedthrough flag (1=yes, 0=no).
     */
    ssSetInputPortDirectFeedThrough(S, inputPortIdx, needsInput);

    /*
     * Configure the output ports. First set the number of 
     * output ports.
     */
    if (!ssSetNumOutputPorts(S, nOutputPorts)) return;

    /*
     * Set output port dimensions for each output port index 
     * starting at 0.
     */
    if(!ssSetOutputPortDimensionInfo(S,outputPortIdx,
        DYNAMIC_DIMENSION)) return;

    /*
     * Set the number of sample times.     */
    ssSetNumSampleTimes(S, 1);   

    /*
     * Set size of the work vectors.
     */
    ssSetNumRWork(S, 0);   /* real vector    */
    ssSetNumIWork(S, 0);   /* integer vector */
    ssSetNumPWork(S, 0);   /* pointer vector */
    ssSetNumModes(S, 0);   /* mode vector    */
    ssSetNumNonsampledZCs(S, 0);   /* zero crossings */

    ssSetOptions(S, 0);

} /* end mdlInitializeSizes */

バージョン履歴

R2006a より前に導入