Задайте количество входных параметров, выходных параметров, состояний, параметров и других характеристик 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
, используется в mdlOutputs
или mdlGetTimeOfNextVarHit
стандартная программа. Установка прямого проходного флага к 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
метод, доступный только для MATLAB® Файл MEX. Если S-функция не встраивается, продукт Simulink Coder не может использовать этот метод, приводящий к ссылке или ошибкам времени выполнения.
Можно установить параметры NumContStates
, NumDiscStates
, NumInputs
numOutputs
, NumRWork
, NumIWork
, NumPWork
, NumModes
, и NumNonsampledZCs
до фиксированного неотрицательного целого числа или говорят механизму Simulink измерять их динамически:
DYNAMICALLY_SIZED
- Длины наборов состояний, работайте векторы, и так далее к значениям, наследованным от ведущего блока. Это устанавливает ширины на фактические входные ширины, согласно скалярным правилам расширения, если вы не используете mdlSetWorkWidths
установить ширины.
0 или положительное число - длины Наборов (или ширины) к заданным значениям.
Значением по умолчанию является 0
.
Уровень 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 */