mdlInitializeSizes

Задайте количество входов, выходов, состояний, параметров и других характеристик S-функции C MEX

Необходимый

Да

Языки

C, C++

Синтаксис

#define MDL_INITIAL_SIZES
void mdlInitializeSizes(SimStruct *S)

Аргументы

S

SimStruct, представляющий блок S-Function.

Описание

Это первые методы коллбэка S-функции, которые Simulink® вызовы двигателя. Этот метод выполняет следующие задачи:

  • Укажите количество параметров, которые поддерживает эта S-функция, используя ssSetNumSFcnParams.

    Использование ssSetSFcnParamTunable(S,paramIdx, 0) когда параметр не может измениться во время симуляции, где paramIdx начинается с 0. Когда параметр был задан как не настраиваемый, двигатель выдает ошибку во время симуляции (или когда во режиме external mode при использовании Coder™ продукта Simulink), если предпринята попытка изменить параметр.

  • Задайте количество состояний, которые эта функция имеет, используя ssSetNumContStates и ssSetNumDiscStates.

  • Сконфигурируйте входные порты блока, включая:

    • Укажите количество входа портов, которые есть у этой S-функции, используя ssSetNumInputPorts.

    • Задайте размерности входных портов.

      Посмотрите ssSetInputPortDimensionInfo для получения дополнительной информации.

    • Для каждого входного порта задайте, имеет ли он прямое сквозное соединение, используя ssSetInputPortDirectFeedThrough.

      Порт имеет прямое сквозное соединение, если вход используется в mdlOutputs или mdlGetTimeOfNextVarHit функция. Флаг прямой передачи для каждого входного порта может быть установлен на любое 1=yes или 0=no. Оно должно быть установлено равным 1, если вход, u, используется в mdlOutputs или mdlGetTimeOfNextVarHit стандартная программа. Установка флага прямой передачи равного 0 говорит движку Simulink, что u не используется ни в одной из этих стандартных программ S-функций. Нарушение этого приводит к непредсказуемым результатам.

  • Сконфигурируйте выходные порты блока, включая:

    • Укажите количество портов выхода, которое имеет блок, используя ssSetNumOutputPorts.

    • Задайте размерности выходных портов.

      Посмотрите mdlSetOutputPortDimensionInfo для получения дополнительной информации.

    Если ваши выходы S-функции дискретны (для примера выходов принимаете только определенные значения, такие как 0, 1 и 2), задайте SS_OPTION_DISCRETE_VALUED_OUTPUT.

  • Установите количество шагов расчета (т.е. частот дискретизации), при которых работает блок.

    Существует два способа определения шагов расчета:

    • Основанные на порте шаги расчета

    • Основанные на блоках шаги расчета

    Полное обсуждение шага расчета вопросов смотрите в Шаги расчета Specify S-Function.

    Для многоразовых S-функций предлагаемый подход к установке шагов расчета осуществляется с помощью основанного на порте метода шагов расчета. Когда вы создаете многократную S-функцию, вы должны позаботиться о том, чтобы убедиться, что, когда более медленные задачи вытесняются, ваша S-функция правильно управляет данными, чтобы избежать условий гонки. Когда заданы шаги расчета на основе портов, блок не может наследовать время расчета Inf в любом порте.

  • Установите размер рабочих векторов блока, используя ssSetNumRWork, ssSetNumIWork, ssSetNumPWork, ssSetNumModes, ssSetNumNonsampledZCs.

  • Установите опции симуляции, которые реализует этот блок, используя ssSetOptions.

    Все опции имеют форму SS_OPTION_<name>. Информацию по каждой опции см. в разделе Настройка функций C/C + + S-Function. Используйте побитовое OR оператор, чтобы задать несколько опций, как в

    ssSetOptions(S, (SS_OPTION_name1 | SS_OPTION_name2))
    

Примечание

Если у вас есть Simulink Coder, при генерации кода для нелинейной S-функции, которая содержит этот метод, убедитесь, что метод не упакован в #if defined(MATLAB_MEX_FILE) оператор. Для примера:

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

The define оператор делает mdlInitializeSizes метод, доступный только для MATLAB® Файл MEX. Если S-функция не встроена, продукт Simulink Coder не может использовать этот метод, что приводит к ошибкам ссылки или времени выполнения.

Динамический размер Функций

Можно задать параметры NumContStates, NumDiscStates, NumInputs, NumOutputs, NumRWork, NumIWork, NumPWork, NumModes, и NumNonsampledZCs фиксированному неотрицательному целому числу или сообщите движку Simulink об их динамическом размере:

  • DYNAMICALLY_SIZED - Устанавливает длины состояний, рабочих векторов и так далее на значения, унаследованные от ведущего блока. Он устанавливает ширины к фактическим входным ширинам, согласно правилам скалярного расширения, если вы не используете mdlSetWorkWidths для задания ширины.

  • 0 или положительное число -- Устанавливает длины (или ширины) заданные значения. Значение по умолчанию является 0.

Инициализация для S-функций MATLAB

Level-2 S-функция MATLAB setup метод выполняет почти те же задачи, что и S-функция C MEX mdlInitializeSizes способ.

Пример

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