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

Организация модели с использованием подсистем в среде Engee

В данном материале рассматривается переход от алгоритмического описания физической задачи к структурной модели в среде имитационного моделирования Engee. Основное внимание уделяется применению подсистем различного типа для повышения наглядности, модульности и повторного использования компонентов.

Исходный код на Julia моделирует электрическую цепь, состоящую из трёх резисторов: резисторы R₁ и R₂ соединены параллельно, а их эквивалентное сопротивление подключено последовательно с резистором R₃. В расчёте учитываются:

  • производственный допуск сопротивлений (случайный разброс ±tol %);
  • температурная зависимость сопротивления через температурный коэффициент TKR.

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

In [ ]:
R1_nom, R2_nom, R3_nom = 100.0, 200.0, 150.0
tol, TKR, T, T0, U = 5.0, 0.01, 40.0, 20.0, 12.0

rand_coef() = 1 + (rand() * 2 - 1) * tol / 100
temp_coef = 1 + (TKR / 100) * (T - T0)
R1 = R1_nom * rand_coef() * temp_coef
R2 = R2_nom * rand_coef() * temp_coef
R3 = R3_nom * rand_coef() * temp_coef

R_parallel = 1 / (1/R1 + 1/R2)
R_total = R_parallel + R3
I = U / R_total
U_parallel = I * R_parallel
U_R3 = I * R3

P1 = U_parallel^2 / R1
P2 = U_parallel^2 / R2
P3 = U_R3^2 / R3
P_total = U * I

println("Мощности:")
println("P1 = $P1 Вт")
println("P2 = $P2 Вт")
println("P3 = $P3 Вт")
println()
println("Общая мощность:")
println("P_total = $P_total Вт")
Мощности:
P1 = 0.12863173377936113 Вт
P2 = 0.06230356760262775 Вт
P3 = 0.4551300744014188 Вт

Общая мощность:
P_total = 0.6460653757834077 Вт

Расшифровка переменных:

Переменная Описание
R1_nom, R2_nom, R3_nom Номинальные сопротивления при опорной температуре T₀, Ом
tol Допуск в процентах (±%)
TKR Температурный коэффициент сопротивления, %/°C
T Текущая температура, °C
T0 Опорная температура, °C
U Напряжение источника, В
rand_coef() Функция возврата случайного коэффициента в диапазоне [1–tol/100, 1+tol/100]
temp_coef Температурный множитель: 1 + (TKR/100)·(T–T₀)
R1, R2, R3 Фактические сопротивления с учётом допуска и температуры
R_parallel Эквивалентное сопротивление параллельного участка
R_total Общее сопротивление цепи
I Ток в цепи
U_parallel Напряжение на параллельном участке
U_R3 Напряжение на резисторе R3
P1, P2, P3 Мощности рассеяния на резисторах
P_total Полная мощность, потребляемая от источника

Построение модели в среде Engee

Перенос алгоритма в графическую среду моделирования позволяет визуализировать структуру системы и упрощает её анализ. Начальная модель (0_System) содержит все блоки, соответствующие операциям исходного кода.
image.png
Как видно из рисунка, такая реализация страдает избыточной связностью и низкой читаемостью. Для преодоления этих недостатков применяются подсистемы — группирующие блоки, объединяющие логически связанные элементы.

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

Подсистему можно создать двумя способами:

  • выделить группу блоков и использовать функцию объединения;image.png
  • добавить готовый блок Subsystem из библиотеки и заполнить его содержимым вручную.
    image.png

После группировки модель (2_Subsystem_and_Mask) становится значительно более структурированной:

image.png

В модели выделены следующие функциональные подсистемы:

Подсистема Назначение Формула
temp_coef Вычисление температурного коэффициента temp_coef = 1 + (TKR/100)·(T − T0)
Gen_R1 Генерация R1 с учётом допуска и температуры R1 = R1_nom · rand_coef() · temp_coef
Gen_R2 Генерация R2 R2 = R2_nom · rand_coef() · temp_coef
Gen_R3 Генерация R3 R3 = R3_nom · rand_coef() · temp_coef
R_parallel Расчёт эквивалентного сопротивления параллельного соединения R1 и R2 R_parallel = 1/(1/R1 + 1/R2)
U_I_Gen Вычисление тока, напряжений и их квадратов для расчёта мощностей R_total = R_parallel + R3, I = U/R_total, U_parallel = I·R_parallel, U_R3 = I·R3

Дополнительные блоки (вне подсистем):

Блок Назначение
Divide-4, -5, -6 Деление для расчёта P2, P1, P3 соответственно
Product-14 Вычисление полной мощности P_total = U·I
Константы Задание параметров R1_nom, R2_nom, R3_nom, tol, TKR, T, T0, U
Outport (P1, P2, P3, P_total) Вывод результатов

Подсистемы не только улучшают визуальное восприятие, но и могут влиять на логику работы модели. Более подробно с управляющими портами подсистем можно ознакомиться в соответствующем примере.

Маски блоков

Маски позволяют параметризовать подсистемы, скрывая внутреннюю реализацию и предоставляя удобный интерфейс для задания параметров. Маска создаётся через контекстное меню подсистемы.

image.png
image.png

В рассматриваемой модели маски используются для задания:

  • параметров TKR, T, T0 в подсистеме temp_coef;
image.png
  • номиналов R1_nom, R2_nom, R3_nom, допуска tol и температурного коэффициента в блоках генерации сопротивлений;
image.png
  • напряжения U, сопротивлений R_parallel и R3 в блоке U_I_Gen.
image.png

Параметры могут быть заданы как числовыми константами, так и ссылками на переменные рабочего пространства Engee.

Детальное описание работы с масками представлено в примерах:

Атомарные подсистемы

Атомарная подсистема (Atomic Subsystem) — это подсистема, которая выполняется как единый неделимый блок с собственным шагом дискретизации, независимым от шага основной модели. Это позволяет:

  • задавать различные частоты дискретизации для разных частей модели;
  • упрощать генерацию кода;
  • изолировать логику внутри подсистемы.

В модели 3_Atomic subsystems атомарными сделаны блоки генерации сопротивлений. Настройка выполняется в параметрах подсистемы.


image.png

Подробнее об атомарных подсистемах и их применении при генерации кода рассказано в этом примере.

Референсные подсистемы (модели-ссылки)

Референсная подсистема (Model Reference) позволяет использовать одну и ту же модель в нескольких местах проекта, сохраняя единый источник. Любые изменения в исходной модели автоматически распространяются на все её экземпляры. Это особенно удобно при наличии повторяющихся функциональных узлов.

Для создания референсной подсистемы необходимо:

  1. Создать отдельную модель с объявленными входами/выходами (например, Gen_R.engee).
image.png
  1. В основной модели использовать блок Model и указать путь к этой модели.
image.png

Подробное описание — в примере по моделям-ссылкам.

Пользовательские библиотеки блоков

Для многократного использования подсистем в различных проектах их можно сохранять в пользовательских библиотеках (файлы с расширением .nglib). Библиотека работает аналогично моделям-ссылкам, но предназначена для хранения множества независимых блоков.

В данном примере подсистема Gen_R скопирована в библиотеку R_Lib.nglib. После подключения папки с библиотекой в пути Engee блок становится доступным для вставки в любую модель.


image.png

Модель 5_Subsystem_Lib использует вызов блока из этой библиотеки.

image.png

Подробнее о создании библиотек — в примере по пользовательским библиотекам блоков.

Верификация модели

Для проверки корректности работы модели достаточно сравнить результаты моделирования последней версии (5_Subsystem_Lib) с эталонными значениями, полученными из исходного Julia-скрипта.

In [ ]:
function run_model(name)
    p, is_loaded = joinpath(@__DIR__, name * ".engee"), name  [m.name for m in engee.get_all_models()]
    is_loaded && engee.load(p, force=true)
    out = engee.run(engee.open(name), verbose=true)
    is_loaded && engee.close(name, force=true)
    sleep(0.1); return out
end
run_model("5_Subsystem_Lib")
P_total_S = collect(simout["5_Subsystem_Lib/P_total"]).value[end]
P1_S = collect(simout["5_Subsystem_Lib/P1"]).value[end]
P2_S = collect(simout["5_Subsystem_Lib/P2"]).value[end]
P3_S = collect(simout["5_Subsystem_Lib/P3"]).value[end]
println("Мощности:")
println("P1 = $P1_S Вт")
println("P2 = $P2_S Вт")
println("P3 = $P3_S Вт")
println()
println("Общая мощность:")
println("P_total = $P_total_S Вт")
Building...
Progress 0%
Progress 100%
Progress 100%
Мощности:
P1 = 0.13699429714545494 Вт
P2 = 0.07280320145541849 Вт
P3 = 0.46469908927615955 Вт

Общая мощность:
P_total = 0.674496587877033 Вт

Небольшие расхождения с исходным скриптом обусловлены случайным характером коэффициента rand_coef() при каждом запуске. Таким образом, модель работает корректно и воспроизводит алгоритмическую логику.

Вывод

В работе последовательно рассмотрены основные подходы к организации моделей в среде Engee с использованием подсистем:

  • Обычные подсистемы — для логической группировки блоков и повышения наглядности.
  • Маски блоков — для параметризации и создания удобного пользовательского интерфейса.
  • Атомарные подсистемы — для независимого управления шагом дискретизации и упрощения кодогенерации.
  • Референсные подсистемы (Model Reference) — для многократного использования одной модели.
  • Пользовательские библиотеки — для хранения и повторного применения блоков в разных проектах.

Каждый из этих инструментов решает конкретную задачу модульности, повторного использования и поддерживаемости моделей. Выбор конкретного подхода зависит от требований проекта: степени детализации, необходимости совместной работы, требований к производительности и генерации кода.

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