Обработайте ошибки в S-функциях

Об ошибках из-за неправильного обращения

При работе с 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-функции не должны быть свободным исключением.

Критерии Завершения ssSetErrorStatus

Если один из ваших методов коллбэка 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'.

Смотрите также

|

Похожие темы