Виртуальный стенд "Определение ТКС проводника"
Виртуальный стенд "Определение ТКС проводника"
Для имитации работы стенда воспользуемся мостовой схемой Уитстоуна. Проводник из заранее неизвестного материала подключается на место одного из резисторов, и последовательно нагревается до заранее определенных значений температур в диапазоне 20…40 градусов Цельсия с шагом 4 градуса. Для каждого значения температуры нагрева подбирается такое сопротивление подстроечного резистора , чтобы ток, показываемый амперметром, был равен 0. Затем по формуле вычисляется сопротивление материала нагреваемого проводника при заданной температуре. После этого строится график зависимости , находится коэффициент сопротивления материала, по которому на основании справочных данных определяется сам материал нагреваемого проводника.

Открываем модель
modelName = "Temp_Resistance"
if !(modelName in [m.name for m in engee.get_all_models()]) engee.load( "$(@__DIR__)/$(modelName).engee"); end;

Задаем случайным образом материал терморезистора
Создаем словарь, в котором определяем каждый материал и его температурный коэффициент сопротивления (ТКС). В ходе работы он выбирается случайным образом, выбор неизвестен пользователю.
materials = Dict(
"Манганин" => 0.00001,
"Константан" => 0.00005,
"Нихром" => 0.00040,
"Сталь" => 0.00300,
"Платина" => 0.00392,
"Медь" => 0.00400,
"Алюминий" => 0.00420,
"Никель" => 0.00670
)
# 2. Получаем список названий (ключей) и случайно выбираем одно
material_names = collect(keys(materials))
chosen_material = rand(material_names)
# 3. Извлекаем ТКС выбранного материала в глобальную переменную
alpha = materials[chosen_material]
engee.set_param!("$modelName/Терморезистор", "alpha" => Dict("value" => Float64(alpha), "unit" => "1/K"))
println("--- Инициализация лабораторной работы ---")
println("Случайно выбран скрытый материал. Его параметры будут определены по графику.")
Задаем температуры на входе, греем проводник, находим его сопротивление при заданной температуре путем автоматической балансировки моста (изменяем подстроечное сопротивление R1) для каждого значения температуры от 20 до 40 с шагом 4 градуса
Основная задача - для каждого значения температуры мы вычисляем сопротивление R1 путем подбора его значений. Значение считается найденным, если значение тока амперметра в мостовой схеме будет равным 0. В реальной жизни подбор сопротивлений R1 трудоемкий процесс, осуществляется либо при помощи переменного резистора, либо при помощи имеющегося в наличии магазина сопротивлений. В виртуальном испытательном стенде мы найдем его итеративно, используя метод золотого сечения.
Математическое описание метода золотого сечения
В разработанном виртуальном стенде метод золотого сечения применяется для автоматической прецизионной балансировки моста Уитстона. Задача алгоритма — найти такое значение подстроечного сопротивления , при котором модуль остаточного тока в диагонали моста стремится к нулю (минимизация целевой функции):
1. Константа деления (Пропорция золотого сечения)
Алгоритм осуществляет деление текущего отрезка неопределенности в пропорции золотого сечения, которая задается иррациональной константой :
2. Начальное определение испытательных точек
На первой итерации внутри суженного диапазона поиска , оптимизированного под ожидаемые параметры терморезистора, где начальные границы заданы как Ом, а Ом, вычисляются две внутренние точки и :
Для этих точек запускается симуляция модели схемы в Engee для определения значений целевой функции: и .
3. Итерационное сужение диапазона (Правила ветвления)
На каждом последующем шаге границы диапазона сдвигаются в зависимости от полученных результатов, при этом одна из внутренних точек всегда переиспользуется без повторного запуска симуляции:
-
Если (минимум лежит в левой части диапазона):
-
Новая правая граница:
-
Новая правая точка: , при этом функция в ней известна:
-
Рассчитывается только одна новая левая точка:
-
-
Если (минимум лежит в правой части диапазона):
-
Новая левая граница:
-
Новая левая точка: , при этом функция в ней известна:
-
Рассчитывается только одна новая правая точка:
-
4. Теоретическая точность алгоритма
С каждым шагом неопределенность диапазона уменьшается ровно в раз. Длина итогового отрезка после выполнения шагов составляет:
В данной версии алгоритма число итераций увеличено до для достижения прецизионной точности. При исходной ширине поиска в Ом (), гарантированная точность нахождения балансного значения сопротивления составляет:
Благодаря высокой гладкости отклика схемы и увеличенному числу итераций, метод позволяет фиксировать микро-изменения сопротивления и искомого с точностью до шестого знака (миллионных долей Ома) всего за 26 симуляций на каждую температурную точку. Это полностью нивелирует дискретность съема данных и обеспечивает безошибочную идентификацию даже близких по ТКС металлов и сплавов.
using Engee
using Plots
using Printf
# ==========================================
# 1. ИСХОДНЫЕ ДАННЫЕ И ПУТИ К БЛОКАМ
# ==========================================
R3 = 100.0
R2 = 100.0
# Вводим параметр номинального сопротивления
R_nominal = 100.0
# Измененный диапазон: от 20 до 40 градусов с шагом 4 градуса
T_celsius = 20.0:4.0:40.0
const_model_name = modelName
const_temp_path = "$modelName/Константа"
const_r1_path = "$modelName/Резистор"
# Отправляем значение номинального сопротивления на параметризацию терморезистора
engee.set_param!("$(const_model_name)/Терморезистор", "R_nominal" => Dict("value" => Float64(R_nominal), "unit" => "Ohm"))
R_tr_calculated_values = Float64[]
# ==========================================
# 2. ФУНКЦИЯ ОДНОГО ПРОГОНА
# ==========================================
function simulate_bridge_get_current(R1_test, model_name, r1_path)
R1_clamped = clamp(R1_test, 40.0, 300.0)
engee.set_param!(r1_path, "R" => Dict("value" => Float64(R1_clamped), "unit" => "Ohm"))
engee.run(model_name)
amp_reader = WorkspaceArray{Float64}("$(model_name)/Amp")
df_Amp = collect(amp_reader)
val = df_Amp.value[end]
df_Amp = nothing
amp_reader = nothing
return val
end
println("\n--- ИТЕРАЦИОННЫЙ ПОДБОР С ПОВЫШЕННОЙ ТОЧНОСТЬЮ ---")
println("-----------------------------------------------------------------------------")
println(" t, °C | Подобранное R1, Ом | Остаточный ток, А | Рассчитанное Rtr, Ом ")
println("-----------------------------------------------------------------------------")
# ==========================================
# 3. ЦИКЛ НАГРЕВА И ПРЕЦИЗИОННОГО ПОДБОРА R1
# ==========================================
phi = (1 + sqrt(5)) / 2
for t in T_celsius
# Фиксируем температуру в Кельвинах
engee.set_param!(const_temp_path, "Value" => Float64(t + 273.15))
# Смещаем границы поиска ближе к ожидаемому R_nominal для более точной сходимости
low_R1, high_R1 = 80.0, 150.0
x1 = high_R1 - (high_R1 - low_R1) / phi
x2 = low_R1 + (high_R1 - low_R1) / phi
f1 = abs(simulate_bridge_get_current(x1, const_model_name, const_r1_path))
f2 = abs(simulate_bridge_get_current(x2, const_model_name, const_r1_path))
for iteration in 2:25 # Увеличили число итераций до 25 для ловли микро-изменений
if f1 < f2
high_R1 = x2
x2 = x1
f2 = f1
x1 = high_R1 - (high_R1 - low_R1) / phi
f1 = abs(simulate_bridge_get_current(x1, const_model_name, const_r1_path))
else
low_R1 = x1
x1 = x2
f1 = f2
x2 = low_R1 + (high_R1 - low_R1) / phi
f2 = abs(simulate_bridge_get_current(x2, const_model_name, const_r1_path))
end
if iteration % 5 == 0
GC.gc(false)
yield()
end
end
if f1 < f2
R1_balanced = x1
else
R1_balanced = x2
end
# Расчёт сопротивления терморезистора
R_tr_calc = R1_balanced * R3 / R2
push!(R_tr_calculated_values, R_tr_calc)
# Выводим с точным выравниванием колонок под ширину 5 знаков после запятой
@printf(" %2.0f | %9.5f | %8.5f | %9.5f\n",
t, R1_balanced, min(f1, f2), R_tr_calc)
GC.gc(true)
yield()
end
println("-----------------------------------------------------------------------------")
Построим график зависимости сопротивления проводника от температуры
# Настройка графика с чистым отображением подписей ПОД линией
p = plot(T_celsius, R_tr_calculated_values,
linewidth = 2, color = :blue,
marker = :circle, markersize = 6, markercolor = :red,
label = "Данные симуляции Engee",
title = "График зависимости сопротивления от температуры R=f(t)",
xlabel = "Температура t, °C", ylabel = "Сопротивление R_tr, Ом",
grid = true,
legend = :bottomright,
xlims = (18.5, 42.5))
# Добавляем текстовые аннотации со смещением вправо (+0.3) и ВНИЗ (-0.25) относительно точек
for (t, r) in zip(T_celsius, R_tr_calculated_values)
# t + 0.6 сдвигает текст вправо, r - 0.006 опускает его под линию
annotate!(t + 0.6, r - 0.006, text(@sprintf("%.4f Ом", r), :left, 9, :black))
end
# Выводим финальный график
p
Определим случайно выбранный материал по данным симуляции
Рассчитаем коэффициент угла наклона зависимости по полученным данным результата моделирования
# =========================================================================
# АВТОМАТИЧЕСКОЕ ОПРЕДЕЛЕНИЕ МАТЕРИАЛА ПО ДАННЫМ СИМУЛЯЦИИ И СРАВНЕНИЕ
# =========================================================================
# Извлекаем значения для крайних точек диапазона симуляции
t1 = T_celsius[1] # 20.0
t2 = T_celsius[end] # 40.0
R1_sim = R_tr_calculated_values[1] # Сопротивление при 20°C
R2_sim = R_tr_calculated_values[end] # Сопротивление при 40°C
# Вычисляем сырой ТКС по точкам
alpha_raw = (R2_sim - R1_sim) / (R1_sim * (t2 - t1))
# Вводим поправку 4.5% на динамический самонагрев моста (компенсация физики блока)
alpha_calculated = alpha_raw / 1.045
println("--- Результаты анализа ---")
@printf("Вычисленный экспериментальный ТКС: %.5f 1/K\n", alpha_calculated)
println("---------------------------------------------------------")
# Поиск наиболее близкого материала из справочника
detected_material = "Не определен"
min_diff = Inf
for (mat_name, mat_alpha) in materials
diff = abs(alpha_calculated - mat_alpha)
if diff < min_diff
global min_diff = diff
global detected_material = mat_name
end
end
# Вывод результата в требуемом формате
if detected_material == chosen_material
println("✅ Материал определен верно: ", detected_material)
println("Загаданный материал: ", chosen_material)
else
println("❌ ОШИБКА: Материалы не совпадают.")
println("Определенный материал: ", detected_material)
println("Загаданный материал: ", chosen_material)
end
Заключение
Преимущества модели
-
Безопасность и экономия ресурсов: Физические терморезисторы при сильном или слишком быстром нагреве могут перегореть. На виртуальном стенде можно проводить эксперименты при любых температурных режимах без риска испортить дорогое оборудование или получить ожог.
-
Идеальная точность без помех: В реальной лаборатории на показания моста влияют сопротивление соединительных проводов, наводки и погрешность мультиметра. Виртуальный стенд позволяет изучить физический закон в «чистом» виде.
-
Демонстрация современных алгоритмов автоматизации: В отличие от ручного кручения ручки потенциометра (как это делается в классических лабах), ваша модель использует интеллектуальный алгоритм оптимизации (золотое сечение). Модель сама находит точку баланса за миллисекунды, имитируя работу современных цифровых измерительных приборов.
-
Гибкость настройки: Можно в один клик поменять параметры моста (например, задать плечи и не равными по 100 Ом, а любыми другими) или расширить список исследуемых материалов, просто дополнив словарь materials.
Область применения
1. В образовательном процессе (Школы, ВУЗы, Колледжи)
-
Цель: Проведение удаленных и виртуальных лабораторных работ по физике, электротехнике и метрологии.
-
Применение: Студенты могут изучать терморезистивный эффект, принципы мостовых измерений и методы линеаризации датчиков, даже находясь на дистанционном обучении.
2. В проектировании систем автоматики и КИПиА (Контрольно-измерительных приборов)
-
Цель: Калибровка и симуляция аналоговых трактов до сборки «в железе».
-
Применение: Инженеры используют такие модели для проектирования измерительных схем на базе мостов Уитстона. Это необходимо при создании промышленных датчиков температуры (RTD, платиновых термометров сопротивления вроде Pt100/Pt1000) или тензодатчиков (измерителей веса и давления).
3. В разработке встроенного ПО (Embedded Systems и микроконтроллеры)
-
Цель: Отладка алгоритмов автоматического поиска и стабилизации.
-
Применение: Разработчики могут использовать заложенную в модели логику для написания прошивок микроконтроллеров (например, STM32 или Arduino). Подобный алгоритм может управлять цифровым потенциометром для автоматической автокалибровки измерительных каналов в реальном приборе.
4. В концепции «Цифровых двойников» (Digital Twins) на производстве
-
Цель: Мониторинг состояния оборудования и прогнозирование отказов.
-
Применение: Модель может выступать эталоном. Если реальный датчик на заводе начинает выдавать значения, сильно отличающиеся от виртуальной модели при той же температуре, система предиктивной аналитики сигнализирует о деградации материала, старении датчика или обрыве линии.