Автоматическая настройка ПИД-регулятора
В примере показывается автоматическая настройка ПИД-регулятора в коде и в модели.
Модель тепловой камеры
Объект управления описывается передаточной функцией
Постоянная времени 12 с описывает инерцию нагревателя и стенок, 3 с — более быструю динамику воздуха и датчика.
Вход u — мощность нагревателя, %,
Выход y — темература нагрева, °C.
Требуется настроить управление таким образом, чтобы время переходного процесса было не больше 20 с
Автоматическая настройка ПИД регулятора в коде
using ControlSystems
sys = tf([0.4], [36.0, 15.0, 1.0])
Характеристики нескорректированной системы
plotlyjs() # Интерактивный бэкэнд графики
p1 = ControlSystems.bodeplot(sys)
t = 0:0.1:100.0
plot(stepinfo(step(feedback(sys), t)))
Частоту среза будем определять по эмпирической формуле
где - время переходного процесса.
wc = round(2.5*pi/20, digits=1)
amplitude_limits = Plots.ylims(p1[1])
Plots.plot!(p1[1], [wc, wc], [amplitude_limits[1], amplitude_limits[2]]; color=:red, linestyle=:dash, label="Желаемая частота 0.4 рад/с")
phase_limits = Plots.ylims(p1[2])
Plots.plot!(p1[2], [wc, wc], [phase_limits[1], phase_limits[2]]; color=:red, linestyle=:dash, label="" )
Настройка ПИД-регулятора
using EngeeControlSystems
c, info = pidtune(sys, :pidf, :parallel, wc)
Характеристики скорректированной системы
Wzam = feedback(c*sys) # Замкнутая система
t = 0:0.1:100.0
plot(stepinfo(step(Wzam, t)))
Wraz = c*sys # Разомкнутая система
ControlSystems.marginplot(sys)
ControlSystems.marginplot!(Wraz)
Автоматическая настройка ПИД-регулятора в модели
engee.addpath(@__DIR__)
if "demo_frd_pid_tune" in [m.name for m in engee.get_all_models()]
m = engee.open( "demo_frd_pid_tune" )
else
m = engee.load( "demo_frd_pid_tune.engee" )
end
engee.set_param!("demo_frd_pid_tune/ПИД-регулятор", "P"=>"1", "I"=>"0", "D"=>"0", "N"=>"100") # Параметры ПИД-регулятора по умолчанию
results1 = engee.run(m, verbose=true)
t = results1["tc_setpoint"].time;
tc_setpoint = results1["tc_setpoint"].value;
tc_temperature = results1["tc_temperature"].value;
tc_disturbance = results1["tc_disturbance"].value;
tc_control = results1["tc_control"].value;
plot(layout=@layout([a; b; с]), legend=:outertopright)
plot!(t, tc_setpoint, subplot=1, ylabel="t, °C", w = 2, label="Желаемая температура", linecolor =:blue)
plot!(t, tc_temperature, subplot=1, ylabel="t, °C", w = 2, label="Температура нагрева", linecolor =:red)
plot!(t, tc_disturbance, subplot=2, ylabel="t, °C", w = 2, label="Внешние возмущения", linecolor =:green)
plot!(t, tc_control, subplot=3, xlabel="Время, c", ylabel="t, °C", w = 2, label="Сигнал управления", linecolor =:green)
Основной недостаток исходной настройки -- большая статическая ошибка. Для её устранения необходимо использовать ПИД-регулятор. Для автоматической настройки коэффициентов ПИД-регулятора используется приложение Настройка ПИД-регулятора по частотной характеристике.
Настройка ПИД-регулятора
Откройте настройки блока ПИД-регулятор и нажмите кнопку Настроить. Через некоторое время откроется приложение Настройка ПИД-регулятора по частотной характеристике. При открытии приложение получает параметры блока: тип ПИД-регулятора (P, I, PI, PID и т. д.), форма ПИД-регулятора (параллельный, идеальный), период дискретизации, а также методы интегрирования и фильтрации производной, если применимо.
Приложение автоматически настраивает ПИД-регулятор по результатам двух симуляций. Во время первой симуляции вычисляется базовый отклик системы. Во время второй симуляции контур размыкается на входе объекта управления. К объекту прикладываются синусоидальные воздействия и ступенчатое воздействие. Затем приложение вычисляет разность откликов, полученных в двух симуляциях. Это позволяет исключить влияние возмущений, действующих в модели. Полученные данные используются для оценки частотной характеристики объекта управления, по которой рассчитываются коэффициенты ПИД-регулятора.
Настройки эксперимента
.png)
Объект управления
По переходным процессам видно, что объект Асимптотически устойчивый
Начало эксперимента
Возмущение следует подавать после завершения начального переходного процесса. В этой модели он заканчивается примерно к моменту 100 с, поэтому примем это значение за время начала эксперимента.
Длительность эксперимента
Длительность эксперимента можно оценить как ; где - частота среза, которую мы определили ранее. Длительность эксперимента возьмем 250 с
Амплитуды синусоидального сигнала
Амплитуды возмущений должны быть достаточно большими, чтобы возмущение вызвало отклик выше уровня шума и достаточно малыми, чтобы удерживать объект в приблизительно линейной области вблизи номинальной рабочей точки и избежать насыщения входа или выхода объекта. Достаточные амплитуды примем равными 5.
Амплитуда ступенчатого сигналов
Параметр задается если объект асимптотически устойчив. Выберем ту же амплитуду, что и для синусов.
Желаемая частота среза:
Частота среза была расчитана ранее 0.4 рад/с
Желаемый запас по фазе
Запас по фазе 60° обычно соответствует перерегулированию около 10% или меньше.
После заполнения полей с настройками эксперимента нажмите Настроить, чтобы запустить две симуляции модели и рассчитать параметры ПИД-регулятора.
По завершении настройки в окне приложения в разделе Результаты отображаются настроенные коэффициенты усиления и расчетный запас по фазе. Проверьте, что рассчитанный запас по фазе близок к Желаемому запасу по фазе.
Проверка настроенного регулятора
Нажмите кнопку Обновить блок, чтобы записать настроенные коэффициенты в блок ПИД-регулятора, а затем выполните расположенные ниже ячейки, чтобы изучить поведение системы после настройки ПИД-регулятора.
.png)
results2 = engee.run(m, verbose=true);
t = results2["tc_setpoint"].time;
tc_setpoint = results2["tc_setpoint"].value;
tc_temperature = results2["tc_temperature"].value;
tc_disturbance = results2["tc_disturbance"].value;
tc_control = results2["tc_control"].value;
plot(layout=@layout([a; b; с]), legend=:outertopright)
plot!(t, tc_setpoint, subplot=1, ylabel="Температура, °C", w = 2, label="Желаемая температура", linecolor =:blue)
plot!(t, tc_temperature, subplot=1, ylabel="Температура, °C", w = 2, label="Температура нагрева", linecolor =:red)
plot!(t, tc_disturbance, subplot=2, ylabel="Температура, °C", w = 2, label="Внешние возмущения", linecolor =:green)
plot!(t, tc_control, subplot=3, xlabel="Время, c", ylabel="Температура, °C", w = 2, label="Сигнал управления", linecolor =:green)