exponenta event banner

mdlInitializeSizes

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

Необходимый

Да

Языки

C, C++

Синтаксис

#define MDL_INITIAL_SIZES
void mdlInitializeSizes(SimStruct *S)

Аргументы

S

SimStruct представляет S-функциональный блок.

Описание

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

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

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

  • Укажите количество состояний, которые имеет эта функция, используя 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.

  • Установите количество выборок (т.е. частоты выборок), с которым работает блок.

    Существует два способа определения времени выборки:

    • Время выборки на основе порта

    • Время выборки на основе блоков

    Полное обсуждение проблем времени выборки см. в разделе Определение времени выборки S-функции.

    Для многоскоростных 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 

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

Элементы блока динамического размера

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

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

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

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

S-функция Level-2 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