Subsystem в Engee
Организация модели с использованием подсистем в среде Engee
В данном материале рассматривается переход от алгоритмического описания физической задачи к структурной модели в среде имитационного моделирования Engee. Основное внимание уделяется применению подсистем различного типа для повышения наглядности, модульности и повторного использования компонентов.
Исходный код на Julia моделирует электрическую цепь, состоящую из трёх резисторов: резисторы R₁ и R₂ соединены параллельно, а их эквивалентное сопротивление подключено последовательно с резистором R₃. В расчёте учитываются:
- производственный допуск сопротивлений (случайный разброс ±tol %);
- температурная зависимость сопротивления через температурный коэффициент TKR.
Цель моделирования — определить мощности, рассеиваемые на каждом резисторе, и полную мощность, потребляемую от источника.
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 Вт")
Расшифровка переменных:
| Переменная | Описание |
|---|---|
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) содержит все блоки, соответствующие операциям исходного кода.

Как видно из рисунка, такая реализация страдает избыточной связностью и низкой читаемостью. Для преодоления этих недостатков применяются подсистемы — группирующие блоки, объединяющие логически связанные элементы.
Создание подсистем
Подсистему можно создать двумя способами:
- выделить группу блоков и использовать функцию объединения;
.png)
- добавить готовый блок Subsystem из библиотеки и заполнить его содержимым вручную.
.png)
После группировки модель (2_Subsystem_and_Mask) становится значительно более структурированной:

В модели выделены следующие функциональные подсистемы:
| Подсистема | Назначение | Формула |
|---|---|---|
| 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) | Вывод результатов |
Подсистемы не только улучшают визуальное восприятие, но и могут влиять на логику работы модели. Более подробно с управляющими портами подсистем можно ознакомиться в соответствующем примере.
Маски блоков
Маски позволяют параметризовать подсистемы, скрывая внутреннюю реализацию и предоставляя удобный интерфейс для задания параметров. Маска создаётся через контекстное меню подсистемы.
.png)
.png)
В рассматриваемой модели маски используются для задания:
- параметров
TKR,T,T0в подсистеме temp_coef;
.png)
- номиналов
R1_nom,R2_nom,R3_nom, допускаtolи температурного коэффициента в блоках генерации сопротивлений;
.png)
- напряжения
U, сопротивленийR_parallelиR3в блоке U_I_Gen.
.png)
Параметры могут быть заданы как числовыми константами, так и ссылками на переменные рабочего пространства Engee.
Детальное описание работы с масками представлено в примерах:
Атомарные подсистемы
Атомарная подсистема (Atomic Subsystem) — это подсистема, которая выполняется как единый неделимый блок с собственным шагом дискретизации, независимым от шага основной модели. Это позволяет:
- задавать различные частоты дискретизации для разных частей модели;
- упрощать генерацию кода;
- изолировать логику внутри подсистемы.
В модели 3_Atomic subsystems атомарными сделаны блоки генерации сопротивлений. Настройка выполняется в параметрах подсистемы.
.png)
Подробнее об атомарных подсистемах и их применении при генерации кода рассказано в этом примере.
Референсные подсистемы (модели-ссылки)
Референсная подсистема (Model Reference) позволяет использовать одну и ту же модель в нескольких местах проекта, сохраняя единый источник. Любые изменения в исходной модели автоматически распространяются на все её экземпляры. Это особенно удобно при наличии повторяющихся функциональных узлов.
Для создания референсной подсистемы необходимо:
- Создать отдельную модель с объявленными входами/выходами (например,
Gen_R.engee).
.png)
- В основной модели использовать блок
Modelи указать путь к этой модели.
.png)
Подробное описание — в примере по моделям-ссылкам.
Пользовательские библиотеки блоков
Для многократного использования подсистем в различных проектах их можно сохранять в пользовательских библиотеках (файлы с расширением .nglib). Библиотека работает аналогично моделям-ссылкам, но предназначена для хранения множества независимых блоков.
В данном примере подсистема Gen_R скопирована в библиотеку R_Lib.nglib. После подключения папки с библиотекой в пути Engee блок становится доступным для вставки в любую модель.
.png)
Модель 5_Subsystem_Lib использует вызов блока из этой библиотеки.
.png)
Подробнее о создании библиотек — в примере по пользовательским библиотекам блоков.
Верификация модели
Для проверки корректности работы модели достаточно сравнить результаты моделирования последней версии (5_Subsystem_Lib) с эталонными значениями, полученными из исходного Julia-скрипта.
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 Вт")
Небольшие расхождения с исходным скриптом обусловлены случайным характером коэффициента rand_coef() при каждом запуске. Таким образом, модель работает корректно и воспроизводит алгоритмическую логику.
Вывод
В работе последовательно рассмотрены основные подходы к организации моделей в среде Engee с использованием подсистем:
- Обычные подсистемы — для логической группировки блоков и повышения наглядности.
- Маски блоков — для параметризации и создания удобного пользовательского интерфейса.
- Атомарные подсистемы — для независимого управления шагом дискретизации и упрощения кодогенерации.
- Референсные подсистемы (Model Reference) — для многократного использования одной модели.
- Пользовательские библиотеки — для хранения и повторного применения блоков в разных проектах.
Каждый из этих инструментов решает конкретную задачу модульности, повторного использования и поддерживаемости моделей. Выбор конкретного подхода зависит от требований проекта: степени детализации, необходимости совместной работы, требований к производительности и генерации кода.
Рекомендуется дополнительно изучить материалы сообщества Engee по каждому из затронутых направлений, чтобы глубже освоить практические аспекты их применения.