assert

Программные настраиваемые ошибки времени выполнения и предупреждения

Синтаксис

assert (predicate_condition, message, Action);

Описание

equations раздел может содержать assert конструкцию, которая позволяет вам задавать настраиваемые ошибки времени выполнения и предупреждения:

assert (predicate_condition, message, Action);

predicate_conditionВыражение, которое будет оценено во время исполнения. Это может быть функция времени, входов, параметров и переменных.
messageДополнительная текстовая строка (с одинарными кавычками), которая сообщает пользователю блока, почему срабатывает ошибки времени выполнения или предупреждение.
ActionНеобязательный атрибут, который задает, запускать ли результаты assert в предупреждении или ошибке во время симуляции. Действие по умолчанию является ошибкой.

The Action позволяет вам задать действие утверждения на основе перечисленного значения параметров. Встроенная система перечисления simscape.enum.assert.action допускает три возможных действия при срабатывании значения: error, warn, и none. Перечисленное значение можно задать непосредственно в Action атрибут:

assert(u > 0, Action = simscape.enum.assert.action.warn)

или создайте перечисленный параметр и дайте пользователю блока управлять действием assert:

parameters
  assert_action = simscape.enum.assert.action.warn 
end

equations
  assert(u > 0, Action = assert_action)
end

Можно использовать assert создать в:

  • Уравнения верхнего уровня, включая начальные уравнения.

  • The if-elseif-else ветви условного выражения.

  • Предложение выражения и правая сторона предложения объявления let выражение.

Когда вы используете assert конструкция в ветви условного выражения, оно не отсчитывается к количеству выражений в ветви, и поэтому освобождается от общего правила, что общее количество выражений уравнений, их размерность и их порядок должны быть одинаковыми для каждой ветви if-elseif-else оператор. Для примера допустимо следующее:

if x>1
     y == 1;
else
     assert(b > 0);
     y == 3;
end

Область возможностей assert конструкция определяется возможностями ее ветви. В предыдущем примере условие предиката b > 0 оценивается только тогда, когда else ветвь действует, то есть когда x меньше или равно 1.

Когда вы включаете assert конструкции в начальных уравнениях, их предикатные условия проверяются только один раз, после решения начальных условий (до начала симуляции см. «Расчеты начальных условий»). Используйте эти утверждения для защиты от инициализации модели с нефизическими значениями.

Примеры

Ошибка времени выполнения

Сгенерируйте ошибку времени выполнения, если объем жидкости в резервуаре становится отрицательным:

assert( V >= 0, 'Insufficient fluid volume for proper operation' );

Во время симуляции, если внутренняя переменная V (соответствующая объему жидкости в резервуаре) принимает отрицательное значение, симуляция останавливается и выводит сообщение об ошибке, содержащее следующую информацию:

  • Время симуляции, когда приведение в действие

  • The message строка (в этом примере Insufficient fluid volume for proper operation)

  • Активная ссылка на блок, который инициировал проверку типа «assertion». Нажмите на Block path ссылка для подсветки блока в диаграмме модели.

  • Активная ссылка на расположение assert в исходном файле компонента. Нажмите на Assert location ссылка для открытия Simscape™ исходного файла компонента с помощью курсора в начале нарушения условия предиката. Для файлов, защищенных Simscape, Assert location информация опускается из сообщения об ошибке.

Предупреждение во время выполнения

Если вы не хотите, чтобы симуляция остановилась, но все еще хотите отобразить предупреждение о нарушении определенного условия, установите Action атрибут к simscape.enum.assert.action.warn. Для примера, если гидравлическое давление падает ниже уровня давления насыщения пара с некоторой точки, это условие может привести к кавитации и сделать недействительными допущения моделирования, используемые в блоке. Можно добавить следующее assert конструкция уравнений гидравлической составляющей:

assert( p > p_cav, 'Pressure is below vapor level; cavitation possible', 
                              Action = simscape.enum.assert.action.warn);

В этом случае, если условие предиката нарушено, симуляция продолжается, но выводит предупреждающее сообщение. Формат предупреждающего сообщения совпадает с форматом сообщения об ошибке, описанного в предыдущем примере.

Предупреждающее сообщение появляется один раз, на первом временном шаге, когда условие предиката нарушено. В этом примере предупреждающее сообщение появляется на первом временном шаге, когда давление падает ниже уровня пара. Пока давление остается ниже этого уровня, сообщение не повторяется на последующих временных шагах. Однако, когда симуляция продолжается, если давление повышается выше уровня насыщения пара, а затем снова падает ниже этого уровня, давление снова активируется и снова появляется предупреждающее сообщение.

Управляемое пользователем действие

Если вы хотите позволить пользователю блока управлять действием при запуске assert, создайте перечисленный параметр и установите Action атрибут, основанный на значении этого параметра.

Для примера в блоке Stepper Motor можно позволить пользователю блока принять решение о желаемом действии, когда двигатель скользит. Объявите параметр управления, основанный на встроенном перечислении действий утверждения, и добавьте следующее assert конструкция к уравнениям компонента:

parameters
  assert_action = simscape.enum.assert.action.warn % Action on slipping
end

equations
  assert(slipping<1,'Stepper motor slip',Action = assert_action)
end

В этом случае действие по умолчанию также является предупреждением во время выполнения, как в предыдущем примере. Однако диалоговое окно блока содержит перечисленный параметр, Action on slipping, с тремя возможными значениями: error, warn, none. Этот параметр позволяет пользователю блока решить, следует ли останавливать симуляцию с ошибкой, продолжить с предупреждением или полностью игнорировать проскальзывания двигателя.

Вопросы совместимости

расширить все

Поведение изменено в R2019a

Введенный в R2011b