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

Автоматическая настройка ПИД-регулятора

В примере показывается автоматическая настройка ПИД-регулятора в коде и в модели.

Модель тепловой камеры

Объект управления описывается передаточной функцией

Постоянная времени 12 с описывает инерцию нагревателя и стенок, 3 с — более быструю динамику воздуха и датчика.

Вход u — мощность нагревателя, %,

Выход y — темература нагрева, °C.

Требуется настроить управление таким образом, чтобы время переходного процесса было не больше 20 с

Автоматическая настройка ПИД регулятора в коде

In [ ]:
using ControlSystems
sys = tf([0.4], [36.0, 15.0, 1.0])
Out[0]:
TransferFunction{Continuous, ControlSystemsBase.SisoRational{Float64}}
         0.4
---------------------
36.0s^2 + 15.0s + 1.0

Continuous-time transfer function model
Характеристики нескорректированной системы
In [ ]:
plotlyjs() # Интерактивный бэкэнд графики
p1 = ControlSystems.bodeplot(sys)
Out[0]:
In [ ]:
t = 0:0.1:100.0
plot(stepinfo(step(feedback(sys), t)))
Out[0]:

Частоту среза будем определять по эмпирической формуле

где - время переходного процесса.

In [ ]:
wc = round(2.5*pi/20, digits=1)
Out[0]:
0.4
In [ ]:
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="" )
Out[0]:
Настройка ПИД-регулятора
In [ ]:
using EngeeControlSystems
c, info = pidtune(sys, :pidf, :parallel, wc)
Out[0]:
(Pid(16.391363067255494, 1.8026133573306222, 26.458472028003097, 0.4583816712361741, nothing, nothing, nothing), (true, 0.4, 68.99543738355393))
Характеристики скорректированной системы
In [ ]:
Wzam = feedback(c*sys) # Замкнутая система
t = 0:0.1:100.0
plot(stepinfo(step(Wzam, t)))
Out[0]:
In [ ]:
Wraz = c*sys # Разомкнутая система
ControlSystems.marginplot(sys)
ControlSystems.marginplot!(Wraz)
Out[0]:

Автоматическая настройка ПИД-регулятора в модели

In [ ]:
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)
Building...
Progress 0%
Progress 26%
Progress 100%
Progress 100%
Out[0]:
SimulationResult(
    run_id => 1,
    "tc_control" => WorkspaceArray{Float64}("demo_frd_pid_tune/tc_control")
,
    "tc_disturbance" => WorkspaceArray{Float64}("demo_frd_pid_tune/tc_disturbance")
,
    "tc_setpoint" => WorkspaceArray{Float64}("demo_frd_pid_tune/tc_setpoint")
,
    "tc_temperature" => WorkspaceArray{Float64}("demo_frd_pid_tune/tc_temperature")

)
In [ ]:
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)
Out[0]:

Основной недостаток исходной настройки -- большая статическая ошибка. Для её устранения необходимо использовать ПИД-регулятор. Для автоматической настройки коэффициентов ПИД-регулятора используется приложение Настройка ПИД-регулятора по частотной характеристике.

Настройка ПИД-регулятора

Откройте настройки блока ПИД-регулятор и нажмите кнопку Настроить. Через некоторое время откроется приложение Настройка ПИД-регулятора по частотной характеристике. При открытии приложение получает параметры блока: тип ПИД-регулятора (P, I, PI, PID и т. д.), форма ПИД-регулятора (параллельный, идеальный), период дискретизации, а также методы интегрирования и фильтрации производной, если применимо.

Приложение автоматически настраивает ПИД-регулятор по результатам двух симуляций. Во время первой симуляции вычисляется базовый отклик системы. Во время второй симуляции контур размыкается на входе объекта управления. К объекту прикладываются синусоидальные воздействия и ступенчатое воздействие. Затем приложение вычисляет разность откликов, полученных в двух симуляциях. Это позволяет исключить влияние возмущений, действующих в модели. Полученные данные используются для оценки частотной характеристики объекта управления, по которой рассчитываются коэффициенты ПИД-регулятора.

Настройки эксперимента

image.png
Объект управления

По переходным процессам видно, что объект Асимптотически устойчивый

Начало эксперимента

Возмущение следует подавать после завершения начального переходного процесса. В этой модели он заканчивается примерно к моменту 100 с, поэтому примем это значение за время начала эксперимента.

Длительность эксперимента

Длительность эксперимента можно оценить как ; где - частота среза, которую мы определили ранее. Длительность эксперимента возьмем 250 с

Амплитуды синусоидального сигнала

Амплитуды возмущений должны быть достаточно большими, чтобы возмущение вызвало отклик выше уровня шума и достаточно малыми, чтобы удерживать объект в приблизительно линейной области вблизи номинальной рабочей точки и избежать насыщения входа или выхода объекта. Достаточные амплитуды примем равными 5.

Амплитуда ступенчатого сигналов

Параметр задается если объект асимптотически устойчив. Выберем ту же амплитуду, что и для синусов.

Желаемая частота среза:

Частота среза была расчитана ранее 0.4 рад/с

Желаемый запас по фазе

Запас по фазе 60° обычно соответствует перерегулированию около 10% или меньше.

После заполнения полей с настройками эксперимента нажмите Настроить, чтобы запустить две симуляции модели и рассчитать параметры ПИД-регулятора.

По завершении настройки в окне приложения в разделе Результаты отображаются настроенные коэффициенты усиления и расчетный запас по фазе. Проверьте, что рассчитанный запас по фазе близок к Желаемому запасу по фазе.

Проверка настроенного регулятора

Нажмите кнопку Обновить блок, чтобы записать настроенные коэффициенты в блок ПИД-регулятора, а затем выполните расположенные ниже ячейки, чтобы изучить поведение системы после настройки ПИД-регулятора.
image.png

In [ ]:
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)
Building...
Progress 0%
Progress 24%
Progress 100%
Progress 100%
Out[0]: