Класс PID-регулятора

Использование системы в различных ситуациях, вопросы программирования сценариев.

Модератор: immortal

Ответить
MapaT
Сообщения: 2
Зарегистрирован: Чт ноя 24, 2016 11:04 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Класс PID-регулятора

Сообщение MapaT » Чт ноя 24, 2016 11:37 pm

Приветствую! Бегло порылся и не нашел готового класса PID-регулятора. В связи с чем, также бегло его настрогал из логики ардуиновской библиотеки.
Вероятно, есть недочеты, но для моих целей поддержания температуры на балконе вполне подходит. Как всегда с PID-ами, вопрос сводится к подбору коэффициентов.
Дополнения и улучшения приветствуются!
По свойствам класса, понятно из комментариев к ним.
По методам.
setPrev - устанавливает временной интервал. Вызывается перед расчетом. Можно дополнить на уровне объекта необходимыми операциями перед расчетом, специфичными для этого объекта. Для примера, в моем случае регулятора температуры, я привожу временной интервал к интервалу получения температуры - к 3-м минутам, вызываю локальный метод вместо родительского.

Код: Выделить всё

$this->setProperty("period", (time() - $this->getProperty("lastRun"))/60/3);
getPid - метод, который проводит все расчеты, также создан для того, чтобы можно было после расчетов провести дополнительные операции над результатом. Этот метод вызывает setPrev, затем calcPid (там расчет, добавить про него нечего). Также, для примера, моя реализация метода в рамках конкретного объекта (вызывается после родительского) - округление полученного значения.

Код: Выделить всё

$this->setProperty("PID", round($this->getProperty("PID"), 0, PHP_ROUND_HALF_UP));
К изменению температуры (объект термодатчика) привязал запись в параметр inputVal полученного значения и запуск расчета. А также запись рассчитанного значения PID в объект диммера.
Вложения
PID_Controllers.txt
(5.75 КБ) 588 скачиваний
За это сообщение автора MapaT поблагодарил:
olehs (Сб янв 07, 2017 10:18 pm)
Рейтинг: 1.16%
Аватара пользователя
Kod.Begemot
Сообщения: 358
Зарегистрирован: Чт июн 20, 2013 5:53 pm
Благодарил (а): 32 раза
Поблагодарили: 42 раза

Re: Класс PID-регулятора

Сообщение Kod.Begemot » Пт ноя 25, 2016 1:30 pm

Объект диммера управляет электрообогревателем через аппаратный диммер (навроде МегаД)?
MapaT
Сообщения: 2
Зарегистрирован: Чт ноя 24, 2016 11:04 pm
Благодарил (а): 0
Поблагодарили: 1 раз

Re: Класс PID-регулятора

Сообщение MapaT » Вт ноя 29, 2016 10:26 am

Все гораздо хуже :)
Обогреватель в данном случае масляный, весьма инертный и худосочный (600 Вт). Сил и энергии делать нормальный диммер, который будет подрезать синусоиду не было, поэтому сгородил ключ на симисторе с детектором нуля: получилось беззвучное реле, но диммером это назвать нельзя. Результат работы PID-регулятора в моем случае - количество секунд в минуте, которое симистор будет включен.
В целом, железная часть у меня на MySensors.
Jager
Сообщения: 708
Зарегистрирован: Сб авг 18, 2012 10:21 am
Благодарил (а): 26 раз
Поблагодарили: 183 раза

Re: Класс PID-регулятора

Сообщение Jager » Сб янв 07, 2017 10:12 pm

MapaT писал(а):Результат работы PID-регулятора в моем случае - количество секунд в минуте, которое симистор будет включен.
Можно ли с помощью вашего класса реализовать например такой режим, 1сек включено-5сек выключено?
olehs
Сообщения: 1115
Зарегистрирован: Вс июн 14, 2015 11:08 am
Благодарил (а): 85 раз
Поблагодарили: 342 раза

Re: Класс PID-регулятора

Сообщение olehs » Вс янв 08, 2017 1:09 am

MapaT, есть пара вопросов по алгоритму:
1. Разве ITerm не должна быть накопительной?
2. Почему направление регулировки (direction) не учитывается при вычислении PID, а влияет только на значение lastRun?
Ответить