Проверка достоверности параметров S-функции C MEX
Нет
C, C++
#define MDL_CHECK_PARAMETERS void mdlCheckParameters(SimStruct *S)
S SimStruct представляет S-функциональный блок.
Проверка новых параметров при каждом изменении или переоценке параметров во время моделирования. Если у вас есть Simulink ® Coder™, для C MEX S-функций этот метод допустим только для моделирования и должен быть заключен в #if defined(MATLAB_MEX_FILE) чтобы быть совместимым с целевыми объектами генерации кода, поддерживающими неинлинированные S-функции.
При выполнении моделирования изменения параметров S-функции могут произойти в любое время во время цикла моделирования, то есть либо в начале этапа моделирования, либо во время этапа моделирования. Когда изменение происходит во время этапа моделирования, модуль Simulink дважды вызывает эту подпрограмму для обработки изменения параметра. Первый вызов на этапе моделирования используется для проверки правильности параметров. После проверки новых параметров моделирование продолжается с использованием исходных значений параметров до следующего этапа моделирования, на котором используются новые значения параметров. Для обеспечения согласованности моделирования необходимы избыточные вызовы.
Примечание
В этой подпрограмме невозможно получить доступ к работе, состоянию, входу, выходу и другим векторам. Эта процедура используется только для проверки параметров. Дополнительная обработка параметров должна быть выполнена в mdlProcessParameters.
В этом примере проверяется первый параметр S-функции, чтобы убедиться, что он является действительным неотрицательным скаляром.
Примечание
С тех пор mdlCheckParameters является необязательным методом, а #define MDL_CHECK_PARAMETERS оператор предшествует функции. Кроме того, поскольку продукт Simulink Coder не поддерживает генерацию кода для mdlCheckParameters, функция заключена в #if defined(MATLAB_MEX_FILE) заявление.
#define PARAM1(S) ssGetSFcnParam(S,0)
#define MDL_CHECK_PARAMETERS /* Change to #undef to remove function */
#if defined(MDL_CHECK_PARAMETERS) && defined(MATLAB_MEX_FILE)
static void mdlCheckParameters(SimStruct *S)
{
if (mxGetNumberOfElements(PARAM1(S)) != 1) {
ssSetErrorStatus(S,"Parameter to S-function must be a scalar");
return;
} else if (mxGetPr(PARAM1(S))[0] < 0) {
ssSetErrorStatus(S, "Parameter to S-function must be nonnegative");
return;
}
}
#endif /* MDL_CHECK_PARAMETERS */
В дополнение к предыдущей подпрограмме необходимо добавить вызов этого метода из mdlInitializeSizes для проверки параметров во время инициализации, поскольку mdlCheckParameters вызывается только во время выполнения моделирования. Для этого после установки ожидаемого количества параметров в S-функции с помощью ssSetNumSFcnParams, используйте этот код в mdlInitializeSizes:
static void mdlInitializeSizes(SimStruct *S)
{
ssSetNumSFcnParams(S, 1); /* Number of expected parameters */
#if defined(MATLAB_MEX_FILE)
if(ssGetNumSFcnParams(S) == ssGetSFcnParamsCount(S) {
mdlCheckParameters(S);
if(ssGetErrorStatus(S) != NULL) return;
} else {
return; /* The Simulink engine reports a mismatch error. */
}
#endif
...
}
Примечание
Макрос ssGetSFcnParamsCount возвращает фактическое количество параметров, введенных в диалоговом окне.
Посмотрите sfun_errhdl.c например.