Задайте количество входов, выходов, состояний, параметров и других характеристик 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
.
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 */