Если интересно, посмотрите как я сделал импульсный ПИД-регулятор. Любым замечаниям буду рад.
** Ксожалению, много логических ошибок, которые надо исправлять**
Если интересно, посмотрите как я сделал импульсный ПИД-регулятор. Любым замечаниям буду рад.
** Ксожалению, много логических ошибок, которые надо исправлять**
Последний раз редактировалось Ефремов Николай; 15.12.2014 в 15:50. Причина: ошибки
Наконец то!!!
После двух месяцев трудов и поисков мне удалось наконец написать полностью работоспособный ШИМ для клапана без датчика положения.
В проекте использовались только блоки из стандартной библиотеки CoDeSys и из Util собственно, сам ПИД регулятор, испытания проводил на этом стенде https://yadi.sk/i/0VWFUN4ecnPiQ
ссылка на мой Яндекс диск. Как это не удивительно я не являюсь специалистом в области составления алгоритмов ПИД регулирования, но результат меня приятно удивил.
Может мне показалось но мой ПИД регулятор на заданную уставку выходит лучше чем ТРМ212 почти без "проскока" и держит температуру -+ 1 гр. с от заданной уставки.
Конечно алгоритм еще требует доработки, но проект полностью работоспособен, и может использоваться на реальных объектах регулирования.
Тестировал в течении нескольких часов и остался доволен результатом. По его принципу написал алгоритм в CoDeSys v2.3 на ПЛК110, и также остался доволен результатом.
И чему несказанно был рад, что, клапан не дергался туда-сюда почти сразу нашел нужную точку и встал в необходимое положение.
Выкладываю проект в свободный доступ, ничего не закодировано и не запаролено. Буду рад любым доработкам и улучшениям, также надеюсь, что вы протестируете у себя на объектах, стенд стендом, а реальный объект, это совсем другое. Надеюсь что все выложил правильно на форуме и с открытием файла проекта проблем не возникнут, я новичок в этом деле.
Стенд обрезано: Стенд упр..jpg
Фото моих уставок P1010216.JPG
Всем кто использует в своих проектах PID из Util, нужно иметь ввиду и предусмотреть способ сброса ПИДа при смене уставки, как показали мои наблюдения на некоторое время ему (ПИДу) первое время "сносит" "башню".
А выражаясь грамотно происходит "удар" при регулировании. И это правильно, просто ПИД выдает результат с учетом новой уставки и накопленной старой интегральной составляющей.
22.11.2014г.
Тестировал ШИМ, и PID из библиотеки Util, на даче у своего коллеги (на форуме зарегистрирован как "Монтер", огромное ему спасибо), остались оба доволены результатом, правда в начале нам пришлось по-колдовать с Кp, Tn, Tv но результат получили хороший -+ 1,5 гр. после выхода на уставку 55гр., это при условии что газовый котел работал дискретно в диапазоне от 70гр. до 90гр..
Я устранил проблему с "броском" во время смены уставки и добавил блок архивации (кому не нужно можно удалить) по двум параметрам.
Скорректированный проект с архивацией также выкладываю (надеюсь все откроется без проблем).
Фото объекта Клапан на даче.jpg
Последний раз редактировалось Ворона; 13.01.2015 в 17:57.
В вашем проекте Ворона, используеться блок вашего изготовления с именем "Generator", в место него нельзя использовать блок "BLINK" ?
Проект на CoDeSys V2.3 c панелью СП270 здесь.
Поведение ПИДа при резкой смене уставки (нужно доработать ПИД должен быть сброшен после смены уставки) https://yadi.sk/i/CHKsfJOocnimA
Поведение ПИДа при обычной регулировке https://yadi.sk/i/k7QCIGRYcniNX
Также выкладываю файл панели.
Несовместимы ? А мужики-то и не знали
Если нету готового ШИМ на выходе, мастерим из Do
Теперь дружим с пидомКод:function psw : bool var_input in : real; //0..1.0 period : time; --------------- psw := ((time_to_dword(time()) mod (time_to_dword(period))) / time_to_real(period)) < in;
Дергание механизма ? Зона нечуйствительности около нуля соответственно знаку.Код:function_block pid_to_2psw var_input actual, set_point : real; //текучка и задание соотв period : time; //общий var_output plus, minus : bool; var pid : pid; //стандартный из util --------------- pid( actual := actual - set_point, //именно E на вход. set_point := 0, //именно 0, т.к. E=0 и есть цель y_min := -1, y_max := 1 ... //тута сами ); plus := psw(limit(0, pid.Y, 1), period); minus := psw(abs(limit(-1, pid.Y, 0)), period);
Сообсно всё.Код:var_input n : real; //0..1.0 ---- pid(...); plus := psw(sel(pid.Y > n, 0, limit(0, pid.Y,1)),..); minus := psw(abs(sel(pid.Y < -n, 0, limit(0, pid.Y,1))),..);
PS
Просьба не поднимать баян про якобы кривой util.pid
Потому что смена уставки для пида - то же что и скачок actual в другую сторону. Зачем тут ломать голову ?Всем кто использует в своих проектах PID из Util, нужно иметь ввиду и предусмотреть способ сброса ПИДа при смене уставки, как показали мои наблюдения на некоторое время ему (ПИДу) первое время "сносит" "башню".
Хотите безударно - поставьте для уставки прокладку из ramp_real
Код:var ramp : ramp_real; ----------- ramp(in:=set_point, ...); pid( actual := actual - ramp.out, ... ); ...
Последний раз редактировалось Валенок; 19.11.2014 в 09:23.
У нас в России мужики могут всякое совместить. А нормальный ПИД-регулятор находит равновесное положение системы за 3-4 импульса. Длительность этих импульсов разная: 1 длинный(пропорциональная часть) устанавливает регулирующий орган в положение близкое к равновесному, следующие 2-3 импульса короткие убирают ошибку рассогласования (интегральная часть). Дифференциальная составляющая вносит коррекцию в зависимости от скорости движения системы к равновесному состоянию. Правильному ПИД-регулятору не нужны прокладки из ramp. Сделать из аналогового ПИД-регулятора импульсный с помощью ШИМ нельзя - это будет не регулятор а недоразумение. Но я не отрицаю, что на каких-то объктах он будет вполне сносно работать.Несовместимы ? А мужики-то и не знали
Последний раз редактировалось Ворона; 20.11.2014 в 12:25.