sergejey писал(а):
А можете код с комментариями вывести? Хотел бы добавить этот алгоритм в Простые устройства для термостата, но что-то не очень понимаю, как он работает.
Тут есть один важный момент. Отличие первого класса от второго не только в наличии PonM, а и в алгоритме запуска расчета.
Для вычисления D-компоненты важен период времени, за который произошло изменение.
Так вот в PIDController для расчета нужно вручную запускать метод getPid, а он уже рассчитает дельту времени с момента последнего запуска.
NewPIDController же умеет сам запускать расчет (создает таймер) с периодичностью, указанной в свойстве sampleTime (в секундах).
Кроме того нужно учесть, что PID-регулятор подразумевает наличие у регулируемого устройства плавной регулировки. Если ваше устройство умеет только вкл/выкл, нужно добавлять алгоритм типа ШИМ, т.е. например при PID=40 устройство за один "фрейм" (равный для примера 10сек) должно 4 секунды быть включено и 6 выключено.
Этого алгоритма нету ни в одном из классов, его нужно наворачивать сверху.
Для работы
PIDController нужно указать:
1. direction - направление регулировки: 0 - прямое, 1 - обратное. Например, увеличение мощности нагревателя приводит к повышению температуры - direction=0
2. Коэффициенты PID (proportional, integral, differential) - тут, думаю, все понятно.
3. minSaturation, maxSaturation - минимальное и максимальное выходное значение регулятора. Например, у меня термоклапан начинает открываться при 60% мощности, т.е границы регулировки у меня 60-100
3. setPoint - это желаемое значение регулируемого параметра, например желаемая температура.
4. inputVal - обратная связь. Сюда должно попадать текущее значение регулируемого параметра, т.е. например значение с датчика температуры.
В результате вызова метода getPID в свойстве PID появится значение регулировки (т.е. например, мощность нагревателя).
Еще объект хранит некоторые промежуточные значения в свойствах lastInput, lastRun, period, ITerm.
Для работы
NewPIDController нужно указать (детальное описание аналогичных свойств см. выше):
1. direction - направление регулировки
2. Коэффициенты PID (kP, kI, kD)
3. min, max - границы регулировки
3. PonM (0/1) - использовать ли
Proportional on Measurement алгоритм регулировки
4. sampleTime - периодичность запуска расчета pid (в секундах)
5. setPoint - целевое значение регулировки
6. input - обратная связь, сюда должно попадать значение с датчика
7. active - (1/0) - вкл/выкл таймер PID
Если active=1, по таймеру будет запускаться метод compute. Результат работы попадает в свойство output. Есть еще вычисляемое свойство outputPercent, которое показывает в процентах значение output в границах min/max (для отображения на графиках в одном масштабе)