Документация Engee

События языка физического моделирования 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 в коде компонента может влиять на поведение компонента в цепочках событий, несмотря на общую декларативность языка физического моделирования.