Подбор вентилятора охлаждения ЦП
Author
using Plots
# Принудительно инициализируем бэкенд GR для генерации статических графиков,
# которые не пропадут при публикации в сообществе
gr()
function run_and_plot_fan_simulation(model_name::String)
# 1. Загрузка и запуск модели в Engee
if !(model_name in [m.name for m in engee.get_all_models()])
engee.load("$(@__DIR__)/$(model_name).engee")
end
engee.run(model_name)
# 2. Извлечение сырых данных (Векторы времени и значений из Workspace)
# Используем строго свойства .time и .value (без круглых скобок!), как требует Engee
data_t_cpu = collect(WorkspaceArray{Float64}("$model_name/T_CPU"))
data_heat = collect(WorkspaceArray{Float64}("$model_name/Heat_Profile"))
data_w = collect(WorkspaceArray{Float64}("$model_name/W"))
data_speed = collect(WorkspaceArray{Float64}("$model_name/Подсистема/Speed_Level"))
# 3. Алгоритм равномерного прореживания строго до 1000 точек по индексам сигналов
# Данный метод не требует интерполяции и исключает любые ошибки несовпадения размерностей
idx_t_cpu = round.(Int, range(1, stop=length(data_t_cpu.time), length=1000))
idx_heat = round.(Int, range(1, stop=length(data_heat.time), length=1000))
idx_w = round.(Int, range(1, stop=length(data_w.time), length=1000))
idx_speed = round.(Int, range(1, stop=length(data_speed.time), length=1000))
# Формируем массивы для графиков (ровно по 1000 элементов в каждом векторе)
t_plot = data_heat.time[idx_heat]
t_cpu_plot = vec(data_t_cpu.value)[idx_t_cpu]
heat_plot = vec(data_heat.value)[idx_heat]
w_plot = vec(data_w.value)[idx_w] .* (60 / 6.28) # перевод в об/мин
speed_plot = vec(data_speed.value)[idx_speed]
# 4. Компоновка и отрисовка графиков
p1 = plot(t_plot, t_cpu_plot, title="Температура ЦП, град. Цельсия", marker=:none)
p2 = plot(t_plot, heat_plot, title="Выделяемая тепловая мощность", linecolor=:orange, marker=:none)
p3 = plot(t_plot, w_plot, title="Скорость вращения, об/мин", linecolor=:red, marker=:none)
p4 = plot(t_plot, speed_plot, title="Выбранный уровень скорости вращения", linecolor=:green, marker=:none)
# Отображение финальной панели из 4 графиков в интерактивном окне ноутбука
display(plot(p1, p2, p3, p4, layout=(2,2), leg=false, size=(1200,600), titlefont=font(10)))
end