Укажите количество входов, выходов, состояний, параметров и других характеристик S-функции C MEX
Да
C, C++
#define MDL_INITIAL_SIZES
void mdlInitializeSizes(SimStruct *S)
S
SimStruct представляет S-функциональный блок.
Это первые S-функциональные методы обратного вызова, которые вызывает модуль Simulink ®. Этот метод выполняет следующие задачи:
Укажите количество параметров, поддерживаемых этой S-функцией, используя ssSetNumSFcnParams.
Использовать ssSetSFcnParamTunable(S,paramIdx, 0) когда параметр не может изменяться во время моделирования, где paramIdx начинается в 0. Если параметр указан как не настраиваемый, модуль выдает ошибку во время моделирования (или во внешнем режиме при использовании продукта 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.
Установите количество выборок (т.е. частоты выборок), с которым работает блок.
Существует два способа определения времени выборки:
Время выборки на основе порта
Время выборки на основе блоков
Полное обсуждение проблем времени выборки см. в разделе Определение времени выборки S-функции.
Для многоскоростных 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 define оператор делает mdlInitializeSizes метод доступен только для файла MATLAB ® MEX. Если S-функция не встроена, продукт Simulink Coder не может использовать этот метод, что приводит к ошибкам связи или времени выполнения.
Можно задать параметры NumContStates, NumDiscStates, NumInputs, NumOutputs, NumRWork, NumIWork, NumPWork, NumModes, и NumNonsampledZCs фиксированному неотрицательному целому числу или указывающему движку Simulink динамически масштабировать их:
DYNAMICALLY_SIZED - Устанавливает длины состояний, рабочих векторов и т. д. для значений, унаследованных от управляющего блока. Он устанавливает ширину на фактическую входную ширину в соответствии со скалярными правилами расширения, если вы не используете mdlSetWorkWidths для задания ширины.
0 или положительное число - задает значения длины (или ширины). Значение по умолчанию: 0.
S-функция Level-2 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 */