Страница 1 из 1

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

Добавлено: Чт ноя 24, 2016 11:37 pm
MapaT
Приветствую! Бегло порылся и не нашел готового класса 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 в объект диммера.

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

Добавлено: Пт ноя 25, 2016 1:30 pm
Kod.Begemot
Объект диммера управляет электрообогревателем через аппаратный диммер (навроде МегаД)?

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

Добавлено: Вт ноя 29, 2016 10:26 am
MapaT
Все гораздо хуже :)
Обогреватель в данном случае масляный, весьма инертный и худосочный (600 Вт). Сил и энергии делать нормальный диммер, который будет подрезать синусоиду не было, поэтому сгородил ключ на симисторе с детектором нуля: получилось беззвучное реле, но диммером это назвать нельзя. Результат работы PID-регулятора в моем случае - количество секунд в минуте, которое симистор будет включен.
В целом, железная часть у меня на MySensors.

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

Добавлено: Сб янв 07, 2017 10:12 pm
Jager
MapaT писал(а):Результат работы PID-регулятора в моем случае - количество секунд в минуте, которое симистор будет включен.
Можно ли с помощью вашего класса реализовать например такой режим, 1сек включено-5сек выключено?

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

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