Обработайте ошибки в 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 прыжки в длину. Если выделение памяти необходимо, используйте 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-функции, которые механизм вызывает во время цикла симуляции (см. Взаимодействие 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'Предупреждение, или 'error'.

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

|

Похожие темы