События языка физического моделирования Engee
|
Страница в процессе разработки. |
В языке физического моделирования Engee события используются для описания резких изменений состояния системы во времени — например, переключений режимов, срабатываний ограничений или переходов между состояниями.
Условные конструкции
Для записи условных уравнений в зависимости от значений переменных используются функции ifelse(…) и gt, lt, ge, le, eq, neq.
Подробное описание с примерами и особенностями работы см. в статье Перечисления, ветвления, циклы и модули языка физического моделирования Engee.
Дискретные события
Для описания дискретных событий, которые срабатывают при изменении условий, используется конструкция @when. Она позволяет задавать действия, выполняемые в момент переключения логических выражений.
В условиях используется оператор edge. Допускаются следующие записи условий:
-
edge(cond)— событие срабатывает при изменении условияcondсfalseнаtrue. -
edge(!cond)— событие срабатывает при изменении условияcondсtrueнаfalse. -
edge(cond1) & edge(cond2)— событие срабатывает при одновременном измененииcond1иcond2сfalseнаtrue. -
edge(cond1) & cond2— событие срабатывает при измененииcond1сfalseнаtrueи выполнении условияcond2. -
edge(cond1) | edge(cond2)— событие срабатывает при изменении условияcond1илиcond2сfalseнаtrue.
Также возможны комбинации из них: (edge(cond1) & edge(cond2)) | edge(cond3).
@when edge(x > 3) begin
event_var1 ~ expr1
event_var2 ~ expr2
end
Внутри блока указываются присваивания, которые произойдут одновременно при выполнении условия. В каждом присваивании в левой части должна быть указана только событийная (event=true) переменная.
В присваиваниях можно использовать предыдущие значения тех же событийных переменных:
@when (x > 3) begin
event_var1 ~ event_var1 + 1
end
Дополнительно можно указать другие условия с помощью @elsewhen. Если несколько условий начинают выполняться одновременно, отработает событие, соответствующее первому из них.
@when edge(x > 1) begin
event_var1 ~ expr1
...
@elsewhen edge(y < 0)
event_var2 ~ expr2
...
end
Инициализировать событийные переменные можно с помощью идентификатора initialevent:
@when initialevent begin
V ~ x + 3
@elsewhen edge(z > 0.9)
V ~ 1
end
Пример компонента с использованием дискретных событий:
@engeemodel example begin
@outputs begin
out = 0
end
@variables begin
x = 0
end
@equations begin
der(x) ~ K
out.u ~ x
end
@variables [event = true] begin
K = 1
V = 2
end
@when edge(x > 1) begin
K ~ 12
end
@when edge(t >= 1.5) begin
V ~ 5
@elsewhen edge(K > 3)
V ~ 12
end
end
В момент, когда x пересечёт значение 1 снизу вверх, переменной K будет присвоено значение 12.
Сразу же V будет присвоено значение 12. В момент t == 1.5 переменная V станет равной 5.
Гибридные автоматы
Гибридные автоматы (@modecharts) — это расширение концепции конечных автоматов. Как и конечные автоматы, они содержат дискретные состояния и переходы между ними, но при этом в каждом состоянии решаются собственные непрерывные дифференциальные уравнения.
Конструкцию @modecharts можно использовать внутри физического компонента наряду с другими конструкциями (@variables, @equations и т.д.).
|
Так, гибридный автомат сочетает дискретную логику и непрерывную физическую динамику: при смене состояния происходит реинициализация решателя и система начинает рассчитываться по новой системе уравнений.
Конструкция @modecharts задает гибридные автоматы и включает:
-
@modechart— объявление гибридного автомата; -
@modes— набор режимов (состояний); -
@mode— отдельный режим, содержащий свои уравнения@equations; -
@transitions— правила перехода между состояниями.
Дополнительно:
-
@entry— задает действия при входе в режим; -
@initial— определяет начальный режим (если не задан, то автомат инициализируется в первом по списку режиме).
Все параметры в условиях @initial должны быть обернуты в default(). Использовать переменные и параметры портов в @initial нельзя.
Пример гибридного автомата
@parameters begin
x0 = 0.5
lower_bnd = 0.0
upper_bnd = 1.0
threshhold = 0.01
e = 0.7
end
@variables begin
x = x0, [priority = "high"]
v = 0.0
F = 0.0
v_old = 0, [event=true]
end
@nodes begin
flange = EngeePhysicalFoundation.Mechanical.Translational.Flange
end
@equations begin
v ~ flange.v
der(x) ~ v
end
@branches begin
F:(flange.F,*)
end
@modecharts begin
m = @modechart begin
@modes begin
@mode FREE begin
@equations begin
F ~ 0
end
end
@mode (IMPACT, BIG_IMPACT) begin
@entry begin
v_old ~ v
end
@equations begin
v ~ -e * v_old
end
end
end
@transitions begin
(FREE, IMPACT, FREE) => x <= lower_bnd
(FREE, IMPACT, FREE) => x >= upper_bnd
end
@initial begin
BIG_IMPACT => (default(x0) < (default(lower_bnd) - default(threshhold))) ||
(default(x0) > (default(upper_bnd) + default(threshhold)))
# если выполняется это условие, автомат стартует из состояния BIG_IMPACT
end
end
# m2 = ...
end
Здесь:
-
В блоке
@modechartsсоздается гибридный автоматm, описывающий дискретные режимы поведения. -
В режиме
FREEвыполняется уравнениеF ~ 0— силаFравна нулю. -
В составном режиме
(IMPACT, BIG_IMPACT):-
В
@entryпри входе запоминается предыдущее значение скоростиv_old ~ v. -
В
@equationsзадается новое значение скоростиv ~ -e * v_old, то есть скорость меняет знак и масштабируется коэффициентомe.
-
-
В
@transitionsопределены правила переходов:-
(FREE, IMPACT, FREE) => x <= lower_bnd— при сниженииxнижеlower_bndвыполняется переход вIMPACT, затем возврат вFREE. -
(FREE, IMPACT, FREE) => x >= upper_bnd— аналогично, при превышенииupper_bnd.
-
-
В
@initialзадано условие старта из состоянияBIG_IMPACT, если начальное значениеxвыходит за пределыlower_bndилиupper_bndс учетомthreshhold. -
m2 = …показывает, что можно добавить второй@modechartв этом же физическом компоненте.
Практические рекомендации
-
Если переходы не срабатывают как ожидается — уменьшайте параметры Maximum step size, Absolute tolerance и Relative tolerance в блоке Solver Configuration.
-
Порядок объявления конструкций
@whenи@modechartв коде компонента может влиять на поведение компонента в цепочках событий, несмотря на общую декларативность языка физического моделирования.