Физическое моделирование, в целом, включает непрерывные переменные и уравнения. В некоторых случаях, однако, можно упростить математическую модель системы и улучшать производительность симуляции путем обработки определенных изменений в поведении системы как дискретных. Такая идеализация принимает, что системные переменные могут только изменить значения мгновенно и с перерывами в отдельных моментах вовремя.
event является концептуальным обозначением, которое обозначает изменение состояния в системе. Моделирование события позволяет вам выполнить дискретные изменения на непрерывных переменных. Два наиболее распространенных приложения моделирования события:
Механизм инициировать-и-содержать, такой как инициированная задержка. Например, компонент имеет два входных параметров: u
и x
(инициированный сигнал), и один выход y
. Когда и только когда инициированный x
сигнала значение изменений от лжи до истины, выхода
y
сбрасывается к значению u
в текущее время. y
остается неизменным все другие времена.
Enabled компонент, действующий на принцип, похожий на Simulink®, включил подсистему (Simulink). Таким образом, компонент имеет управляющий сигнал, как введено. Если управляющий сигнал имеет положительное значение, то компонент содержит определенные состояния к новому значению или сбрасывает их. Когда управляющий сигнал отрицателен, изменение состояний согласно уравнениям компонента.
Следующие построения на языке Simscape™ позволяют вам выполнить моделирование события: переменные события, events
раздел, when
пункт и edge
оператор.
Переменные события являются кусочной константой, то есть, они изменяют значения только в моменты события и сохраняют их значения постоянными между событиями. Можно объявить внутренние переменные компонента целого числа типа или действительный как переменные события путем установки Event=true
атрибут.
Например, следующий код объявляет две переменные события: x
(введите действительный), и d
(введите целое число).
variables (Event=true) x = 0; d = int32(0); end
Можно инициализировать переменные события при помощи initialevent
оператор. Можно также инициализировать переменные события тот же путь как непрерывные переменные путем установки их целевых значений и приоритетов в блоке объявления элемента. Для получения дополнительной информации смотрите initialevent
.
Вы обновляете значения переменных события в events
раздел файла компонента, при помощи when
пункт.
edge
Операторedge
оператор берет скалярное Булево выражение, как введено. Это возвращает true и инициировало событие, когда и только когда входной параметр изменяет значение от лжи до истины. Тип возврата edge
event type. Тип данных о событиях является специальной категорией булева типа, который возвращает true только мгновенно и возвращает false в противном случае.
Следующая диаграмма иллюстрирует различие между типами данных о событиях и булевыми данными.
edge(b)
возвращает true только когда b
изменения от лжи до истины.
Инициировать событие на падающем ребре условия b
, используйте edge(~b)
.
Правила деривации данных между булевыми данными и типами данных о событиях:
edge
(boolean
isevent
~event
boolean
событие
событие
isevent
событие
&& boolean
isevent
событие
|| event
isevent
событие
|| boolean
) boolean
Вы используете edge
оператор к предикатам события define в when
пункты.
when
Пунктevents
раздел в файле компонента справляется с обновлениями события. events
раздел может содержать только when
пункты. Порядок when
пункты не имеют значения.
when
пункт служит, чтобы обновить значения переменных события. Синтаксис
when EventPredicate var1 = expr1; var2 = expr2; ... end
EventPredicate
выражение, которое задает, когда событие имеет место. Это должно быть выражение типа данных о событиях, как описано в Типе Данных о событиях и Операторе ребра.
Переменные в теле 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.
when
пункт не может обновить переменную события несколько раз в рамках того же списка присвоений. Однако два независимых when
пункты также не могут обновить ту же переменную события. Необходимо использовать elsewhen
перейдите, чтобы сделать это.
elsewhen
Пунктыwhen
пункт может опционально иметь один или несколько elsewhen
ветви:
when EventPredicate var1 = expr1; var2 = expr2; ... elsewhen EventPredicate var1 = expr3; ... end
else
по умолчанию перейдите в
when
пункт недопустим.
Общее использование elsewhen
ветви должны приоритизировать события. Если несколько предикатов становятся верными в том же моменте времени, только ветвь с наивысшим приоритетом активируется. Приоритет ветвей в when
пункт определяется их порядком объявления. Таким образом, when
ветвь имеет самый высокий приоритет, последний elsewhen
ветвь имеет самый низкий приоритет.