Класс PID-регулятора
Добавлено: Чт ноя 24, 2016 11:37 pm
Приветствую! Бегло порылся и не нашел готового класса PID-регулятора. В связи с чем, также бегло его настрогал из логики ардуиновской библиотеки.
Вероятно, есть недочеты, но для моих целей поддержания температуры на балконе вполне подходит. Как всегда с PID-ами, вопрос сводится к подбору коэффициентов.
Дополнения и улучшения приветствуются!
По свойствам класса, понятно из комментариев к ним.
По методам.
setPrev - устанавливает временной интервал. Вызывается перед расчетом. Можно дополнить на уровне объекта необходимыми операциями перед расчетом, специфичными для этого объекта. Для примера, в моем случае регулятора температуры, я привожу временной интервал к интервалу получения температуры - к 3-м минутам, вызываю локальный метод вместо родительского.
getPid - метод, который проводит все расчеты, также создан для того, чтобы можно было после расчетов провести дополнительные операции над результатом. Этот метод вызывает setPrev, затем calcPid (там расчет, добавить про него нечего). Также, для примера, моя реализация метода в рамках конкретного объекта (вызывается после родительского) - округление полученного значения.
К изменению температуры (объект термодатчика) привязал запись в параметр inputVal полученного значения и запуск расчета. А также запись рассчитанного значения PID в объект диммера.
Вероятно, есть недочеты, но для моих целей поддержания температуры на балконе вполне подходит. Как всегда с PID-ами, вопрос сводится к подбору коэффициентов.
Дополнения и улучшения приветствуются!
По свойствам класса, понятно из комментариев к ним.
По методам.
setPrev - устанавливает временной интервал. Вызывается перед расчетом. Можно дополнить на уровне объекта необходимыми операциями перед расчетом, специфичными для этого объекта. Для примера, в моем случае регулятора температуры, я привожу временной интервал к интервалу получения температуры - к 3-м минутам, вызываю локальный метод вместо родительского.
Код: Выделить всё
$this->setProperty("period", (time() - $this->getProperty("lastRun"))/60/3);
Код: Выделить всё
$this->setProperty("PID", round($this->getProperty("PID"), 0, PHP_ROUND_HALF_UP));