Физическое моделирование, в общем, включает непрерывные переменные и уравнения. Однако в некоторых случаях можно упростить математическую модель системы и повысить производительность моделирования, рассматривая определенные изменения в поведении системы как дискретные. Такая идеализация предполагает, что системные переменные могут изменять значения только мгновенно и периодически в определенные моменты времени.
Событие - это концептуальная нотация, обозначающая изменение состояния в системе. Моделирование событий позволяет выполнять дискретные изменения непрерывных переменных. Двумя наиболее распространенными приложениями моделирования событий являются:
Механизм запуска и удержания, например, инициируемая задержка. Например, компонент имеет два входа: u и x (сигнал срабатывания) и один выход y. Когда и только когда сработал сигнал x изменение значения с false на true, вывод y сбрасывается до значения u в текущее время. y остается неизменным все остальные времена.
Компонент с поддержкой, действующий по принципу, аналогичному подсистеме с поддержкой Simulink ®. То есть компонент имеет управляющий сигнал в качестве входного сигнала. Если управляющий сигнал имеет положительное значение, то компонент удерживает определенные состояния до самого последнего значения или сбрасывает их. Когда управляющий сигнал отрицательный, состояния изменяются в соответствии с уравнениями компонентов.
Следующие конструкции на Simscape™ языке позволяют выполнять моделирование событий: переменные событий, events раздел, when пункт, и edge оператор.
Переменные события являются кусочно постоянными, то есть они изменяют значения только в моменты события и сохраняют свои значения постоянными между событиями. Можно объявить внутренние переменные компонента типа integer или real в качестве переменных события, установив значение Event=true атрибут.
Например, следующий код объявляет две переменные события: x (тип real) и d (тип целое число).
variables (Event=true) x = 0; d = int32(0); end
Можно инициализировать переменные событий с помощью initialevent оператор. Можно также инициализировать переменные события аналогично непрерывным переменным, задав их целевые значения и приоритеты в блоке объявления члена. Дополнительные сведения см. в разделе initialevent.
Вы обновляете значения переменных событий в events в разделе файла компонента с помощью when пункт.
edge Оператор edge оператор принимает скалярное логическое выражение в качестве входного значения. Возвращает значение true и запускает событие, когда и только когда входной аргумент изменяет значение с false на true. Возвращаемый тип edge является типом события. Тип данных события является специальной категорией логического типа, которая возвращает значение true только мгновенно, в противном случае возвращает значение false.
На следующем рисунке показано различие между типом данных Boolean и типом события.

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