~/notes / pid-controller-python

2026-02-24⚙️ АСУ ТП1 мин0 просм.

ПИД-регулятор на Python: от формулы до кода

Что такое ПИД

ПИД-регулятор (пропорционально-интегрально-дифференциальный) — основа большинства систем автоматического управления. Поддерживает заданное значение (уставку) несмотря на возмущения.

Формула: u(t) = Kp*e(t) + Ki*∫e(t)dt + Kd*de(t)/dt

Где e(t) — ошибка (разница между уставкой и текущим значением).

Реализация на Python

import time

class PIDController:
    def __init__(self, kp, ki, kd, setpoint):
        self.kp = kp
        self.ki = ki
        self.kd = kd
        self.setpoint = setpoint
        self._integral = 0
        self._prev_error = 0
        self._prev_time = time.time()

    def compute(self, measured_value):
        now = time.time()
        dt = now - self._prev_time
        if dt <= 0:
            return 0

        error = self.setpoint - measured_value
        self._integral += error * dt
        derivative = (error - self._prev_error) / dt

        output = (self.kp * error +
                  self.ki * self._integral +
                  self.kd * derivative)

        self._prev_error = error
        self._prev_time = now
        return output

Ограничение интегральной составляющей

Без ограничения интеграл может накопиться до огромных значений (integral windup). Добавляем clamp:

self._integral = max(-100, min(100, self._integral))

Подбор коэффициентов

Метод Циглера-Никольса: увеличивай Kp до появления устойчивых колебаний, запиши период Pu и критическое усиление Ku. Затем: Kp=0.6Ku, Ki=1.2Ku/Pu, Kd=0.075KuPu.

На практике чаще подбирают вручную: сначала P, потом I для устранения статической ошибки, D — только если нужно ускорить реакцию.