Дискретное моделирование событий

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

event является концептуальным обозначением, которое обозначает изменение состояния в системе. Моделирование событий позволяет вам выполнить дискретные изменения непрерывных переменных. Двумя наиболее распространенными приложениями моделирования событий являются:

  • Механизм триггера и удержания, такой как срабатывающая задержка. Для примера компонент имеет два входных параметра: u и x (триггерный сигнал) и один выходной y. Когда и только когда срабатывает сигнал x изменяет значение с false на true, выводит y сбрасывается на значение u в текущее время. y остается неизменным все остальные времена.

  • Активированный компонент, действующий по принципу, подобному Simulink® включенная подсистема. То есть компонент имеет управляющий сигнал в качестве входного сигнала. Если управляющий сигнал имеет положительное значение, то компонент удерживает определенные состояния до самого последнего значения или сбрасывает их. Когда управляющий сигнал отрицателен, состояния изменяются согласно уравнениям компонента.

Следующие конструкции на Simscape™ языке позволяют вам выполнить моделирование событий: переменные события, events раздел, when пункт, и edge оператор.

Переменные события

Переменные события являются кусочно-постоянными, то есть они изменяют значения только в моменты событий и сохраняют свои значения постоянными между событиями. Можно объявить переменные внутреннего компонента целого числа или вещественные как переменные события путем установки Event=true атрибут.

Например, следующий код объявляет две переменные события: x (тип real) и d (целое число).

variables (Event=true)
   x = 0;
   d = int32(0);
end

Можно инициализировать переменные события с помощью initialevent оператор. Можно также инициализировать переменные события так же, как и непрерывные переменные, путем установки их целевых значений и приоритетов в блоке объявления представителя. Для получения дополнительной информации смотрите initialevent.

Вы обновляете значения переменных события в events раздел файла компонента при помощи when пункт.

Тип и edge данных о событиях Оператор

The edge оператор принимает за вход скаляра логическое выражение. Он возвращает true и запускает событие, когда и только когда входной параметр изменяет значение с false на true. Тип возврата edge является event type. Тип данных о событиях является специальной категорией логического типа, которая возвращает true только мгновенно и возвращает false в противном случае.

Следующий рисунок иллюстрирует различие между булевым и событийным типами данных.

edge(b) возвращает true только тогда, когда b изменяется с false на true.

Чтобы вызвать событие на падающем ребре условия b, использовать edge(~b).

Правила вывода данных между логическим и событийным типами данных:

  • edge(boolean) event

  • ~event является boolean

  • (event && <reservedrangesplaceholder0>) event

  • (event && <reservedrangesplaceholder0>) event

  • (event || event) event

  • (event || boolean) boolean

Вы используете edge оператор для определения предикатов событий в when пункты.

Раздел и when событий Пункт

The events раздел в файле компонента управляет обновлениями событий. The events раздел может содержать только when пункты. Порядок when положения не имеют значения.

The when предложение служит для обновления значений переменных события. Синтаксис:

when EventPredicate
  var1 = expr1; 
  var2 = expr2; 
  ...
end

EventPredicate - выражение, которое определяет, когда происходит событие. Это должно быть выражение данных о событиях типа, как описано в Данные о событиях Type и ребра Оператора.

Переменные в теле when предложение должно быть объявлено как переменные события. Когда предикат события возвращается true, все переменные в теле when предложение одновременно обновляется до новых значений.

Порядок присвоений переменных в теле when пункт не имеет значения, потому что все обновления происходят одновременно. Для примера, если d1 и d2 являются переменными события, инициализированными как 0,

when edge(time>1.0)
   d1 = d2 + 1;  
   d2 = d1 + 1;  
 end

эквивалентно:

when edge(time>1.0)
   d2 = d1 + 1;  
   d1 = d2 + 1;  
end

После события оба d1 и d2 иметь новое значение 1, поскольку они оба были одновременно обновлены путем добавления 1 к старому значению 0.

A when не удается обновить переменную события более одного раза в том же списке назначений. Однако два независимых when клаузулы также могут не обновлять ту же переменную события. Необходимо использовать elsewhen ветвь для этого.

Ответвление elsewhen Пункты

A when предложение может опционально иметь одно или несколько elsewhen ветви:

when EventPredicate
  var1 = expr1; 
  var2 = expr2; 
  ...
elsewhen EventPredicate
  var1 = expr3; 
  ...
end

Примечание

Значение по умолчанию else ветвь в when пункт запрещен.

Общее использование elsewhen ветви должны определять приоритеты событий. Если несколько предикатов становятся истинными в одну и ту же точку времени, активируется только ветвь с наивысшим приоритетом. Приоритет ветвей в when пункт определяется их порядком декларирования. То есть, when ветвь имеет наивысший приоритет, последний elsewhen ветвь имеет самый низкий приоритет.

Похожие темы