Я честно говоря не знал что можно использовать ПИД не указывая min/max_y.
И да, както добавив ПИД без проверки переполнения, я в какойто момент обнаружил что он не работает и флаг переполнения взведен...
Времени на разбирательство причины не было, но теперь любой пид я обвязываю проверкой (хуже то не будет)..
В ближайшем подходящем проекте попробую поставить счетчик на переполнение, вообще самому стало интересно насколько часто это может происходить и в каких условиях..
К вопросу о переполнении сделал так:
regulator.RESET:=regulator.OVERFLOW
Да, но определить когда изменились данные не всегда возможно. Точнее что они изменились можно понять, а вот что они реально не меняются не всегда.
Или я просто не в курсе. Аналоговый вход на модуле ввода-вывода по модбасу. Как узнать, что в текущем цикле программы этот вход обновился, если его значение совпадает с предыдущим его значением?
Что значит:-"Работает железобетонно"???
Вы вообще ту сферу работы выбрали?
Ничто не препятствует вызову ФБ ПИД регулятора в каждом цикле,не делайте мозги.
Так есть пара нюансов и никто их не упомянул ни разу:
1. По факту регулятор только "Нагреватель", для реализации "Холодильника" надо "разворачивать" выход.
2. Отсутствие "мертвой зоны" т.е области нечуствительности к отклонению SV-PV в определенном диапазоне.
А вообще нормальный регулятор, я для себя доработал исходник:- добавил "Мертвую зону" .
З.Ы А с Tn=0 некоторые ПИД регуляторы вообще не работают, этот в их числе.
И вообще 99.5% вопросов на этом форуме решаются элементарным прочтением технических описаний(это документация такая)...
Последний раз редактировалось Sergey666; 22.11.2018 в 23:40.
На утиловском ПИД-регуляторе мертвая зона реализуется примерно так:
pid.SP:=SEL(ABS(task - temperature) < deadband, task, temperature)
Или у вас есть более правильная реализация?
Ну а как же ПД-регулятор? Если бы данный утиловский регулятор при Tn=0 становился ПД-регулятором можно было б изменением коэффициента менять тип регулятора. И по одной из теорий настройки ПИД, первым пунктом идет настройка только пропорциональной составляющей, а затем уже дифференциальной и интегральной. А здесь получается нужно изначально какую-то интегральную составляющую вводить. И не всегда есть возможность передать очень большое число (например при передаче коэффициентов через модбас в виде целого 2-х байтового).
Задачи бывают разные. Как вариант: автомат розлива газ. напитков, который должен поддерживать давление СО2 в накопительной емкости. Делается это двумя клапанами: клапан подачи углекислоты и клапан сброса. Оба работают по ПИД-закону, для поддержания давления в допустимой зоне. Они оба используют "мертвую зону", один сверху, чтобы при превышении сбросить излишки, другой снизу, чтобы при снижении добавить углекислоты. Стабильно держать на одном уровне не реально: идет розлив - давление падает, в емкость набирается напиток - давление растет и излишки сбрасываются. Если убрать мертвую зону, то растет расход углекислоты, как ни настраивай ПИД. По аналогичному принципу работает газирование продукта с сатураторах. Думаю в других сферах тоже присутствуют аналогичные задачи, где не нужно "держать" регулируемую величину с нулевой точностью.
И тем не менее все нормальные промышленные пид-регуляторы данный функционал имеют. В том числе и ТРМ101. Так почему бы не иметь данный функционал в библиотечной функции, вместо того, чтобы выдумывать как бы это реализовать самому, даже если это не особо сложно?
А мы сейчас находимся на форуме с тематикой "промышленная автоматизация" и обсуждаем применение ПИД-регулирования в промышленном производстве или на форуме математиков обсуждаем сферическую формулу ПИД в вакууме?
Мало ли кто бы от чего там не отказался. В приведенном выше примере технологи бы тоже не отказались, регулировать давление углекислоты так, чтобы оно всегда было равно уставке и не сбрасывались излишки в атмосферу, но в жестокой реальности с её физическими законами набираемый в емкость продукт неизбежно выталкивает набранную туда углекислоту.
Последний раз редактировалось SBeaR; 23.11.2018 в 18:02.
Так введите ФБ зоны нечуствительности перед ПИДом. Это стандартный программистский подход.
Лично я всегда ПИД (ПД, ПИ) вызываю каждый цикл, хотя может это и не правильно.
В Кодесис вроде нет REAL16. Конечно можно функцию сделать, которая будет переводить real32 в real16 с потерей точности, потом передовать это в модбас. Но далеко не все клиенты могут работать с real16. Я real16 вообще никогда не встречал.
Если позволите позанудствовать, то FFFF это не дохрена, а -1. А так да, соглашение можно.
Все это конечно можно и в каких то ситуациях приемлемое решение, но это лишняя писанина не только на стороне ПЛК, но и на стороне модбас-клиента.
И это всё, чтобы временно отключить И-составляющую регулятора.
Я решил на всякий случай сделать так, а то кто-нибудь установит TN=0 и всё, приплыли:
IF rPidI = 0 THEN
regulator.TN := 9999999999999999999.0;
ELSE
regulator.TN := rPidI;
END_IF
К слову о мертвой зоне.
Мой многострадальный регулятор управляет скоростью открытия/закрытия задвижки ШИМ-ом. И в пределах мертвой зоны лишний раз не хочется задижку дергать, что бы не расходовать ресурс задвижки и реле (оно там не твердотельное, но это к теме не относится).
Последний раз редактировалось dzukp; 24.11.2018 в 00:04.