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