Сообщество Engee

Язык физического моделирования Engee

Автор
avatar-nikfilaretovnikfilaretov
Notebook

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

В 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);

Для начала, посмотрим на модель усилителя, собранного на обычных не модифицированных компонентах:

opampstock.png

Запустим эту модель и получим коэффициент усиления -8:

engee.open(joinpath("OpAmp_Stock.engee"))
Rs = engee.run(joinpath("OpAmp_Stock"))
collect(Rs["Деление.1"])
2×2 DataFrame
Rowtimevalue
Float64Float64
10.0-8.0
20.01-8.0

Теперь откроем модель OpAmp_Custom:

image.png

Как видно, блоки резисторов поменялись. Потому что это не блоки резисторов, а блоки Physical Component. Посмотрим на них:

cssc_d.png

В вкладке Description видим имя нашего компонента, MyResistorHeat, а во вкладке Основные видим, параметры, которые мы указали в регионе @parameters:

cssc.png

Целевые значения появились, так как мы указали их в @variables.

Для наглядности примем коэффициент равным 0.001, а примем равным 300 Кельвинам (что соответствует температуре при нормальных условиях). Просимулируем модель при температуре равной :

image.png

Видно, что компонент отработал правильно, и полученный коэффициент усиления равен -8. А теперь поднимем температуру у R1 и посмотрим на результаты симуляции:

image.png

Видно, что коэффициент усиления изменился! Значит наш компонент работает.

Выводы

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