56 lines
2.4 KiB
Python
56 lines
2.4 KiB
Python
import matplotlib.pyplot as plt
|
||
import time
|
||
|
||
# Параметры PID-регулятора
|
||
kp = 0.5 # пропорциональный коэффициент
|
||
ki = 0.1 # интегральный коэффициент
|
||
kd = 0.2 # дифференциальный коэффициент (НОВОЕ!)
|
||
|
||
# Инициализация переменных
|
||
setpoint = 50.0 # заданное значение
|
||
input_val = 0.0 # текущее значение (с датчика)
|
||
I = 0.0 # интегральная составляющая
|
||
prev_error = 0.0 # предыдущая ошибка (для D-составляющей)
|
||
dt = 0.1 # временной шаг
|
||
|
||
# Списки для хранения данных для графика
|
||
time_points = []
|
||
setpoint_points = []
|
||
input_points = []
|
||
out_points = []
|
||
|
||
# Симуляция работы PID-регулятора
|
||
for t in range(100):
|
||
# Обновляем входное значение (имитация системы)
|
||
error = setpoint - input_val
|
||
input_val += error * 0.1 * (1 + 0.1 * t) # имитация изменения системы
|
||
|
||
# Расчет управляющего сигнала (PID)
|
||
P = error # пропорциональная составляющая
|
||
I += error * dt # интегральная составляющая
|
||
D = (error - prev_error) / dt # дифференциальная составляющая (НОВОЕ!)
|
||
out = P * kp + I * ki + D * kd # общий управляющий сигнал
|
||
|
||
# Сохраняем предыдущую ошибку для D-составляющей
|
||
prev_error = error
|
||
|
||
# Сохраняем данные для графика
|
||
time_points.append(t * dt)
|
||
setpoint_points.append(setpoint)
|
||
input_points.append(input_val)
|
||
out_points.append(out)
|
||
|
||
time.sleep(dt) # задержка для имитации реального времени
|
||
|
||
# Построение графика
|
||
plt.figure(figsize=(10, 6))
|
||
plt.plot(time_points, setpoint_points, label='Setpoint', linewidth=2)
|
||
plt.plot(time_points, input_points, label='Input', linewidth=2)
|
||
plt.plot(time_points, out_points, label='Output (PID)', linewidth=2)
|
||
|
||
plt.title('PID Controller Performance (with D-term)')
|
||
plt.xlabel('Time (s)')
|
||
plt.ylabel('Value')
|
||
plt.legend()
|
||
plt.grid(True)
|
||
plt.show() |