Физическое моделирование, в целом, включает непрерывные переменные и уравнения. В некоторых случаях, однако, можно упростить математическую модель системы и улучшить эффективность симуляции, рассматривая определенные изменения в поведении системы как дискретные. Такая идеализация предполагает, что системные переменные могут изменять значения только мгновенно и прерывисто в определенные точки времени.
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
ветвь имеет самый низкий приоритет.