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

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

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

  • Механизм инициировать-и-содержать, такой как инициированная задержка. Например, компонент имеет два входных параметров: u и x (инициированный сигнал), и один выход y. Когда и только когда инициированный x сигнала значение изменений от лжи до истины, выхода y сбрасывается к значению u в текущее время. y остается неизменным все другие времена.

  • Enabled компонент, действующий на принцип, похожий на 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(booleanisevent

  • ~event boolean

  • событие событиеisevent

  • событие && booleanisevent

  • событие || eventisevent

  • событие || 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 ветвь имеет самый низкий приоритет.

Похожие темы