При работе с S-функциями важно обработать неожиданные события, такие как значения недопустимого параметра правильно.
Если ваша S-функция MEX C имеет параметры, содержимое которых необходимо подтвердить, используйте следующий метод, чтобы сообщить об ошибках.
ssSetErrorStatus
(S,"Error encountered due to ...");
return;
В большинстве случаев механизм Simulink® отображает ошибки в Диагностическом Средстве просмотра. Если с ошибкой сталкиваются в 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
. Функция mexErrMsgTxt
использует обработку исключений, чтобы отключить выполнение S-функции. Чтобы поддержать обработку исключений в S-функциях, механизм Simulink должен настроить обработчики исключений до каждого S-вызова-функции. Это вводит наверху в симуляцию.
Можно избежать симуляции наверху путем гарантирования, что S-функция MEX C содержит полностью исключение свободный код. Исключение свободный код относится, чтобы никогда кодировать это прыжки в длину. Ваша S-функция не является исключением, свободным, если это содержит стандартную программу, которая, когда названо, имеет потенциал длинного перехода. Например, mexErrMsgTxt
выдает исключение (т.е. прыжки в длину), когда названо, таким образом конечное выполнение вашей S-функции. Используя mxCalloc
может вызвать непредсказуемые результаты в случае ошибки распределения памяти, потому что прыжки в длину mxCalloc
. Если выделение памяти необходимо, используйте
стандартную программу calloc
stdlib.h
непосредственно и выполните вашу собственную обработку ошибок.
Если вы не вызываете mexErrMsgTxt
или другие стандартные программы API, которые вызывают исключения, используют опцию S-функции SS_OPTION_EXCEPTION_FREE_CODE
. Вы делаете это путем выдачи следующей команды в функции 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-функции, которые механизм вызывает во время цикла симуляции (см. Взаимодействие Engine Simulink с S-функциями C). Стандартные программы во время выполнения включают
mdlGetTimeOfNextVarHit
mdlOutputs
mdlUpdate
mdlDerivatives
Если все стандартные программы во время выполнения в вашей S-функции являются свободным исключением, можно использовать эту опцию:
ssSetOptions(S, SS_OPTION_RUNTIME_EXCEPTION_FREE_CODE);
Другие стандартные программы в вашей S-функции не должны быть свободным исключением.
Если один из ваших методов коллбэка S-функции MEX C вызывает ssSetErrorStatus
во время симуляции, механизм Simulink отправляет ошибку и отключает симуляцию, как только метод коллбэка возвращается. Если ваша S-функция, которую включена опция SS_OPTION_CALL_TERMINATE_ON_EXIT
(см. ssSetOptions
), механизм вызывает вашу S-функцию метод mdlTerminate
как часть процесса завершения. В противном случае механизм вызывает вашу S-функцию метод mdlTerminate
, только если по крайней мере один метод блока mdlStart
выполнился без ошибки во время симуляции.
Если ваша S-функция MEX C вызывает в противном случае необъяснимые ошибки, причина может состоять в том, что S-функция написала вне ее присвоенных областей в памяти. Можно проверить эту возможность путем активации границ массивов, проверяющих опцию. Эта функция обнаруживает любую попытку Блока s-function, чтобы записать вне областей, присвоенных ему для следующих типов данных о блоке:
Векторы работы (R, я, P, D, и режим)
Состояния (непрерывный и дискретный)
Выходные параметры
Включить массив ограничивает проверку, выберите warning
или error
из списка опций Array bounds exceeded на диалоговом окне Configuration Parameters. Также введите следующую команду в командной строке MATLAB®.
set_param(modelName, 'ArrayBoundsChecking', ValueStr)
где modelName
является именем модели Simulink, и ValueStr
является или 'none'
, 'warning'
или 'error'
.
mdlInitializeSizes
| ssSetErrorStatus