Создание простого физического компонента
Страница в процессе разработки. |
В декларативном языке физического моделирования Engee можно создавать собственные блоки, имитирующие работу реальных физических систем. Такие блоки называются физическими компонентами и используются, когда библиотеки физических блоков недостаточно.
Создание компонента
Физический компонент описывается в специальном текстовом файле формата .ngpc. Для удобства такой файл лучше хранить в отдельной папке (1 папка = 1 компонент). Так, для создания физического компонента необходимо:
-
Создать папку в файловом браузере Engee
;
-
Добавить ее в путь;
-
В папке создайте файл формата .ngpc;
-
В .ngpc файле напишите следующий код:
@engeemodel component_name begin end
Это код для создания компонента без какого-либо поведения, параметров и настроек.
Конструкция @engeemodel имя_компонента begin … end
— является обязательной для инициализации компонента в рабочей среде Engee.В одном .ngpc-файле может быть объявлено несколько компонентов, однако, во избежание путаницы, рекомендуется создавать новый .ngpc-файл для каждого компонента. -
Добавьте на холст блок Physical Component;
-
Дважды кликните по блоку для открытия окна настроек
блока;
-
В поле Component type укажите имя компонента из
@engeemodel
или выберите путь к файлу .ngpc, нажав по иконке:
-
Если компонент не привязан к файлу, то на иконке появится предупреждение
".ngpc Unspecified"
(по умолчанию). Если привязан — на иконке показывается имя компонента из конструкции:Без привязки
С привязкой
Для корректной работы модели с физическим компонентом (или любым другим блоком раздела 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, имитирующий резистор с двумя портами, параметром сопротивления, переменными напряжения и тока, а также уравнениями, которые описывают его физическое поведение:
Рекомендации
-
Используйте информативные имена и задавайте единицы измерения для параметров и переменных.
-
Проверяйте физическую корректность уравнений и граничные случаи (через
assert
, интервал параметров и т.п.). -
Используйте маски для дополнительной настройки.
-
Создавайте собственные библиотеки
из своих физических компонентов для повторного использования.