exponenta event banner

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

Сведения об обработке ошибок

При работе с S-функциями важно правильно обрабатывать непредвиденные события, такие как недопустимые значения параметров.

Если S-функция C MEX имеет параметры, содержимое которых необходимо проверить, используйте следующий метод для сообщения об ошибках.

ssSetErrorStatus(S,"Error encountered due to ...");
return;

В большинстве случаев модуль Simulink ® отображает ошибки в средстве просмотра диагностики. Если ошибка обнаружена вmdlCheckParameters когда параметры S-функции вводятся в диалоговое окно блока, механизм открывает диалоговое окно ошибки, показанное ниже. В любом случае подсистема отображает сообщение об ошибке вместе с именем S-функции и связанного S-функционального блока, который вызвал ошибку.

Второй аргумент для 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-функции. Это вводит накладные расходы в моделирование.

Свободный код исключения

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

  • mdlGetTimeOfNextVarHit

  • mdlOutputs

  • mdlUpdate

  • mdlDerivatives

Если все подпрограммы времени выполнения в пределах S-функции не содержат исключений, можно использовать следующую опцию:

ssSetOptions(S, SS_OPTION_RUNTIME_EXCEPTION_FREE_CODE);

Другие процедуры в S-функции не обязательно должны быть свободными от исключений.

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

Если один из методов обратного вызова C MEX S-функции вызывает ssSetErrorStatus во время моделирования модуль Simulink размещает ошибку и завершает моделирование, как только возвращается метод обратного вызова. Если ваша S-функция SS_OPTION_CALL_TERMINATE_ON_EXIT опция включена (см. ssSetOptions), движок вызывает вашу S-функцию mdlTerminate способ как часть процесса завершения. В противном случае механизм вызывает S-функцию mdlTerminate метод только в том случае, если по крайней мере один блок mdlStart выполнен без ошибок во время моделирования.

Проверка границ массива

Если ваша S-функция C MEX вызывает необъяснимые ошибки, причиной может быть то, что S-функция записывает данные за пределы назначенных областей памяти. Эту возможность можно проверить, включив функцию проверки границ массива. Эта функция обнаруживает любую попытку блока S-Function выполнить запись за пределами назначенных ему областей для следующих типов данных блока:

  • Рабочие векторы (R, I, P, D и режим)

  • Состояния (непрерывные и дискретные)

  • Продукция

Чтобы включить проверку границ массива, выберите warning или error из списка параметров превышения границ массива в диалоговом окне Параметры конфигурации (Configuration Parameters). Либо введите следующую команду в командной строке MATLAB ®.

set_param(modelName, 'ArrayBoundsChecking', ValueStr)

где modelName - имя модели Simulink и ValueStr является либо 'none', 'warning', или 'error'.

См. также

|

Связанные темы