PDA

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



Serrk
23.01.2014, 11:44
Подскажите пожалуйста по каким уравнениям (логике) работает ПИД регулятор в Codesys?

Мурат Ахриев
23.01.2014, 12:09
Ответы на вопросы по работе ПИД регулятора, из библиотеки Util, вы можете найти в русскоязычной справке к CODESYS.

Прикрепляю скриншот из справки с ответом на ваш вопрос.

11523

Serrk
23.01.2014, 15:59
Вообще-то меня интересует внутренняя структура этого блока.

Мурат Ахриев
23.01.2014, 16:14
Библиотека Util распространяется компанией 3S в компилированном виде, соответственно внутренняя структура функциональных блоков скрыта.

Василий Кашуба
23.01.2014, 16:24
Вообще-то меня интересует внутренняя структура этого блока.
Примерно такая на ФБ в Овен Лоджике. 11534

melky
24.01.2014, 13:08
Василий Кашуба, только линии обратной связи, работающие в ПР в CodeSys работать НЕ БУДУТ с вероятностью 90%

Serrk
24.01.2014, 15:03
Понятно. Свой сочинять буду. Утиловский не работает. Я думал, кто нибудь знает интегральное уравнение у утиловского.

Sergey666
24.01.2014, 15:48
Util.lib в КДС2.3 открытая , не думаю что код сильно отличается (если вообще отличается).

capzap
24.01.2014, 16:10
В оскат загляните, есть и интеграл в виде открытого ПОУ

Serrk
26.01.2014, 09:54
Всем спасибо

ASo
26.01.2014, 10:44
Библиотека Util распространяется компанией 3S в компилированном виде, соответственно внутренняя структура функциональных блоков скрыта.
А почему у меня - в открытом?


(* 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&#228;tzen *)
I(IN:=ERROR, TM:=TMDIFF, RESET:=FALSE); (* Integral absch&#228;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 &#252;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;

amn
26.01.2014, 13:34
АSо, а как так получилось, что код с ошибками?
В строке
IF Y_MAX>Y_MIN AND Y0 THEN
Переменная Y0 не описана. И в конце END_IF лишний.

ASo
26.01.2014, 14:09
Видимо, глюк движка форума.
Сейчас попробовал скопипастить. Внутри тэгов CODE все нормально, при сохранении сообщения - вот так :(

Но это не имеет большого значения. Откройте util.lib, как проект, откройте блок PID и смотрите.

amn
26.01.2014, 14:41
Да, действительно, глюк интеллектуальный, еще и AND добавил :)

Мурат Ахриев
27.01.2014, 11:42
А почему у меня - в открытом?


(* 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&#228;tzen *)
I(IN:=ERROR, TM:=TMDIFF, RESET:=FALSE); (* Integral absch&#228;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 &#252;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;



Спасибо за информацию, оказывается для Codesys 2 библиотеки поставляются с исходными кодами, в Codesys 3 уже компилированные поставляются.

kaxriman
04.02.2014, 23:02
кто нибудь подскажет, Пид регулятор работает или нет.

Василий Кашуба
05.02.2014, 10:24
кто нибудь подскажет, Пид регулятор работает или нет.
Работает, работает.

kaxriman
05.02.2014, 23:40
Работает, работает.

Не могли бы выложит на форум небольшой пример для проверки.
А то я хочу приобрести СПК 107, но не зная справится ПЛК с нашей
задачей не могу этого сделать.
Для примера сделайте терморегулятор на 4 зоны с програмным задатчиком
и контролем разности температур между зонами .
Буду очень благодарен.

smk1635
05.02.2014, 23:48
Не могли бы выложит на форум небольшой пример для проверки.
А то я хочу приобрести СПК 107, но не зная справится ПЛК с нашей
задачей не могу этого сделать.
Для примера сделайте терморегулятор на 4 зоны с програмным задатчиком
и контролем разности температур между зонами .
Буду очень благодарен.

Оплата наличными или по безналу ? :D
Впрочем приобрести СПК 107 и самому попробовать дешевле выдет.

kaxriman
06.02.2014, 00:25
Оплата наличными или по безналу ? :D
Впрочем приобрести СПК 107 и самому попробовать дешевле выдет.

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

smk1635
06.02.2014, 01:05
платить будем как вы хотите .
Попробовать как говорится всегда успеем, хочется выбрать правильное направление.
Выше писали что Пид регулятор в библиотеке с ошибками. Кажется этот проект еще
сырой . Сомненья, сомненья.

На форуме есть тема, где люди предлагают свои услуги.
А на данном конкретном ПИД - регуляторе свет клином не сошелся. Есть и другие.
Всегда можно подобрать. Есть самописные очень хорошие.
Напишите ТЗ и думаю многие откликнутся.

BETEP
06.02.2014, 01:57
Для примера сделайте терморегулятор на 4 зоны с програмным задатчиком
и контролем разности температур между зонами .
Вас интересует регулирование по градиенту температуры? или как понимать контроль разности между зонами?

kaxriman
06.02.2014, 23:26
Вас интересует регулирование по градиенту температуры? или как понимать контроль разности между зонами?

Печь состоит из четырех зон нагрева и регулирования температуры.
Уставка в зонах одинаковая 0-1000 °С . для равномерного нагрева материалов по длине печи нужно следить еще за разницей температур
в во всех зонах. Уставка задается программным задатчиком, в виде графика, состоит из десяти участков набора температуры.

BETEP
07.02.2014, 13:13
т.е. загрузили в печку, и прогнали какой то график?
Получается ещё и скорость нагрева или охлаждения регулировать? или скорость изменения температуры между точками графика значения не имеет?
Задачка может не из простых оказаться.
Вроде всё просто, выдержать график и скорость, на хорошем стандартном регуляторе. но равномерность нагрева (тот самый градиент) может заставить изрядно попотеть.
Не сделать такого на самописном регуляторе. Можно конечно, но времени на его разработку и тестирование уйдёт немеряно.
Если нагрев не газом, берите омроновские терморегуляторы, а в каком либо контроллере (СПК 107 например) пересчитывайте ваш график из десяти точек, в график с интервалом в 5-30 секунд (интервал методом тыка под конкретную печь и материал) и передавайте задание терморегуляторам.
Если не прокатит, т.е. разбег между зонами стабильным не получится, тогда специальные многозонные регуляторы с градиентом, но я не знаю как они с частой сменой задания дружить будут

kaxriman
07.02.2014, 23:03
мне казалось это простой задачей.
Давайте разберем по полочкам.
1. Создаем 4 Пид регулятора, уставка регуляторам передаются из следующего блока ;
2. Создаем программный задатчик из 10 зон с визуализацией на экране графически;
3. Создаем блок контроля достигнутой температуры во всех зонах;
4. Остается придумать как воздействовать на ту зону где температура выше других;
Пока вроде все.

BETEP
08.02.2014, 01:42
А скорость изменения температуры между заданными точками?
начали 0 минут-30 градусов
15 минут 150
37 минут 150
40 минут 300
60 минут 450 и.т.д. до охлаждения.
т.е. между точками 0, 15, 37, 40, 60 температура Вас не волнует, главное чтобы в точках она была заданной?
Вы уверены что правильно задачу описываете?

smk1635
08.02.2014, 10:17
Скорее всего kaxriman нужен задачик который изменяет постепенно уставку ПИД - регуляторов по времени. При этом должен учитываться градиент.
Хоть что за печь ? И что за материал?
Или обсуждаем сферическую печь в вакууме ?

Валенок
08.02.2014, 11:46
нужен задачик который изменяет постепенно уставку ПИД - регуляторов по времени
ramp_real.out ---> pid.set_point

kaxriman
08.02.2014, 12:33
А скорость изменения температуры между заданными точками?
начали 0 минут-30 градусов
15 минут 150
37 минут 150
40 минут 300
60 минут 450 и.т.д. до охлаждения.
т.е. между точками 0, 15, 37, 40, 60 температура Вас не волнует, главное чтобы в точках она была заданной?
Вы уверены что правильно задачу описываете?

Я сейчас посмотрел руководство от ТРМ251, нам подойдет точно такой-же алгоритм программного задатчика,
даже шаги можно оставить 5.

Русин Павел Сергеевич
11.02.2014, 06:01
извините что лезу с недопониманием, но в чём собственно говоря сложность? градиент тут зачем?
если я правильно понимаю задачу объект можно рассматривать не как многосвязную систему (что в свою очередь было бы правильно), а как систему из 4 отдельных объектов в каждом свой нагреватель и в каждом своя обратная связь (конечно возможно большее перерегулирование у каждого из объектов) но если все объекты будут одинаковыми и будут находится в равных условиях, то разнится температура между зонами печи практически не будет.

BETEP
11.02.2014, 12:51
Может не будет, а может будет достаточно критичной для материала,

Если не прокатит, т.е. разбег между зонами стабильным не получится, тогда специальные многозонные регуляторы с градиентом
т.е. пробовать.

Drahtor
11.02.2014, 15:28
Такая же ситуация: печь, 3 канала управления, необходимо выдержать одинаковую температуру по всему объему печи с точностью +-1 градус. Выход регулятора - ШИМ сигнал. Плюс технологи требуют еще 27(!!!) термопар для детального контроля (визуального) температуры. СПК207 потянет 4 модуля МВ110-8АС + 4 ПИД-регулятора с ШИМ + МДВВ + визуализация? СПК мой еще похоже из самых первых партий (приобрел в феврале прошлого года), тормозит даже с простенькой программой при переходе со страницы на страницу.

BETEP
11.02.2014, 18:56
Придумали подобное, уже давно. Я эту штуку не пробовал.
называется CelciuX

Николаев Андрей
12.02.2014, 08:28
Такая же ситуация: печь, 3 канала управления, необходимо выдержать одинаковую температуру по всему объему печи с точностью +-1 градус. Выход регулятора - ШИМ сигнал. Плюс технологи требуют еще 27(!!!) термопар для детального контроля (визуального) температуры. СПК207 потянет 4 модуля МВ110-8АС + 4 ПИД-регулятора с ШИМ + МДВВ + визуализация? СПК мой еще похоже из самых первых партий (приобрел в феврале прошлого года), тормозит даже с простенькой программой при переходе со страницы на страницу.

Тормозит не программа, с большой вероятностью визуализация (не зависимо от программы).

kaxriman
12.02.2014, 21:28
Тормозит не программа, с большой вероятностью визуализация (не зависимо от программы).

Да, об этом тоже, потянет ли СПК107 четыре Пид регулятора, програмный задатчик, визуализации
и еще дополнительные задачи.
Кстати кто-то делал програмный задатчик с уставками оператора на 5 шагов.
по общему проекту, значит нужно создать 4 Пид регулятора, экраны визуализации и один регулятор между
зонами. Но как нужно воздействовать на Пид регуляторы.
Пишите кто знаком.

Александр Приходько
20.02.2014, 22:09
Да, об этом тоже, потянет ли СПК107 четыре Пид регулятора, програмный задатчик, визуализации
и еще дополнительные задачи.
Кстати кто-то делал програмный задатчик с уставками оператора на 5 шагов.
по общему проекту, значит нужно создать 4 Пид регулятора, экраны визуализации и один регулятор между
зонами. Но как нужно воздействовать на Пид регуляторы.
Пишите кто знаком.

А собственно что Вас смущает?
4 PID регулятора не такая уж и сложная задача.

Александр Приходько
20.02.2014, 22:15
А собственно что Вас смущает?
4 PID регулятора не такая уж и сложная задача.

Думаю нужно просто оптимизировать Ваш проект.

Например:
1. Основной программе поставить цикл 10-20мс
2. Задачу визуализации Вызывайте циклически с интервалом 200-300мс.
3. В настройках менеджера визуализации выставьте стиль Default
4. Если в визуализации есть картинки старайтесь их использовать меньшего размера.

lara197a
20.02.2014, 22:53
на самом деле Пид регулятор сильно часто вызывать не требуется.
НО, лично я бы использовал классическую связку ПЛК- панель.
исключительно из-за отсутствия у овена скоростной шины данных, предпочитаю иметь некоторое количество входов-выходов на борту.
Хоть систему безопасности на них завести(пуск-стоп...) .

smk1635
20.02.2014, 23:56
НО, лично я бы использовал классическую связку ПЛК- панель.
исключительно из-за отсутствия у овена скоростной шины данных, предпочитаю иметь некоторое количество входов-выходов на борту.
Хоть систему безопасности на них завести(пуск-стоп...) .

Это точно.
Мы в связке с СПК, ПР-ки используем в качестве модулей ввода-вывода. Программа безопасности зашивается в ПР, ну и дублируется в СПК. Да же если с СПК что то случится, ПР-ка отработает по аварийным сигналам.

kaxriman
27.02.2014, 23:44
Это точно.
Мы в связке с СПК, ПР-ки используем в качестве модулей ввода-вывода. Программа безопасности зашивается в ПР, ну и дублируется в СПК. Да же если с СПК что то случится, ПР-ка отработает по аварийным сигналам.

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

Александр Приходько
27.03.2014, 02:04
Господа коллеги.
Тут наконец руки добрались до библиотеки OSCAT.

1. Вещь классная
2. Свободно распространяемая
3. Открыты исходники
4. Есть пид регуляторы

Мунус один - не русифицирована.

Но тем кому позарез нужны PID, а те что есть в CODESYS не нравятся, вам сюда:
http://store.codesys.com/oscat-basic.html

Или кому лень качать:

ivanok
02.04.2014, 23:52
Открытые исходники ПИДов в OSCAT не увидел. Размерность коэффициентов регуляторов не определена (в описании указывается как составляющая), у CTRL_PI и CTRL_PID она почему-то разная. Соберите связку СПК (Control Win V3) + МВ110-А + МУ110-Р + ЭП10 и попробуйте настроить. Как настроить диф.коэффициент CTRL_PID так и не понял, в UTILe с диф.коэф. такая же беда. В режиме PI вроде работает. Отсутствие ОВЕНовских ПИДов для CDS3 сильно огорчает и тормозит применение СПК.

RV9WFJ
04.04.2014, 09:13
мне казалось это простой задачей.
Давайте разберем по полочкам.
1. Создаем 4 Пид регулятора, уставка регуляторам передаются из следующего блока ;
2. Создаем программный задатчик из 10 зон с визуализацией на экране графически;
3. Создаем блок контроля достигнутой температуры во всех зонах;
4. Остается придумать как воздействовать на ту зону где температура выше других;
Пока вроде все.Делал в свое время прям в точности вашу задачу на ПЛК73. Могу сказать вам сразу в чем вы заблуждаетесь - 4 ПИД регулятора на одну камеру с общими зонами работать НЕ БУДЕТ так как велико влияние друг на друга. Надо делать один главный ПИД 3 пропорциональных регулятора или еще какую-то логику городить но точно не 4 ПИД. Если надо могу дать или продать проект на ПЛК73. Там можно каждой зоне выбирать тип регулятора.

kaxriman
04.04.2014, 14:39
Делал в свое время прям в точности вашу задачу на ПЛК73. Могу сказать вам сразу в чем вы заблуждаетесь - 4 ПИД регулятора на одну камеру с общими зонами работать НЕ БУДЕТ так как велико влияние друг на друга. Надо делать один главный ПИД 3 пропорциональных регулятора или еще какую-то логику городить но точно не 4 ПИД. Если надо могу дать или продать проект на ПЛК73. Там можно каждой зоне выбирать тип регулятора.

Спасибо за отклик. Проект на ПЛК73 не подходит, потому что приобрел СПК107+МВА110+ПР114. Временно запустили печь на ТРМ251 с 1 зоной.
Но вы наверное правы в том что нужен 1 ПИД и 4 модуля управления выходами, пока не знаю по какой формуле.

жекон
09.04.2014, 20:05
Спасибо за отклик. Проект на ПЛК73 не подходит, потому что приобрел СПК107+МВА110+ПР114. Временно запустили печь на ТРМ251 с 1 зоной.
Но вы наверное правы в том что нужен 1 ПИД и 4 модуля управления выходами, пока не знаю по какой формуле.
Не большая проблема перенести проект из КДС2 в КДС3

kaxriman
05.05.2014, 19:28
Сегодня сдал проект заказчику полностью. Архив не могу выложить, передал заказчику.
Могу сказать что заказчик доволен.
Применил ПИДы от ОСКАТ, работают замечательно.
В задачу ввел понятие средней температуры. У нас в 4-х зонах температуру контролируют 1 ПИД регулятор и 4 ПИ регулятора.
Спасибо всем ! Ваши отклики помогли сильно.

RV9WFJ
05.05.2014, 19:44
Может все-таки 1- ПИД и 3-П регулятора?

kaxriman
05.05.2014, 22:13
Может все-таки 1- ПИД и 3-П регулятора?

Нет я решил эту задачу именно так, главный ПИД определяет уровень выхода от 0 до 100% в зависимости от Тср-Туст,
зонные ПИ регуляторы следят за Тср- Тзон и корректируют управляющий сигнал зон от -10 до +10 к выходному сигналу ПИДа.
Итак получается 4 ПИ регулятора, и один общий ПИД регулятор. ПИ регуляторы понадобились из-за того что каждая зона имеет
свои значения потерь тепла и нагрева, интегральная составляющая запоминает эти различия.
И нет необходимости как то экономить на регуляторах . Главное чтобы все работало согласовано.

RV9WFJ
06.05.2014, 06:47
Интересная конструкция получилась, еще бы графики (трейсы) глянуть по температурам и выходам.

kholonkin
13.05.2014, 21:49
Интересно, у меня не получилось библиотечные ПИД запользовать, ни встроенные ни ОСКАТОВские..........
Ручками разность высчитываю.....

kukla100
12.06.2014, 09:07
Скажите, как можно библиотеку "PID_Regulators" из КДС2.3 перенести в КДС3.5 ?

RV9WFJ
12.06.2014, 17:01
Никак потому что она внутри ПЛК сидит. А что в ней такого ценного есть, чего нет в CS3.5

kukla100
12.06.2014, 20:09
Просто нужен пид-регулятор, а к "PID_Regulators" и описание есть. Если бы такую же библиотеку с описанием сделали для CS3.5, то было бы здорово.

RV9WFJ
13.06.2014, 07:58
ПИД лучше взять из OSCAT или Util.lib. На оба есть описание, хотя что там описывать не понятно уже после первого использования. Отличаются они только механизмами инициализации Reset и переходом в ручной режим и обратно. Сама формула у всех одинаковая.

kukla100
13.06.2014, 09:58
ПИД лучше взять из OSCAT или Util.lib. На оба есть описание, хотя что там описывать не понятно уже после первого использования. Отличаются они только механизмами инициализации Reset и переходом в ручной режим и обратно. Сама формула у всех одинаковая.

На ПИД из OSCAT тогда хорошо бы описание на русском увидеть. И где описание к Util.lib взять?

RV9WFJ
13.06.2014, 10:10
На ПИД из OSCAT тогда хорошо бы описание на русском увидеть.
Ну наверно можно через Google Переводчик. Но чем пытаться переводить описание, проще посмотреть код и Вам сразу станет ясно, что практически все ПИД-ы одинаковы. Отличия лишь в ограничениях и мелочах.

И где описание к Util.lib взять?
CoDeSys_V23_RU.pdf стр.354 или F1 в CS3.

kukla100
13.06.2014, 13:32
А в этих библиотеках есть "Блоки для управления исполнительными механизмами" ?

Инженер23
20.07.2016, 14:54
Использовал ПИД регулятор из библиотеки OSCAT.
Первое нужно вычислить разницу между уставкой и текущим значением и результат передать ПИД регулятору
Также регулятору передается максимальное и минимальное значение только он сам его нифига не ограничивает (только интегральную составляющую он ограничивает этими значениями) так что нужно вручную прописывать услевия если результат меньше минимума то установить минимум если больше максимума то установить максимум, а если в диапазоне то присвоить результат ПИД

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

divinewinhs
26.07.2016, 10:15
Ребят помогите,в общем ситуация такая взял пид из oscat библы
При уставке управляется все идеально, тэны и холодильная машина держат 0,5 градуса!

При отрицательной уставке то регулирование не происходит!
Начинает произвольную температуру держать!
Причем до уставки - вообще не доходит регулируется в пределах +

Т.е . если уставка -10, а в обьеме + 15 то пид держит примерно + 5 градусов хотя дифиринциал считает правельно - 25

capzap
26.07.2016, 10:22
если уставка отрицательная, то наверное и регулятор работает не в режиме нагрев, а охлаждение. Тут скорее всего надо пропорциональный задавать с минусом

divinewinhs
26.07.2016, 10:41
Ты имееш ввиду пропорциональный коэфициен? я пробовал начинает регулировать за 3-4 до уставки и некак недоходит до ее
Т.е. уставка - 25 а пид пляшет в районе -21 градуса
При этом я врубаю холодильную машину на всю катушку принудительно пака не перевалит за 5 градуса до уставки
И только потом включаю пид иначе пид болтается в + температуре

capzap
26.07.2016, 10:42
Также регулятору передается максимальное и минимальное значение только он сам его нифига не ограничивает (только интегральную составляющую он ограничивает этими значениями) так что нужно вручную прописывать услевия если результат меньше минимума то установить минимум если больше максимума то установить максимум, а если в диапазоне то присвоить результат ПИД

вот код CTRL_OUT, выход не может не ограничиваться
(* Limit the output *)
IF Y > LIM_L AND Y < LIM_H THEN
LIM := FALSE;
ELSE
Y := LIMIT(LIM_L, Y, LIM_H);
LIM := TRUE;
END_IF;
а по поводу
Первое нужно вычислить разницу между уставкой и текущим значением и результат передать ПИД регуляторуа зачем тогда используется CTRL_IN если не для вычисления разницы между уставкой и актуальным значением. Получается под ПИД-ом Вы понимаете ПОУ начинающееся на FT_ , а не CTRL_

capzap
26.07.2016, 10:44
Ты имееш ввиду пропорциональный коэфициен? я пробовал начинает регулировать за 3-4 до уставки и некак недоходит до ее
Т.е. уставка - 25 а пид пляшет в районе -21 градуса
При этом я врубаю холодильную машину на всю катушку принудительно пака не перевалит за 5 градуса до уставки
И только потом включаю пид иначе пид болтается в + температуре

там есть еще параметр offset, видимо он для этого и нужен чтоб подстраивать в таких случаях. Тут дело не в программировании а в подборе коэффициентов индивидуально для каждого объекта

divinewinhs
26.07.2016, 10:49
С плюсом все идеально! Если текущая температура в обьеме допустим +25 и задать уставку +5 или +10 то включится холодильник и будет охлождать как надо в районе +- 0.5 от уставки, а вот с отрицательной уставкой полная хрень

capzap
26.07.2016, 12:48
вобще то, разницы не должно быть, там diff рассчитывается как абсолютное значение между уставкой и актуальным значением

ЗЫ хотя нет, абсолютное значение только для мертвойзоны используется, а для diff просто разница, в этом наверное и проблема

divinewinhs
26.07.2016, 14:30
вобще то, разницы не должно быть, там diff рассчитывается как абсолютное значение между уставкой и актуальным значением

ЗЫ хотя нет, абсолютное значение только для мертвойзоны используется, а для diff просто разница, в этом наверное и проблема

и как мне это поправить? чтобы пид и на - работал

это реальное упущение можно багрепорт отправить с правками

Нашел где срабатывает исключение!
Да ты был прав все дело в дед зоун



If ABS(X) > L then
Dead_zone:=X;
elseif Dead_zone> 0.0 then
Dead_zone:=-X;
else
Dead_zone:=0.0;
end_if

Инженер23
28.07.2016, 08:08
вот код CTRL_OUT, выход не может не ограничиваться
(* Limit the output *)
IF Y > LIM_L AND Y < LIM_H THEN
LIM := FALSE;
ELSE
Y := LIMIT(LIM_L, Y, LIM_H);
LIM := TRUE;
END_IF;
а по поводуа зачем тогда используется CTRL_IN если не для вычисления разницы между уставкой и актуальным значением. Получается под ПИД-ом Вы понимаете ПОУ начинающееся на FT_ , а не CTRL_
Я использую FT_PID и CTRL_OUT и CTRL_IN не использовал

capzap
28.07.2016, 08:25
Я использую FT_PID и CTRL_OUT и CTRL_IN не использовал

ну так значит надо брать CTRL_PID и самому ни чего не придется добавлять

capzap
28.07.2016, 09:06
и как мне это поправить? чтобы пид и на - работал

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

divinewinhs
28.07.2016, 11:54
Мне нужно и на плюс и на минус, столкнулся с проблемой что мои правки начинает работать на минус , и естественно тогда плюс перестает работать

Инженер23
10.08.2016, 09:24
Мне нужно и на плюс и на минус, столкнулся с проблемой что мои правки начинает работать на минус , и естественно тогда плюс перестает работать
Попробуй использовать только блок FT_PID
на вход подаешь разность между тем что есть и тем что надо (т.е. ошибку) на выходе получаешь либо + либо - причем почти без ограничений. Значение с выхода анализируешь, если от 10 до 100 то включаешь нагреватели на соответствующий процент
если от -10 до -100 то включаешь холодильник... холодильник можно регулировать ШИМ с периодом 100 секунд например...
Можешь дополнительные условия прописать например если уставка меньше 10 градусов то запретить работу нагревателей, а если уставка больше 30 градусов то запретить работу холодильника.

Эдуард_Н
10.08.2016, 11:53
Что за блок FT_PID, откуда?

Инженер23
10.08.2016, 16:27
с пятой страницы этой темы библиотека OSCATBasic.zip

Drahtor
27.11.2016, 22:05
Прошу сильно не пинать, только начинаю знакомиться ПИД. Для того, чтобы понять суть, решил написать маленький ФБ где попытался этот самый ПИД реализовть. Всего лишь вычисление трех выходных составляющих, ничего сверхъестественного типа ручного режима и т.д. Данный ФБ вызываю в PLC_PRG с интервалом 1 секунда (переменная t_cycle в коде.
Хочу спросить, является ли это хоть чем-то похожим на ПИД-регулятор? Правильно ли я понимаю его суть? Надеюсь, что в тему.


err:=SetPoint-ActValue;
PY:=Kp*err;
IY:=IY+(Kp/Ti)*err/TIME_TO_WORD(t_cycle)/1000.0;
DY:=Kp*Td*(err-prev_err)/TIME_TO_WORD(t_cycle)/1000.0;

IF IY<-100.00 THEN
IY:=-100.0;
END_IF
IF IY>100.0 THEN
IY:=100;
END_IF
prev_err:=err;
Y_out:= PY+IY+DY;

IF Y_out<-100.00 THEN
Y_out:=-100.0;
END_IF
IF Y_out>100.0 THEN
Y_out:=100;
END_IF

Пьер
01.12.2016, 22:31
Из библиотеки ОСКАТ
CTRL_PI

Input
ACT: REAL (value measured by the way)
SET: REAL (default)
SUP: REAL (noise reduction)
SFO: REAL (ofset for the output)
M_I: REAL (input value for manual operation)
MAN: BOOL (switch to manual mode, MANUAL = TRUE)
RST: BOOL (asynchronous reset input)
KP: REAL (proportional part of the controller)
KI: REAL (integral part of the controller)
LL: REAL (lower output limit)
LH: REAL (upper output limit)
Output
Y: REAL (output of the controller)
DIFF: Real (deviation)
LIM: BOOL (TRUE if the output has reached a limit)


Что есть?
SUP: REAL (noise reduction)
SFO: REAL (ofset for the output)
M_I: REAL (input value for manual operation)
с аглицкого не могу понять.
И как это применяется. Можете простыми словами объяснить?
Всем заранее спасибо!

YuriBel
02.12.2016, 10:54
Предположительно, то есть совсем.
В смысле, что прочитал по-английски, но дальше никуда не заглядывал.
SUP: REAL (noise reduction)- возможно, некий порог, ниже которого разница между текущим значением и уставкой не принимается во внимание (для уменьшения шума)
SFO: REAL (ofset for the output)- скорее всего некая аддитивная составляющая, которая прибавляется к величине на выходе (сдвиг на выходе)
M_I: REAL (input value for manual operation) Некая входная величина для ручного режима. С тем, что это такое, наверное можно попробовать поразбираться на практике, переведя регулятор в ручной режим (входом MAN). Это может быть величина, которая поступает на вход вместо ACT, либо значение рассогласования.

ЗЫ. Еще раз подчеркну, что это только предположения.

Grampus
29.12.2016, 08:38
Добрый день господа! Скажите пожалуйста можно реализовать передачу данных в MySQL с СПК207 . может есть у кого опыт или пример!???

RV9WFJ
29.12.2016, 08:45
Можно, в CoDeSys Store даже пример видел. Возможно и в Oscat что-то есть.

melky
29.12.2016, 11:10
Grampus самый простой способ, читать данные SCADA системой и отправлять в БД.