PDA

Просмотр полной версии : ПЛК110 с ПИД-регулятором из Utils.lib



dzukp
19.11.2018, 11:23
Доброго дня, проблема в следующем.

Использую ПЛК100 [м2]. Добавил в программу ПИД из utils.lib. При запуске программы работает, начинаю его настраивать и через какое-то время значение выхода (Y) перестает меняться. Устанавливаю reset=TRUE, manual = TRUE, y_manual=0, меняю уставку, меняю пропорциональный и интегральный коэффициент - безрезультатно. Как на выходе висело какое-то значение (например -10.651), так и продолжает. При этом выход OVERFLOW = FALSE.

Мельком пробежал по форуму, вроде не я один жалуюсь на ПИД. Так что использовать? Другой ПИД из oscat или от Овен Pid_reg2 или Pid_regulators?

Crusash
19.11.2018, 12:42
....
Мельком пробежал по форуму, вроде не я один жалуюсь на ПИД. Так что использовать? Другой ПИД из oscat или от Овен Pid_reg2 или Pid_regulators?

Желательно научится использовать стандартный ПИД из utils.lib, он самый простой из всех имеющихся, а уже потом пробовать другие регуляторы..

SBeaR
19.11.2018, 13:23
Попробуйте этот:
http://www.owen.ru/forum/showthread.php?t=11443&p=291549&viewfull=1#post291549
В той же теме двумя сообщениями раньше (сообщение 317), есть архив в котором находится описание данного ПИД-регулятора на русском.
Только имейте в виду, что использовать его необходимо в циклической задаче.

PS. А вообще убедитесь, что Y Max>Y Min. Условие должно выполнятся строго. Равенство тоже не допускается, иначе ютиловский ПИД начинает выдавать произвольные значения и вроде бы не обрабатывает переполнение.

dzukp
19.11.2018, 15:45
Желательно научится использовать стандартный ПИД из utils.lib, он самый простой из всех имеющихся, а уже потом пробовать другие регуляторы..

Я бы рад использовать utils.lib, но по каким-то причинам он перестает работать через какое-то время. Я предположил, может это особенность реализации ПИД-регулятора на ПЛК110, что он не работает.

Если дело в том что я неправильно использую, то что я могу делать не так? Параметры К=0.1, И=1, Д=0, мин=-100, макс=100. Вызывается каждый цикл. Что еще не так? Он должен хоть как-то работать. В начале он регулирует, а через несколько минут виснит. При reset=TRUE, manual = TRUE, y_manual=0 на выходе 0 не появляется.

Crusash
19.11.2018, 17:55
Я бы рад использовать utils.lib, но по каким-то причинам он перестает работать через какое-то время. Я предположил, может это особенность реализации ПИД-регулятора на ПЛК110, что он не работает.

Если дело в том что я неправильно использую, то что я могу делать не так? Параметры К=0.1, И=1, Д=0, мин=-100, макс=100. Вызывается каждый цикл. Что еще не так? Он должен хоть как-то работать. В начале он регулирует, а через несколько минут виснит. При reset=TRUE, manual = TRUE, y_manual=0 на выходе 0 не появляется.

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


Pid(ACTUAL:=tek_t, set_point:=ust_t, KP:=k_P, TN:=k_I, TV:=k_D,
Y_manual:=0, Y_offset:=0, Y_MIN:=0, Y_MAX:=1000,Manual:=False, RESET:=FALSE);

IVM
19.11.2018, 19:01
Я бы рад использовать utils.lib, но по каким-то причинам он перестает работать через какое-то время. Я предположил, может это особенность реализации ПИД-регулятора на ПЛК110, что он не работает.

Если дело в том что я неправильно использую, то что я могу делать не так? Параметры К=0.1, И=1, Д=0, мин=-100, макс=100. Вызывается каждый цикл. Что еще не так? Он должен хоть как-то работать. В начале он регулирует, а через несколько минут виснит. При reset=TRUE, manual = TRUE, y_manual=0 на выходе 0 не появляется.

И (Tn) = 1 не верно. Tn должно быть многие тысячи.

dzukp
20.11.2018, 01:39
И (Tn) = 1 не верно. Tn должно быть многие тысячи.

Tn это время интегрирования? Согласен должно быть побольше.

Но моя проблема не в том, что неправильно регулирует, а в том, что регулятор в какой-то момент перестает менять значение своего выхода (Y), как будто перестает вызываться. Причем значение выхода остается в каком-то промежуточном положении ни максимум, ни минимум, ни y_manual, ни y_offset.


это самый простой ПИД, железобетонный, там ломаться нечему

Я так и предполагаю, что я что-то не так делаю, но не могу понять что.


И вызывать каждый цикл не надо

А как же его вызывать? С чем связано, что не каждый цикл? Хотя в моем конкретном случае действительно не надо. Вы утверждаете, что в любом случае нужно вызывать с каким-то периодом отличным от времени цикла?

Sergey666
20.11.2018, 12:26
Доброго дня, проблема в следующем.

Использую ПЛК100 [м2]. Добавил в программу ПИД из utils.lib. При запуске программы работает, начинаю его настраивать и через какое-то время значение выхода (Y) перестает меняться. Устанавливаю reset=TRUE, manual = TRUE, y_manual=0, меняю уставку, меняю пропорциональный и интегральный коэффициент - безрезультатно. Как на выходе висело какое-то значение (например -10.651), так и продолжает. При этом выход OVERFLOW = FALSE.
Мельком пробежал по форуму, вроде не я один жалуюсь на ПИД. Так что использовать? Другой ПИД из oscat или от Овен Pid_reg2 или Pid_regulators?

Вы что делаете??? Вы одновременно выполняете сброс регулятора и перевод в ручной режим(reset=TRUE, manual = TRUE) и что желаете получить???
Описаловку читайте!

dzukp
20.11.2018, 13:49
Вы что делаете??? Вы одновременно выполняете сброс регулятора и перевод в ручной режим(reset=TRUE, manual = TRUE) и что желаете получить???
Описаловку читайте!

"Устанавливаю reset=TRUE, manual = TRUE, y_manual=0, меняю уставку, меняю пропорциональный и интегральный коэффициент" это все не одновременно, а по очереди. Пробовал менять коэффициенты - не помогло. Пробовал reset=true - не помогло. Пробовал manual=True - не помогло.

Но как я понял из описаловки даже если одновременно reset=TRUE, manual = TRUE, y_manual = 0, y_offset = 0 на выходе должен быть 0. Эксперемент не могу пока провести.

На данный момент регулятор ведет себя нормально, повторить ситуацию получалось только если TN=0. Тоже, кстати, момент неудобный, если я захочу отказаться от интегральной составляющей что делать? TN=9999999999999 так, но это не очень удобно? Да, можно использовать функциональный блок PD, но это не гибко.

dzukp
21.11.2018, 14:35
Проблема больше не повторяется. Возможно из-за того, что проект заново перекомпилировал.
Резюме: ПИД из util.lib работает железобетонно, неопределенная ситуация возникает, когда TN=0.

Crusash
21.11.2018, 18:04
Проблема больше не повторяется. Возможно из-за того, что проект заново перекомпилировал.
Резюме: ПИД из util.lib работает железобетонно, неопределенная ситуация возникает, когда TN=0.

Железобетонно - так то так, но и о проверке переполнения не забывайте, и если что перегружайте...

Crusash
21.11.2018, 19:18
А переполнения тупо не будет никогда коли заданы min/max_y

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

dzukp
22.11.2018, 00:58
К вопросу о переполнении сделал так:
regulator.RESET:=regulator.OVERFLOW




Т.к. получение actual это не непрерывная функция, а набор точек, то вызов пида реально нужен только в момент обновления данных.

Да, но определить когда изменились данные не всегда возможно. Точнее что они изменились можно понять, а вот что они реально не меняются не всегда.


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

Sergey666
22.11.2018, 23:32
Что значит:-"Работает железобетонно"???
Вы вообще ту сферу работы выбрали?
Ничто не препятствует вызову ФБ ПИД регулятора в каждом цикле,не делайте мозги.
Так есть пара нюансов и никто их не упомянул ни разу:
1. По факту регулятор только "Нагреватель", для реализации "Холодильника" надо "разворачивать" выход.
2. Отсутствие "мертвой зоны" т.е области нечуствительности к отклонению SV-PV в определенном диапазоне.
А вообще нормальный регулятор, я для себя доработал исходник:- добавил "Мертвую зону" .
З.Ы А с Tn=0 некоторые ПИД регуляторы вообще не работают, этот в их числе.
И вообще 99.5% вопросов на этом форуме решаются элементарным прочтением технических описаний(это документация такая:))...

SBeaR
23.11.2018, 04:17
1. По факту регулятор только "Нагреватель", для реализации "Холодильника" надо "разворачивать" выход.

Что значит "разворачивать выход"? В нормальных ПИД-регуляторах для реализации холодильника достаточно сделать отрицательным коэффициент усиления. Я сомневаюсь, что в данном регуляторе это делается как-то по другому.

dzukp
23.11.2018, 11:53
А вообще нормальный регулятор, я для себя доработал исходник:- добавил "Мертвую зону"

На утиловском ПИД-регуляторе мертвая зона реализуется примерно так:

pid.SP:=SEL(ABS(task - temperature) < deadband, task, temperature)

Или у вас есть более правильная реализация?


З.Ы А с Tn=0 некоторые ПИД регуляторы вообще не работают, этот в их числе.

Ну а как же ПД-регулятор? Если бы данный утиловский регулятор при Tn=0 становился ПД-регулятором можно было б изменением коэффициента менять тип регулятора. И по одной из теорий настройки ПИД, первым пунктом идет настройка только пропорциональной составляющей, а затем уже дифференциальной и интегральной. А здесь получается нужно изначально какую-то интегральную составляющую вводить. И не всегда есть возможность передать очень большое число (например при передаче коэффициентов через модбас в виде целого 2-х байтового).

SBeaR
23.11.2018, 15:16
А на кой она вообще нужна регулятору ? Проблемы с регулятором или с исполнительным механизмом ?
Задачи бывают разные. Как вариант: автомат розлива газ. напитков, который должен поддерживать давление СО2 в накопительной емкости. Делается это двумя клапанами: клапан подачи углекислоты и клапан сброса. Оба работают по ПИД-закону, для поддержания давления в допустимой зоне. Они оба используют "мертвую зону", один сверху, чтобы при превышении сбросить излишки, другой снизу, чтобы при снижении добавить углекислоты. Стабильно держать на одном уровне не реально: идет розлив - давление падает, в емкость набирается напиток - давление растет и излишки сбрасываются. Если убрать мертвую зону, то растет расход углекислоты, как ни настраивай ПИД. По аналогичному принципу работает газирование продукта с сатураторах. Думаю в других сферах тоже присутствуют аналогичные задачи, где не нужно "держать" регулируемую величину с нулевой точностью.

SBeaR
23.11.2018, 17:53
Ну так пид-регулятору то эта зона зачем ?
И тем не менее все нормальные промышленные пид-регуляторы данный функционал имеют. В том числе и ТРМ101. Так почему бы не иметь данный функционал в библиотечной функции, вместо того, чтобы выдумывать как бы это реализовать самому, даже если это не особо сложно?

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

ASo
23.11.2018, 18:24
Так введите ФБ зоны нечуствительности перед ПИДом. Это стандартный программистский подход.

dzukp
23.11.2018, 23:25
Кстати, его каждый цикл вызываете ?

Лично я всегда ПИД (ПД, ПИ) вызываю каждый цикл, хотя может это и не правильно.



Всегда есть возможность. Кто запрещает передать REAL16 ? Или ввести соглашение о, например, $FFFF - это есть 1eДОХРЕНА ?


В Кодесис вроде нет REAL16. Конечно можно функцию сделать, которая будет переводить real32 в real16 с потерей точности, потом передовать это в модбас. Но далеко не все клиенты могут работать с real16. Я real16 вообще никогда не встречал.
Если позволите позанудствовать, то FFFF это не дохрена, а -1. А так да, соглашение можно.
Все это конечно можно и в каких то ситуациях приемлемое решение, но это лишняя писанина не только на стороне ПЛК, но и на стороне модбас-клиента.
И это всё, чтобы временно отключить И-составляющую регулятора.

Я решил на всякий случай сделать так, а то кто-нибудь установит TN=0 и всё, приплыли:

IF rPidI = 0 THEN
regulator.TN := 9999999999999999999.0;
ELSE
regulator.TN := rPidI;
END_IF

К слову о мертвой зоне.
Мой многострадальный регулятор управляет скоростью открытия/закрытия задвижки ШИМ-ом. И в пределах мертвой зоны лишний раз не хочется задижку дергать, что бы не расходовать ресурс задвижки и реле (оно там не твердотельное, но это к теме не относится).

SBeaR
24.11.2018, 08:52
Думаете я с луны свалился и не было подобных задач ? Я такие штуки обычно решаю по превышению разницы между текущим заданием для исполнителя и выходом пида. Типа :
if abs(pid.y - y) >= чегототам then
y := pid.y;
end_if
(дальше аналог или шим - не имеет значения). Мертвая зона вне пида.

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


А мы сейчас обсуждаем специализированный регулятор для углекислоты или пид который уже модифицирован для реальной работы, но сохранил максимальную абстрактность ?

А при чем здесь специализированный регулятор? Вы просили зачем нужна мертвая зона, я привел вам пример задачи в которой данная зона нужна. Товарищ dzukp привел вам другой пример. Это реальность, а не абстрактная математика.
И да, регулятор в примере с углекислотой не является специализированным. Такой же стандартный библиотечный ПИД, как и обсуждаемый здесь, но предназначен для работы с другими ПЛК.

ASo
24.11.2018, 10:44
Повторяю - поставьте перед входом измеряемой величины в ФБ ПИД ФБ Мертвая зона - это стандартный программистский подход.
И если у Вас привод с 3-х позиционным управлением - не используйте ФБ PID из util.lib с переходником по выходу - это не правильно.

SBeaR
24.11.2018, 11:58
Пример задачи где мертвая зона не нужна - любая из ОВиК с аналоговым приводом на выходе.

Для этого достаточно сделать мертвую зону нулевой.


Есть задачи где пиду вход или выход нужно возводить в квадрат. Давайте пиду и это имплантируем. Вы можете убедительно доказать что мой квадрат мне менее нужен чем Вам ваша мертвая зона ?
А еще у пида мне нужен выход отвечающий за запуск цирк.насоса и выход на открытие привода воздушной заслонки.

Вы уже начинаете передергивать.


))))) Это ведь ни разу не огрубление, да ?

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


И покажите хоть одного технолога, который на вопрос - "А хотите отклонение 0.0000 ? " ответит : "Нет-нет, мне 0.0000 не нужно, мне нужно +-XXXX"

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


И Вы ошибаетесь - это не мертвая зона и это не огрубление результата работы ПИД. Это вариант решения проблем исполнительного механизма. Не ? Вышеописываемая проблема решена ?
Вот Вам ваша мертвая зона зачем ? "Шоб було" ?

Тогда если исходить из вашей логике, то библиотечному ПИД не нужны Y_OFFSET, Ymax и Ymin. А уж Manual вообще нужно реализовывать отдельно, запчем они вообще нужны абстрактному ПИДу.


Нет. Это регулятор который еще дальше ушел от местного ПИДа - т.е. стал более специализированный. И у которого входных палок еще больше.

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

ASo
24.11.2018, 12:30
Вы откройте библиотечный ФБ и Вам будет понятно, зачем нужны offset и manual.

SBeaR
24.11.2018, 13:29
Вы откройте библиотечный ФБ и Вам будет понятно, зачем нужны offset и manual.
Я знаю зачем они нужны. Но "стандартный программистский подход" требует от вас реализовать данный функционал самостоятельно вне библиотечной функции ПИД. Чем они лучше "мертвой зоны"?

ASo
24.11.2018, 13:46
Тем, что вне блока их реализовать невозможно.

SBeaR
24.11.2018, 15:00
Не более чем. Вы привели пример - я привел пример. Вы хотите внедрить в стандарт свое - я хочу внедрить в стандарт свое. Ваше лучше моего ?
Еще раз - есть задачи где пиду вход или выход нужно возводить в степень (например квадрат).
"Для этого достаточно сделать мертвую зону нулевой" == "Для вашего случая достаточно сделать степень на входе и выходе = 1"

Я без проблем с вами соглашусь, как только вы мне продемонстрируете промышленный ПИД-регулятор (хоть в виде прибора, хоть в виде библиотеки), в котором нет мертвой зоны, но есть возведение входа и выхода в степень.



Нет. Потому что не лучше, а невозможно и/или дорого, т.е. вынужденные допустимые отклонения. Не надо выдавать вынужденность за правило.

Эта вынужденность есть правило практически для всех промышленных систем и регуляторов и не важно как это называется: мертвая зона, зона нечувствительности, дельта, гистерезис. Эти понятия есть и используются в реальности постоянно.



Нет. Это именно ИХ стандартный регулятор. Их стандарт. С какого чей-то там стандарт должен быть стандартом здесь ?

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



Этим просто убили. Ничего что здесь тоже Плк ?
Что вас смущает? Погуглите "Modular PID Control"

Пакет Modular PID Control используется в тех случаях, когда стандартные ПИД регуляторы не позволяют решить поставленные задачи автоматического регулирования. На основе стандартных функциональных блоков, входящих в состав пакета, могут создаваться любые структуры систем автоматического регулирования.

ASo
24.11.2018, 15:10
Почему это ? (я про маnual и offset) //ушел смотреть
Потому, что не всегда надо начинать регулирование с 0.
Мануал используется для "подхвата" с предыдущего этапа регулирования (ручного, иным ПИДом, ....)
Оффсет используется скажем в каскадном регулировании, когда выходное значение ПИДа скажем от 10 до 40.

ASo
25.11.2018, 13:09
Можно и так. У одного российского производителя ПЛК со своей системой программирования в первых версиях вообще вычмхитание уставки из величины выносилось вне ФБ - точно по учебнику ТАУ.

SBeaR
25.11.2018, 14:24
А вот зачем ? Я вышел на форум с плаками что у меня пид не работает ? Или что в утильном пиде нет степени и теперь всё пропало - вставьте степень в стандартный пид ?
Вы выразили свое "фе" человеку, который сказал, что его не устраивает отсутствие мертвой зоны в данном ПИДе и он данную зону себе добавил. Вы заявили, что данная функция не нужна ПИД-регулятору. Когда вам указали, что есть задачи, требующие таковую зону и мало того, все промышленные ПИД-регуляторы данную функцию на борту имеют вы начали съезжать на абстрактность данного регулятора. Ну что ж пусть будет так.



Потому что они сделали минимально* необходимую поправку для реальной работы. Не удовлетворяет ? пишите свой другой регулятор по свои потребности. Или напишите/попросите/оплатите создателям - они сделают новую версию util с дополнительным регулятором с вашей любимой мертвой зоной. Но это будет другой регулятор.
*могли б еще меньше. Но что есть (см. предыдущий пост).

Не удовлетворяет и я пользуюсь другим ПИД-регулятором.
И видимо не удовлетворяет не одного меня, раз даже в CoDeSys имеются библиотеки с другими ПИД-регуляторами.

dzukp
26.11.2018, 10:36
Остальное - поверх пида, т.е. сборки специализированных пид-содержащих регуляторов хоть с мертвой зоной, хоть крестикомвышивающих.

Посоветуйте как лучше реализовать мертвую зону на утиловском для регулирования температуры задвижкой.

1.
pid();
if abs(SP-PV) < deadband then
pid.Y := 0; // чтобы задвижка стояла на месте
end_if

2.
pid();
if abs(SP-PV) < deadband then
SP:=PV;
end_if

3.
pid();
if abs(SP-PV) < deadband then
SP:=PV;
pid.Y := 0;
end_if

Можете предложить свой вариант.

Crusash
26.11.2018, 14:00
Посоветуйте как лучше реализовать мертвую зону на утиловском для регулирования температуры задвижкой.
....
Можете предложить свой вариант.

можно так



Pid();
IF Pid.Y <5 AND Pid.Y > -5 THEN (*например меньше 5 больше -5*)
P:=0;(*исполнитель отключен*)
ELSE
P:=Pid.Y;(*исполнитель в работе*)
END_IF

dzukp
26.11.2018, 14:25
можно так



Pid();
IF Pid.Y <5 AND Pid.Y > -5 THEN (*например меньше 5 больше -5*)
P:=0;(*исполнитель отключен*)
ELSE
P:=Pid.Y;(*исполнитель в работе*)
END_IF



В этом варианте меня смущает, что, возможно, будет постоянно расти интегральная составляющая.

SBeaR
26.11.2018, 17:26
Посоветуйте как лучше реализовать мертвую зону на утиловском для регулирования температуры задвижкой.

Ни один из этих вариантов у вас работать не будет. В первом варианте вы не сможете присвоить выходу значение. Во втором варианте у вас уставка будет постоянно "следовать" за переменной, как только переменная попадет в зону нечувствительности. Только если PV изменится резко, чтобы выскочить из зоны, только тогда ПИД заработает.
Ну а третий вариант это сумма двух первых.

Sergey666
26.11.2018, 21:05
Ни один из этих вариантов у вас работать не будет. В первом варианте вы не сможете присвоить выходу значение. Во втором варианте у вас уставка будет постоянно "следовать" за переменной, как только переменная попадет в зону нечувствительности. Только если PV изменится резко, чтобы выскочить из зоны, только тогда ПИД заработает.
Ну а третий вариант это сумма двух первых.

if Pid.Pv>=Pid.Sv-Dead_band OR Pid.Pv<=Pid.Sv+Dead_band THEN
Pid.Pv:=Pid.Sv;
end_if;
...
...
...
Pid();
Т.е вариант№2 товарища стартера, именно этого не хватает в "заводской" комплектации утильного ПИД регулятора, проверено десятками стабильно работающих реализаций. Тут еще кто-то пургу мел про Tn="многим тысячам"...,так вот то именно пурга(или бред). Зырьте формулу,для этого даже код открывать не надо.
Как то так...

З.Ы Вы тут такую пургу метете... Господа!Пришлите мне того-же, что вы курите.

SBeaR
27.11.2018, 02:41
Т.е вариант№2 товарища стартера, именно этого не хватает в "заводской" комплектации утильного ПИД регулятора, проверено десятками стабильно работающих реализаций.
З.Ы Вы тут такую пургу метете... Господа!Пришлите мне того-же, что вы курите.
А вы принципиально не видите разницы между своим вариантом и вариантом dzukp? Вы оперируете в отличии от него с входными переменными ПИД, а он с какими то абстрактными SP и PV, при этом используя в коде вполне конкретный pid.Y.
Так вот тот конкретный кусок кода работать не будет, так как переменная SP будет изменяться вслед за PV, как только PV попадет в мертвую зону.
Избежать этого можно только если где-то ранее в коде будет строка вида: SP:=A;
В явном виде в варианте dzukp этого нет и реализовав данный вариант "как есть" можно сильно удивится, что переменная так ни когда из мертвой зоны и не выйдет (без резкого скачка значения переменной)
Да и ваш вариант работать не будет. В вашем случае в условии нужен AND, а не OR.
Я бы наверно реализовал это как-то так:


IF PV>(SP+DB) THEN
PID.SP:=(SP+DB);
ELSIF PV<(SP-DB) THEN
PID.SP:=(SP-DB);
ELSE
PID.SP:=PV;
END_IF;

Поясню почему PID.SP:=SP+DB.
Это позволит регулятору при выходе переменной из мертвой зоны более плавно начать регулирование. В противном же случае мы получим ошибку рассогласования >= величине мертвой зоны, что может привести к резкому скачкообразному изменению выхода ПИД из-за больших значений пропорциональной и дифференциальной составляющих регулятора.

Никитин
28.11.2018, 02:00
Хотел бы внести своё предложение в дискуссию: добавить задержку включения для того, чтобы "пролетая" уставку переменная не "цеплялась" за границы "мертвой зоны", и ввести "мертвую зону" в установившемся режиме.
Например:
ton1(IN := ABS(SP - PV) < DB, PT := <время выхода на уставку>);

Andrew_Stranger
28.11.2018, 17:57
А почему нельзя подавать сигнал сброса на вход Reset регулятора?

SBeaR
28.11.2018, 19:29
А почему нельзя подавать сигнал сброса на вход Reset регулятора?
Потому что не всегда при выходе на уставку регулятор обнуляется. Для ряда процессов, например таких как поддержание давления, при PV=SP выход регулятора будет каким либо отличным от нуля числом.

Andrew_Stranger
28.11.2018, 20:50
Вот и я о том же. Почему нельзя вместо PID.SP:=PV написать Reset:=true?

SBeaR
29.11.2018, 02:05
Вот и я о том же. Почему нельзя вместо PID.SP:=PV написать Reset:=true?
Что значит о том же? Reset:=True выключает ПИД регулятор, делая Y равным Y_Offset, то есть по умолчанию равным 0.
В отличии от этого PID.SP:=PV всего лишь убирает ошибку рассогласования Er:=SP-PV, тем самым обнуляя пропорциональную и дифференциальную составляющие, но оставляя неизменной составляющую интегральную, которая попросту перестает изменяться. Данный процесс полностью аналогичен обычному процессу выхода регулятора на уставку, когда PV становится равной SP. Просто за SP принимается интервал от (SP-DB) до (SP+DB).

dzukp
29.11.2018, 09:45
Хотел бы внести своё предложение в дискуссию: добавить задержку включения для того, чтобы "пролетая" уставку переменная не "цеплялась" за границы "мертвой зоны", и ввести "мертвую зону" в установившемся режиме.
Например:
ton1(IN := ABS(SP - PV) < DB, PT := <время выхода на уставку>);

В варианте SBeaR меня тоже смущает, то что идеальный регулятор на уставку выходить не будет, будет либо SP+DB, либо SP-DB.
Наверное как-то так нужно сделать.



ton1(IN := ABS(SP - PV) < DB, PT := <время выхода на уставку>);
IF ton1.Q AND PV>(SP+DB) THEN
PID.SP:=(SP+DB);
ELSIF ton1.Q AND PV<(SP-DB) THEN
PID.SP:=(SP-DB);
ELSE
PID.SP:=PV;
END_IF;

Andrew_Stranger
29.11.2018, 09:49
Sbear, спасибо разобрался.

SBeaR
29.11.2018, 10:04
В варианте SBeaR меня тоже смущает, то что идеальный регулятор на уставку выходить не будет, будет либо SP+DB, либо SP-DB.

Идеальных регуляторов не существует, если только вы не настроили параметры ПИД таким образом, чтобы он полчаса выходил на уставку, вместо положенной 1 минуты (время условно), но тогда зачем вам мертвая зона?
Инерционность выведет объект к уставке хотя бы за счет дифференциальной составляющей, которая еще один цикл будет действовать из-за разницы между прошлым и настоящим значением процесса.
Ну а если процесс у вас медленный сам по себе, то смысла использовать мертвую зону как правило нет.

dzukp
29.11.2018, 10:35
Идеальных регуляторов не существует, если только вы не настроили параметры ПИД таким образом, чтобы он полчаса выходил на уставку, вместо положенной 1 минуты (время условно), но тогда зачем вам мертвая зона?
Инерционность выведет объект к уставке хотя бы за счет дифференциальной составляющей, которая еще один цикл будет действовать из-за разницы между прошлым и настоящим значением процесса.
Ну а если процесс у вас медленный сам по себе, то смысла использовать мертвую зону как правило нет.

В данный момент у меня задвижка трехпозиционная, ПИД регулирует температуру изменяя скорость движения задвижки на открытие и закрытие ШИМ-ом. Процесс достаточно медленный, выход на уставку десятки минут. Мертвая зона, чтобы без нужды не дергать исполнительный механизм, когда более-менее установится.

SBeaR
29.11.2018, 10:47
В данный момент у меня задвижка трехпозиционная, ПИД регулирует температуру изменяя скорость движения задвижки на открытие и закрытие ШИМ-ом. Процесс достаточно медленный, выход на уставку десятки минут. Мертвая зона, чтобы без нужды не дергать исполнительный механизм, когда более-менее установится.
А у вас процесс идеально выходит на уставку без перерегулирования хотя бы в градус, два? Вот этот градус и можно по идее сделать зоной нечувствительности. За счет инерционности задвижки объект сам себя загонит к уставке и успокоится там.

dzukp
29.11.2018, 13:52
А у вас процесс идеально выходит на уставку без перерегулирования хотя бы в градус, два? Вот этот градус и можно по идее сделать зоной нечувствительности. За счет инерционности задвижки объект сам себя загонит к уставке и успокоится там.

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