При работе с S-функциями важно правильно обрабатывать неожиданные события, такие как недопустимые значения параметров.
Если ваша функция C MEX S имеет параметры, содержимое которых необходимо проверить, используйте следующий метод, чтобы сообщить об ошибках.
ssSetErrorStatus
(S,"Error encountered due to ...");
return;
В большинстве случаев Simulink® в программе Diagnostic Viewer отображаются ошибки. Если ошибка встречается в mdlCheckParameters
когда параметры S-функции вводятся в диалоговое окно блока, механизм открывает диалоговое окно ошибки, показанное ниже. В любом случае механизм отображает сообщение об ошибке вместе с именем S-функции и связанного с ней блока s-function, который вызвал ошибку.
Второй аргумент в ssSetErrorStatus
должна быть постоянной памятью. Это не может быть локальная переменная в вашей функции. Для примера следующее вызывает непредсказуемые ошибки.
mdlOutputs() { char msg[256]; /* ILLEGAL: should be "static char */ /*msg[256];"*/ sprintf(msg,"Error due to %s", string); ssSetErrorStatus(S,msg); return; }
Потому что ssSetErrorStatus
не генерирует исключения, использование его для сообщения об ошибках в вашей S-функции предпочтительнее, чем использование mexErrMsgTxt
. The mexErrMsgTxt
функция использует обработку исключений, чтобы завершить выполнение S-функции. Чтобы поддержать обработку исключений в S-функциях, механизм Simulink должен настроить обработчики исключений до каждого вызова S-функции. Это вводит накладные расходы в симуляцию.
Можно избежать накладных расходов на симуляцию, гарантируя, что ваша функция C MEX S-function полностью содержит код, свободный от исключений. Бесплатный код исключения относится к коду, который никогда не скачет в длину. Ваша S-функция не является свободной от исключений, если она содержит любую стандартную программу, которая при вызове имеет потенциал прыжков в длину. Для примера, mexErrMsgTxt
выдает исключение (т.е. длинные скачки) при вызове, таким образом завершая выполнение вашей S-функции. Использование mxCalloc
может вызвать непредсказуемые результаты в случае ошибки выделения памяти, потому что mxCalloc
длинные прыжки. Если необходимо выделение памяти, используйте stdlib.h
calloc
Выполните настройку непосредственно и выполните собственную обработку ошибок.
Если вы не звоните mexErrMsgTxt
или другие стандартные программы API, которые вызывают исключения, используйте SS_OPTION_EXCEPTION_FREE_CODE
Опция S-функции. Вы делаете это путем ввода следующей команды в mdlInitializeSizes
функция.
ssSetOptions(S, SS_OPTION_EXCEPTION_FREE_CODE);
Установка этой опции увеличивает эффективность вашей S-функции, позволяя движку Simulink обходить настройку обработки исключений, которая обычно выполняется перед каждым вызовом S-функции. Вы должны проявлять крайнюю осторожность, чтобы убедиться, что ваш код свободен от исключений при использовании SS_OPTION_EXCEPTION_FREE_CODE
. Если ваша S-функция генерирует исключение, когда эта опция установлена, происходят непредсказуемые результаты.
Все mex*
стандартные программы имеют потенциал длинных прыжков. Несколько mx*
стандартные программы также имеют потенциал прыжков в длину. Чтобы избежать любых трудностей, используйте только стандартные программы API, которые извлекают указатель или определяют размер параметров. Например, следующие стандартные программы API никогда не выдают исключение: mxGetPr
, mxGetData
, mxGetNumberOfDimensions
, mxGetM
, mxGetN
, и mxGetNumberOfElements
.
Код в стандартных программах выполнения также может выдавать исключения. Стандартные программы выполнения ссылаются на определенные стандартные программы S-функций, которые инициатор вызывает во время цикла симуляции (см. «Взаимодействие Simulink Engine с C S-Functions»). Во время выполнения стандартных программ включать
mdlGetTimeOfNextVarHit
mdlOutputs
mdlUpdate
mdlDerivatives
Если все стандартные программы выполнения в вашей S-функции свободны от исключений, можно использовать эту опцию:
ssSetOptions(S, SS_OPTION_RUNTIME_EXCEPTION_FREE_CODE);
Другие стандартные программы в вашей S-функции не должны быть свободными от исключений.
Если один из методов коллбэка C MEX S-функции вызывает ssSetErrorStatus
во время симуляции механизм Simulink помещает ошибку и завершает симуляцию, как только метод коллбэка возвращается. Если ваша S-функция SS_OPTION_CALL_TERMINATE_ON_EXIT
опция включена (см. ssSetOptions
), двигатель вызывает вашу S-функцию mdlTerminate
способ как часть процесса завершения. В противном случае двигатель вызывает вашу S-функцию mdlTerminate
метод только, если хотя бы один блок mdlStart
метод выполнен без ошибок во время симуляции.
Если ваша функция C MEX S вызывает в противном случае необъяснимые ошибки, причиной может быть то, что S-функция записывается за пределы назначенных ей областей в памяти. Можно проверить эту возможность, включив функцию проверки границ массива. Эта функция обнаруживает любую попытку блока S-Function записать за пределы областей, назначенных ему для следующих типов блочных данных:
Рабочие векторы (R, I, P, D и режим)
Состояния (непрерывные и дискретные)
Выходы
Чтобы включить проверку границ массива, выберите warning
или error
из списка опций Array bounds exceeded в диалоговом окне Configuration Parameters. Также введите следующую команду в MATLAB® командная строка.
set_param(modelName, 'ArrayBoundsChecking', ValueStr)
где modelName
- имя модели Simulink и ValueStr
является либо 'none'
, 'warning'
, или 'error'
.
mdlInitializeSizes
| ssSetErrorStatus