Задайте количество входных параметров, выходных параметров, состояний, параметров и других характеристик 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 метод, доступный только для файла MEX MATLAB®. Если S-функция не встраивается, продукт Simulink Coder не может использовать этот метод, приводящий к ссылке или ошибкам времени выполнения.
Можно установить параметры NumContStates, NumDiscStates, NumInputsnumOutputs , 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 */