Язык физического моделирования Engee
Создание пользовательского физического компонента
В Engee существует огромная библиотека физического моделирования. Но всегда чего-то не хватает или хочется смоделировать физический объект при помощи своих уравнений.
Задача этого небольшого проекта - сделать свой резистор, в котором сопротивление зависит от температуры
Постановка задачи
В базовой библиотеке физического моделирования есть компонент Резистор. Он моделирует сопротивление в цепи, и имеет только один параметр, Сопротивление. Однако, это идеализированный резистор - не учитывается влияние температуры. Поэтому нам потребуется создать свой более "реалистичный" резистор.
Создание компонента резистора
Для создания пользовательского физического компонента будем применять специализированный язык физического моделирования, входящий в Engee. Но, прежде чем начать писать код, давайте вспомним как связана температура и сопротивление:
где:
- опорная температура
- сопротивление при опорной температуре
- некоторая константа, зависит от материала сопротивления
Теперь можно переходить к написанию своего компонента. Код для компонента должен содержаться в файле с расширение *.ngpc. Я уже написал свою реализацию резистора, посмотрим на нее:
@engeemodel MyResistorHeat begin
@nodes begin
p = EngeePhysicalFoundation.Electrical.Pin(), [view = ("+", "left")]
n = EngeePhysicalFoundation.Electrical.Pin(), [view = ("-", "right")]
end
@variables begin
v = 0, [unit="V",description = "Voltage"]
i = 0, [unit="A",description = "Current"]
end
@parameters begin
R = 200.0, [unit="Ohm"]
a = 0.1, [unit="1/K"]
T0 = 300, [unit="K"]
T = 300, [unit="K"]
end
@branches begin
i:(p.i, n.i)
end
@equations begin
v~p.v-n.v
v ~ R*(1+a*(T-T0))*i
end
end
Видно, что компонент заключен в регион @engeemodel. Рассмотрим наиболее интересные структуры кода:
@nodes
- описывает физические ненаправленные порты компонента. Каждый такой порт принадлежит домену - области физики (механика, электричество, магнетизм и тд)
@parameters
- параметры компонента, которые задает пользователь
@equations
- уравнения, описывающие поведение компонента. Как раз сюда и записывается наше уравнение
Как работать с кодом компонента?
Что бы использовать свой физический блок, мало написать код компонента, его требуется встроить в модель. Для этого используется блок Physical Component. В его настройках указывается файл с кодом компонента. А что бы модель заработала, файл с кодом должен быть в пути Engee.
Пришло время применить наш новый компонент:
demoroot = @__DIR__
engee.addpath(demoroot);
Для начала, посмотрим на модель усилителя, собранного на обычных не модифицированных компонентах:
Запустим эту модель и получим коэффициент усиления -8:
engee.open(joinpath("OpAmp_Stock.engee"))
Rs = engee.run(joinpath("OpAmp_Stock"))
collect(Rs["Деление.1"])
Теперь откроем модель OpAmp_Custom:
Как видно, блоки резисторов поменялись. Потому что это не блоки резисторов, а блоки Physical Component. Посмотрим на них:
В вкладке Description видим имя нашего компонента, MyResistorHeat, а во вкладке Основные видим, параметры, которые мы указали в регионе @parameters
:
Целевые значения появились, так как мы указали их в @variables
.
Для наглядности примем коэффициент равным 0.001, а примем равным 300 Кельвинам (что соответствует температуре при нормальных условиях). Просимулируем модель при температуре равной :
Видно, что компонент отработал правильно, и полученный коэффициент усиления равен -8. А теперь поднимем температуру у R1 и посмотрим на результаты симуляции:
Видно, что коэффициент усиления изменился! Значит наш компонент работает.
Выводы
Язык физического моделирования в Engee - это необходимый инструмент для описания своих физических компонентов. В разрезе текущего проекта можно представить, что компонент мог бы быть расширен в части моделирования нагрева резистора, что опять же удобно сделать с помощью языка физического моделирования.