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