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