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