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