Проверяйте валидность MEX C параметры S-функции
Нет
C, C++
#define MDL_CHECK_PARAMETERS void mdlCheckParameters(SimStruct *S)
S
SimStruct, представляющий Блок s-function.
Проверяет новые установки параметров каждый раз, когда параметры изменяются или переоценены во время симуляции. Если у вас есть Simulink® Coder™ для S-функций MEX C, этот метод только допустим для симуляции и должен быть заключен в оператор #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
для примера.