Проверьте законность 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
для примера.