PID-регулятор

PID для ИМ с дискретным и аналоговым управлением

Пользовательские блоки ПИД регуляторов, прочих регуляторов и для работы с ШИМ выходами
Правила форума
Рекомендации по размещению блоков:
Автор блока создает подробное описание блока, отличие от подобных(если есть на данный момент).Сложные блоки очень желательно с примерами.
При выходе новых версий редактирует/дополняет свой первый пост с указанием даты, версии, причины.
В каждой теме обсуждается только выложенный автором блок - баги, возможность (или предложение) доработки и прочие хотелки.
Свои блоки, переработанные, с другими библиотеками, протоколами и т.д.- размещаем либо сами отдельно, либо обсуждаем и дорабатываем в форуме Разработка блоков.
Пользователи улучшив блок автора и проверив его работоспособность - могут обратиться к автору или модераторам с просьбой добавить их версию блока в первое сообщение темы.
Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

PID-регулятор

#1

Сообщение Boroda » 24.01.2018{, 12:51}

Данный самописный PID-регулятор с успехом используется в системах на ПЛК известного Российского производителя на промышленных объектах. Регулирует температуру и давление в трубопроводах посредством дискретных и аналоговых трехходовых кранов. Также управляет частотными преобразователями трехфазных двигателей по интерфейсу 0-5В (0-10В и 4-20мА с внешними блоками преобразования на ОУ).

Представлено 2 вида регуляторов ПИД и ПД.

*******************************************************************************************
ПИД имеет 2 выхода для работы с аналоговыми исполнительными механизмами (ИМ) или ТЭНами.
Структурная схемаПоказать
Shema_PID.PNG
Структурная схема ПИД
Shema_PID.PNG (16.72 КБ) 5030 просмотров
Входы:
1.Value - текущее значение
2. Set - уставка (задатчик)
3. Kp - коэфф пропорциональной составляющей
4. Ki - коэфф интегральной составляющей
5. Kd - коэфф дифф составляющей
6. MaxPow - максимальная мощность на выходе
7. MinPow - минимальная мощность на выходе
8. MinPulse - минимальная разрешенная длительность импульса на выходе PWM
Выходы:
1. pwm (медленный ШИМ) - дискретный выход для подключения нагревателя/холодильника.
2. PWR - аналоговый выход, показывающий текущую мощность (0..1000).
Расчет мощности по формуле PWR = Kp*E(t)+Σ(E(t)/Ki)+Kd*∆E(t).
E(t) - рассогласование (уставка - вход),
∆E(t)- дельта рассогласования по сравнению с предыдущим измерением,
Kp,Ki,Kd - коэфф ПИД.

*******************************************************************************************
У ПД 3 выхода для работы с дискретными ИМ.
Структурная схемаПоказать
Shema_PD.png
Структурная схема ПД
Shema_PD.png (16.29 КБ) 5030 просмотров
Входы:
1.Value - текущее значение
2. Set - уставка (задатчик)
3. Kp - коэфф пропорциональной составляющей
4. Kd - коэфф дифф составляющей
5. MaxPow - максимальная мощность на выходе
6. MinPulse - минимальная разрешенная длительность импульса на выходе PWM
Выходы:
1. open (открыть, медленный ШИМ) - дискретный выход для открытия крана.
2. close (закрыть, медленный ШИМ) - дискретный выход для закрытия крана.
3. dPWR - аналоговый выход, показывающий текущее изменение мощности (-1000..+1000).
Расчет изменения мощности идет по формуле dPWR = Kp*E(t)+Kd*∆E(t).
E(t) - рассогласование (уставка - вход),
∆E(t)- дельта рассогласования по сравнению с предыдущим измерением,
Kp,Kd - коэфф ПД.

*******************************************************************************************

Просто о составляющих ПИД (для простоты в качестве регулируемого параметра возьмем температуру):

Ошибка регулирования = ("уставка" - "текущая температура").

Пропорциональная составляющая - мощность на выходе равна ("ошибка регулирования") * Kp,
чем больше коэфф. Kp, тем больше мощность. Если уставка = 40, температура = 30, Kp = 2, то мощность = 20%.
Если температура = уставке, то Пропорц = 0.

Интегральная составляющая - каждый период работы регулятора мощность на выходе будет увеличиваться
или уменьшаться на величину ("ошибка регулирования") / Ki, можно сказать, что интегр. составл. это
накопитель мощности и чем меньше коэфф. Ki, тем быстрее мощность будет возрастать или уменьшаться.
Если уставка = 40, температура = 30, Ki = 5, то мощность будет прибавляться на 2% каждый период.
Если температура = уставке, то мощность не меняется.

Дифференциальная составляющая - мощность на выходе равна:
("ошибка регулирования сейчас" - "ошибка регулирования в прошлом периоде") * Kd.
Этот параметр следит за скоростью изменения температуры. Если коэфф Kd = 6, сейчас ошибка регулирования = 5,
а в предыдущий период была = 10 (т.е. температура возросла на 5 градусов), то мощность на выходе будет
равна (-5*6) = -30%. Дифф составляющая уменьшила мощность, потому как температура очень сильно начала
подниматься. Если температура стабильна, то Дифф = 0.

Полная мощность ПИД-регулятора считается по формуле PWR = (пропорц + интегр + дифф).
Допустим мощность, накопленная в интегральной составляющей = 42%, тогда в нашем случае
PWR = 20+42-30 = 32%. Из этого примера видно, как "П" и "Д" оперативно помогают медленно меняющейся "И"
корректировать выходную мощность в зависимости от текущего состояния объекта регулирования.

Дискретные выходы pwm/open/close.
На данных выходах организован медленный ШИМ. Период ШИМа равен периоду работы ПИД(ПД) регулятора.
Пусть период ПИД и ШИМ равен 10 секунд, тогда длительности импульсов на выходе будут такими:
Мощность = 0%, выход отключен.
Мощность = 10%, импульс 1 секунда, пауза 9 секунд.
Мощность = 30%, импульс 3 секунды, пауза 7 секунд.
Мощность = 50%, импульс 5 секунд, пауза 5 секунд.
Мощность = 90%, импульс 9 секунд, пауза 1 секунда.
Мощность = 100%, выход включен.

*******************************************************************************************

Во всех регуляторах задается период работы медленных ШИМ (выходов pwm/open/close), он же является периодом измерения входного сигнала.

Для тестирования собрал схему из реле, нагрузочного резистора 10W и термодатчика DS18B20 - температуру держит хорошо!
Фото процесса тестированияПоказать
Тест ПИД-регулятора.png
Фото процесса тестирования
В архиве блоки пользователя PID_V2, PD_V2, примеры проектов на Pro Mini и график работы ПИД-регулятора при поддержании температуры нагревателя.

Архив обновлен 12.04.2017

Test_PID.rar
Блоки ПИД
(282.87 КБ) 498 скачиваний

Аватара пользователя
dizzyy
Капитан
Сообщения: 752
Зарегистрирован: 24.11.2017{, 16:25}
Репутация: 37
Откуда: Червоноград
Имя: Марьян

PID-регулятор

#2

Сообщение dizzyy » 28.01.2018{, 19:22}

если 1 уставка то работает хорошо...
если несколько начинает врать и сходить с ума
например я держал 5 минут температуру 30 градусов, а когда уставка сменмлась на 62 , то спад начался аж в 72 гр.прошло минут 10 покапид начал держать 62 гр.

Аватара пользователя
Nikan
Майор
Сообщения: 1129
Зарегистрирован: 29.12.2016{, 00:49}
Репутация: 87
Откуда: москва

PID-регулятор

#3

Сообщение Nikan » 28.01.2018{, 19:28}

dizzyy писал(а):
28.01.2018{, 19:22}
то спад начался аж в 72 гр.прошло минут 10 покапид начал держать 62 гр.
так ему же коэффициенты подбирать надо
на старом форуме ветка есть, там и статья была как настраивать

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

PID-регулятор

#4

Сообщение Boroda » 29.01.2018{, 01:08}

ПИДы для систем ГВС и отопления в котельных иногда по 5-6 часов настраиваются. А бывает и через несколько дней подъезжаешь и еще перенастраиваешь.

Аватара пользователя
dizzyy
Капитан
Сообщения: 752
Зарегистрирован: 24.11.2017{, 16:25}
Репутация: 37
Откуда: Червоноград
Имя: Марьян

PID-регулятор

#5

Сообщение dizzyy » 29.01.2018{, 15:58}

Boroda писал(а):
29.01.2018{, 01:08}
ПИДы для систем ГВС и отопления в котельных иногда по 5-6 часов настраиваются. А бывает и через несколько дней подъезжаешь и еще перенастраиваешь.
уверен что так и есть ...поставил те что в примере и мне понравилось для одной температуры , работает четко с предсказанием про наростанние и спад ...
но он накапливает данные по ошибкам одной температуры , подсунув ему другую он опирается на старые данные и чудит..
хотел его в пивоварню, а там точность в градусах и паузы по 5-60 минут, и пока устаканится ферменты сдохнут ...хотя как придет запасной датчик сделаю макетку и побалуюсь с коэффициентами
надо на новый форум инструкцию по настройке пидов , что подключать и куда , какие схемы подойдут и какие режимы пида и какие опто к ним

Аватара пользователя
Sancho
Полковник
Сообщения: 3963
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 563
Откуда: Ярославль.
Имя: Александр
Контактная информация:

PID-регулятор

#6

Сообщение Sancho » 29.01.2018{, 16:27}

Как-то выкладывал. Давно.
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

PID-регулятор

#7

Сообщение Boroda » 29.01.2018{, 19:44}

dizzyy, ну значит неправильно настроен. Накопление интеграла процесс медленный, и пока он накапливается, главную роль играет П составляющая. Поставьте P=50, I=0, D=0 и сразу все станет ясно (на каждый градус рассогласования будет приходиться 50% мощности). Самогонный аппарат и на чистом П-регуляторе с бешенным коэффициентом может работать, чуть не добирая температуру (1-2 градуса).
Последний раз редактировалось Boroda 29.01.2018{, 20:07}, всего редактировалось 3 раза.

Аватара пользователя
Alias
Лейтенант
Сообщения: 476
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

PID-регулятор

#8

Сообщение Alias » 29.01.2018{, 19:57}

А если отдельные блоки со своими уставками для разных термопауз сделать?

Аватара пользователя
dizzyy
Капитан
Сообщения: 752
Зарегистрирован: 24.11.2017{, 16:25}
Репутация: 37
Откуда: Червоноград
Имя: Марьян

PID-регулятор

#9

Сообщение dizzyy » 30.01.2018{, 21:07}

Sancho писал(а):
29.01.2018{, 16:27}
Как-то выкладывал. Давно.
спасибо, как раз нашел здесь блок Virtuino и там можно график делать , вот им и займусь , но жду блютуз модули ..
Boroda писал(а):
29.01.2018{, 19:44}
dizzyy, ну значит неправильно настроен. Накопление интеграла процесс медленный, и пока он накапливается, главную роль играет П составляющая. Поставьте P=50, I=0, D=0 и сразу все станет ясно (на каждый градус рассогласования будет приходиться 50% мощности). Самогонный аппарат и на чистом П-регуляторе с бешенным коэффициентом может работать, чуть не добирая температуру (1-2 градуса).
попробую , я просто смотрел в сторону сброса накопления при изменении уставки
Alias писал(а):
29.01.2018{, 19:57}
А если отдельные блоки со своими уставками для разных термопауз сделать?
код вырастет , мне Александр и так помог облегчить код, но вылизывая до того как должно быть и так код растет, я уже не помещаюсь даже с remotexy

Boroda, может перенести такие вопросы по блокам в отдельный топик ?

Serg_Grn
Лейтенант
Сообщения: 330
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 33
Откуда: Одесса
Имя: Сергей

PID-регулятор

#10

Сообщение Serg_Grn » 28.04.2018{, 12:10}

Вопрос по ПИД регулятору.
Как отключать ПИД регулятор? В моменты, когда система остановлена, интегральная составляющая накапливает ошибку, и в итоге, когда система запускается, на выходе 100% мощности за счет накопившейся до этого интегральной. Получается сильное перерегулирование при старте. Входа EN в блоке ПИД нет, отсюда и вопрос.

Аватара пользователя
Sancho
Полковник
Сообщения: 3963
Зарегистрирован: 25.12.2015{, 17:32}
Репутация: 563
Откуда: Ярославль.
Имя: Александр
Контактная информация:

PID-регулятор

#11

Сообщение Sancho » 28.04.2018{, 12:30}

Serg_Grn писал(а):
28.04.2018{, 12:10}
Вопрос по ПИД регулятору. (ПИД - автор Boroda).
Как отключать ПИД регулятор? В моменты, когда система остановлена, интегральная составляющая накапливает ошибку, и в итоге, когда система запускается, на выходе 100% мощности за счет накопившейся до этого интегральной. Получается сильное перерегулирование при старте. Входа EN в блоке ПИД нет, отсюда и вопрос.
Ставь на отдельную плату, выполняющуюся по условию. При выключении/включении платы вычисления продолжатся с того-же места...
Если не получится на контроллере - сделаю на тразисторах и 155/176...Научился, немного.
Поможем проекту вместе!

Serg_Grn
Лейтенант
Сообщения: 330
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 33
Откуда: Одесса
Имя: Сергей

PID-регулятор

#12

Сообщение Serg_Grn » 28.04.2018{, 12:35}

Sancho, про эту возможность забыл. Спасибо!

Serg_Grn
Лейтенант
Сообщения: 330
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 33
Откуда: Одесса
Имя: Сергей

PID-регулятор

#13

Сообщение Serg_Grn » 29.04.2018{, 09:18}

Попробовал добавить вход "en" в блок ПИД. Так как в написании кода ничего не смыслю, прошу знатоков проверить правильность.
Вложения
test.flp
(204.77 КБ) 83 скачивания

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

PID-регулятор

#14

Сообщение Boroda » 29.04.2018{, 09:52}

Serg_Grn, если Вы отключите вход EN в момент, когда на PWM или PWR будет единица, то она так и останется там. Надо добавить ELSE.

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

If (En) 
{
*PID*
}
else
{
ok = false; pwm = false; PWR = 0; Integ = 0;
}
Последний раз редактировалось Boroda 29.04.2018{, 11:48}, всего редактировалось 2 раза.

Serg_Grn
Лейтенант
Сообщения: 330
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 33
Откуда: Одесса
Имя: Сергей

PID-регулятор

#15

Сообщение Serg_Grn » 29.04.2018{, 10:23}

Это понятно, спасибо. А еще меня интересует накопленная интегральная: как сбрасывать накопленные значения при отключении блока? Чтобы они не оказывали влияние потом.

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

PID-регулятор

#16

Сообщение Boroda » 29.04.2018{, 11:46}

Serg_Grn,
как сбрасывать накопленные значения
исправил выше.

Serg_Grn
Лейтенант
Сообщения: 330
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 33
Откуда: Одесса
Имя: Сергей

PID-регулятор

#17

Сообщение Serg_Grn » 29.04.2018{, 13:19}

Boroda, спасибо!

Отправлено спустя 6 часов 43 минуты 55 секунд:
Boroda, если Вам не сложно, проясните один момент: я при настройке пид-регулятора столкнулся с тем, что при включении интегральной составляющей начинается перерегулирование, причем даже если вводить в Ki огромные значения - все равно.
Открыл редактор блока и оказалось, что интегральная ограничена (MinPow * 10), (MaxPow * 10), в то время как пропорциональная и дифференциальная имеют ограничения (+/-1000). Почему такое ограничение у интегральной? Просто у меня мин.мощность 40% (меньше нельзя), выходит, что и интегральная не может быть меньше, отсюда и перерегулирование, как мне кажется...
Последний раз редактировалось Serg_Grn 29.04.2018{, 22:50}, всего редактировалось 1 раз.

Serg_Grn
Лейтенант
Сообщения: 330
Зарегистрирован: 11.02.2018{, 13:07}
Репутация: 33
Откуда: Одесса
Имя: Сергей

PID-регулятор

#18

Сообщение Serg_Grn » 29.04.2018{, 21:44}

Ещё вопрос к знатокам)
Заметил, что диф.составляющая, если ставить большой Kd, при малых значениях разности ошибок (вблизи уставки) начинает раскачивать, так как коэффициент очень велик. Но если коэффициент снизить, то ее не хватает при старте и разгоне системы - недостаточно снижает мощность. В этой связи вопрос, а что если формулу немного изменить: Kd умножать не на разность ошибок между двумя периодами, а на квадрат этой разности? Тогда диф.составляющая будет иметь мизерный эффект при малых значениях разности ошибок (0,1 - 1), но эффект ее будет сильно возрастать когда разность ошибок становится больше (2-3... единиц за период). Как Вы думаете, такой вариант возможен?

Аватара пользователя
Alias
Лейтенант
Сообщения: 476
Зарегистрирован: 27.11.2017{, 13:15}
Репутация: 36
Откуда: Rus44
Имя: Michael
Контактная информация:

PID-регулятор

#19

Сообщение Alias » 29.04.2018{, 22:28}

А можно и мне свой вопросик повторить здесь? Извиняюсь за вторжение. Я его уже озвучил в http://forum.flprog.ru/viewtopic.php?p=46251#p46251
Спасибо!

Аватара пользователя
Boroda
Капитан
Сообщения: 836
Зарегистрирован: 01.05.2016{, 01:04}
Репутация: 36
Откуда: Коломна
Имя: Станислав
Контактная информация:

PID-регулятор

#20

Сообщение Boroda » 01.05.2018{, 10:59}

Serg_Grn писал(а):
29.04.2018{, 21:38}
Открыл редактор блока и оказалось, что интегральная ограничена (MinPow * 10), (MaxPow * 10), в то время как пропорциональная и дифференциальная имеют ограничения (+/-1000). Почему такое ограничение у интегральной?
Т.к. расчеты ведутся в ИНТах, в программе сделаны некоторые ограничения, чтоб не вываливаться за диапазон +-32767.
1. Ограничение П и Д (+-1000) - это ограничение до +-100,0% выходной мощности (можно в принипе сделать до +-10000).
2. Ограничение И - это ограничение до MinPow/MaxPow выходной мощности, если сделать больше, то при долгом неравенстве SET<>VALUE интеграл убежит далеко за пределы минимальной или максимальной мощности и потом долго будет возвращаться и все это время будет наблюдаться перерегулирование. Такая хрень постоянно возникала у ПИД-регулятора в Codesys, поэтому пришлось от него отказаться.

Отправлено спустя 10 минут 31 секунду:
Serg_Grn писал(а):
29.04.2018{, 21:44}
Kd умножать не на разность ошибок между двумя периодами, а на квадрат этой разности?
В принципе можно попробывать, тут даже может и не квадрат получиться, а куб или 1,5.
Serg_Grn писал(а):
29.04.2018{, 21:44}
то ее не хватает при старте и разгоне системы - недостаточно снижает мощность
Очень быстро набирается мощность и происходит выбег? Значит снижайте Кп.
Я обычно ставлю Кд = Кп*(1...2).

А вообще лучше сначала убрать дифф и без него попробовать. А потом при необходимости добавить.

Ответить

Вернуться в «ПИД регуляторы (PID), блоки для ШИМ»