mdlInitializeSizes

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

Необходимый

Да

Языки

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 при использовании продукта Simulink Coder™), если попытка предпринята, чтобы изменить параметр.

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

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

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

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

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

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

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

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

    • Задайте количество выходных портов, которые блок имеет, с помощью ssSetNumOutputPorts.

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

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

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

  • Определите номер частот дискретизации (i. e., частоты дискретизации), в котором действует блок.

    Существует два способа задать частоты дискретизации:

    • Основанные на порте частоты дискретизации

    • Основанные на блоке частоты дискретизации

    Смотрите Задают Частоты дискретизации S-функции для полного обсуждения проблем частоты дискретизации.

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

  • Установите размер векторов работы блока, с помощью ssSetNumRWork, ssSetNumIWork, ssSetNumPWork, ssSetNumModes, ssSetNumNonsampledZCs.

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

    Все опции имеют форму SS_OPTION_<name>. Смотрите Конфигурируют Функции S-функции C/C++ информации о каждой опции. Используйте поразрядный оператор 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 

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

Динамически измеренные блочные функции

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

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

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

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

Уровень 2 S-функция MATLAB метод setup выполняет почти те же задачи как S-функция MEX C метод 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 */

Смотрите также

setup, mdlInitializeSampleTimes

Представлено до R2006a

Была ли эта тема полезной?