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

Создание простого физического компонента

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

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

Создание компонента

Физический компонент описывается в специальном текстовом файле формата .ngpc. Для удобства такой файл лучше хранить в отдельной папке (1 папка = 1 компонент). Так, для создания физического компонента необходимо:

  • Создать папку в файловом браузере Engee file browser 7;

  • Добавить ее в путь;

  • В папке создайте файл формата .ngpc;

  • В .ngpc файле напишите следующий код:

    @engeemodel component_name begin
    end

    Это код для создания компонента без какого-либо поведения, параметров и настроек.

    Конструкция @engeemodel имя_компонента begin …​ end — является обязательной для инициализации компонента в рабочей среде Engee.
    В одном .ngpc-файле может быть объявлено несколько компонентов, однако, во избежание путаницы, рекомендуется создавать новый .ngpc-файл для каждого компонента.
  • Добавьте на холст блок Physical Component;

  • Дважды кликните по блоку для открытия окна настроек debug article icon 1 блока;

  • В поле Component type укажите имя компонента из @engeemodel или выберите путь к файлу .ngpc, нажав по иконке add component icon:

    physical component block icon 2 ru

  • Если компонент не привязан к файлу, то на иконке появится предупреждение ".ngpc Unspecified" (по умолчанию). Если привязан — на иконке показывается имя компонента из конструкции:

    Без привязки

    С привязкой

    physical component block icon

    physical component block icon 1

Для корректной работы модели с физическим компонентом (или любым другим блоком раздела Physical Modeling) необходимо добавить в модель блок Solver Configuration.

Структура физического компонента

Объявление любого физического компонента начинается с конструкции @engeemodel, после которой указывается имя компонента. Все содержимое компонента описывается внутри секции begin …​ end:

@engeemodel component_name begin
end

Код выше создает пустой физический компонент без параметров и настроек поведения. Чтобы компонент выполнял полезные функции — внутри секции размещаются другие конструкции языка, каждая из которых также оформляется в секции begin …​ end. Например:

  • @parameters — задает параметры, которые настраиваются пользователем:

    @parameters begin
        a = 1.0
    end
  • @variables — вводит переменные, изменяющиеся в ходе моделирования:

    @variables begin
        x = 1.0
    end
  • @equations — описывает уравнения, связывающие параметры и переменные.

    @equations begin
        der(x) ~ -a*x
    end

Теперь просто соединим их в одном физическом компоненте:

@engeemodel component-name begin
    @parameters begin
        a = 1.0
    end
    @variables begin
        x = 1.0
    end
    @equations begin
        der(x) ~ -a*x
    end
end

Здесь параметр a задает коэффициент, переменная x описывает состояние системы, а уравнение определяет динамику в виде экспоненциального убывания. Такой пример показывает, как с помощью декларативного языка можно задать простое поведение компонента.

Следует отметить, что это лишь базовый набор конструкций, в декларативном языке Engee их значительно больше: порты (@nodes), ветви (@branches), структурные параметры, подкомпоненты, аннотации и многое другое. Полный список см. в разделе Синтаксис декларативного языка моделирования Engee.

Практический пример

Рассмотрим пример физического компонента Resistor, имитирующего поведение резистора. Пример демонстрирует объявление портов, параметров и переменных с единицами, задание ветви тока, основные уравнения и распространение параметров среды.

@engeemodel Resistor begin
    @nodes begin
        p = EngeePhysicalFoundation.Electrical.Pin
        n = EngeePhysicalFoundation.Electrical.Pin
    end

    @parameters [group = "Parameters"] begin
        R = 1.0, [unit = "Ohm", description = "Resistance"]
    end

    @variables [group = "Initial Targets"] begin
        v = 0.0, [unit = "V", description = "Voltage"]
        i = 0.0, [unit = "A", description = "Current"]
    end

    @branches begin
        i:(p.i, n.i)
    end

    @equations begin
        v ~ p.v - n.v
        v ~ R * i
        domain_connect(n, p)
        assert(R >= 0.0)
    end
end

Разберем построчно, что делает каждая конструкция.

  • @engeemodel Resistor begin …​ end — объявление нового физического компонента с именем Resistor. Весь код внутри относится к этому компоненту.

  • @nodes begin …​ end — описание портов подключения.

    • p = EngeePhysicalFoundation.Electrical.Pin — первый электрический порт.

    • n = EngeePhysicalFoundation.Electrical.Pin — второй электрический порт.

  • @parameters begin …​ end — параметры компонента.

    • R = 1.0, [unit = "Ohm", description = "Resistance"] — параметр сопротивления с единицами и описанием.

  • @variables begin …​ end — переменные (величины, вычисляемые в процессе моделирования).

    • v = 0.0, [unit = "V", description = "Voltage"] — напряжение на элементе.

    • i = 0.0, [unit = "A", description = "Current"] — ток через элемент.

  • @branches begin …​ end — ветви, внутри этой конструкции токи разных портов связываются в одну общую переменную. Это нужно, чтобы правильно учитывать правило: сумма токов, входящих и выходящих через порты компонента, всегда равна нулю.

    • i:(p.i, n.i) — поток i связывается с токами в портах p и n.

  • @equations begin …​ end — уравнения и дополнительные условия.

    • v ~ p.v - n.v — определение напряжения как разности потенциалов портов.

    • v ~ R * i — закон Ома: напряжение пропорционально току.

    • domain_connect(n, p) — выравнивание параметров среды между портами.

    • assert(R >= 0.0) — проверка: сопротивление не может быть отрицательным.

Таким образом, с помощью декларативного языка Engee создается физический компонент Resistor, имитирующий резистор с двумя портами, параметром сопротивления, переменными напряжения и тока, а также уравнениями, которые описывают его физическое поведение:

resistor component ru

Рекомендации

  • Используйте информативные имена и задавайте единицы измерения для параметров и переменных.

  • Проверяйте физическую корректность уравнений и граничные случаи (через assert, интервал параметров и т.п.).

  • Используйте маски для дополнительной настройки.

  • Создавайте собственные библиотеки user library 1 из своих физических компонентов для повторного использования.