PDA

Просмотр полной версии : ПИД регулятор



Страницы : [1] 2 3

Николаев Андрей
15.10.2011, 16:13
ПИД регулятор.

День добрый господа.
Задумались над идеей создания библиотеки ПИД регуляторов.
Есть желание учесть Ваши пожелания.

Отсюда 2 вопроса:
1. Чем нравится\не нравится библиотека Pid_Reg2? Пожелания и предложения по данной библиотеке.
2. Приведите пример ПИД регулятора, который по Вашему мнению оптимален. Имя - чей это алгоритм желательно в личку.

ASo
15.10.2011, 16:26
2. Мой вариант - хочу из стандартной util.lib, но с подключением входа времени считывания АЦП. Все никак не дойдут руки переделать.

CEkip
15.10.2011, 17:02
ПИД регулятор.

День добрый господа.
Задумались над идеей создания библиотеки ПИД регуляторов.
Есть желание учесть Ваши пожелания.

Отсюда 2 вопроса:
1. Чем нравится\не нравится библиотека Pid_Reg2? Пожелания и предложения по данной библиотеке.
2. Приведите пример ПИД регулятора, который по Вашему мнению оптимален. Имя - чей это алгоритм желательно в личку.

Работать с Pid_Reg2 необходимо на живом контроллере, так как данная библиотека не поддерживается в режиме эмуляции. А с этим уже проблематично. :eek:

Gans
15.10.2011, 19:43
Уменя нормально работает ПИД-регулятор во вложении. Правда в нем нет привязки врмени от АЦП, но он делался для поддержания температуры и этого мне хватило.
P. S. Почему тема называется "ПИД-регулятор" ведь он не единственный есть много разных!!! Может стоит переименовать в "Регуляторы" или целую ветку создать?

Safron
15.10.2011, 19:48
Библиотека работоспособная, но сложна в освоении. Идея с автонастройкой хорошая. В отличии от неё, библиотеку Pid_regulators мне не удалось победить. Мне пришлось обратиться к библиотеке Oscat. Кое-что изменил. Но самое главное, я вывел коэффициеты настроек (постоянные интегрирования и диффиренцирования, ошибку рассогласования, задание, выход регулятора и т.д.) на визуализацию. Это значительно упростило в режиме отладки следить за реакцией объекта и настраивать регулятор...Что мешает и с другими регуляторами так поступить и в качестве выходов добавить некоторые настроечные параметры?

Николаев Андрей
15.10.2011, 21:07
2. Мой вариант - хочу из стандартной util.lib, но с подключением входа времени считывания АЦП. Все никак не дойдут руки переделать.
То есть заведение в ПИД времени измерения с датчика полезная функция? Я лично на паре объектов на вход просто генератор импульсов подавал.


Работать с Pid_Reg2 необходимо на живом контроллере, так как данная библиотека не поддерживается в режиме эмуляции. А с этим уже проблематично. :eek:
Если решим таки создавать новую библиотеку - будет работать и без контроллера.

У меня вопрос скорее по алгоритму, и пожеланиям к входам\выходам и прочим характеристикам. К стати в Бийске мне рассказывали что хотят от ПИДа, но я не записал :(


Уменя нормально работает ПИД-регулятор во вложении. Правда в нем нет привязки врмени от АЦП, но он делался для поддержания температуры и этого мне хватило.
P. S. Почему тема называется "ПИД-регулятор" ведь он не единственный есть много разных!!! Может стоит переименовать в "Регуляторы" или целую ветку создать?
Сейчас интересен именно ПИД (как говорится по просьбам трудящихся). Если есть интерес к другим регуляторам, и есть какие то наработки - конечно давайте заведем новую тему.


Библиотека работоспособная, но сложна в освоении. Идея с автонастройкой хорошая. В отличии от неё, библиотеку Pid_regulators мне не удалось победить. Мне пришлось обратиться к библиотеке Oscat. Кое-что изменил. Но самое главное, я вывел коэффициеты настроек (постоянные интегрирования и диффиренцирования, ошибку рассогласования, задание, выход регулятора и т.д.) на визуализацию. Это значительно упростило в режиме отладки следить за реакцией объекта и настраивать регулятор...Что мешает и с другими регуляторами так поступить и в качестве выходов добавить некоторые настроечные параметры?
Ничего. Об этом и речь. На первом этапе собираю пожелания - каких входов\выходов не хватает, какие лишние, нужен ли ручной режим мощности, нужно ли сохранять коэффициенты автонастройки после ручного изменения, нужен ли быстрый выход на уставку, и пр. и пр. и пр.
Вторым этапом создам примерное описание, и выложу на суд общественности.

ASo
15.10.2011, 21:14
То есть заведение в ПИД времени измерения с датчика полезная функция? Я лично на паре объектов на вход просто генератор импульсов подавал. Скажем так, не вредная. Как минимум улучшает точность. А задача - простейшая. Ведь сейчас в util.lib это время берется с таймера межу вызовами функции.

Ничего. Об этом и речь. На первом этапе собираю пожелания - каких входов\выходов не хватает, какие лишние, нужен ли ручной режим мощности, нужно ли сохранять коэффициенты автонастройки после ручного изменения, нужен ли быстрый выход на уставку, и пр. и пр. и пр.1. Режим ручной мощности - нужен.
2. Нужен режим старта с указанного значения.
3. Нужен быстрый выход на уставку.
4. Авто настройка - ИМХО - страшный вред. Нет ее алгоритмов, работающих во всех случаях жизни. И лучше несколько средние коэффициенты, чем настроенные не правильно.
Полный аналог - численное решение трансцедантного уравнения. Универсального метода - не существует.

Николаев Андрей
16.10.2011, 03:20
Понятно, что есть формула из учебника по ТАУ за 3 курс.
Однако вопрос в удобстве работы и дополнительных функциях.
Да и автонастройка на не дико инерционных объектах, особенно работающая :), шибко полезная вещь.

А что скажете по поводу двух ПИД для "двух-позиционных" (нагреватель, отсечной клапан) и "трехпозиционных" (регулирующий клапан) устройств?

nevii
16.10.2011, 14:56
Очень бы хотелось чтобы ПИДы в новой библиотеке были рабочие (в качестве исключения) чтобы небыло как вот в этой ветке:

http://www.owen.ru/forum/showthread.php?t=10248&highlight=nevii


"Вообще, данный регулятор не предназначен для сохранения в retain. В руководстве, видимо, сделали Ctrl+C, Ctrl+V. Очевидно - хранить более 1000 байт в retain глупо когда из них нужно примерно 22."

"Все не очень хорошо.Победить не получится."

"Собственно сабж. Прогресс в прошивках в области pidreg2 для ПЛК1хх остановлен. Удобные для работы версии есть только для линейки ПЛК 63-73"

Очень классно в тех поддержке говорят : "Ну вы первый кто за ... тцать лет это обнаружил....."

Hemann
17.10.2011, 14:25
Думаю что так как-то:
Нужны ручное управление мощностью, старт с произвольного значения, автонастройка, позволяющая запомнить коэффициенты в retain и при следующем запуске контроллера чтобы их можно было загрузить в регулятор; наверное быстрый выход на уставку. Это имеет смысл сделать и для двухпозиционных и трехпозиционных устройств. А еще (ну это мечта чтоль такая :) ) чтобы можно было разные методы выхода на уставку использовать, типа апериодического, с 20%-ым перерегулированием, с минимальным среднеквадратичным отклонением...

capzap
17.10.2011, 15:05
когда то я автоподсройку делал следующим способом: было три зоны
а) первая зона, когда абсолютная (ABS ) разность температуры и уставки не превышала 0.5-1 градуса цельсия, там стояли самые маленькие возможные коеффиценты, чтоб не сильно реагировать на случайные всплески
б) вторая зона, это когда абс.разница между текущей температурой и предыдущей итерации составляла угол, по отношению к горизонтальной линии, меньше 21 градусов (самый сложный вопрос как вычислять, по геометрии у меня не очень было :) )
в) треть зона как и вторая только от 21 градусов и выше, тут коэффиценты стояли, чтоб максимально быстро довести температуру до уставки

Николаев Андрей
17.10.2011, 15:15
Думаю что так как-то:
Нужны ручное управление мощностью, старт с произвольного значения, автонастройка, позволяющая запомнить коэффициенты в retain и при следующем запуске контроллера чтобы их можно было загрузить в регулятор; наверное быстрый выход на уставку. Это имеет смысл сделать и для двухпозиционных и трехпозиционных устройств. А еще (ну это мечта чтоль такая :) ) чтобы можно было разные методы выхода на уставку использовать, типа апериодического, с 20%-ым перерегулированием, с минимальным среднеквадратичным отклонением...

Блок сам должен расчитанные коэффициенты сохранять, или нужно их вытаскивать?
Нужны таки ПИД для двухпозиционного и трехпозиционного устройств?
Про указанные типы выхода на уставку - можно чуть подробнее?

Dr_KekS
05.11.2011, 09:20
Думаю, блок должен сам сохранять коэффициенты, но с возможностью их вытаскивания и записывания, Пид нужны и для 2х и для 3х позиционных устройств с аналоговым и ШИМ управлением...было бы здорово сделать автонастройку автоматической - нажал и забыл - выполнилась и работает

kolyan
05.11.2011, 15:28
Не следует забывать и про ПИ регуляторы без обратной связи, а то получится как с ТРМ212.

А что не так с ТРМ-212?
Вроде бы, без проблем на объектах работают.
И на соотношении газ\воздух и как погодозависимые...
Косяки были, в основном, замечены при переходе из ручного режима в автомат.

Солнечный заяц
11.11.2011, 08:57
Хотелось бы видеть что-то похожее на PID из util.lib, но:
1. Обязательно сделать защиту от -1#QNAN на выходе регулятора
2. Должна быть возможность ручной корректировки коэффициентов после автонастройки (или без автонастройки)
3. Модификации с использованием времени измерения параметра и без него.

Алексей Дмитриев
14.11.2011, 23:17
Регулятор из util.lib недоделанный. Ошибка там в том, что интегральная составляющая ничем не ограничена, только разрядностью. Ей глубоко наплевать на входы min и max. Получается следующее - при длительном рассогласовании в одну сторону, скажем при выходе на режим при нагреве интегратор улетает в невиданную даль, далее при смене знака рассогласования он, естественно начинает уменьшать значение интегральной составляющей, но столько же долго, как и при разогреве. Имеем полностью неработоспособный алгоритм. Делал так - при смене знака рассогласования сбрасывал интеграл - дальше все работало, но это не дело - надо исправить.

Зуйков Александр
21.11.2011, 09:24
У него другой косяк. Есть внутренняя переменная, которая записывается при смене уставки как разница между старой и новой уставкой и остаётся как постоянное слагаемое. И оно не сбрасывается после завершения переходного процесса. Надо сбрасывать самому. По крайней мере в ПД.

Зуйков Александр
21.11.2011, 11:11
Назвал может и не правильно, год назад разбирался с ним.
Это правильная память с точки зрения регулирования, но она должна обнуляться по завершении переходного процесса. А она не обнуляется и на выходе регулятора остаётся сигнал тогда, когда его быть не должно. При нулевом рассогласовании на выходе ПД должен быть 0!
А из-за переменной Y_ADDOFFSET при изменениях входных переменных блока она устанавливается наглухо и регулятор начинает выдавать сигнал тогда, когда объект в установившемся состоянии и его не надо трогать. При этом настройки адекватны и все сигналы по блоку нулевые, кроме этого слагаемого.

Зуйков Александр
21.11.2011, 13:58
И тут же получить бросок ? За што боролись ? Мне вот он ненужен. Вам нужен - reset в руки.

Скачка от сброса не будет, если сброс в установившемся и ПД является именно ПД, а не тем, что похоже на ПД, но им не является.


С какого это перепугу. Почему 0. А может 7. Или -325 ?
Мне вот нужно 0.42. Чем 0 лучше ?
Давайте сначала определимся с границами выхода.
А после этого попытаемся понять почему при нулевой ошибке в разное время может (и должен) быть разный выход у ПД.
PS
Надеюсь Вы позволите "рассогласование" заменить на "ошибку".

В установившемся (пусть даже не надолго) состоянии TV будет отдыхать. Значение в ПИД держится накопленной суммой, а не этим офсетом. Этим и проявляется в первую очередь корректность настройки, после характера переходного процесса.
Если при нулевой ошибке на выходе ПД есть значение, не обусловленное составляющей Д, то это уже не ПД, а чтото другое, узкоспециальная реализация.

Зуйков Александр
21.11.2011, 14:04
..и выход с новыми настройками начинает менятся от значения существовавшего непосредственно перед изменением а не с нуля. Это - правильно. Кому это не нужно - reset (дежа вю)

выход и будет меняться от прежнего значения, каким бы оно не было, 0 или не 0, эта переменная избавляет только от скачка относительно этого старого значения, который появится при изменении составляющих К и Д. Поэтому она и должна резко или плавно, но затираться при подходе к уставке

Зуйков Александр
21.11.2011, 14:11
В общем Ваша позиция мне вполне ясна.
Моё пожелание о том, чтобы в библиотеках регуляторы, названные своими классическими именами, а не "ПИД-регулятор для задвижек" или ещё какой нибудь, были регуляторами, ведущими себя однозначно в соответствии с формулой, которой от них ждёшь, и чтобы о таких внутренних переменных, которые дают неоднозначный выход в установившемся режиме, я узнавал не в поле, а при чтении описания библиотеки

kholonkin
23.11.2011, 22:35
Что то прочел ветку..... какой то монолог напомнило.... при чем тема монолога типа - "Что делать?"
А вот развития в русле - "Дело в следующем! И как побороть!" не обнаружил.:(
Тема ПИДа актуальна для меня.

Николаев Андрей
23.11.2011, 23:01
Как бы основная цель была как раз собрать пожелания к библиотеке с людей, для которых тема ПИДа актуальна...

igorsp
11.12.2011, 02:42
борюсь с библиотекой PID_Reg2
напишите диапазоны входных и выходных сигналов для ФБ W1_ANR W2_ANR DSP_A_PID
только величины хотелось бы видеть реальные
для примера из описания "Текущее положение задвижки ( ХОВ - при анр КЗР – расчётное либо реальное) или мощности регулятора (при АНР ШИМ)."
что поставить 0...1, или 0.....10000 ?

Николаев Андрей
11.12.2011, 21:15
борюсь с библиотекой PID_Reg2
напишите диапазоны входных и выходных сигналов для ФБ W1_ANR W2_ANR DSP_A_PID
только величины хотелось бы видеть реальные
для примера из описания "Текущее положение задвижки ( ХОВ - при анр КЗР – расчётное либо реальное) или мощности регулятора (при АНР ШИМ)."
что поставить 0...1, или 0.....10000 ?

Присылайте пожалуйста вопросы по ПИД регуляторам на почту:
support@owen.ru - обязательно выясним и ответим.

Николаев Андрей
11.12.2011, 21:29
Возвращаясь к варианту создания новой библиотеки.
Начинаем делать первые прикидки. Пока только 4 блока. Продолжаем думать дальше.
Во вложении первые прикидки. Описание и пример блоков в CoDeSys.

Все предложения, варианты и критику просьба слать сюда:
a.nikolaev@owen.ru

Gans
11.12.2011, 22:14
Здравствуйте Андрей
Для регулятора PID_easy на мой взгляд явно не хватает задания начального положения. Что-то типа - X_Start.

Например:
После всех расчетов П, И, и Д состовляющих мы получаем желаемое положение регулирующего органа. Так вот к нему и прибавить X_Start, а затем ограничить от 0 до 100 :-)

Применение:
Необходимо регулировать ГВС на небольшой котельной. Предположим работает один котел с переходом с большого на малое горение. Температура на выходе котла прыгает на +-20 градусов.
На вход X_Start подаем –0.75*температура_котла+100.
Где:
–0.75 – весовой коэффициент (возможно изменяющийся по какому либо алгоритму)
температура_котла – температура котлового контура.
100 – коэффициент «с потолка», что бы подправить начальное положение регулирующего органа.

Разумеется сюда можно добавить обратку ГВС на входе в теплообменник и тд. Таким образом получим регулятор который сможет начать приводить в порядок объект регулирования до того как заданный параметр начнет отклонятся от задания. Итого получаем простейший и эффективный многоконтурный регулятор.

P. S. Надеюсь не слишком запутанно получилось. Понимаю что всё это можно сделать и вне регулятора, но реализовать в регуляторе будет логичнее.

nevii
11.12.2011, 22:51
Очень бы хотелось чтобы ПИДы в новой библиотеке были рабочие (в качестве исключения) чтобы небыло как вот в этой ветке:

http://www.owen.ru/forum/showthread....ighlight=nevii


"Вообще, данный регулятор не предназначен для сохранения в retain. В руководстве, видимо, сделали Ctrl+C, Ctrl+V. Очевидно - хранить более 1000 байт в retain глупо когда из них нужно примерно 22."

"Все не очень хорошо.Победить не получится."

"Собственно сабж. Прогресс в прошивках в области pidreg2 для ПЛК1хх остановлен. Удобные для работы версии есть только для линейки ПЛК 63-73"

Очень классно в тех поддержке говорят : "Ну вы первый кто за ... тцать лет это обнаружил....."

Николаев Андрей
14.12.2011, 10:18
Здравствуйте Андрей
Для регулятора PID_easy на мой взгляд явно не хватает задания начального положения. Что-то типа - X_Start.

P. S. Надеюсь не слишком запутанно получилось. Понимаю что всё это можно сделать и вне регулятора, но реализовать в регуляторе будет логичнее.

Если честно - немного запутанно... Можно как то по рабоче-крестьянски...:)
К тому же это ПИД простой, даже без автонастройки. И этим ПИДом мы не ограничимся.


Очень бы хотелось чтобы ПИДы в новой библиотеке были рабочие
Спасибо за обратную связь - это я уже видел. Именно для этого я и хочу самостоятельно эту работу возглавить.
По этому сейчас интересуют пожелания по существу.

И если не лениво, то огромная просьба - на электронку, чтобы у меня все пожелания остались...

Солнечный заяц
15.12.2011, 08:46
2Николаев Андрей
Вероятно, Gans имел в виду следующее:
В ПИД заводится расчетное значение необходимое получить на выходе (0..100) (например положение 3-ходового крана в описанном случае с ГВС), а ПИД в свою очередь его корректирует (грубо говоря +/- 10%).
В двух словах, что-то вроде сумматора расченого значения с поправкой ПИД-регулятора и общим ограничением значения на выходе (0..100).

Касательно примера про ГВС: Например температура в котловом контуре 90С. По расчету, для получения температуры горячей воды 70С, нам необходимо установить 3-ходовой кран на 70% (это значение мы и заводим в "X_Start"). ПИД анализирует температуру ГВС и подправляет выходное значение относительно расчетных 70%.

П.С.
Мне бы хотелось реализовать следующий вариант:
Есть паровой котел, стоит задача поддерживать уровень воды в его барабане. Расход воды на входе и выходе (тонн пара) известны, уровень воды известен. Хотелось бы, что бы регулятор, в первую очередь, выравнивал расходы, а потом уже корректировал уровень. Таким образом мы бы практически исключили перерегулирование при хорошем быстродействии. Но при этом не вставал вопрос снятия характеристик на задвижку воды, т.к. мы заранее не знаем ее пропускной способности в каждом из положений.
Пока еще серьезным разбором этого вопроса не занимался, но на вскидку - простого решения в голову не приходит.

П.П.С. Только если удастся динамически изменять Максимум(100%минус<положение задвижки после выравнивания расходов>) и Минимум(0%минус<положение задвижки после выравнивания расходов>) выходного сигнала регулятора уровня, без изменения его скоростных характеристик.

capzap
15.12.2011, 09:34
а двухкаскадное регулирование не пробовали

Николаев Андрей
15.12.2011, 11:13
Ох хох...
Это какие то уже сложные блоки. Их надо обсуждать отдельно.
Я предлагаю сделать библиотеку простых блоков для использования в 80% случаев.

capzap
15.12.2011, 12:07
Ох хох...
Это какие то уже сложные блоки. Их надо обсуждать отдельно.
Я предлагаю сделать библиотеку простых блоков для использования в 80% случаев.
если это ко мне, то я отвечал на
Хотелось бы, что бы регулятор, в первую очередь, выравнивал расходы, а потом уже корректировал уровень.два каскада это два простых регулятора, стоящих последовательно и с той лишь разницей что уставку для второго каскада формирует первый

Солнечный заяц
15.12.2011, 12:55
2capzap
Вы предлагаете, чтобы регулятор расхода давал задание регулятору уровня, вместо оператора???

capzap
15.12.2011, 13:03
не совсем, зная разницу расходов можно прибавить соответствующее приращение к уставке заданной оператором, это в кратце, а более подробно надо открывать другую тему

Gans
15.12.2011, 15:38
Если честно - немного запутанно... Можно как то по рабоче-крестьянски...:)
К тому же это ПИД простой, даже без автонастройки. И этим ПИДом мы не ограничимся.
Раз уж происхождение позволяет попробую по другому решил выложить исходники (во вложении) самого регулятора.
мое предложение в исходниках регулятора выглядит так: rlOutPut:=rlOutPut+rlOutPutDif+rlCorrectionValve;
а точнее кроме учета пропорциональной, интегральной и дифференциальной составляющих еще дополнительно суммировать еще один параметр "rlCorrectionValve". Назавем этот вход - "начальное положение".

и вот вызов ПИД-регулятора из программы.
fnbPID_GVS(
rlCurent:=rlT_prjamGVS,
rlSetPoint:=rlT_Zadan_Curent,
rlK:=0.01*IP_intControlGVS_K,
rlI:=IP_intControlGVS_Ti,
rlD:=IP_intControlGVS_Td,
tmQuant:=t#1s,
rlI_MAX:=4000,
rlI_MIN:=-4000,
rlCorrectionValve:=rlTemp1*rlT_za_Kotl+rlTemp2*rlT _ObrGVS+140,
blnReset:=FALSE);

P. S. Просто для меня это сейчас актуально вот и морочу голову.

Gans
15.12.2011, 16:05
Мне бы хотелось реализовать следующий вариант:
Есть паровой котел, стоит задача поддерживать уровень воды в его барабане. Расход воды на входе и выходе (тонн пара) известны, уровень воды известен. Хотелось бы, что бы регулятор, в первую очередь, выравнивал расходы, а потом уже корректировал уровень. Таким образом мы бы практически исключили перерегулирование при хорошем быстродействии. Но при этом не вставал вопрос снятия характеристик на задвижку воды, т.к. мы заранее не знаем ее пропускной способности в каждом из положений.
Пока еще серьезным разбором этого вопроса не занимался, но на вскидку - простого решения в голову не приходит.
П.П.С. Только если удастся динамически изменять Максимум(100%минус<положение задвижки после выравнивания расходов>) и Минимум(0%минус<положение задвижки после выравнивания расходов>) выходного сигнала регулятора уровня, без изменения его скоростных характеристик.
Здравствуйте "Солнечный заяц"
Проблема у меня (с точки зрения математики) точно такая же как и у Вас. Правда пока работающего варианта решения не получается. Но решение точно скрывается где-то в дебрях многоконтурных системах управления. Вот и предложил предусмотреть в типовом ПИД-регуляторе еще один вход (в других регуляторах он называется начальное положение) и я сейчас пытаюсь с помощью этого входа построить многоконтурную систему управления.
P. S. Лично я против ограничения выходного сигнала как Вы предложили. Слишком тонкая и опасная настройка, а уж для паровых котлов .....

genchik
17.01.2012, 18:14
Как запустить ПИД ФУНКЦИЮ после отключения питания. Подскажите пожалуйста.

lpv22
25.01.2012, 23:01
Всем доброго времени суток!
Дабы не плодить много тем, задам свой вопрос по PID_FUNCTION из библиотеки PID_Regulators: при переходе из режима "Стоп" в режим "Работа" или при отключении питания и дальнейшем его включении выход ПИД-регулятора выдает значение при котором он был переведен в режим "стоп" и никак не реагирует на изменение ошибки рассогласования, т.е. застывает в этом промежуточном выходном значении пока не сделаешь ручной сброс на контроллере... после этого оживает выход ПИД-регулятора

Назаров Александр
10.02.2012, 16:50
Добрый день Форум! Есть несколько вопросов по функциональному блоку управления 3-х позиционным ИМ без датчика положения (VALVE_NO_POS_DY):
1.YREG:REAL – входная мощность (суммарное приращение мощности управляющего сигнала на текущий момент): это из описания. Вопрос: Приращение к чему? и пределы этой величины?
2. DTIME:REAL – интервал времени между вызовами ФБ. Для чего нужен этот параметр? Для уменьшения вклада во время выполнения программы пользователя?
3. Почему DTIME влияет на время полного хода ИМ? или как DTIME влияет на TSM? Т.е. если на вход YREG подать 1, то через время TSM выход YSM не будет равен 1 при разных DTIME.
Такое ощущение, что блок слегка кривоват и к тому же им никто не пользуется? Так зачем же предлагать такой продукт в качестве библиотеки!

Малышев Олег
10.02.2012, 17:06
Добрый день.
Использовать данный фб без блоков APID_* несколько неудобно.
1) Приращение - относительно предыдущего значения. Иначе говоря на выходе ПИД ставится сумматор который просто прибавляет вычисленное значение ПИД к предыдущему результату. Пид каждый цикл дает значение на которое нужно переместить задвижку от -1/тхода до 1/тхода.
2) DTIME - просто ставьте время цикла в секундах. 0.001 для 1 мсек
3) Блок не кривоват - просто лучше использовать APID_VALVE.

Alex_Kos
21.02.2012, 09:53
Насколько я понял алгоритм работы ФБ VALVE_NO_POS_DY следующий:
значение на входеYREG=0.3 (при PMIN=0, PMAX=1) говорит нам о том, что необходимо открыть задвижку на 30% относительно текущего положения. Сигнал на открытие необходимо будет подавать в течении TSM*0.3 секунд. В случае если TSM*0.3 будет меньше чем TIMPS, то подача управляющего сигнала проводиться не будет. Учет времени открывания в ФБ производится посредством DTIME. Поправьте пожалуйста меня если что не так понял.
По поводу PMIN и PMAX – я так понимаю если мы работаем с задвижкой, то PMIN=0 а PMAX=1.
Что не понятно:
1 – TLUFT – каким образом время выборки люфта влияет на алгоритм работы и что оно собой представляет?
2 - порядок работы с SYNC – синхронизация начального положения. Хотелось бы более подробное описание о том как с этим работать.

Малышев Олег
21.02.2012, 10:05
1 - Время выборки люфта. При реверсе положения к времени хода добавляется это время - связанно с особенностью исп. механизма в котором двигатель передвигает шестеренки в течение этого времени, а хода штока нет.
2 - Не стоит работать с SYNC. Говорю как разработчик - с этим много подводных камней.

Alex_Kos
21.02.2012, 10:11
То есть люфт имеет место когда мы при открывании начинаем подавать сигнал на закрытие? Когда задвижка в неподвижном положении перед закрытием или открытием данное время нет необходимости учитывать?

gtfox
27.02.2012, 02:18
Тут вроде как есть что почитать...
http://plc4good.org.ua/ (http://plc4good.org.ua/index.php?sub=4)

Alex_Kos
16.03.2012, 08:58
Спасибо! Интересный материал!

ОООСА
13.04.2012, 16:54
Для тех, кто хочет серьёзно разобраться в ПРАКТИЧЕСКОМ использовании САР почитайте вот эту КЛАССИКУ советской эстрады Ремиконт 130 - kafedra.asutp.locum.ru/tsa/remicont_r130.pdf
Вот еще www.ispu.ru/files/str._44-46.pdf
Если есть возможность, то достать книжечку В.Д. Таланов "Технические средства автоматизации"
Есть так-же хорошая программа эмуляции от МГТУ Баумана - http://mvtu.power.bmstu.ru/
Да много еще чего есть в инете, главное что надо не на ТАУ напирать, а на практические приложения. Считаю, что лучшим является документация по Ремиконту 130, программирование реализовано по подобию ФБД, всё реальное, и ничего лишнего.:D
Поняв функциональные схемы Ремиконта, зная нюансы РЕАЛЬНОЙ САР, можно достаточно легко реализовать регуляторы в CoDeSys.

Aleksandr_Sorokin
10.06.2012, 05:24
Здравствуйте!
Да бы не плодить новых тем, задам свой вопрос здесь. Вопрос не про настройку ПИДа, а про принципиальную возможность выполнения в ПЛК154.
Стоит задача реализовать классический каскадный регулятор по схеме, изображённой на рисунке (ведущий - ПЛК154, ведомые - ТРМ212). Хитрость в том, что котлы должны подключаться последовательно, а не работать одновременно, то есть при выходной мощности ведущего ПИД-регулятора от 0 до 50% работает котёл № 1 и выходная мощность его ведомого регулятора от 0 до 100%, а при выходной мощности ведущего ПИД-регулятора от 50 до 100% подключается и работает котёл № 2 (первый уже работает на максимуме) и выходная мощность его ведомого регулятора так же от 0 до 100% соответственно.
Вопрос в том как разделить и отмасштабировать выходную мощность ведущего регулятора на два ведомых?
Сработает ли следующий вариант: сигнал от входного датчика температуры в ПЛК154 заводиться в два параллельных блока ПИД-регулятора. На первом блоке Рmin и Рmax задаются от 0 до 0,5, на втором - от 0,5 до 1,0 соответственно. Выход Y первого блока выводится на ТРМ212 первого котла, выход Y второго блока - на ТРМ212 второго котла.

Буду рад любой помощи. Спасибо.

Gans
10.06.2012, 08:05
Здравствуйте Александр.

Здравствуйте!
Да бы не плодить новых тем, задам свой вопрос здесь. Вопрос не про настройку ПИДа, а про принципиальную возможность выполнения в ПЛК154.
Стоит задача реализовать классический каскадный регулятор по схеме, изображённой на рисунке (ведущий - ПЛК154, ведомые - ТРМ212). Хитрость в том, что котлы должны подключаться последовательно, а не работать одновременно, то есть при выходной мощности ведущего ПИД-регулятора от 0 до 50% работает котёл № 1 и выходная мощность его ведомого регулятора от 0 до 100%, а при выходной мощности ведущего ПИД-регулятора от 50 до 100% подключается и работает котёл № 2 (первый уже работает на максимуме) и выходная мощность его ведомого регулятора так же от 0 до 100% соответственно.
Вопрос в том как разделить и отмасштабировать выходную мощность ведущего регулятора на два ведомых?
Сработает ли следующий вариант: сигнал от входного датчика температуры в ПЛК154 заводиться в два параллельных блока ПИД-регулятора. На первом блоке Рmin и Рmax задаются от 0 до 0,5, на втором - от 0,5 до 1,0 соответственно. Выход Y первого блока выводится на ТРМ212 первого котла, выход Y второго блока - на ТРМ212 второго котла.

Буду рад любой помощи. Спасибо.

Про аналогичное управление много написано в каскадных регуляторах разных фирм. Расскажу про то, что читал:
1. Включаете один котел.
2. Считаете «интеграл ошибки» на общем коллекторе после котлов. Раз в минуту суммируете (с учетом знака) рассогласование/ошибку между заданием и измеренным значением.
3. Если «интеграл ошибки» станет меньше порогового значения (например: -45) – это значит, что пора включить дополнительно еще один котел.
4. Если «интеграл ошибки» станет больше порогового значения (например: 45) – это значит, что пора выключить дополнительный котел.

Aleksandr_Sorokin
11.06.2012, 06:04
Здравствуйте Александр.
Про аналогичное управление много написано в каскадных регуляторах разных фирм. Расскажу про то, что читал:
1. Включаете один котел.
2. Считаете «интеграл ошибки» на общем коллекторе после котлов. Раз в минуту суммируете (с учетом знака) рассогласование/ошибку между заданием и измеренным значением.
3. Если «интеграл ошибки» станет меньше порогового значения (например: -45) – это значит, что пора включить дополнительно еще один котел.
4. Если «интеграл ошибки» станет больше порогового значения (например: 45) – это значит, что пора выключить дополнительный котел.

А можно ссылки на данную литературу?
Я правильно понимаю, если "включение при пороговом значении", то получается просто компаратор, который даёт сигналы на включение/отключение котлов, а те в свою очередь регулируются своими регуляторами. Но тогда же это не каскадный регулятор. В таком случае не обязательно следить именно за рассогласованием, можно непосредственно за температурой в коллекторе после котлов. Так или я что-то не правильно понял?



pid(
..
y_min:=0,
y_max:=200
);
y1:=limit(0,pid.y,100); (*%*)
y2:=limit(100,pid.y,200)-100; (*%*)

Тут только надо полосу продумать для снижения дребезга вокруг y=100. Время или буквально - полосу.

PS
Зачем ТРМ при ПЛК154 ?

А не могли бы Вы поподробнее описать этот алгоритм? А то я, если честно, не понял, да и опыта в этом деле у меня не много. Limit - это что, операнд?

ТРМ212 на котлах уже были и убирать их не стали.

capzap
11.06.2012, 07:28
LIMIT - Ограничитель
OUT := LIMIT(Min, IN, Max) означает:
OUT := MIN (MAX (IN, Min), Max)
Max задает верхнюю и Min нижнюю границы ограничителя. Если IN больше верхнего или меньше
нижнего пределов, результат ‘обрезается’ соответственно до Max или Min.Если в тягость читать документацию :)

gtfox
13.06.2012, 09:09
ПИД регулятор.

День добрый господа.
Задумались над идеей создания библиотеки ПИД регуляторов.
Есть желание учесть Ваши пожелания.

Отсюда 2 вопроса:
1. Чем нравится\не нравится библиотека Pid_Reg2? Пожелания и предложения по данной библиотеке.
2. Приведите пример ПИД регулятора, который по Вашему мнению оптимален. Имя - чей это алгоритм желательно в личку.

2. Книга Astrom K.J., Hagglund T. Advanced PID Control (и другие книги Astrom K.J) http://www.twirpx.com/file/162015/
Вкратце на русском есть тут:
Денисенко В.В. Компьютерное управление технологическим процессом, экспериментом, оборудованием http://www.twirpx.com/file/116346/
P.S.
В книгах есть много ошибок, скорее всего введенных намеренно, поэтому советую выводить все расчеты самим...

Thorn
28.06.2012, 00:12
Я правильно понимаю, если "включение при пороговом значении", то получается просто компаратор, который даёт сигналы на включение/отключение котлов, а те в свою очередь регулируются своими регуляторами. Но тогда же это не каскадный регулятор. В таком случае не обязательно следить именно за рассогласованием, можно непосредственно за температурой в коллекторе после котлов. Так или я что-то не правильно понял?Система со слежением за дифференциалом рассогласования постоянно пытается убрать разность между реальной и заданной температурой, просто если разность небольшая то и интеграл растёт медленно (но он растёт!) и может быть раз в несколько часов включит дополнительный котёл (или ступень) и таки додавит до заданной температуры.
Система же с прямым слежением имеет привычку постоянно недобирать несколько градусов, по крайней мере со ступенчатыми горелками. С модулированными вероятно будет несколько лучше, но я думаю что котлы надо включать/выключать по интегралу разности, а уже полировку до заданной температуры доводить PI регулятором горелки последнего включенного ведомого котла, те-же, что имеют более высокий приоритет должны быть включены на полную мощность в обход PI регуляторов - это кстати и есть каскад.

Создайте в экселе 4 колонки: 1-минуты (1-60), 2-температура, 3-разность от заданной температуры, 4-интеграл разности. И попробуйте поэкспериментировать с колонкой температуры, особенно очевидно будет если в какой-то момент задать несколько одинаковых значений подряд.

zaur
07.09.2012, 08:48
Попробую задать вопрос сюда. Сам блоком apid_valve никогда не пользовался (делал сам связку пида и управления клапаном). Но вот в руки попала рабочая программа с данным блоком. Злил на 63 с целью кое-что посмотреть и исправить. И вот возникло несколько вопросов.
1) Есть там такой параметр внутри как anr_state по типу вроде bool. Так вот он у меня красный invalid. Что это и как оно влияет на работу? И почему так?
2) Блок адекватно работает только если значение на входе постоянно изменяется?
3) Хочу вытащить оттуда значение ПИД регулятора. Как я думаю, на вход внутреннего valve_no_pos заводится yreg. Его и буду брать (когда отдельно работаешь все именно так). Теперь вопрос: он же здесь идет от 0 до 100 стандартно?

CEkip
16.10.2012, 04:38
Выкладываю вполне вменяемый регулятор. Испытан на практике на таких параметрах как: разрежение в топке котла, уровень в барабане котла, соотношение топливо-воздух, нагрузка.
Работает хорошо и предсказуемо.

MikeF
17.10.2012, 07:34
Вопрос к тем, кто сам писал ПИД. Какую реккурентную формулу использовали для реализации алгоритма?

gtfox
17.10.2012, 09:20
Вопрос к тем, кто сам писал ПИД. Какую реккурентную формулу использовали для реализации алгоритма?


2. Книга Astrom K.J., Hagglund T. Advanced PID Control http://www.twirpx.com/file/162015/

страницы 64, 414, 420, 428

MikeF
17.10.2012, 12:23
страницы 64, 414, 420, 428

Спасибо, качаю.

petera
18.10.2012, 12:01
Выкладываю вполне вменяемый регулятор. Испытан на практике на таких параметрах как: разрежение в топке котла, уровень в барабане котла, соотношение топливо-воздух, нагрузка.
Работает хорошо и предсказуемо.
А не скажете,CEkip, чем определяется минимальная длительность импульсов на выходах Y_UP и Y_DOWN?. Точнее каким способом ее можно задавать?

CEkip
18.10.2012, 12:43
А не скажете,CEkip, чем определяется минимальная длительность импульсов на выходах Y_UP и Y_DOWN?. Точнее каким способом ее можно задавать?

минимальной длительности нет, но если понадобится то можно дописать, а вот время реверса учел сразу - оно фиксированное и = 0,2 сек.

Andrew_Stranger
19.10.2012, 09:57
Не могли бы уточнить еще параметр Time_PWM. Какие значения лучше выставлять?

CEkip
19.10.2012, 15:48
Не могли бы уточнить еще параметр Time_PWM. Какие значения лучше выставлять?

Это зависит от Ваше времени цикла программы. Я делаю мин. время цикла в программе 10мс и ставлю Time_PWM=600, т.е. время перерасчета = 6 сек.
Если хотите посмотреть работу регулятора в режиме эмуляции на компьютере, то поставите Time_PWM=10...60.

Andrew_Stranger
19.10.2012, 18:02
Посмотрел работу вашего ПИДа на ПЛК100. Сначала идет импульсное регулирование Шимом. Потом выход постоянно замкнут. Не похоже на регуляторы в ТРМах.
Работаю над регулируванием температуры в теплице с помощью задвижки. Не понятно как на реальном обьекте регулятор покажет себя. Может что посоветуете.

CEkip
19.10.2012, 18:20
Посмотрел работу вашего ПИДа на ПЛК100. Сначала идет импульсное регулирование Шимом. Потом выход постоянно замкнут. Не похоже на регуляторы в ТРМах.
Работаю над регулируванием температуры в теплице с помощью задвижки. Не понятно как на реальном обьекте регулятор покажет себя. Может что посоветуете.

У Вас просто накапливается ошибка. На реальном объекте при работе исполнительного механизма будет реакция регулируемой величины, т.е. будет изменятся рассогласование и соответственно и время ШИМ будет меняться в сторону уменьшения или увелечения. Но время ШИМ не будет больше Time_PWM*Время цикла.

У меня регулятор уровня воды в барабане котла держит уровень в пределах +/- 1 см при допустимом +/-4 см.

Andrew_Stranger
19.10.2012, 18:40
Температура в теплице очень инерционна по сравнению с уровнем в барабане.

MikeF
19.10.2012, 18:48
Вам просто нужна постоянная интегрирования больше чем в случае с барабаном.

Andrew_Stranger
19.10.2012, 20:13
Попробовал. ШИМ работает дольше, но потом все равно выход замыкает.
Наверно в алгоритме сброса нет при максимальном значении ПИДа. Хотя может он и не нужен.

MikeF
19.10.2012, 20:20
Нужно пробовать на реальном объекте, ШИМ идет без пауз, т.к. уставка не достигается.

MikeF
22.10.2012, 07:48
Кстати работу регуляторов я лично пробую на резисторе типа ПЭВ надетом на термосопротивление ДТС015 :)

princesska21
31.01.2013, 11:27
Вопрос наверное глупый, но как просмотреть коды библиотеки пид регулятора если код библиотеки в виде блока? Он точно не закрытый и раньше я его просматривала

ASo
31.01.2013, 11:33
Открыть библиотеку как проект.
Открыть модуль PID, он написан на ST.

SergeyH
23.02.2013, 06:13
ПЛК160 не пойму что не так. Только начал изучать ПИД-регуляторы
PID_2POS_IM_ANR из PID_Regulators

PID1(PV := Analog1, PV_TIME := 10, SP := 5000,START_ANR := %IX5.0,YDOP := 1000, _IMIN := -0.5,_IMAX := 0.5);

Так вот регулируется значение влажности точнее должно, у меня сейчас под рукой для экспериментов только чайник. Но на датчике значение больше 20000 а он все равно OUT_VAL показывает 100; чтобы я не делал ничего не меняется.

capzap
23.02.2013, 08:43
ПЛК160 не пойму что не так. Только начал изучать ПИД-регуляторы
PID_2POS_IM_ANR из PID_Regulators

PID1(PV := Analog1, PV_TIME := 10, SP := 5000,START_ANR := %IX5.0,YDOP := 1000, _IMIN := -0.5,_IMAX := 0.5);

Так вот регулируется значение влажности точнее должно, у меня сейчас под рукой для экспериментов только чайник. Но на датчике значение больше 20000 а он все равно OUT_VAL показывает 100; чтобы я не делал ничего не меняется.

А зачем Вы сразу взялись за регулятор с автонастройкой, про который описание не совсем точное. Контролируете ли Вы значение выхода STATE_ANR? Изменяло ли оно свое состояние, если подругому, то проводилась ли автонастройка регулятора?

ЗЫ параметр START_ANR := %IX5.0, точно управляется и бывает в состоянии TRUE?

SergeyH
23.02.2013, 18:57
Автонастройка не проводится

%IX5.0 это кнопка F1 на ПЛК, и когда нажимаю её то STATE_ANR все равно FALSE, пока пробую без автонастройки. Он же должен по идее если PV > SP + YDOP изменить значение с +100 на -100 и без автонастройки?.

А он это делает только в момент запуска. А потом значение висит одно и тоже. У меня грубо говоря ТЭН с испарителем пара на твердотельном реле.
PID_Function работает, буду пользоваться ей.
Вопрос есть ли стандартные функции, если OUT_VAL нужно преобразовать в ШИМ и задать нижнее значение частоты переключений реле(чтобы его не убить)?

Малышев Олег
24.02.2013, 10:40
Автонастройка невозможна т.к. у Вас на вход PV_TIME подана константа, нужно подать время измерения в 1/100 секунды

Aleksey9952
14.03.2013, 14:35
Подскажите пожалуйста, у меня такая система, есть 4 контактора, первый и третий работает через частотник для разгона двигателя, а второй и четвертый переключаются на прямую через определенное время, давление воды в системе должно быть 4.2 бара, мне надо что бы контактор который через частотник подключен например третий добавлял только 0.2 бара когда их не хватает... (если задание не корректно могу переписать...) как тут с пид-регулятором быть, и можете ли написать???

fred2012
08.05.2013, 14:59
Здравствуйте господа ну или товарищи, ладно ет не важно! Вот такая вот у меня проблема, ПИД мне надо сделать с ПЛК160. По датчику давления 4...20ма Надо что бы по уменьшению давления включались каналы, а когда давления в норме то постепенно уменьшалось количество каналов. КАждый канал будет включать ступень сгорания парогенераторов, их у меня 4, если кто может помогите, и я сам тоже посмотрю, а то смотрю что библиотека по пид есть. А ступеней у меня 12, включаются ступени простым сухим контактом

MikeF
08.05.2013, 16:56
Напишите поточнее ТЗ. А то непонятно сколько ступеней 4 или 12? Или 4 парогенератора каждый по 12 ступеней?

fred2012
09.05.2013, 04:41
Четыре парогенератора, у каждого парогенератора три ступени, ступень 1 малого сгорания, ступень 2 среднего сгорания, ступень 3 сильного сгорания. Вот и хочу что бы при нормальном давлении работали одна или две из малого сгорания. И что бы не тупой ПИД был конечно, у меня машина открывает пар система энорцеонная сразу давления валится а если упадёт ниже пяти очков то машина обвалится, а это четыреста литров молока в каналию. У меня сейчас обычные манометры стоят, саляру жрут бесщадно

CEkip
11.05.2013, 18:55
1. Добавил минимальное время импульса: Time_PWM_Min измеряется в тиках (циклы программы);
2. Теперь можно задавать время реверса: T_REVERS (в сек.);
3. При переходе рассогласования регулятора через "0" регулятор сбрасывается;
4. При переводе в ручной режим регулятор сбрасывается и накопление ошибки не происходит;
5. Также теперь имеется возможность сбрасывать регулятор из вне.

ga-nozry
24.05.2013, 13:14
Продолжаю делиться функциональными блоками :)
Этот блок я использую для управления частотниками с помощью ПЛК. Сейчас задействован аналоговый выход ПЛК, но с таким же успехом блок можно применять и для соединений ПЛК и ЧП через цифровые интерфейсы.

ПИД, реализованный на ПЛК, для управления частотниками мы применяем совсем недавно. Толкнула к этому необходимость поддержания заданной температуры отопления с помощью насосов расхолодки по показаниям обычного ДТС.

Блок также экспортирован и код открыт. Он очень прост (подробное описание (http://www.asutp-volgograd.com/1/post/2013/05/pid-regulator-for-inverters-codesys.html)), но достаточно универсален и пока отлично показывает себя на практике.

Тем не менее, буду признателен, если и вы поделитесь своим опытом реализации ПИДа для ЧП. Задача-то очень типичная, а я не пытался найти готовое решение и сделал блок на месте, поэтому мог и упустить что-то.

Николаев Андрей
24.05.2013, 14:58
Огромное спасибо.

lara197a
24.05.2013, 17:34
А чем не устроил ПИД в частотнике?
для датчиков есть НТП1.

ga-nozry
24.05.2013, 22:01
Необходимость создания блока появилась когда кто-то решил изменить технологию на готовых объектах и вместо привычного прямого регулирования давления использовать обратное регулирование по температуре. Для переделки шкафа под программный ПИД надо было лишь перекинуть два провода.

А если в общем:

ПИД в данной модели ЧП - плох (коэффициенты не влияют на его работу)
В нем нет возможности обратного управления (разгон двигателя если значение выше уставки)
НТП стоит денег, а на ПЛК есть свободные аналоговые выходы.
Сначала я и попробовал ПИД ЧП, а с ПЛК пересылал инвертированное, преобразованное в 4-20 мА, значение температуры - уставка. Да, помимо текущего значения необходимо отсылать и уставку (которая меняется в зависимости от т-ры воздуха на улице). Всё работало... Но зачем такие извороты подумал я :)
Можно было и по Modbus всё передавать, но в ЧП помимо схемотехнических проблем (резистор надо выпаивать, причем это нигде не описано и я первым это обнаружил, а частотников больше 200 таких) были и программные проблемы (по Modbus нельзя изменить параметр уставки если активирован встроенный ПИД - это я тоже первый в России обнаружил, вот такой я хренов открыватель)


Как видите, проблемы в основном из-за ЧП. Хотя ПИД на ПЛК мне лично кажется более удобным, простым, надежным (в нашем случае), и более профессиональным что ли.

Holden
06.06.2013, 13:58
Подскажите какую библиотеку пид лучше использовать. Модель - нагревательный элемент внутри замкнутой камеры, необходимо поддерживать температуру с точностью до градуса. Нужно чтобы по приближению к уставке пид работал на опережения как бы предсказывая и уменьшал выходную мощность

Holden
06.06.2013, 14:04
т.е подбирать коэффициенты?

Алексей Дмитриев
18.06.2013, 10:40
Прошло уже много лет, а тема до сих пор актуальна! Боролся и я в свое время с библиотечными творениями, но закончилось это написанием простого функционального блока, который устраивает в 99% случаев.
Вот код:

FUNCTION_BLOCK PID_REG
VAR_INPUT
EN:BOOL; (*Включить регулятор*)
SETP: REAL ; (*Уставка*)
FEED: REAL ; (*Обратная связь*)
MAN_IN: REAL; (*Выход в ручном режиме*)
KP: REAL ; (*Коэффициент усиления*)
KI: REAL ; (*Коэффициент усиления интегрального звена*)
KD: REAL; (*Коэффициент усиления дифференциального звена*)
MAX_V: REAL; (*Максимум выхода*)
MIN_V: REAL; (*Минимум выхода*)
RES: BOOL; (*Сброс регулятора*)
MAN: BOOL; (*Ручной режим*)
CLOCK: DINT; (*Текущее время*)
END_VAR
(*Вход CLOCK - часы, постоянно инкрементируемое двойное слово. Частота может быть любой.
Это зависит от того с какой точностью необходимо обрабатывать временные интервалы.*)

VAR_OUTPUT
END:BOOL; (*Регулятор включен*)
LMN: REAL ; (*Выход регулятора*)
END_VAR

VAR
E_N,E_N1,E_N2,U_N0,U_N1: REAL;
DELTA_T,KI_DISCR,KD_DISCR: REAL;
ST0,ST1: DINT;
END_VAR

(*Собственно код*)

IF EN THEN (*Если включено, то ПОЕХАЛИ!*)
(*Посчитаем отклонения во все моменты времени*)
E_N2:=E_N1;
E_N1:=E_N;
E_N:=SETP-FEED;
ST1:=ST0;
ST0:=CLOCK;
DELTA_T:=DINT_TO_REAL(ST0-ST1)/10.0; (*Временной интервал X Сек. Часы на входе с дискретностью X/10 Сек*)
(*А теперь с коэффициентами*)
KI_DISCR:=KI*DELTA_T;
KD_DISCR:=KD/DELTA_T;
(*Собственно - выход, то есть сумма интегрального и дифференциального звена*)
U_N0:=U_N1+KI_DISCR*E_N+KD_DISCR*(E_N-2*E_N1+E_N2);
IF KI>0 THEN
IF KP*E_N+U_N0>MAX_V THEN (*Проверка максимума*)
U_N0:=MAX_V-KP*E_N;
END_IF;
IF KP*E_N+U_N0<MIN_V THEN (*Проверка минимума*)
U_N0:=MIN_V-KP*E_N;
END_IF;
ELSE U_N0:=0;
END_IF;
IF RES=TRUE THEN (*Сброс, однако*)
U_N0:=0;
END_IF;
IF MAN=TRUE THEN (*Ручной режим*)
U_N0:=MAN_IN-KP*E_N;
END_IF;
U_N1:=U_N0;
LMN:=KP*E_N+U_N0; (*Добрались, таки до выхода*)
END:=TRUE; (*Все посчитано*)
ELSE
END:=FALSE; (*Регулятор отключен, дальше тоже ничего не выполняется*)
LMN:=0; (*Выход, на всякий случай обнулим*)
END_IF;
Пробуйте, видоизменяйте как душе угодно!

melky
24.06.2013, 18:49
Вопрос по PID из Util.lib

Уставка 18, когда ставлю значение 18 на измеряемом входе, то выход фиксируется на том значении, которое было или становится чуть меньше или чуть больше в зависимости от предыдущего состояния.
например при входе 17,9 доползло до 100 (ограничение лимита Y_MAX), ставлю на вход 18 и значение на выходе 99,8 и снижаться начинает только если на входе 18,1

Разве не должно значение стать 0 (Y_MIN) или продолжать снижаться до 0?

Y_OFFSET равен 0

MikeF
24.06.2013, 19:47
Лучше проверять на реальном объекте или на модели. Возможно это как-то связано с мертвой зоной или накоплением очень большой интегральной составляющей.

melky
25.06.2013, 12:51
Кто сталкивался с ПИД регулированием нагрева тенами с ШИМ, подскажите, какие параметры лучше выставлять изначально исходя из своего опыта ?

KP Коэффициент передачи.
TN Постоянная интегрирования, в секундах (т.е. "0.5" для 500 мс).
TV Постоянная дифференцирования, в секундах (т.е. "0.5" для 500 мс).

И что лучше ставить в МИН МАХ, 10 и потом умножать на 100 или 100 потом * на 10 или просто уж 1000 и передавать на ШИМ.

Из опыта прошлых побед так сказать.

MikeF
25.06.2013, 13:09
Вопрос некорректный. Параметры настройки у всех свои.
По поводу параметров мин макс.
Если в работе нет ситуаций с долгим выходом на уставку (в такие моменты сильно накапливается интегральная составляющая, которая потом долго "рассасывается") то можно делать хоть как, а так чтобы ПИД нормально работал именно в плане своей интегральной части, то лучше ставить пределы по максимуму.

Алексей Дмитриев
25.06.2013, 16:27
Вот, кстати мой код, который чуть выше лишен этого недостатка - при смене знака рассогласования выход сразу начинает свой путь назад.

melky
25.06.2013, 18:32
MikeF, учитывая, что регулирование нагревом будет через ШИМ то установка Мин/Макс оправдана. Регулятор не будет уходить в минуса и в большие плюса. то есть будет держать интервал 0 - 1000. А вот как этот интервал для тенов лучше сделать уже вопрос.
На счет параметров понятно что у всех свои, я и спрашивал какие более менее оптимальны при условии, что на выходе будут висеть тены.

MikeF
25.06.2013, 19:05
Вот, кстати мой код, который чуть выше лишен этого недостатка - при смене знака рассогласования выход сразу начинает свой путь назад.
Возможно где-то на практике это может быть полезно. А по факту говорит о том, что нет интегральной составляющей...

MikeF
25.06.2013, 19:10
MikeF, учитывая, что регулирование нагревом будет через ШИМ то установка Мин/Макс оправдана. Регулятор не будет уходить в минуса и в большие плюса. то есть будет держать интервал 0 - 1000.
А вы думали вообще не указывать мин-макс чтоли? :)
Ставьте 0-1000. На самом деле это абсолютно непринципиально, ибо в отрицательную область всё равно регулятор не уйдет при нормальной работе...

Алексей Дмитриев
26.06.2013, 00:35
Недостаток - именно такое решение.
Пример:
На насосе - 50Гц. Давление 0.5, Уставка - 5.
Стало неспеша давление 0.6 и зачем-то частота сразу повалилась ?
Правильно сказали - это тогда П или ПД
Она начнет медленно снижаться в соответствии с интегральной составляющей при достижении уставки, в вашем случае=5!:D
Глупость ляпнули, бывает.:rolleyes: Потестите алгоритм хотя-бы в симуляторе, кстати прекрасно работает, потом делайте "авторитетные" заявления.:mad:

Алексей Дмитриев
26.06.2013, 00:50
Возможно где-то на практике это может быть полезно. А по факту говорит о том, что нет интегральной составляющей...


:DОна, увы есть! Но ограничена сверху максимумом, а снизу минимумом, а посему, как я уже и писал ранее, при выходе параметра чуть выше уставки, начинает плавненько отрабатывать назад сразу, не дожидаясь когда И составляющая станет меньше максимума! Тестируйте алгоритм, он простой и совершенно бесплатный!:D Потом пишите "авторитетные" заявления!:p

MikeF
26.06.2013, 05:18
А что вы так возбудились то?
Как говорил классик: "Кто на ком стоял? Потрудитесь излагать свои мысли яснее..."
То у вас сразу начинает, то плавно.
Мы ж по вашим авторским словам составили мнение :)
Если И составляющая есть, то обязательно будет точка перегиба, где выходное значение на какое-то время замирает.
Не надо быть авторитетом чтобы понять это.

Алексей Дмитриев
26.06.2013, 09:10
То у вас сразу начинает, то плавно.

Автомобиль сразу начинает останавливаться - по вашему получается, что это означает мгновенную остановку, скажем со 100 км/ч до нуля, за ноль секунд. ;)
По существу: Чем плох библиотечный регулятор:
Идет разогрев объекта, интегральная составляющая растет и ничем не ограничена. Объект разогрелся до уставки, интегратор начинает уменьшаться, но его значение раз в 10 больше максимума выхода регулятора. Долго нервно ждем-с, пока интегратор свалится до значения максимума выхода, после чего выход начинает уменьшаться. Перегрев объекта раза в 2-3 гарантирован.

MikeF
26.06.2013, 12:27
Это уже другой разговор.
Просто если человек (а тем более два) вас не поняли, то имеет смысл задуматься и над своими словами...

Алексей Дмитриев
27.06.2013, 14:57
Это про кого ? В утиле - ограничение есть. Если, конечно, его (ограничение) использовать.

Не шмогла, лезет намного выше чем ограничение, наложенное на выход.:( Подскажите как???
Хотя заметил, что при изменении Ти где-то она (интегральная составляющая) ограничивается, но не понял где и как оно зависит от настройки. В моем коде ограничение наложено жестко по ограничению выхода, при любых настройках Ки. От Ки зависит только скорость изменения интегральной составляющей, что правильно, как я полагаю.:cool:

Алексей Дмитриев
28.06.2013, 11:59
Y за пределы не выходит, выходит интегральная составляющая. Y=пропорциональная+интегральная+дифференциальная. Дальше догадайтесь сами, что происходит если интегральная>>>>Ymax.
Странно, но решил все-таки проверить в эмуляторе - нормально работает. Мучался где-то пару лет назад на ПЛК63 - не работало. Может особенности контроллера какие?

capzap
28.06.2013, 15:02
:) Александр, зря Вы распинаетесь, лосяш чисто теоретически спорит по овеновскому направлению http://www.owen.ru/forum/showthread.php?t=10555&p=114153&viewfull=1#post114153

Алексей Дмитриев
28.06.2013, 16:19
А меня и.состав - не парит. Y не выходит - всё. Поу - это черный ящик. Есть входы и выходы. Не надо забивать голову копаясь в внутрях, это парить вообще не должно.

Ну да, парить не должно, когда уже давным-давно перегрев, а мощность на выходе из-за этой грёбаной интегральной составляющей все еще 100% и не думает снижаться!:mad:
Вместо зажаренной котлеты получили кусок черного угля, а так нормально, не парит, регулятор-то рабочий!:D
Как я уже говорил в эмуляторе работает, интеграл ограничен, а на ПЛК63 не хочет почему-то, прет в небо! :mad::mad::mad:
Так недолго и до 2-ого Чернобыля.:)

Алексей Дмитриев
01.07.2013, 14:11
Сейчас нет ПЛК63 чтобы проверить, в эмуляторе с этим все ОК. Тогда удалось победить сбросом интегратора при перегреве в 5 градусов, после чего все застаканивалось нормально.

Алексей Дмитриев
02.07.2013, 16:44
Это происходит при Actual <<< Setpoint, но опять же напомню - на ПЛК63.

Алексей Дмитриев
03.07.2013, 15:39
Почему выход интегратора =12000 при ограничении на Ymax=1000? Теперь поставьте Actual = 101, что будет с выходом регулятора? Он у меня не начинал снижаться сразу, то есть торчал на максимуме до тех пор, пока интегратор не уменьшался до 1000, или там с единицами измерения какой-то бред. В вашем случае на выходе интегратора должно-бы быть 1200, то есть 1000 - интегратор, +200=Отклонение*2. Че-то все-таки неладно в Датском королевстве!;)

Алексей Дмитриев
04.07.2013, 01:59
Если-бы работало, даже не взглянул-бы на выход интегратора. Надо заканчивать эту тему.

Shayker
19.07.2013, 14:10
Для 2.3 есть нечто подобное?

жекон
19.07.2013, 19:10
Для 2.3 есть нечто подобное?
Для него и есть, да и большое спасибо автору сэкономил кучу времени, мне такой блок нужен совсем скоро

ga-nozry
23.07.2013, 16:33
На здоровье :D
В благодарность можете поддержать мой блог, оставляя по возможности и уместности ссылки на него: http://www.asutp-volgograd.com/blog.html

Блок в сабже я расширил, кстати. В нём теперь присутствует выходная булева переменная, по состоянию которой может включаться (отключаться) дополнительный двигатель если основной не создал нужное давление (или ещё что) за определенное время, разогнавшись почти на максимум (если при совместной работе выход ПИД достиг заданной нижней границы). Также присутствует ограничение минимальной выходной частоты и полная остановка двигателя при длительном вращении на минимальной частоте. Если нужно - выложу.

Чуть позже вообще планирую выложить и описать в блоге готовую программу для ПЛК150/160 для управления по rs-485 (или через клеммы) любым числом групп насосов (под управлением ПЧ) с произвольным числом насосов в каждой по схеме основной-дополнительный-резервные. Сейчас такую по городу запускаем, тестирование почти закончили.

Поэтому подписывайтесь на RSS-ленту (http://feeds.feedburner.com/asutp-volgograd) (можно по e-mail, вбив его в форму на блоге (http://www.asutp-volgograd.com/blog.html). Вам придет сообщение если появится новый пост).

Aldonin2007
25.10.2013, 14:35
Уважаемые господа разработчики и форумчане!
Я конечно понимаю, что я со своим... да в калашный ряд, но, если Вам интересно, то выскажу пару своих соображений:
1. PID-регулятор вещь великолепная и очень нужная, так как может применяться в совершенно разных областях техники.
2. Не надо иметь каких-то сверх знаний, что бы использовать и эксплуатировать эти регуляторы. НО!!!
3. Поскольку далеко не все, кто что либо строит на основе PID-регуляторов имеют специальное образование, то возможно ли как-то упростить, т.е. перейти на "рабоче-крестьянский" язык в описании настроек данного прибора? Честно говоря, я не считаю себя полным безграмотностью, но когда я впервые столкнулся с регулятором ТРМ-251, то без автонастройки, о которой здесь много говорится, я прибор едва ли бы запустил! Ну уж очень мудрёно там всё написано! Так же и с присвоением значений переменных (интегральной, дифференциальной, постоянной) в библиотечных регуляторах КоДеСис абсолютная непонятка! - Впятером два дня думали (по аналогии с ТРМ-251) - только мозги вывихнули!
Очень бы хотелось видеть более понятное описание и толкования хоть блока, хоть прибора!
4. По входам - выходам:
Лично моё мнение - пусть они будут как есть сейчас. Если не надо, то просто не использовать да и всё! А вот добавить входов на управление - это с радостью! Конкретно: По примеру ТРМ-251 в регуляторе нужно или несколько уставок, или возможность менять их по мере необходимости оператора, либо программно с течением времени. Так же было бы не плохо предусмотреть возможность выхода на уставку по заданному значению времени. И ещё нужны выхода сигнализирующие о выходе на ту или иную уставку, например для отсчёта времени сушки изделия.

Ну вот и всё, пожалуй.
С уважением, Алдонин Евгений.

amn
25.10.2013, 17:51
Еще неплохо было бы на рабоче-крестьянском языке описать принцип работы автонастройки.

RV9WFJ
26.10.2013, 06:59
Так вроде все понятно в общих чертах по блоку. Единственное - совершенно не указано как быть если на горячую надо уставку поменять (обнулить интегралку) или что делать когда выход обнуляется принудительно при открытии дверцы печи например. Опять с интегралкой непонятки. Я вроде методом н.тыка дошел к ответу, но не уверен, что так оптимально.

MikeF
27.10.2013, 09:13
Уважаемые господа разработчики и форумчане!
Я конечно понимаю, что я со своим... да в калашный ряд, но, если Вам интересно, то выскажу пару своих соображений:
1. PID-регулятор вещь великолепная и очень нужная, так как может применяться в совершенно разных областях техники.
2. Не надо иметь каких-то сверх знаний, что бы использовать и эксплуатировать эти регуляторы. НО!!!
3. Поскольку далеко не все, кто что либо строит на основе PID-регуляторов имеют специальное образование, то возможно ли как-то упростить, т.е. перейти на "рабоче-крестьянский" язык в описании настроек данного прибора? Честно говоря, я не считаю себя полным безграмотностью, но когда я впервые столкнулся с регулятором ТРМ-251, то без автонастройки, о которой здесь много говорится, я прибор едва ли бы запустил! Ну уж очень мудрёно там всё написано! Так же и с присвоением значений переменных (интегральной, дифференциальной, постоянной) в библиотечных регуляторах КоДеСис абсолютная непонятка! - Впятером два дня думали (по аналогии с ТРМ-251) - только мозги вывихнули!
Очень бы хотелось видеть более понятное описание и толкования хоть блока, хоть прибора!
4. По входам - выходам:
Лично моё мнение - пусть они будут как есть сейчас. Если не надо, то просто не использовать да и всё! А вот добавить входов на управление - это с радостью! Конкретно: По примеру ТРМ-251 в регуляторе нужно или несколько уставок, или возможность менять их по мере необходимости оператора, либо программно с течением времени. Так же было бы не плохо предусмотреть возможность выхода на уставку по заданному значению времени. И ещё нужны выхода сигнализирующие о выходе на ту или иную уставку, например для отсчёта времени сушки изделия.

Ну вот и всё, пожалуй.
С уважением, Алдонин Евгений.
В принципе рюши можно и самому дописать, была бы основа и тех. задание.

Aleksey Belokon
27.11.2013, 23:42
Добрый день! Понимаю избитую тему но прочитав все что есть на форуме, по теме ПИД, ответы не нашел. Использую PID регулятор из библиотеки UTIL.lib. Электро калорифер в приточной системе. В результате экспериментов с параметрами (пальцем в небо) выставил значения следующие KP = 1; TN = 100; TV = 0.
При попытке увеличить TV (ставил от 5 до 50) картина одна и та же резко начинает расти Y и температура аж до 50+ градусов в притоке, держит 99% немного прыгая уменьшится на процент и опять вернется. Ну дальше конечно нервы не выдерживали, приходилось гасить, а то так и до повреждений недалеко. Почему-то не уменьшает проценты когда температура становится выше уставки.

При выбранных же значениях колебания равномерные идут где-то 5 градусов, в процентах где-то 10%. Хотелось бы стабилизировать колебания и понять работу ПИД регулятора.

Если у кого есть рекомендации по литературе теоретическая часть ПИД (только не надо библиотеку скидывать, время тоже ограниченно) действительно стоящей. Ну и вопрос может есть какой алгоритм подбора коэффициентов вручную.

Цифры применял по аналогии с заводскими заданиями в ТРМ133М, там KP = 0,1; TN = 100; TV = 15.

kgsh82
28.11.2013, 07:45
Добрый день! Понимаю избитую тему но прочитав все что есть на форуме, по теме ПИД, ответы не нашел. Использую PID регулятор из библиотеки UTIL.lib. Электро калорифер в приточной системе. В результате экспериментов с параметрами (пальцем в небо) выставил значения следующие KP = 1; TN = 100; TV = 0.
При попытке увеличить TV (ставил от 5 до 50) картина одна и та же резко начинает расти Y и температура аж до 50+ градусов в притоке, держит 99% немного прыгая уменьшится на процент и опять вернется. Ну дальше конечно нервы не выдерживали, приходилось гасить, а то так и до повреждений недалеко. Почему-то не уменьшает проценты когда температура становится выше уставки.

При выбранных же значениях колебания равномерные идут где-то 5 градусов, в процентах где-то 10%. Хотелось бы стабилизировать колебания и понять работу ПИД регулятора.

Если у кого есть рекомендации по литературе теоретическая часть ПИД (только не надо библиотеку скидывать, время тоже ограниченно) действительно стоящей. Ну и вопрос может есть какой алгоритм подбора коэффициентов вручную.

Цифры применял по аналогии с заводскими заданиями в ТРМ133М, там KP = 0,1; TN = 100; TV = 15.

Я пользуюсь именно этим регулятором. Ставлю такие коэффициенты: KP:=5; TN:=120; TV:=0; Всё прекрасно работает.

Выложите кусочек вызова ФБ

Sergey666
28.11.2013, 09:23
Не помню было это на форуме или нет...

(*================================================ ===========*)
Сказка про ПИД-регулятор

Cадитесь поудобнее и слушайте... Давным давно, в позапрошлом веке или в позапрошлом тысячелетии или ещё ранее, то уже сейчас точно неведомо, в Англии или в России или в Греции или в Тридесятом царстве, были предприняты первые попытки реализовать саморегулирующиеся системы. Однако получалось это не всегда, ни с того ни сего, арыки выходили из берегов не донося до садов живительную влагу, то паровые машины шли вразнос, губя создателей своих без вины, а то количество чиновников молниеносно увеличивалось на фоне стремительного обнищания народа. Много мудрых мудрецов думали, как бы делу помочь, как одолеть стихию непонятную? Звездочеты думали-думали, ничего путного не придумали. Физики с математиками думали-думали, несколько матмоделей придумали только и всего. А естествоиспытатели с алхимиками взяли и придумали PID-регулятор. Приладили его к чему-то, историки не успели записать к чему, посмотрели - хороша вещица. И давай с тех пор втыкать его куда ни попадя. Однако вот незадача - двенадцать раз втыкнут, ну всё хорошо, а на тринадцатый не подходит хоть ты тресни! Уж и сенсоры заморские ставили, актюаторы аглицкие врезали - ничего не помогает. Стали кликать математиков на помощь. Математики они хоть и бывают злыми иногда, и память у них хорошая, но всё ж народ незлопамятный - пришли. Посмотрели математики на PID регулятор - ересь да и только! Но делу то надо помочь... Кому пятилетку за три года надо делать, а у кому тред-юнион покоя не даёт. Вообщем согласились математики с алхимиками - будем для вас критерии сочинять. Правда последние уж не алхимиками звались, а называли себя гордо Инженерами по Автоматизации - с насиженных мест их химики к тому времени полностью вытурили. Сочиняли критерии Найквист и Вайттекер, Вышнеградский и Михайлов, и еще много-много других мудрецов. Сочиняли затейливо и красиво. То ажурну загагулину на кресте нарисуют, то кружочки с крестиками, а то и просто плюсики да минусики вряд. Как ни стараются математики - доходит до Инженеров по Автоматизации неважно. И тогда снизошло на Николса-Циглера прозрение - если по Сеньке и шапка, то каков регулятор такие и настройки его. И не надо людям голову морочить вовсе! Взял он и: 1. на работающем PID регуляторе, в относительно установившемся режиме, отключил D и уменьшил, на сколько это возможно, влияние I соответствующим образом изменив Ti (Внимание! некоторые контролеры имеют нетрадиционную ориентацию Ti, а некоторые, особо впечатлительные контроллеры от Ti=0 могут впасть в кому. Поэтому, ничего не обобщая, советую, прежде чем что-то предпринимать, обратится к документации на конкретный контролер и думать мозгами.). 2. потом стал Николс-Циглер увеличиваль, постепенно, с шагом около 10 % оставшийся коэффициент - Р, до возникновения автоколебаний в контуре - записал "Ко". 3. Записал величину периода этих колебаний - "То". 4. Недолго подумав решил что: для PI K = Ko * 0.45 Ti = To / 1.2 для PID K = Ko * 0.6 Ti = To / 2 Td = To / 8 5. Но видно очень не долго думал Николс-Циглер, перерегулирование аж до 40%! Тогда поправил его Тирес-Любен: K = Ko / 3.22 Ti = To * 2.2 , а Td добавлять по вкусу. С той поры Инженеры по Автоматизации вроде как посвящённые стали, много ещё чего понапридумывали и линеаризацию и декуплинг и всякие поправки для объектов без самовыравнивания, а тринадцатый регулятор всё равно не в дугу...
(*================================================ ===============================================*)
Может поможет...
Там еще 2 ПИДа - один фикс цикл - его вызывать надо с периодом (1 раз в секунду) , другой во входном параметре имеет период пересчета коэффициентов в мс.

kukla100
20.04.2014, 17:54
Прошло уже много лет, а тема до сих пор актуальна! Боролся и я в свое время с библиотечными творениями, но закончилось это написанием простого функционального блока, который устраивает в 99% случаев.
Вот код:

FUNCTION_BLOCK PID_REG
VAR_INPUT
EN:BOOL; (*Включить регулятор*)
SETP: REAL ; (*Уставка*)
FEED: REAL ; (*Обратная связь*)
MAN_IN: REAL; (*Выход в ручном режиме*)
KP: REAL ; (*Коэффициент усиления*)
KI: REAL ; (*Коэффициент усиления интегрального звена*)
KD: REAL; (*Коэффициент усиления дифференциального звена*)
MAX_V: REAL; (*Максимум выхода*)
MIN_V: REAL; (*Минимум выхода*)
RES: BOOL; (*Сброс регулятора*)
MAN: BOOL; (*Ручной режим*)
CLOCK: DINT; (*Текущее время*)
END_VAR
(*Вход CLOCK - часы, постоянно инкрементируемое двойное слово. Частота может быть любой.
Это зависит от того с какой точностью необходимо обрабатывать временные интервалы.*)

VAR_OUTPUT
END:BOOL; (*Регулятор включен*)
LMN: REAL ; (*Выход регулятора*)
END_VAR

VAR
E_N,E_N1,E_N2,U_N0,U_N1: REAL;
DELTA_T,KI_DISCR,KD_DISCR: REAL;
ST0,ST1: DINT;
END_VAR

(*Собственно код*)

IF EN THEN (*Если включено, то ПОЕХАЛИ!*)
(*Посчитаем отклонения во все моменты времени*)
E_N2:=E_N1;
E_N1:=E_N;
E_N:=SETP-FEED;
ST1:=ST0;
ST0:=CLOCK;
DELTA_T:=DINT_TO_REAL(ST0-ST1)/10.0; (*Временной интервал X Сек. Часы на входе с дискретностью X/10 Сек*)
(*А теперь с коэффициентами*)
KI_DISCR:=KI*DELTA_T;
KD_DISCR:=KD/DELTA_T;
(*Собственно - выход, то есть сумма интегрального и дифференциального звена*)
U_N0:=U_N1+KI_DISCR*E_N+KD_DISCR*(E_N-2*E_N1+E_N2);
IF KI>0 THEN
IF KP*E_N+U_N0>MAX_V THEN (*Проверка максимума*)
U_N0:=MAX_V-KP*E_N;
END_IF;
IF KP*E_N+U_N0<MIN_V THEN (*Проверка минимума*)
U_N0:=MIN_V-KP*E_N;
END_IF;
ELSE U_N0:=0;
END_IF;
IF RES=TRUE THEN (*Сброс, однако*)
U_N0:=0;
END_IF;
IF MAN=TRUE THEN (*Ручной режим*)
U_N0:=MAN_IN-KP*E_N;
END_IF;
U_N1:=U_N0;
LMN:=KP*E_N+U_N0; (*Добрались, таки до выхода*)
END:=TRUE; (*Все посчитано*)
ELSE
END:=FALSE; (*Регулятор отключен, дальше тоже ничего не выполняется*)
LMN:=0; (*Выход, на всякий случай обнулим*)
END_IF;
Пробуйте, видоизменяйте как душе угодно!

А на каком языке это написано? Можете выложить готовый блок? И при повторении выдаёт ошибку

MikeF
20.04.2014, 18:38
Это ST. Выложите файл, посмотрим.

kukla100
20.04.2014, 19:20
Это ST. Выложите файл, посмотрим.
Вот выкладываю

Alber
19.05.2014, 17:05
ЧТо-то тема засохла!
Не знаю, относиться ли мой вопрос к этой теме, а может к другой (какой подскажите), но то что он про регулятор - это точно:)
Может у кого есть опыт применения различных видов регуляторов подскажет какой вид регулятора наиболее приемлем для инерционных систем (помещений, отапливаемых теплыми полами, электро батареями).
Я так поня из написанного, что это гистерезисные. А может ПИ пойдет или еще какой? И в чем их преимущество?

MikeF
19.05.2014, 17:57
Для отопления помещения эл. нагревателем я использовал ПИД, д-часть конечно роли не играла, но работало хорошо, темп. держалась с очень маленьким отклонением. Использовались два датчика темп., значение с них усреднялось с весовыми коэффициентами (для более комфортного пребывания людей в определенных местах помещения).
Для отопления помещения с помощью теплых полов использовали ПИ, длительность имп. фиксирована 1% от полного хода трехходового, длит. паузы определяется значением с ПИ-регулятора. Датчик темп. воздуха использовался с дискретным выходом (кажется какой-то из Dallas).
Последний случай конечно суперинерционный, регулятор долго выходит на плавный режим регулирования, первые много часов :) действительно по сути в гистерезисном режиме работает.

Alber
21.05.2014, 10:57
А как себя ведут такие системы в нештатных ситуациях (открытие дверей, окон), долго ли они восстанавливаются и чем лучше гистерезиса, ведь если гистерезис маленький поставить, то откланения не такие громадные будут!? Я имею ввиду с точки зрения эффективности, на сколько применение ПИ регулятора по расходу мощности выше гистерезиса или при умелой настройке разница между ними сводиться к минимуму, а столько городить (ШИМ с большими интервалами) смысл?
ПИД регуляты для электрического теплого пола не делают! ну может вип модели и те просто вид ПИДа имееют, а сами в гистерезисе работают!
Вот у ПИДа есть регулировка уровня выходной мощности - это плюс (хотя при таких условиях не очень понятно плюс ли)

значение с них усреднялось с весовыми коэффициентами (для более комфортного пребывания людей в определенных местах помещения). А ЭНТО КАК ДЕЛАЕТСЯ?

RV9WFJ
22.05.2014, 07:36
ПИД как раз на инерционных процессах хорошо работает. Вся проблема только в том чтоб его правильно настроить. Вот тут уже нет единого хорошего метода. Если вы 2х позиционный регулятор используете то при правильном подборе мощности нагревателя тоже будет хорошо работать, а вот если мощность нагревателя с большим запасом выбрана то будут выбеги постоянно.

MikeF
22.05.2014, 07:56
А как себя ведут такие системы в нештатных ситуациях (открытие дверей, окон), долго ли они восстанавливаются
Долго конечно. Для примера можно посмотреть тесты климат-контроля в машине, такие тесты часто делают в автомурзилках.


на сколько применение ПИ регулятора по расходу мощности выше гистерезиса
О, это интересный вопрос. Хотя и банальный, т.к. разбирается в учебниках. Но, как показала практика, мало кто задумывается, что несколько грамотных строчек кода могут сэкономить серьезные деньги.

Само собой ПИ экономичнее вкл/выкл!

Здесь есть варианты эл. отопление или на газу.

С эл. выгода может быть не такой большой при определенных условиях. Проблема двухпозиционных регуляторов в том, что процесс регулирования на практике всегда несимметричен. Т.е. либо постоянный перегрев или постоянный недогрев. Использование регулятора с И-составляющей симметрирует процесс автоматически, благодаря чему и получается экономия энергоресурсов из-за исключения постоянного перегрева выше уставки.

С газовым отоплением плюс к этому добавляются потери энергии при продувке горелки, если используется двухпозицонное/ступенчатое регулирование. Т.е. нужно ПИ регулирование + модулируемая горелка. Не говоря уже об износе оборудования из-за постоянных пусков и термоциклирования всей системы.


А ЭНТО КАК ДЕЛАЕТСЯ?
Да, звучит пафоснее чем делается :)

Сигналы с датчиков перед подачей на регулятор обрабатываются простой формулой.
Тср=К1*Т1+К2*Т2,
где Тср - темп. для подачи на регулятор,
Т1 и Т2 - сигналы с датчиков,
К1 и К2 - весовые коэф. причем К1+К2=1.

В моём случае коэф. были равны 0,4 и 0,6 соответственно, т.е. регулятор "больше ориентировался" на показания датчика Т2.

Alber
22.05.2014, 20:17
Да, оно понятно про газ и т.д. Но я морочусь с ПИДом, потому, что другой альтернативы кроме электрического обогрева нет! А как повысить эффективность системы и стоит ли оно того - это меня и беспакоет.
Но ,судя по выше изложенному, я так понимаю что использование ПИДа оправдывается, только его точить под себя придется и я так понимаю напильник надо побольше брать:)
АНР (автонастройка коэффициентов пида) играет роль или в данных уловиях это не имеет значения?
Есть библиотека PID_reg2 помоему к ПЛК63 (на ПЛК 100 она будет работать или не вариант) там даже такая штука есть DSP_A_PID (Адаптивный ПИД регулятор с быстрым выходо на уставку!) что за зверь? как работает? кто пробывал? на ПЛК100 будет работать?
Да, там во всех ПИДах есть циклическое время (PV_TIME), я так и не понял чем его заменить, если нет аналогового выхода.
И чем опасен переход в ручной режим? (я так понял мощность подскакивает и спалить чего-нить можно) и как этого избежать?

Alber
22.05.2014, 20:26
Просто ни разу такую штуку не пробывал а в симуляции не работает, поэтому осторожно подхожу к этому вопросу и пытаюсь понять побольше прежде чем начинать эсперементы. Написано много, но в пока не попробуешь не поймешь, вот и спрашиваю у тех кто использует эти программные "агрегаты".
Понимаю, что вставить код, подключиться и нажать старт и будет счатье, но кажется что должно быть чтот еще!
Да а как быть с настройками ШИМа? Какой длительности (хоть примерно или какого порядка брать) мин интервал брать? не 20мс же!

MikeF
22.05.2014, 20:33
Вышеописанный регулятор как раз на пиде с автонастройкой работал, достаточно гладко. ПЛК150 использовался.
Библиотеки эти насколько знаю работают только со своими плк.

На вход pv_time я подавал gen_out:=gen_out+10; в таких случаях.

MikeF
22.05.2014, 20:37
Да а как быть с настройками ШИМа? Какой длительности (хоть примерно или какого порядка брать) мин интервал брать? не 20мс же!
Можно период сек 10-30 взять. Я вообще делал двухпозиционный регулятор управляемый с выхода пид, темп. шла очень ровно, скриншот только потерял...

Alber
23.05.2014, 21:18
Вышеописанный регулятор как раз на пиде с автонастройкой работал, достаточно гладко. ПЛК150 использовался.
Библиотеки эти насколько знаю работают только со своими плк.

На вход pv_time я подавал gen_out:=gen_out+10; в таких случаях.

Гена аут - это приращение, которое бесконечно растет или сбрасывается при достижении опр значения и в чем оно меряется (в милисеках)? или оно пастет бесканечно пока ПИД работает?

MikeF
23.05.2014, 21:23
растет, переходит через ноль, ведет себя точно так же как стандартное время измерения у аналоговых каналов

Alber
25.05.2014, 17:07
Не очень представляю как этот счетчик на CFC выглядит на ST понятно
t:=t+10;
IF (t MOD 1000)=0 THEN
A := A + 10;
IF A > 9999 THEN
A := 0;
END_IF
END_IF
Да, тут еще одна пакость образовалась с которой не знаю как бороться! в библиотеке Pid_reg2 (хотя написано что она для ПЛК 63,73,100,110,150,154) на ПЛК100 возникает ошибка, в которой пишится следующее: "запрещенные ссылки на внешние POU" перечисляются все внутренние блоки APID_PWM (я так понимаю что блоку APID_PWM не дают всязаться со своими же внутренними блоками)!
Что за глюк? Может многие уже это вылечили. И есть ли еще библиотеки с АНР и БВУ, которые работают на ПЛК100?

MikeF
25.05.2014, 17:54
А зачем такой навороченный код, чем мой пример не устроил?
Мой на cfc просто сделать :)

Я использовал PID_2POS_IM_ANR из библиотеки PID_Regulators на ПЛК150, 110-30. Нормально работал.

RV9WFJ
26.05.2014, 08:34
На сколько помню там разные файлы библиотеки для ПЛК63/73 и ПЛК100/150..... с одинаковыми ФБ. Берите из этого архива http://kipshop.ru/CoDeSys/bibl/Lib_OWEN_PLC1xx_v8.12.zip

Alber
05.06.2014, 21:16
Спасибо я понял все и ПИД работает, только я все больше понимаю, что мне не ПИД нужен, а может быть ПИ. ПИД очень быстро и не всегда хорошо реагирует на изменение пораметров объекта. Вообщем у него много лишних движений. Для инерционного объекта лишнии движения не нужны, нужно мало, но по делу.
Подыскиваю все возможные варианты. Если есть опыт в исползовании других видов регуляторов, напишите.

RV9WFJ
06.06.2014, 04:56
Уменьшите диф.состовляющую и будет вам ПИ. Из принципиально других только нелинейные - в упрощенном виде это просто таблица соответствия выходного сигнала входному.

MikeF
06.06.2014, 06:09
Я ПИ использую в таких случаях.

Alber
08.06.2014, 12:34
Pid_reg2 на ПЛК 100 заработал, но PID_2POS_IM_ANR вроде лучше регулирует ( w2_anr слишком быстро меняет мощность, поэтому время ШИМ надо ставить маленькое) PID_2POS_IM_ANR регулирует стабильно и точно, только с приращением интегральной надо угадать! Подскажите, почему ПИД регулятор цепляется либо выше уставки и начинает там регулировать и держать температуру, либо ниже, почему на уставке не хочет стоять и как это подправить (PID_2POS_IM_ANR, может все дела в ограничении максимального приращения интегральной составляющей?)?

MikeF
08.06.2014, 13:51
"Подвисание" возле уставки говорит о том, что И-части в регуляторе почти нет, т.е. это П регулятор. Чем больше Кр (чем глубже обратная связь в системе) тем ближе к уставке приближается П регулятор.

kukla100
09.06.2014, 12:31
Люди, помогите, горю!!! Нужно собрать ПИД-регулятор на модулирующую горелку "унигаз". Дело в чём: перепробывал все регуляторы с форума все они быстродействующие, а на горелку надо медленный, поскольку сам котёл инертен. И ещё все регуляторы которые я нашел выдавали сразу полный сигнал на открытие при большой разнице между измеренным значение и уставкой, а такое, я повторюсь, не надо. Выхода нужны на релейные. Перепробывал всё :PID_Regulators, PID_PWM_CE (12_10_2012) и PID_REG_CE (23_12_10), и ни чего.

vav
10.06.2014, 17:11
ТРМ для модулирующей горелки рассматривался тут (http://www.owen.ru/forum/showthread.php?t=17138).
Из готовых приборов ОВЕН кое как подходит ТРМ 212, но из-за отсутствия защиты от теплового удара, при запуске наращивает свою мощность, пусть не очень быстро, но уверенно, в то время как на RWF50, при нарастании температуры, при минимальной мощности потребления газа, долгое время давал команду сервоприводу уменьшить мощность.
Хотите реализовать полноценный алгоритм на ПЛК - прочтите мануал на gefran (http://yadi.sk/d/uTw3q_ToMLo7H).

gishirakuharaka
27.06.2014, 20:07
Проблема такая.
По просьбе товарища взялся за регулятор для самогонного аппарата. Есть простой терморегулятор, но слишком большие колебания. С ПИД регулятором проблем нет, но программа ни как не вяжется с фазовым регулятором мощности. На выходе имеем ШИМ, есть идея завести отфильтрованный ШИМ в мощность, но как?

MikeF
27.06.2014, 20:20
Вы по-понятнее напишите, а то в отличие от самогоноварения прослеживается перегонка пустого в порожнее - отфильтрованный шим - по сути сигнал на входе шим блока, т.е. выход ПИД, "плавный" аналоговый сигнал.

Ефремов Николай
03.12.2014, 05:58
Три года прошло с открытия темы, а воз и ныне там. Почему? Потомучто подменяются понятия ПИД-регулятор и ПИД-закон регулирования. Нельзя на основе одного устройства(функционального блока), названного ПИД-регулятором с помощью принципиально разных ИМ(исполнительных механизмов) получить ПИД-закон регулирования на объекте. Нельзя из уже сформированного по ПИД-закону аналогового выходного сигнала формировать импульсы разной длительности для управления задвижкой или клапаном(больше/стоп/меньше) и считать, что регулирование будет происходить по ПИД-закону. Господа, забудте про это. В данном случае, задвижка или клапан являются интегрирующим звеном, поэтому для формирования импульсов нужно устройство ПДД', после интегрирования сигнала которого получится ПИД.

MikeF
03.12.2014, 06:31
Приветствую, земляк, полностью согласен.
Всяк должен понимать, что для управления трехходовым или горелкой с дискретными входами достаточен П регулятор, с преобразователем аналогового выхода регулятора в нужную последовательность импульсов.
Т.е. при управлении такими ИМ из-за их интегрирующих свойств на выходе регулятора будет число близкое к 0 в установившемся режиме.
При управлении же ИМ с аналоговым входом или по интерфейсу на выходе регулятора будет некое число отличное от ноля (накопленная интегральная составляющая) из-за того что такие ИМ не являются интегрирующим звеном и для поддержания уставки нужно непрерывное воздействие.

Ефремов Николай
03.12.2014, 09:29
Спасибо, :)

sashakim
14.12.2014, 23:39
Добрый день!
Кто нибудь подскажет? У меня PID_REG2 на ПЛК110-30 не работает. Я скачал с сайта библиотеку для ПЛК110-30, но она, я так понимаю, не совместима. Где можно скачать? Или подскажите как сделать PID-регулятор для управления смешивающим клапаном.

Гарчев Евгений
15.12.2014, 11:51
Здравствуйте!
библиотека Pid_Reg2 для ПЛК63/73, для ПЛК1хх Pid_Regulators.

sashakim
19.12.2014, 13:49
А кто-нибудь может дать или написать пример в codesys 2.3 на CFC контроль по температуре и управление двумя реле. Чтоб получился аналог ТРМ212.

RV9WFJ
20.12.2014, 04:48
Если вам нравится садо мазо то не склоняйте к этому других. На форуме есть пример ПИД на ST + обвязка на CFC.

Эдуард_Н
21.12.2014, 03:52
Если вам нравится садо мазо то не склоняйте к этому других. На форуме есть пример ПИД на ST + обвязка на CFC.

Где этот пример лежит?

sashakim
21.12.2014, 21:29
Если пример на с использованием PID_REG2, то у меня пишет ошибку. Если есть возможность, то хотелся бы пример (скиньте ссылку если такой пример есть) с использованием библиотеки Pid_Regulators.

sashakim
24.12.2014, 09:03
Я так понимаю, помочь мне никто не может?
Задам вопрос по другому. Есть регулятор с автонастройкой второго типа PID_3POS_IM_ANR. Еслть ли у кого пример работы с этим ФБ?

Ефремов Николай
29.12.2014, 10:43
У меня PID_REG2 на ПЛК110-30 не работает. Я скачал с сайта библиотеку для ПЛК110-30, но она, я так понимаю, не совместима. Где можно скачать? Или подскажите как сделать PID-регулятор для управления смешивающим клапаном. Вероятно, причина не работы Вашего регулятора в другом. ПЛК110 не имеет собственных аналоговых входов, следовательно Вы работаете через МВ110, а на полный опрос (например для МВ110-8А) всех аналоговых входов требуется время (на 8 входов около 6 сек). Кроме того, Вы должны кроме значения на входе МВ110 считывать относительное время измерения на этом входе, без него у Вас регулятор работать не будет.

RV9WFJ
30.12.2014, 04:23
Вероятно, причина не работы Вашего регулятора в другом. ПЛК110 не имеет собственных аналоговых входов, следовательно Вы работаете через МВ110, а на полный опрос (например для МВ110-8А) всех аналоговых входов требуется время (на 8 входов около 6 сек). Кроме того, Вы должны кроме значения на входе МВ110 считывать относительное время измерения на этом входе, без него у Вас регулятор работать не будет.
Вероятно Николай вы плохо представляете себе что такое групповой опрос и как можно опрашивать все входы 10 раз в секунду вместе с временем. А библиотека у товарища не работает потому что и не должна работать, она для ПЛК63/73.

Ефремов Николай
30.12.2014, 04:57
Вероятно Николай вы плохо представляете себе что такое групповой опрос и как можно опрашивать все входы 10 раз в секунду вместе с временем. А библиотека у товарища не работает потому что и не должна работать, она для ПЛК63/73.Опрос модулей, но не опрос датчиков. Но зачем опрашивать модуль 10 раз в секунду, если значения на нём изменяются 1 раз за 6 сек(для модуля МВ110-8А)?

RV9WFJ
31.12.2014, 11:23
Опрос модулей, но не опрос датчиков. Но зачем опрашивать модуль 10 раз в секунду, если значения на нём изменяются 1 раз за 6 сек(для модуля МВ110-8А)?
В конфигураторе можно выставить на нужный вход 0.3 сек время опроса, если он на ПИД используется. Да и ПИДу чаще не требуется если он температуру поддерживает. Гораздо важнее чтоб данные были синхронизированы с считываемым временем опроса, а для этого требуется групповой опрос.

petera
13.01.2015, 19:16
Данный PID_DZ2 сделал из ФБ PID библиотеки util.lib
16144

ЗЫ. Почему-то нельзя использовать вложения с расширением EXP:(.
Я и не заметил, что файл не прикрепился к сообщению

Doctor
16.02.2015, 00:09
ПИД регулятор.

День добрый господа.
Задумались над идеей создания библиотеки ПИД регуляторов.
Есть желание учесть Ваши пожелания.

Отсюда 2 вопроса:
1. Чем нравится\не нравится библиотека Pid_Reg2? Пожелания и предложения по данной библиотеке.
2. Приведите пример ПИД регулятора, который по Вашему мнению оптимален. Имя - чей это алгоритм желательно в личку.
На первый вопрос не отвечу - слишком там всё для меня заморочено :_(
А вот на второй ответил бы так: хотелось бы чтобы функционал и входы/выходы были такими-же, как в ТРМ32. Возможно ли?

black-hol
31.03.2015, 09:50
1. Какой серии плк, пойдет для регулирования давления подпиточной воды, в таком режиме: импульсный с ручным управлением и в автомате

2. Как лучше начать изучение CodeSys?

kolyan
23.07.2015, 11:15
Добрый день!

Вопрос следующий:

Может ли кто-нибудь дать пример ПИД регулятора для управления нагревателем/холодильником (не для 3-х позиционных ИМ!) для ПЛК-73 ?
Как, например, в ТРМ-12 - именно для системы нагреватель (ТЭН) и холодильник (вентилятор).
Спасибо.

Вольд
23.07.2015, 12:27
А самому повторить на ПЛК73 (написать код на ST) то, что описано в РЭ на ТРМ12 сложно ? За день можно сделать.

kolyan
23.07.2015, 14:00
А самому повторить на ПЛК73 (написать код на ST) то, что описано в РЭ на ТРМ12 сложно ? За день можно сделать.

Флуд не приветствуется.
Если есть примеры - буду благодарен.
Нет - не нужно засорять тему.

P.S.
За столько лет у компании Овен так и не появилось такого ФБ (управление системой нагреватель/холодильник).
Которую можно сделать "за один день".
Почему - то на всякие вопросы, типа, как работать с клавиатурой ПЛК и им подобные - десятки ответов.
А как поднимешь серьёзную тему - или никого или одни "доброжелатели"...

Вольд
23.07.2015, 14:18
Флуд не приветствуется.
Если есть примеры - буду благодарен.
Нет - не нужно засорять тему.

P.S.
За столько лет у компании Овен так и не появилось такого ФБ (управление системой нагреватель/холодильник).
Которую можно сделать "за один день".
Почему - то на всякие вопросы, типа, как работать с клавиатурой ПЛК и им подобные - десятки ответов.
А как поднимешь серьёзную тему - или никого или одни "доброжелатели"...
Какой флуд, я и слова такого не знаю.;) Я для ПЛК100 лет пять назад сам сделал. Там нет ничего сложного, надо знать всего 4 арифметических действия. Для расчета управляющего сигнала на выходе цифрового ПИД-регулятора используется формула: см. вложение. В РЭ на ТРМ12 все подробно описано. Много полезного по ПИД-регуляторам можно найти в сети.

вапросик
24.07.2015, 12:53
кстати,для цифровых ПИД-регуляторов есть хороший пример (алгоритм) в этой книге (http://bhv.ru/books/book.php?id=188412) (стр.309-316)
написал для плк-63 за пару часов,пару дней испытывал-великолепно работает.

Гарчев Евгений
24.07.2015, 16:39
Флуд не приветствуется.
Если есть примеры - буду благодарен.
Нет - не нужно засорять тему.

P.S.
За столько лет у компании Овен так и не появилось такого ФБ (управление системой нагреватель/холодильник).
Которую можно сделать "за один день".
Почему - то на всякие вопросы, типа, как работать с клавиатурой ПЛК и им подобные - десятки ответов.
А как поднимешь серьёзную тему - или никого или одни "доброжелатели"...

А ф.б. APID_PWM из биб-ки Pid_reg2 не подходит?

жекон
25.07.2015, 05:07
кстати,для цифровых ПИД-регуляторов есть хороший пример (алгоритм) в этой книге (http://bhv.ru/books/book.php?id=188412) (стр.309-316)
написал для плк-63 за пару часов,пару дней испытывал-великолепно работает.
Выложили бы на суд общественности:rolleyes:

вапросик
25.07.2015, 13:21
кажется эта релизная версия :D -для плк 63-нагрев ТЭНа:

Вольд
25.07.2015, 14:32
кажется эта релизная версия :D -для плк 63-нагрев ТЭНа:

Надо оформить это как простейший проект для ПЛК. В проект надо включить PLC_PRG, FUNCTION_BLOCK PID_REG,
FUNCTION xy : REAL. В PLC_PRG надо вставить обращение к FUNCTION_BLOCK PID_REG. Тогда это будет законченный пример.

Pvalp
07.09.2015, 10:27
Сообщение от kukla100 #126
на каком языке это написано? Можете выложить готовый блок? И при повторении выдаёт ошибку
19810


Сообщение от MikeF Посмотреть сообщение
Это ST. Выложите файл, посмотрим.

Сообщение от kukla100 #128
Вот выкладываю
Вложения
Тип файла: lib PID.lib (9.1 Кб, Просмотров: 141)

Там всего лишь маленькая ошибка, наверное сделанная автором чисто автоматически.
было:
19810
стало:
19811

и сама библиотека:
19812
Уже поправленная.

Pvalp
09.09.2015, 00:01
кстати,для цифровых ПИД-регуляторов есть хороший пример (алгоритм) в этой книге (http://bhv.ru/books/book.php?id=188412) (стр.309-316)
написал для плк-63 за пару часов,пару дней испытывал-великолепно работает.

А где можно скачать эту книгу?

вапросик
18.09.2015, 17:46
этой книги-электронной версии НЕ видел,но есть предыдущее издание этой книги:
"нечеткие регуляторы в системах АУ" ,2008 г.,киев,изд-во радиоматор,
кажется она валяется на twirpx.com

Pvalp
18.09.2015, 23:41
Спасибо большое, я это видел.

Денис Сухарев
08.10.2015, 15:28
Готовый полигон, на котором можно посмотреть работу регулятора. Работает в режиме эмуляции. Регулятор может работать как напрямую с дискретных выходов, так и через аналоговый выход, через модуль ШИМ (Pulser). Режим переключается кнопкой в визуализации. Возмущение можно создавать через корректор, получается очень наглядно и понятно.
Полигон эмитирует работу регулятора уровня. Регулятор управляет виртуальным регулирующим клапаном, посредством дискретных команд (Открыть/Закрыть).

20322

Вольд
08.10.2015, 15:39
Готовый полигон, на котором можно посмотреть работу регулятора. Работает в режиме эмуляции. Регулятор может работать как напрямую с дискретных выходов, так и через аналоговый выход, через модуль ШИМ (Pulser). Режим переключается кнопкой в визуализации. Возмущение можно создавать через корректор, получается очень наглядно и понятно.
Полигон эмитирует работу регулятора уровня. Регулятор управляет виртуальной задвижкой дискретными командами (Открыть/Закрыть).

20322

Отличный проект, только комментариев к коду не хватает. Интересно где и кем была сделана работа ?

Денис Сухарев
08.10.2015, 15:42
Отличный проект, только комментариев к коду не хватает. Интересно где и кем была сделана работа ?
Это сделал я в 2009 году. Современный RSL алгоритм регулятора значительно отличается от алгоритма Logic_Reg.
А комментарии могу и добавить если кому будет интересно...

Вольд
08.10.2015, 15:45
Это сделал я в 2009 году. Современная модель регулятора гораздо круче )).
Вы в ВУЗе работаете ?

liga_blunt
08.10.2015, 17:41
Конечно интересно

MikeF
08.10.2015, 18:29
Современный RSL алгоритм регулятора значительно отличается от алгоритма Logic_Reg.
RSL и Logic_Reg это что?

Денис Сухарев
08.10.2015, 19:00
RSL и Logic_Reg это что?
Это функциональные блоки прогностических регуляторов, с блоком Logic_Reg можно познакомится скачав полигон регулятора уровня, выложен чуть выше.

Денис Сухарев
08.10.2015, 19:05
Вы в ВУЗе работаете ?

Нет, на производстве. Я больше практик, чем теоретик. Кстати, приведённый в примере регулятор прекрасно работает на практике, на реальных объектах теплоэнергетики, сам проверял. Есть конечно недостатки которые в следующих версиях устранены.

MikeF
08.10.2015, 19:24
с блоком Logic_Reg можно познакомится скачав полигон регулятора уровня, выложен чуть выше.
А с RSL? :)
В чужой программе тяжеловато разбираться без комментов. Если кратко, в чем заключается прогнозирование? Линейная экстраполяция от скорости изменения сигнала рассогласования?

Денис Сухарев
09.10.2015, 07:41
А с RSL? :)
В чужой программе тяжеловато разбираться без комментов. Если кратко, в чем заключается прогнозирование? Линейная экстраполяция от скорости изменения сигнала рассогласования?

Если кратко то вы совершенно правы, скорость изменения сигнала рассогласования - это базовый компонент прогноза, но не единственный. В расчёте участвуют время хода исполнительного механизма и диапазон регулирования в абсолютных единицах.

Прилагаю полигон с комментариями. Там всё просто ))

murzik
12.10.2015, 21:26
Возвращаясь к варианту создания новой библиотеки.
Начинаем делать первые прикидки. Пока только 4 блока. Продолжаем думать дальше.
Во вложении первые прикидки. Описание и пример блоков в CoDeSys.

Все предложения, варианты и критику просьба слать сюда:
a.nikolaev@owen.ru
Простите за дилетантский вопрос: а как можно утащить данный регулятор к себе в проект?
пробовал сохранить его, как библиотеку - получилось. Только не совсем. Сохранилось, но не работает:rolleyes:
зы ИМелось в виду вложение к сообщению №28. При цитировании оно потерялось:eek:

Пьер
02.11.2015, 15:44
Да тот самый косяк с привязкой ко времени хода исп. мех.

Можно по конкретнее. Что с привязкой ко времени исп.мех.
КЗР стоит. 120 сек полный ход (от мин до макс).
Получается ПИД завязан на этом времени?

Владислав Г.
24.11.2015, 19:27
ПИД-регулятор PID_2POS_IM_ANR. На выходе OUT_VAL только ноль. Где ошибка?

ss_zeim
16.12.2015, 16:55
Пытался разобраться с импульсным ПИД регулятором с автонастройкой без датчика положения. Добиться адекватной работы от регулятора так и не удалось. А нельзя создать простой нормальный адекватный регулятор без автонастроек чтобы самому определять параметры регулирования?
Думаю не вредно ввести в регулятор функции динамической и статической балансировки для исключения скачка при изменении задания.
Пробовал построить регулятор на основе аналогового регулятора и позиционера VALVE_NO_POS_DY. Виртуально точно позиционировать положение клапана очень сложно. накапливается ошибка и клапан просто не доходит до крайних положений. Сделал формирователь импульсов по приращению выхода аналогового ПИД регулятора. При достижении крайних значений выхода ПИД регулятора сбрасываю регулятор и формирователь импульса. Вроде работает нормально.

Серг
12.01.2016, 15:58
Добрый день! Поздравляю всех с Новым Годом! Прошу помощи. Задача: настроить режим нагрева через ПИД-регулятор с изменением уставки во времени. Первая часть понятна. Как можно изменять уставку, например увеличивая (уменьшая) температуру последовательно во времени (речь идет о часах). Понимаю, что нужен таймер. Однако пока слаб в кодесис и совет был бы уместен. Контроллер ПЛК-150. Всем спасибо! Моя почта: ssslll.lll2015@yandex.ru.

Yuran66
29.03.2016, 20:30
Добрый день. Только начинаю осваивать ПЛК Овен, раньше работали с Ремиконт Р-130. Подскажите через что нужно пропустить выход регулятора У=-100...100, для управления трехпозиционным регулирующим органом (больше/меньше). Используем ПЛК-160. Регуляторы из библиотек по моему мнению работают неадекватно.

Пьер
30.03.2016, 07:41
Добрый день. Только начинаю осваивать ПЛК Овен, раньше работали с Ремиконт Р-130. Подскажите через что нужно пропустить выход регулятора У=-100...100, для управления трехпозиционным регулирующим органом (больше/меньше). Используем ПЛК-160. Регуляторы из библиотек по моему мнению работают неадекватно.

а какой пид используете? Из какой биб-ки?

ASo
30.03.2016, 08:00
Для 3-х позиционного управления Вам надо написать свой ПИД, переписав классический в дифференциальной форме.
Вот пример.

Вольд
30.03.2016, 10:12
Для 3-х позиционного управления Вам надо написать свой ПИД, переписав классический в дифференциальной форме.
Вот пример.

А чье это творение ?

Yuran66
30.03.2016, 10:31
а какой пид используете? Из какой биб-ки?
Добрый день!
Сейчас использую PID_REG_CE (23_12_10) из одноименной библиотеки. Не устраивает сильнейшее перерегулирование при длительном выходе на уставку и длительный возврат при изменении знака рассогласования. Так же пробовал PID_PWM_CE (12_10_2012), но он не понятно работает с выходами. Словно пускает на выходы больше меньше не дискрет а последовательность импульсов.
Теперь хочу использовать что то из библиотек ОВЕНа, типа PID_Regulators, но у них выход аналоговый, отсюда и вопрос как преобразовать в импульсы заданной длительности, с периодом в зависимоти от "У".

Yuran66
30.03.2016, 10:32
Для 3-х позиционного управления Вам надо написать свой ПИД, переписав классический в дифференциальной форме.
Вот пример.

Спасибо посмотрю.

ASo
30.03.2016, 12:42
А чье это творение ?

Мое.
А что?

Yuran66
03.04.2016, 18:20
Для 3-х позиционного управления Вам надо написать свой ПИД, переписав классический в дифференциальной форме.
Вот пример.
Извините, а не могли бы Вы пояснить по переменным Step и Stroke в блоке?

Yuran66
10.04.2016, 09:40
Добрый день! Сочинил надстройку для ПИДа для управления ИМ в импульсном режиме. Прошу дать замечания. Пытался получить воздействие, подобное алгоблоку РИМ Ремиконт Р-130. Почему то длительность импульсов в контроллере сильно отличается от длительности в симуляторе. ПИД использован из библиотеки Util.

Yuran66
20.04.2016, 21:07
Не дождался замечаний по предыдущему шедевру. Предлагаю вашему вниманию следующий Импульсный ПИД.

petera
20.04.2016, 22:38
Добрый день!
Сейчас использую PID_REG_CE (23_12_10) из одноименной библиотеки. Не устраивает сильнейшее перерегулирование при длительном выходе на уставку и длительный возврат при изменении знака рассогласования. Так же пробовал PID_PWM_CE (12_10_2012), но он не понятно работает с выходами. Словно пускает на выходы больше меньше не дискрет а последовательность импульсов.
Теперь хочу использовать что то из библиотек ОВЕНа, типа PID_Regulators, но у них выход аналоговый, отсюда и вопрос как преобразовать в импульсы заданной длительности, с периодом в зависимоти от "У".
Добавить из той же библиотеки VALVE_REG_NO_POS
24019

Yuran66
21.04.2016, 11:46
Добавить из той же библиотеки VALVE_REG_NO_POS
24019
Не, это все полумеры. Причем кривые. Начиная с того что библиотечный ПИД не имеет зоны нечувствительности по рассогласованию...

petera
21.04.2016, 12:25
Не, это все полумеры. Причем кривые. Начиная с того что библиотечный ПИД не имеет зоны нечувствительности по рассогласованию...
Не имеет зоны нечувствительности? Добавим http://www.owen.ru/forum/showthread.php?t=11443&p=158489&viewfull=1#post158489
Остальная кривизна в чем?
Скрин - фрагмент из реального проекта, это был регулятор уровня воды в барабане котла ДКВР. Работает по сей день и даже не подозревает о том, что он якобы "кривой".

Yuran66
21.04.2016, 14:10
Посмотрите вложение выше, я сделал именно на основе dz2. Дайте замечания.

Yuran66
21.04.2016, 19:55
Не имеет зоны нечувствительности? Добавим http://www.owen.ru/forum/showthread.php?t=11443&p=158489&viewfull=1#post158489
Остальная кривизна в чем?
Скрин - фрагмент из реального проекта, это был регулятор уровня воды в барабане котла ДКВР. Работает по сей день и даже не подозревает о том, что он якобы "кривой".
Да в том даже, что чтобы повторит Ваш скрин нужно подключить кучу разных библиотек, и ни в одной из них не обнаружить загадочного блока GEN_PULS. Но не в этом дело, а в том, что за столько лет в библиотеках не появилось классического импульсного ПИД регулятора, с заведомо правильной логикой работы непосредственно от разработчика.

petera
22.04.2016, 07:57
Да в том даже, что чтобы повторит Ваш скрин нужно подключить кучу разных библиотек, и ни в одной из них не обнаружить загадочного блока GEN_PULS. Но не в этом дело, а в том, что за столько лет в библиотеках не появилось классического импульсного ПИД регулятора, с заведомо правильной логикой работы непосредственно от разработчика.
GEN_PULSE - из библиотеки OSCAT
24049
Если лень подключать эту библиотеку, то вот код

FUNCTION_BLOCK GEN_PULSE
VAR_INPUT
ENQ : BOOL := TRUE;
PTH : TIME;
PTL : TIME;
END_VAR
VAR_OUTPUT
Q : BOOL;
END_VAR
VAR
tx: TIME;
tn: TIME;
init: BOOL;
END_VAR
IF enq THEN
tx := DWORD_TO_TIME(T_PLC_MS());
IF NOT init THEN init := TRUE; tn := tx; END_IF;
IF tx - tn >= SEL(Q, PTL, PTH) THEN
tn := tn + SEL(Q, PTL, PTH);
Q := NOT Q;
END_IF;
ELSE
Q := FALSE;
init := FALSE;
END_IF;

Артём Дмитриевич
25.04.2016, 22:08
Подскажите пожалуйста, какой блок ПИД-регулятора использовать для языка LD? Может нужно как то особенно блок вставлять? Ругается, что на вход идет BOOL, а не REAL, для LD это понятно...

Yuran66
29.04.2016, 10:28
Добрый день! Подскажите пожалуйста есть ли ошибки в подходу к построению импульсного ПИД в сообщении http://www.owen.ru/forum/showthread.php?t=11443&p=206540&viewfull=1#post206540 ? У меня основной вопрос по формированию 1 импульса. Как классически должна расчитываться его длительность?

Yuran66
03.05.2016, 19:42
Скрин - фрагмент из реального проекта, это был регулятор уровня воды в барабане котла ДКВР. Работает по сей день и даже не подозревает о том, что он якобы "кривой".
Вы меня конечно извините, но либо я чего то недопониманию, либо этот фрагмент никогда не был в реальном проекте...
Почему при нулевой ошибке на выходе VALVE_REG LESS единица, при этом на выходе фрагмента всегда ноль?

Пьер
23.05.2016, 08:40
GEN_PULSE - из библиотеки OSCAT
Если можно, объясните пожалуйста, для чего вы применили этот блок? (Логически) Спасибо!

Пьер
23.05.2016, 09:34
Хочу использовать "функциональный блок регулятора с АНР для трехпозиционного ИМ без
датчика положения (APID_VALVE)" из биб-ки PID_Reg2
Для поддержки т-ры.
24541
Есть пара вопросов:
1.
PV_0:REAL – начальное значение регулируемого параметра или значение параметра при
нулевой мощности управляющего сигнала. Это какое нужно установить значение?
2.
SYNC:BOOL – установка положения задвижки через вход PV. При установке значения True
положение задвижки (в диапазоне от 0 до 1) считывается из входа PV и сохраняется во
внутренней переменной ФБ. Это как? Можно на пальцах?

В данный момент использую ручное управление задвижкой без датчика положения - (VALVE_REG_NO_POS) из биб-ки PID_Regulators

3.
Возможна ли такая логика работы: Регулирование происходит APID_VALVE при нажатии "Ручное управление" управляю блоком VALVE_REG_NO_POS? В APID_VALVE нет времени реверса ИМ, как с этим быть?

petera
23.05.2016, 12:01
Если можно, объясните пожалуйста, для чего вы применили этот блок? (Логически) Спасибо!
Т.к. датчик положения регулирующего органа не предусмотрен, то для устранения рассогласования между реальным положением и виртуальным, сделал импульсы доводки, по аналогии с ТРМ-ами.
Для этого и нужен блок "GEN_PULSE".
Импульсы доводки формируются если на входе "VALVE_REG_NO_POS" значение равно "0" или "100".

Stalker46k
25.05.2016, 09:50
И снова здравствуйте.
Помогите пожалуйста разобраться с нелегким вопросом))
У меня имеется контроллер ПЛК150 с тремя подключенными датчиками температуры и 2 регулируемых клапана. Один датчик температуры наружного воздуха и два датчика теплоносителя, каждый на свой клапан.
Какой регулятор стоит выбрать? Какие значения мне нужно знать чтобы регулировать клапаны по 4-20? До этого работал только в языке LD и только с релейной логикой. Сильно не пинайте.
Заранее спасибо за советы.

Пьер
25.05.2016, 14:21
Импульсы доводки формируются если на входе "VALVE_REG_NO_POS" значение равно "0" или "100".
У пид регулятора есть выходной сигнал OUT: REAL; – выходной сигнал регулятора, от -100 до 100% относительной мощности;
Можно этот сигнал использовать на задвижку напрямую?
Как понять от -100 до 100% относительной мощности, никак не допрет, получается всего навсего преобразовать (- 100 +100) в (0 +100)?

Andrew_Stranger
25.05.2016, 23:06
В теории сигнал У ПИДа аналговый от: 1.175494351e-38 до 3.402823466e+38, но обычно такими значениями не разбрасываются и ограничивают сигнал сверху и снизу, то есть вы можете установить любое значение если используете PID из библиотеки util. Далее если у вас задвижка с дискретным управлением, вам надо аналог преобразовать в дискрету, пропустив сигнал через ШИМ. У меня почему-то проблемы были с блоком VALVE_NO_POS.

Пьер
26.05.2016, 08:20
В теории сигнал У ПИДа аналговый от: 1.175494351e-38 до 3.402823466e+38, но обычно такими значениями не разбрасываются и ограничивают сигнал сверху и снизу, то есть вы можете установить любое значение если используете PID из библиотеки util. Далее если у вас задвижка с дискретным управлением, вам надо аналог преобразовать в дискрету, пропустив сигнал через ШИМ. У меня почему-то проблемы были с блоком VALVE_NO_POS.

C управление задвижки блоком VALVE_REG_NO_POS проблем не было, сейчас проблеме с Пидом. Если все получится отпишусь.

Владислав Г.
02.06.2016, 13:55
Подскажите: PID_2POS сохраняет настройки ПИД-коэффициентов или при новом включении необходимо опять включать автонастройку? Сам блок очень понравился в работе (правда настольном), но вот на сколько будет удобно всякий раз автонастраивать - большой вопрос.

Пьер
06.06.2016, 10:45
Pid
Хочу спросить у Вас! У меня 3х поз. задвижка без д.д. Я настроил ее откр/закр. через блок VALVE_REG_NO_POS. Она у меня откр/закр от 0 до 100% как надо.
Теперь нужно настроить регулирование. Взял PID_3POS_IM_ANR + VALVE_REG_NO_POS. Регулирую температуру. При открытии темп.повышается, а при закрытии понижается, использую сигнал от 0 до +100 отрезая отрицательную часть. Короче говоря при завершении АНР начинаются колебания от 0 до 100, т.е. задвижка полностью закрывается и открывается. Устаканивания не происходит. Инертность около 2 минут.
1. Время хода задвижки в блоке PID_3POS_IM_ANR TVAL в секундах?
2. Может использовать "Холодильник"?
3.Из -за чего может быть такая болтанка?

capzap
06.06.2016, 13:17
я с этой бибкой не работаю, мне достаточно классического ПИД-а из степа или оскат, у меня используется оборудование аналоговое с регулированием от 0 до 100% без всяких 3-х позиционных или ШИМ-ов и т.п., для обратной зависимости достаточно пропорциональный задавать с минусом. По поводу колебаний это и должно быть при автонастройке и в это время вмешиваться в работу нельзя, как долго это будет происходить известно только самой программе

deniska13
08.06.2016, 16:09
Добрый день, уважаемые форумчане.
Много было тем про регуляторы и управление электроприводами клапанов по сигналу "Больше", "Стоп" и "Меньше", но к моему большому сожалению ни один из них не оправдал моих ожиданий и работали они не очень корректно, возможно потому, что применялись не на контроллерах ОВЕН а на контроллерах BECKHOFF, вот и пришлось мне написать небольшую программку "прокладку", как тут все называют для PID регулятора из библиотеки UTIL. Буду рад комментариям и замечаниям. Не получилось у меня отредактировать код, так чтобы он был наглядным, поэтому приложил файл с программой.

FUNCTION_BLOCK VALVE_3_POS
VAR
RANGE: REAL; (*ДИАПАЗОН ПИД РЕГУЛЯТОРА*)
PERIOD: TIME; (*ПЕРИОД ИМПУЛЬСОВ*)
TIME_PULSE: TIME; (*ВРЕМЯ ИМПУЛЬСА*)
TIME_PULSE_R: REAL;
TIME_PAUSE: TIME; (*ВРЕМЯ ПАУЗЫ*)
TIME_PAUSE_R: REAL;
TMR_MAX_HIGHT: TP; (*ТАЙМЕР ВЫДАЧИ ИМПУЛЬСА ПРИ ПИД > 0*)
TMR_MIN_HIGHT: TP; (*ТАЙМЕР ВЫДАЧИ ИМПУЛЬСА ПРИ ПИД < 0*)
TMR_MAX_LOW: TP; (*ТАЙМЕР ВЫДАЧИ ПАУЗЫ ИМПУЛЬСА ПРИ ПИД > 0*)
TMR_MIN_LOW: TP; (*ТАЙМЕР ВЫДАЧИ ПАУЗЫ ИМПУЛЬСА ПРИ ПИД < 0*)
PERIOD_R: REAL;
MIN_TIME_PULSE_R: REAL;
MIN_TIME_PULSE:TIME; (*МИНИМАЛЬНОЕ ВРЕМЯ ИМПУЛЬСА*)
F_TRIG_MAX:F_TRIG; (*ТРИГГЕР ЗАПУСКА ТАЙМЕРА ПАУЗЫ ПРИ ПИД > 0*)
F_TRIG_MIN:F_TRIG; (*ТРИГГЕР ЗАПУСКА ТАЙМЕРА ПАУЗЫ ПРИ ПИД < 0*)
END_VAR

VAR_INPUT
IN_VAL: REAL; (*ВЫХОД ПИД*)
IN_VAL_MIN: REAL := -100; (*МИНИМАЛЬНОЕ ЗНАЧЕНИЕ ПИД НА ВЫХОДЕ ЛУЧШЕ ЗАДАТЬ -15*)
IN_VAL_MAX: REAL := 100; (*МАКСИМАЛЬНОЕ ЗНАЧЕНИЕ ПИД НА ВЫХОДЕ ЛУЧШЕ ЗАДАТЬ 15*)
FULL_MOTION_TIME: REAL := 120; (*ВРЕМЯ ХОДА ПРИВОДА ПРИМЕР: 120*)
DEAD_ZONE: REAL := 0.1; (*ЗОНА НЕЧУВСТВИТЕЛЬНОСТИ ПРИМЕР: 0.1*)
AUTO: BOOL := TRUE; (*АВТОМАТИЧЕСКИЙ РЕЖИМ РАБОТЫ ЕСЛИ TRUE и РУЧНОЙ РЕЖИМ РАБОТЫ ЕСЛИ FALSE*)
OPENED: BOOL := FALSE; (*ОТКРЫТИЕ*)
CLOSED: BOOL := FALSE; (*ЗАКРЫТИЕ*)
END_VAR

VAR_OUTPUT
MORE: BOOL; (*БОЛЬШЕ*)
LESS: BOOL; (*МЕНЬШЕ*)
END_VAR


(*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\НАЧ АЛО\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*)
(*АВТОМАТИЧЕСКИЙ РЕЖИМ РАБОТЫ*)
IF AUTO THEN
RANGE := IN_VAL_MAX - IN_VAL_MIN; (*ОТПРЕДЕЛЕНИЕ ДИАПАЗОНА*)
MIN_TIME_PULSE_R := ( FULL_MOTION_TIME * 0.005 )*1000; (*ОПРЕДЕЛЕНИЕ МИНИМАЛЬНОЙ ДЛИТ. ИМПУЛЬСА*)
MIN_TIME_PULSE := REAL_TO_TIME( MIN_TIME_PULSE_R ); (*ПРЕОБРАЗОВАНИЕ ТИПОВ*)
PERIOD_R := ( FULL_MOTION_TIME / 20 ); (*ОПРЕДЕЛЕНИЕ ПЕРИОДА ИМПУЛЬСОВ*)
PERIOD := REAL_TO_TIME( PERIOD_R ) * 1000; (*ПРЕОБРАЗОВАНИЕ ТИПОВ*)

(*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*)
(*ВЫДАЧА ИМПУЛЬСА ПРИ ПОЛОЖИТЕЛЬНОМ ЗНАЧЕНИИ НА ВЫХОДЕ ПИД*)
IF (IN_VAL_MIN <0 AND IN_VAL_MAX >0) AND IN_VAL > (0 + DEAD_ZONE) THEN
LESS := FALSE; (*ОБНУЛЕНИЕ СИГНАЛА "МЕНЬШЕ" ЕСЛИ ОСТАЛСЯ АКТИВИРОВАНЫМ*)
TMR_MIN_LOW (IN:= FALSE, PT := TIME_PAUSE); (*ОБНУЛЕНИЕ ТАЙМЕРА ПАУЗЫ*)
TIME_PULSE_R := ( ( IN_VAL * PERIOD_R) / (RANGE / 2) )* 1000; (*РАСЧЕТ ТЕК ВРЕМЕНИ ИМПУЛЬСА*)
TIME_PAUSE_R := (PERIOD_R*1000 - TIME_PULSE_R); (*РАСЧЕТ ТЕКУЩЕГО ВРЕМЕНИ ПАУЗЫ*)
TIME_PULSE := REAL_TO_TIME ( TIME_PULSE_R );
TIME_PAUSE := REAL_TO_TIME ( TIME_PAUSE_R );
IF TIME_PULSE > MIN_TIME_PULSE THEN (*СРАВНЕНЕНИЕ МИН ВРЕМЕНИ ИМПУЛЬСА И РАСЧ ТЕКУЩЕГО*)
TMR_MAX_HIGHT (IN:= TRUE AND NOT TMR_MAX_LOW.Q, PT := TIME_PULSE); (*ЗАПУСК ТАЙМЕРА*)
END_IF
F_TRIG_MAX (CLK := TMR_MAX_HIGHT.Q); (*ТРИГГЕР ЗАУСКА ТАЙМЕРА ПАУЗЫ ПРИ*)
TMR_MAX_LOW (IN:= F_TRIG_MAX.Q, PT := TIME_PAUSE); (*ЗАПУСК ТАЙМЕРА ПАУЗЫ*)
END_IF
(*ОБНУЛЕНИЕ ТАЙМЕРА ВЫДАЮЩЕГО ИМПУЛЬСЫ ПОКА РАБОТАЕТ ТАЙМЕР ПАУЗЫ*)
IF TMR_MAX_LOW.Q OR (TIME_PULSE < MIN_TIME_PULSE) THEN
TMR_MAX_HIGHT (IN:= FALSE, PT := TIME_PULSE);
END_IF
(*АКТИВАЦИЯ ВЫХОДА РЕГУЛЯТОРА "БОЛЬШЕ" ПОКА РАБОТАЕТ ТАЙМЕР ИМПУЛЬСА И РАСЧЕТНЫМ ВРЕМЕНЕМ*)
IF (TMR_MAX_HIGHT.Q OR IN_VAL = IN_VAL_MAX) AND NOT LESS THEN
MORE := TRUE; (*АКТИВАЦИЯ "БОЛЬШЕ"*)
ELSE
MORE := FALSE; (*ИНАЧЕ ДЕАКТИВАЦИЯ "БОЛЬШЕ"*)
END_IF
(*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*)

(*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\*)
(*ВЫДАЧА ИМПУЛЬСА ПРИ ОТРИЦАТЕЛЬНОМ ЗНАЧЕНИИ НА ВЫХОДЕ ПИД*)
IF (IN_VAL_MIN <0 AND IN_VAL_MAX >0) AND IN_VAL < (0 - DEAD_ZONE) THEN
MORE := FALSE; (*ОБНУЛЕНИЕ СИГНАЛА "БОЛЬШЕ" ЕСЛИ ОСТАЛСЯ АКТИВИРОВАННЫМ*)
TMR_MAX_LOW (IN:= FALSE, PT := TIME_PAUSE); (*ОБНУЛЕНИЕ ТАЙМЕРА ПАУЗЫ*)
TIME_PULSE_R := ( ( IN_VAL * PERIOD_R *(-1) ) / ( RANGE / 2) ) * 1000; (*РАСЧЕТ ВРЕМЕНИ ИМПУЛЬСА*)
TIME_PAUSE_R := (PERIOD_R*1000 - TIME_PULSE_R); (*РАСЧЕТ ТЕКУЩЕГО ВРЕМЕНИ ПАУЗЫ*)
TIME_PULSE := REAL_TO_TIME ( TIME_PULSE_R );
TIME_PAUSE := REAL_TO_TIME ( TIME_PAUSE_R );
IF TIME_PULSE > MIN_TIME_PULSE THEN (*СРАВНЕНЕНИЕ МИН ВР ИМПУЛЬСА И РАСЧЕТНОГО ТЕКУЩЕГО*)
TMR_MIN_HIGHT (IN:= TRUE AND NOT TMR_MIN_LOW.Q, PT := TIME_PULSE); (*ЗАПУСК ТАЙМЕРА*)
END_IF
F_TRIG_MIN (CLK := TMR_MIN_HIGHT.Q); (*ТРИГГЕР ЗАУСКА ТАЙМЕРА ПАУЗЫ ПРИ*)
TMR_MIN_LOW (IN:= F_TRIG_MIN.Q, PT := TIME_PAUSE); (*ЗАПУСК ТАЙМЕРА ПАУЗЫ ИМПУЛЬСА*)
END_IF
(*ОБНУЛЕНИЕ ТАЙМЕРА ВЫДАЮЩЕГО ИМПУЛЬСЫ ПОКА РАБОТАЕТ ТАЙМЕР ПАУЗЫ*)
IF TMR_MIN_LOW.Q OR (TIME_PULSE < MIN_TIME_PULSE) THEN
TMR_MIN_HIGHT (IN:= FALSE, PT := TIME_PULSE);
END_IF
(*АКТИВАЦИЯ ВЫХОДА РЕГУЛЯТОРА "МЕНЬШЕ" ПОКА РАБОТАЕТ ТАЙМЕР ИМПУЛЬСА И РАСЧЕТНЫМ ВРЕМЕНЕМ*)
IF (TMR_MIN_HIGHT.Q OR IN_VAL = IN_VAL_MIN) AND NOT MORE THEN
LESS := TRUE; (*АКТИВАЦИЯ "МЕНЬШЕ"*)
ELSE
LESS := FALSE; (*ИНАЧЕ ДЕАКТИВАЦИЯ "МЕНЬШЕ"*)
END_IF
END_IF
(*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\*)

(*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\*)
(*РУЧНОЙ РЕЖИМ РАБОТЫ*)
IF NOT AUTO THEN
IF OPENED AND NOT LESS THEN (*ЕСЛИ АВТИВИРОВАН ВХОД "OPENED" и НЕ АКТИВНО "МЕНЬШЕ"*)
MORE := TRUE; (*АКТИВАЦИЯ "БОЛЬШЕ"*)
ELSE
MORE := FALSE; (*ИНАЧЕ ДЕАКТИВАЦИЯ "БОЛЬШЕ"*)
END_IF
IF CLOSED AND NOT MORE THEN (*ЕСЛИ АВТИВИРОВАН ВХОД "CLOSED" и НЕ АКТИВНО "БОЛЬШЕ"*)
LESS := TRUE; (*АКТИВАЦИЯ "МЕНЬШЕ"*)
ELSE
LESS := FALSE; (*ИНАЧЕ ДЕАКТИВАЦИЯ "МЕНЬШЕ"*)
END_IF
END_IF
(*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\\\*)
(*\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\К ОНЕЦ\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \\\\\\\\\\\\\\\\*)

Эдуард_Н
08.06.2016, 16:15
А не проще выложить сразу файлом?

deniska13
08.06.2016, 16:19
А не проще выложить сразу файлом?
файл вложил)

deniska13
08.06.2016, 16:46
Выкладываю вполне вменяемый регулятор. Испытан на практике на таких параметрах как: разрежение в топке котла, уровень в барабане котла, соотношение топливо-воздух, нагрузка.
Работает хорошо и предсказуемо.
Сколько не пытался использовать Ваш регулятор, так ничего и не заработало нормально, очень большие колебания....тестировал на ПЛК BECKHOFF...
не понятно откуда брать значение времени цикла программы и для чего оно там нужно?....

Yuran66
08.06.2016, 18:03
Сколько не пытался использовать Ваш регулятор, так ничего и не заработало нормально, очень большие колебания....тестировал на ПЛК BECKHOFF...
не понятно откуда брать значение времени цикла программы и для чего оно там нужно?....
Попробуйте пожалуйста мой, очень нужно услышать замечания предложения.

deniska13
08.06.2016, 18:46
Выкладываю ФБ в собранном виде, кому лень. ФБ с комментариями, но если что-то будет не понятно, спрашивайте..
На вход ФБ IN_VAL нужно подключить выход ФБ PID из библиотеки UTIL, на ФБ PID входы Y_MIN должен быть равен входу ФБ VALVE_3_POS IN_VAL_MIN, а Y_MAX должен быть равен IN_VAL_MAX. Вроде все, остальное должно быть понятно.

Newcomer
08.06.2016, 18:50
Что-то жутко большой размер кода для такой задачи.

deniska13
08.06.2016, 18:56
Что-то жутко большой размер кода для такой задачи.
Если у Вас есть решение этой задачи рабочее и у которой объем кода меньше буду рад увидеть его)

capzap
08.06.2016, 19:32
ну как вариант LESS := CLOSED AND NOT MORE;

deniska13
08.06.2016, 19:44
ну как вариант LESS := CLOSED AND NOT MORE;

Спасибо, за такой прием, буду применять в дальнейшем. Но сейчас суть не в красоте и компактности кода, а в его работоспособности.
Может Вы можете протестировать мой ФБ и указать на ошибки, если они есть.

capzap
08.06.2016, 19:49
я не работаю с трехпозиционными клапанами, не знаю как должно быть

deniska13
08.06.2016, 19:50
я не работаю с трехпозиционными клапанами, не знаю как должно быть

Очень жаль)...тогда может еще какие-нибудь приемы по написанию компактного кода посоветуете?)

ASo
08.06.2016, 19:53
Я один понимаю, почему классический ПИД нельзя использовать с 3-х позиционными регуляторами???

deniska13
08.06.2016, 19:56
Я один понимаю, почему классический ПИД нельзя использовать с 3-х позиционными регуляторами???
Об этом уже говорилось на форуме и конечно правильно использовать ПДД, но сейчас у меня остро стоит задача, нужно управлять 3-х позиционным электроприводом клапана, нужно сделать чтобы работало) а уж качество на втором месте...в России все так живут не знали?)

deniska13
08.06.2016, 20:07
Я один понимаю, почему классический ПИД нельзя использовать с 3-х позиционными регуляторами???

Может у Вас есть решение о котором говорите?)

ASo
08.06.2016, 20:09
Бибку я уже выкладывал. Повторяю.

deniska13
08.06.2016, 20:19
Бибку я уже выкладывал. Повторяю.

Спасибо, посмотрю как работает Ваше решение=)

deniska13
08.06.2016, 20:22
Бибку я уже выкладывал. Повторяю.
Можете прокомментировать то что подавать на входы?

ASo
08.06.2016, 20:28
X - измеряемая величина
XS - уставка
К, Т - пропорциональный и интегральный коэффициенты ПИ регулятора (диф составляющая в POU отсутствует)
Step - время цикла пересчета регулятора
MinPulse - минимальное время импульса на привод. При меньшем вычисленном в цикле времени происходит суммирование с предыдущем накоплением и запоминание суммы.
Stroke - время полного хода привода
Low, Hight - ручное управление выходами.

deniska13
08.06.2016, 20:56
X - измеряемая величина
XS - уставка
К, Т - пропорциональный и интегральный коэффициенты ПИ регулятора (диф составляющая в POU отсутствует)
Step - время цикла пересчета регулятора
MinPulse - минимальное время импульса на привод. При меньшем вычисленном в цикле времени происходит суммирование с предыдущем накоплением и запоминание суммы.
Stroke - время полного хода привода
Low, Hight - ручное управление выходами.

Получается, что и у Вас присутствует интегральная составляющая...

ASo
08.06.2016, 21:06
Вы исходный код просмотрите, он открытый.
Грубо, произведен перевод обычного ПИД (ПИ) регулятора в дифференциальную форму dt (с) = (dY(%)/100%) * Stroke (с)
Поэтому указанные П и И коэффициенты "классического" ПИДа пересчитываются. Так удобнее.

deniska13
08.06.2016, 21:11
Вы исходный код просмотрите, он открытый.
Грубо, произведен перевод обычного ПИД (ПИ) регулятора в дифференциальную форму dt (с) = (dY(%)/100%) * Stroke (с)
Поэтому указанные П и И коэффициенты "классического" ПИДа пересчитываются. Так удобнее.

Ясно, ладно буду разбираться в Вашем коде, хотя просмотрев его пока сложно уловить суть..)
У Вас нет такого же блока, но только с комментариями?)

MikeF
09.06.2016, 04:06
Время цикла берут либо с аналогового модуля либо создают самостоятельно.

Эдуард_Н
09.06.2016, 13:58
Уважаемый deniska13 какие параметры Вы устанавливали в PID регуляторе из библиотеки UTIL ?

Эдуард_Н
09.06.2016, 13:59
Бибку я уже выкладывал. Повторяю.

Какие параметры Вы ставили в своём ФБ?

ASo
09.06.2016, 14:29
В смысле? Для какой системы?

Эдуард_Н
09.06.2016, 14:37
В смысле? Для какой системы?

Ну допустим для управления трёхходовым в ГВС, в ФБ "PIDP".

ASo
09.06.2016, 16:45
К= 0,05..0,1, T=50..100..150.
Step=T#1s
MinPulse=T#300ms

Эдуард_Н
09.06.2016, 17:22
К= 0,05..0,1, T=50..100..150.
Step=T#1s
MinPulse=T#300ms

Чего-то с этими параметрами (правда в эмуляции) не шевелится совсем:(.

deniska13
09.06.2016, 18:02
Уважаемый deniska13 какие параметры Вы устанавливали в PID регуляторе из библиотеки UTIL ?

Y_MIN -100
Y_MAX 100
Коэффициент усиления 5
Интегральная составляющая 25
Дифф. составляющая 0

Остальные входы не имеют значения

deniska13
09.06.2016, 18:07
К= 0,05..0,1, T=50..100..150.
Step=T#1s
MinPulse=T#300ms

Применил Ваш регулятор на реальном объекте для регулирования ГВС.
К = 5
Т = 50
Время хода привода = 120с
MinPulse = 500мс
Регулятор не выдаёт импульсов с разной длительностью, а просто замыкает либо "больше" либо "меньше", "стоп" не увидел. Возможно я что-то не так настроил, подскажите в чем может быть ошибка.

ASo
09.06.2016, 18:09
Поставьте К=0,05. 5 - это слишком много.
Блок работает, используется именно в ИТП.