Если интересно, посмотрите как я сделал импульсный ПИД-регулятор. Любым замечаниям буду рад.
** Ксожалению, много логических ошибок, которые надо исправлять**
Вид для печати
Если интересно, посмотрите как я сделал импульсный ПИД-регулятор. Любым замечаниям буду рад.
** Ксожалению, много логических ошибок, которые надо исправлять**
Наконец то!!!
После двух месяцев трудов и поисков мне удалось наконец написать полностью работоспособный ШИМ для клапана без датчика положения.
В проекте использовались только блоки из стандартной библиотеки CoDeSys и из Util собственно, сам ПИД регулятор, испытания проводил на этом стенде https://yadi.sk/i/0VWFUN4ecnPiQ
ссылка на мой Яндекс диск. Как это не удивительно я не являюсь специалистом в области составления алгоритмов ПИД регулирования, но результат меня приятно удивил.
Может мне показалось но мой ПИД регулятор на заданную уставку выходит лучше чем ТРМ212 почти без "проскока" и держит температуру -+ 1 гр. с от заданной уставки.
Конечно алгоритм еще требует доработки, но проект полностью работоспособен, и может использоваться на реальных объектах регулирования.
Тестировал в течении нескольких часов и остался доволен результатом. По его принципу написал алгоритм в CoDeSys v2.3 на ПЛК110, и также остался доволен результатом.
И чему несказанно был рад, что, клапан не дергался туда-сюда почти сразу нашел нужную точку и встал в необходимое положение.
Выкладываю проект в свободный доступ, ничего не закодировано и не запаролено. Буду рад любым доработкам и улучшениям, также надеюсь, что вы протестируете у себя на объектах, стенд стендом, а реальный объект, это совсем другое. Надеюсь что все выложил правильно на форуме и с открытием файла проекта проблем не возникнут, я новичок в этом деле.
Стенд обрезано: Вложение 15273
Фото моих уставок Вложение 15275
Всем кто использует в своих проектах PID из Util, нужно иметь ввиду и предусмотреть способ сброса ПИДа при смене уставки, как показали мои наблюдения на некоторое время ему (ПИДу) первое время "сносит" "башню".
А выражаясь грамотно происходит "удар" при регулировании. И это правильно, просто ПИД выдает результат с учетом новой уставки и накопленной старой интегральной составляющей.
22.11.2014г.
Тестировал ШИМ, и PID из библиотеки Util, на даче у своего коллеги (на форуме зарегистрирован как "Монтер", огромное ему спасибо), остались оба доволены результатом, правда в начале нам пришлось по-колдовать с Кp, Tn, Tv но результат получили хороший -+ 1,5 гр. после выхода на уставку 55гр., это при условии что газовый котел работал дискретно в диапазоне от 70гр. до 90гр..
Я устранил проблему с "броском" во время смены уставки и добавил блок архивации (кому не нужно можно удалить) по двум параметрам.
Скорректированный проект с архивацией также выкладываю (надеюсь все откроется без проблем).
Фото объекта Вложение 15386
В вашем проекте Ворона, используеться блок вашего изготовления с именем "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,
...
);
...
У нас в России мужики могут всякое совместить. А нормальный ПИД-регулятор находит равновесное положение системы за 3-4 импульса. Длительность этих импульсов разная: 1 длинный(пропорциональная часть) устанавливает регулирующий орган в положение близкое к равновесному, следующие 2-3 импульса короткие убирают ошибку рассогласования (интегральная часть). Дифференциальная составляющая вносит коррекцию в зависимости от скорости движения системы к равновесному состоянию. Правильному ПИД-регулятору не нужны прокладки из ramp. Сделать из аналогового ПИД-регулятора импульсный с помощью ШИМ нельзя - это будет не регулятор а недоразумение. Но я не отрицаю, что на каких-то объктах он будет вполне сносно работать.Цитата:
Несовместимы ? А мужики-то и не знали