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

Порты декларативного языка Engee

Страница в процессе разработки.

В декларативном языке Engee порты — это интерфейсы, через которые физический компонент взаимодействует с другими блоками модели. Через порт могут передаваться:

  • Физические величины (напряжение, давление, температура);

  • Сигналы управления (например, числовые коэффициенты или булевы значения).

Порты физических компонентов (как и всей библиотеки Физическое моделирование) могут соединяться только с другими блоками физического моделирования.

Виды портов

В декларативном языке Engee есть два типа портов:

  • Направленные порты (@inputs, @outputs) — используются для передачи сигналов. У них всегда задано направление: вход (input) или выход (output). Такие порты чаще всего применяются в блоках управления, где нужно передавать управляющие или вычисленные значения.

  • Ненаправленные порты (@nodes) — применяются для описания физических соединений. У них нет строгого деления на «вход» и «выход»: поток может течь в любую сторону. С их помощью моделируются реальные физические домены, например:

    • Электричество (напряжение и ток),

    • Механика (скорость и сила),

    • Теплообменники (температура и тепловой поток).

Автоматические уравнения

Главное преимущество декларативного подхода в том, что базовые уравнения формируются автоматически. Когда два компонента соединяются портами, то Engee сам создает:

  • Уравнение равенства потенциалов (например, напряжения в соединенных узлах одинаковы);

  • Уравнение баланса потоков (сумма токов, тепловых потоков или сил в узле равна нулю — по закону сохранения).

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

Направленные порты

Сигнальные входы и выходы объявляются через секции @inputs и @outputs.

@engeemodel GainBlock begin
    @parameters begin
        k = 2.0
    end
    @inputs begin
        u
    end
    @outputs begin
        y
    end
    @equations begin
        y ~ k * u
    end
end

Здесь:

  • На вход u поступает сигнал;

  • Внутри уравнения он умножается на коэффициент k;

  • Результат передается на выход y.

Такие порты удобны для смешанных моделей, где часть элементов работает с физическими величинами, а часть — с сигналами управления.

Ненаправленные порты

Внутри компонента такие порты объявляются через секцию @nodes.

@engeemodel Resistor begin
    @parameters begin
        R = 1.0, [unit = "Ohm"]
    end
    @nodes begin
        p = AcausalFoundation.Electrical.Pin
        n = AcausalFoundation.Electrical.Pin
    end
    @variables begin
        v = 0.0, [unit = "V"]
        i = 0.0, [unit = "A"]
    end
    @branches begin
        i:(p.i, n.i)
    end
    @equations begin
        v ~ p.v - n.v
        v ~ R * i
    end
end

Здесь:

  • @nodes — добавляет два электрических порта p и n;

  • @branches — формулирует правило сохранения тока в ветви;

  • @equations — задает закон Ома: напряжение на резисторе равно произведению сопротивления на ток.

Потенциалы и потоки в ненаправленных портах

Чтобы корректно описывать физику, у каждого ненаправленного порта есть связанные переменные:

  • Потенциальные переменные — задают состояние точки подключения (например, напряжение, температура, давление). По умолчанию переменная считается потенциальной, если не указаны дополнительные метаданные.

  • Потоковые переменные (connect = Flow) описывают перенос или обмен величины между компонентами (например, ток, тепловой поток, массовый расход).

Пример объявления электрического порта:

@engeeconnector Pin begin
    v                       # напряжение (потенциал)
    i, [connect = Flow]     # ток (поток)
end

Здесь:

  • v — переменная-потенциал, отражает напряжение в узле;

  • i — переменная-поток, отражает ток, протекающий через порт.

При соединении портов Engee автоматически формирует уравнения:

  • Потенциалы (v) соединенных портов равны;

  • Сумма потоков (i) равна нулю (закон сохранения).

Соединение портов

После объявления портов их нужно соединить между собой в модели. В декларативном языке Engee предусмотрены два механизма:

  • connect(…​) — соединяет порты разных компонентов, формируя уравнения равенства потенциалов и баланса потоков. Например:

    @equations begin
        connect(res.p, cap.p)
        connect(res.n, cap.n)
    end

    Такое соединение создает уравнения, связывающие резистор и конденсатор в электрическую цепь.

  • domain_connect(…​) — обеспечивает согласованность параметров среды внутри одного физического компонента. Пример:

    @equations begin
        domain_connect(p, n)
    end

    Здесь оператор domain_connect выравнивает параметры среды между портами (например, теплопроводность или свойства жидкости), если это требуется внутри одного компонента.