exponenta event banner

Дискретное моделирование событий

Физическое моделирование, в общем, включает непрерывные переменные и уравнения. Однако в некоторых случаях можно упростить математическую модель системы и повысить производительность моделирования, рассматривая определенные изменения в поведении системы как дискретные. Такая идеализация предполагает, что системные переменные могут изменять значения только мгновенно и периодически в определенные моменты времени.

Событие - это концептуальная нотация, обозначающая изменение состояния в системе. Моделирование событий позволяет выполнять дискретные изменения непрерывных переменных. Двумя наиболее распространенными приложениями моделирования событий являются:

  • Механизм запуска и удержания, например, инициируемая задержка. Например, компонент имеет два входа: 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 ветвь имеет наименьший приоритет.

Связанные темы