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

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

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

Похожие темы