Подскажите пожалуйста по каким уравнениям (логике) работает ПИД регулятор в Codesys?
Вид для печати
Подскажите пожалуйста по каким уравнениям (логике) работает ПИД регулятор в Codesys?
Ответы на вопросы по работе ПИД регулятора, из библиотеки Util, вы можете найти в русскоязычной справке к CODESYS.
Прикрепляю скриншот из справки с ответом на ваш вопрос.
Вложение 11523
Вообще-то меня интересует внутренняя структура этого блока.
Библиотека Util распространяется компанией 3S в компилированном виде, соответственно внутренняя структура функциональных блоков скрыта.
Примерно такая на ФБ в Овен Лоджике. Вложение 11534
Василий Кашуба, только линии обратной связи, работающие в ПР в CodeSys работать НЕ БУДУТ с вероятностью 90%
Понятно. Свой сочинять буду. Утиловский не работает. Я думал, кто нибудь знает интегральное уравнение у утиловского.
Util.lib в КДС2.3 открытая , не думаю что код сильно отличается (если вообще отличается).
В оскат загляните, есть и интеграл в виде открытого ПОУ
Всем спасибо
А почему у меня - в открытом?
Код:(* PD controller *)
FUNCTION_BLOCK PID
VAR_INPUT
ACTUAL :REAL; (* actual value, process variable *)
SET_POINT:REAL; (* desired value, set point *)
KP:REAL; (* proportionality const. (P)*)
TN:REAL; (* reset time (I) in sec *)
TV:REAL; (* rate time, derivative time (D) in sec*)
Y_MANUAL:REAL; (* Y is set to this value as long as MANUAL=TRUE *)
Y_OFFSET:REAL; (* offset for manipulated variable *)
Y_MIN:REAL; (* minimum value for manipulated variable *)
Y_MAX:REAL; (* maximum value for manipulated variable *)
MANUAL:BOOL; (* TRUE: manual: Y is not influenced by controller,
FALSE: controller determines Y *)
RESET:BOOL; (* reset: set Y output to Y_OFFSET and reset integral part *)
END_VAR
VAR_OUTPUT
Y:REAL; (* manipulated variable, set value*)
LIMITS_ACTIVE:BOOL:=FALSE; (* true set value would exceed limits Y_MIN, Y_MAX *)
OVERFLOW:BOOL:=FALSE; (* overflow in integral part *)
END_VAR
VAR
CLOCK:TON;
I: INTEGRAL;
D: DERIVATIVE;
TMDIFF: DWORD;
ERROR: REAL;
INIT: BOOL:=TRUE;
Y_ADDOFFSET: REAL;
KPcopy:REAL;
TNcopy:REAL;
TVcopy:REAL;
END_VAR
IF TN>0 AND KP<> 0 AND (NOT OVERFLOW OR RESET OR MANUAL) THEN
ERROR := SET_POINT-ACTUAL; (* Regeldifferenz *)
IF RESET OR MANUAL OR INIT OR (KP<>KPcopy OR TN<>TNcopy OR TV<>TVcopy) THEN (* Reset oder Handbetrieb *)
I(RESET:=TRUE);
D(RESET:=TRUE);
OVERFLOW:=FALSE;
LIMITS_ACTIVE:=FALSE;
IF RESET OR INIT THEN
Y := Y_OFFSET;
INIT:=FALSE;
Y_ADDOFFSET := 0;
ELSIF MANUAL THEN
Y := Y_MANUAL;
Y_ADDOFFSET := Y_MANUAL-(Y_OFFSET+KP*(ERROR+I.OUT/TN+D.OUT*TV));
ELSE
Y_ADDOFFSET := Y - Y_OFFSET - KP*ERROR;
END_IF
TMDIFF:=0;
CLOCK(IN:=FALSE); (* Timer neu starten *)
CLOCK(PT:=t#1h, IN:=TRUE);
TNcopy := TN;
TVcopy := TV;
KPcopy := KP;
ELSE
CLOCK; (* Timer abfragen *)
TMDIFF:=TIME_TO_DWORD(CLOCK.ET); (* Zeitdifferenz seit letztem Aufruf *)
END_IF;
IF TMDIFF>0 THEN
CLOCK(IN:=FALSE); (* Timer neu starten *)
CLOCK(PT:=t#1h, IN:=TRUE);
D(IN:=ERROR, TM:=TMDIFF, RESET:=FALSE); (* Differential abschätzen *)
I(IN:=ERROR, TM:=TMDIFF, RESET:=FALSE); (* Integral abschätzen *)
OVERFLOW := I.OVERFLOW;
IF NOT OVERFLOW THEN
Y:=Y_OFFSET+KP*(ERROR+I.OUT/TN+D.OUT*TV) + Y_ADDOFFSET;
IF Y>1E30 OR Y<-1E30 THEN (* Overflow steht bevor, darf aber eigentlich nicht passieren *)
OVERFLOW:=TRUE;
END_IF;
LIMITS_ACTIVE:=FALSE;
IF Y_MAX>Y_MIN AND Y>Y_MAX THEN (* Stellwert-Obergrenze überschritten *)
LIMITS_ACTIVE:=TRUE;
IF KP<>0 THEN
I(IN:=(Y_MAX-Y)*TN/KP,TM:=1000,RESET:=FALSE); (* Integral korrigieren *)
END_IF
Y:=Y_MAX;
END_IF;
IF Y_MAX>Y_MIN AND Y<Y_MIN THEN (* Stellwert-Untergrenze unterschritten *)
LIMITS_ACTIVE:=TRUE;
IF KP<>0 THEN
I(IN:=(Y_MIN-Y)*TN/KP,TM:=1000,RESET:=FALSE); (* Integral korrigieren *)
END_IF
Y:=Y_MIN;
END_IF;
END_IF;
ELSE
CLOCK(PT:=t#1h,IN:=TRUE);
END_IF;
END_IF;
АSо, а как так получилось, что код с ошибками?
В строке
IF Y_MAX>Y_MIN AND Y0 THEN
Переменная Y0 не описана. И в конце END_IF лишний.
Видимо, глюк движка форума.
Сейчас попробовал скопипастить. Внутри тэгов CODE все нормально, при сохранении сообщения - вот так :(
Но это не имеет большого значения. Откройте util.lib, как проект, откройте блок PID и смотрите.
Да, действительно, глюк интеллектуальный, еще и AND добавил :)
кто нибудь подскажет, Пид регулятор работает или нет.
Не могли бы выложит на форум небольшой пример для проверки.
А то я хочу приобрести СПК 107, но не зная справится ПЛК с нашей
задачей не могу этого сделать.
Для примера сделайте терморегулятор на 4 зоны с програмным задатчиком
и контролем разности температур между зонами .
Буду очень благодарен.
Печь состоит из четырех зон нагрева и регулирования температуры.
Уставка в зонах одинаковая 0-1000 °С . для равномерного нагрева материалов по длине печи нужно следить еще за разницей температур
в во всех зонах. Уставка задается программным задатчиком, в виде графика, состоит из десяти участков набора температуры.
т.е. загрузили в печку, и прогнали какой то график?
Получается ещё и скорость нагрева или охлаждения регулировать? или скорость изменения температуры между точками графика значения не имеет?
Задачка может не из простых оказаться.
Вроде всё просто, выдержать график и скорость, на хорошем стандартном регуляторе. но равномерность нагрева (тот самый градиент) может заставить изрядно попотеть.
Не сделать такого на самописном регуляторе. Можно конечно, но времени на его разработку и тестирование уйдёт немеряно.
Если нагрев не газом, берите омроновские терморегуляторы, а в каком либо контроллере (СПК 107 например) пересчитывайте ваш график из десяти точек, в график с интервалом в 5-30 секунд (интервал методом тыка под конкретную печь и материал) и передавайте задание терморегуляторам.
Если не прокатит, т.е. разбег между зонами стабильным не получится, тогда специальные многозонные регуляторы с градиентом, но я не знаю как они с частой сменой задания дружить будут
мне казалось это простой задачей.
Давайте разберем по полочкам.
1. Создаем 4 Пид регулятора, уставка регуляторам передаются из следующего блока ;
2. Создаем программный задатчик из 10 зон с визуализацией на экране графически;
3. Создаем блок контроля достигнутой температуры во всех зонах;
4. Остается придумать как воздействовать на ту зону где температура выше других;
Пока вроде все.
А скорость изменения температуры между заданными точками?
начали 0 минут-30 градусов
15 минут 150
37 минут 150
40 минут 300
60 минут 450 и.т.д. до охлаждения.
т.е. между точками 0, 15, 37, 40, 60 температура Вас не волнует, главное чтобы в точках она была заданной?
Вы уверены что правильно задачу описываете?
Скорее всего kaxriman нужен задачик который изменяет постепенно уставку ПИД - регуляторов по времени. При этом должен учитываться градиент.
Хоть что за печь ? И что за материал?
Или обсуждаем сферическую печь в вакууме ?
ramp_real.out ---> pid.set_pointЦитата:
нужен задачик который изменяет постепенно уставку ПИД - регуляторов по времени
извините что лезу с недопониманием, но в чём собственно говоря сложность? градиент тут зачем?
если я правильно понимаю задачу объект можно рассматривать не как многосвязную систему (что в свою очередь было бы правильно), а как систему из 4 отдельных объектов в каждом свой нагреватель и в каждом своя обратная связь (конечно возможно большее перерегулирование у каждого из объектов) но если все объекты будут одинаковыми и будут находится в равных условиях, то разнится температура между зонами печи практически не будет.
Такая же ситуация: печь, 3 канала управления, необходимо выдержать одинаковую температуру по всему объему печи с точностью +-1 градус. Выход регулятора - ШИМ сигнал. Плюс технологи требуют еще 27(!!!) термопар для детального контроля (визуального) температуры. СПК207 потянет 4 модуля МВ110-8АС + 4 ПИД-регулятора с ШИМ + МДВВ + визуализация? СПК мой еще похоже из самых первых партий (приобрел в феврале прошлого года), тормозит даже с простенькой программой при переходе со страницы на страницу.
Придумали подобное, уже давно. Я эту штуку не пробовал.
называется CelciuX
Да, об этом тоже, потянет ли СПК107 четыре Пид регулятора, програмный задатчик, визуализации
и еще дополнительные задачи.
Кстати кто-то делал програмный задатчик с уставками оператора на 5 шагов.
по общему проекту, значит нужно создать 4 Пид регулятора, экраны визуализации и один регулятор между
зонами. Но как нужно воздействовать на Пид регуляторы.
Пишите кто знаком.
Думаю нужно просто оптимизировать Ваш проект.
Например:
1. Основной программе поставить цикл 10-20мс
2. Задачу визуализации Вызывайте циклически с интервалом 200-300мс.
3. В настройках менеджера визуализации выставьте стиль Default
4. Если в визуализации есть картинки старайтесь их использовать меньшего размера.
на самом деле Пид регулятор сильно часто вызывать не требуется.
НО, лично я бы использовал классическую связку ПЛК- панель.
исключительно из-за отсутствия у овена скоростной шины данных, предпочитаю иметь некоторое количество входов-выходов на борту.
Хоть систему безопасности на них завести(пуск-стоп...) .