PDA

Просмотр полной версии : ПИД-регулятор с релейным выходом.



nordth
04.08.2018, 03:04
Стоит задача использовать ПИД-регулятор, который бы просто включал и отключал нагреватель, как, например, ТРМ151 с релейным выходом. Те что смотрел в библиотеках имеют выход типа REAL, то есть по сути предназначены для управления аналоговым исполнительным механизмом, но не дискретным.
Какое решение придумать?
Спасибо.

Сергей0308
04.08.2018, 04:11
Стоит задача использовать ПИД-регулятор, который бы просто включал и отключал нагреватель, как, например, ТРМ151 с релейным выходом. Те что смотрел в библиотеках имеют выход типа REAL, то есть по сути предназначены для управления аналоговым исполнительным механизмом, но не дискретным.
Какое решение придумать?
Спасибо.

Почитайте что нибудь про ШИМ!

nordth
04.08.2018, 06:44
Почитайте что нибудь про ШИМ!

Нашел в одной из библиотек такой вот - APID_PWM называется, но у него опять же выходы WORD и REAL, ни никак не BOOL что мне требуется.

Сергей0308
04.08.2018, 07:31
Если у Вас есть ПИД-регулятор с аналоговым выходом, в чём проблема(если нет встроенного ШИМа у выходов), выбрать необходимый период и преобразовать выходную мощность в ширину(длительность) импульса! И мне кажется релейным выходом много не нащёлкаешь, лучше транзисторный + ТТР!

krollcbas
04.08.2018, 07:33
Использую обычный PID из UTIL, прикрутить (написать) к выходу 0-100% импульсник, который будет давать импульсы не сложно

capzap
04.08.2018, 07:52
выход типа REAL, то есть по сути предназначены для управления аналоговым исполнительным механизмом, но не дискретным.
Какое решение придумать?
Спасибо.
а если брать результат выхода регулятора realValue>50.0 разв он не булевый?

Eugene.A
04.08.2018, 08:45
"Выкладываю более полную версию блока ПИД-регулирования:
с возможностью использования КЗР как с датчиком, так и без датчика положения,
с возможностью прямого управления открытием и закрытием КЗР."
Борис Калинин
https://www.asutp-volgograd.com/blog/pid-regulator-codesys

nordth
04.08.2018, 08:54
а если брать результат выхода регулятора realValue>50.0 разв он не булевый?

То есть просто поставить компаратор и сравнивать выход PID c 50.0?

capzap
04.08.2018, 09:03
То есть просто поставить компаратор и сравнивать выход PID c 50.0?

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

nordth
05.08.2018, 21:39
Спасибо за ответы. Покопался в библиотеках и нашел адаптивные PID регуляторы. Для решения задачи выбрал регулятор APID_PWM, не не могу до конца разобраться с его настройкой. Чтобы не заводить еще одну тему хотел бы чтобы проверили правильность настройки и еще есть непонятности.

APID1(Pv:=trmp, Pv_Time:= ptm, SP:=SetPoint, RAMP:=FALSE, DYX:=?, PV_0:=?, START_ANR:=ANR, Y_MANUAL:=?,Y_MAN_SET:=FALSE, XN:=?, PMAX:=1, PMIN:=0);
ANR:=APID1.ANR_WORK;
IF APID1.Y = 0 THEN ten:=FALSE; ELSE ten:=TRUE; END_IF

1. Pv_Time: взял прямо с модуля ввода через ModBus с Register Input Module под номером 3, для первого канала. Это правильно?
2. Если не использую быстрый выход на уставку RAMP:=FALSE, то что ставить в параметре DYX?
3. Что ставить в параметре PV_0?
4. На вход START_ANR просто подаю значение с выхода блока ANR_WORK правильно?
5. Ручной режим не используется Y_MAN_SET:=FALSE, что делаем с Y_MANUAL?
6. Правильно ли установлены PMAX и PMIN и правильно ли организовано управление дискретным исполнительным устройством ten от выхода типа REAL APID1.Y?
7. Вход XN, это т. н. гитерезис?

Для чего нужны блоки SET_APID и GET_APID и нужно ли мне их использовать и если нужно то для чего? Просто хочу понимать до конца суть.

Спасибо.

Зинько Владислав
06.08.2018, 09:17
Добрый день!

Вы используете ПЛК63/73?
Если да, то ознакомились ли Вы с описанием этой библиотеки?
Файл описания приложен к посту.

Если же Вы используете ПЛК1хх, то эта библиотека в них не поддержана. Для этой серии контроллеров предусмотрена библиотека Pid_Regulators. Скачать можно по ссылке (http://www.owen.ru/uploads/txtlic.php?url=http:/kipshop.ru/CoDeSys/bibl/Lib_OWEN_PLC1xx_v8.12.zip).

Ниже представлены ответы на Ваши вопросы:

1. Pv_Time: взял прямо с модуля ввода через ModBus с Register Input Module под номером 3, для первого канала. Это правильно?
Какой модуль вывода Вы используете?
В этот параметр Вы должны передавать циклическое время измерения значения в канале.


2. Если не использую быстрый выход на уставку RAMP:=FALSE, то что ставить в параметре DYX?
Оставьте равным "0". Он не будет задействован.


3. Что ставить в параметре PV_0?
Значение измеряемой величины в момент ДО начала работы генератора.
Т.е. перед запуском ПИД-регулятора Вы фиксируете значение измеряемой величины и передаете на этот вход, не меняя его в процессе работы блока до следующего запуска.



4. На вход START_ANR просто подаю значение с выхода блока ANR_WORK правильно?
Нет. На этот вход Вы должны подать высокий уровень для того, чтобы блок перешел в режим автонастройки.
У блока APID_PWM режим автонастройки встроенный.


5. Ручной режим не используется Y_MAN_SET:=FALSE, что делаем с Y_MANUAL?
По аналогии с п.2, можете оставить по умолчанию - "0".


6. Правильно ли установлены PMAX и PMIN?
PMAX и PMIN установлены верно.


Правильно ли организовано управление дискретным исполнительным устройством ten от выхода типа REAL APID1.Y?
Нет, не верно.
В данном случае ПИД-регулятор будет выдавать число типа REAL, соответствующее значению выходной мощности, необходимой для поддержания изменяемой величины на уровне уставки.
По Вашему же коду, ТЕН отключится только когда регулятор полностью сбросит выходное воздействие.
По логике работы ПИД-регулятора, такое произойдет только при крайнем перерегулировании.

Если Ваш ТЭН может работать в режиме ШИМ (постоянно и часто включаться/выключаться), то Вам необходимо просто связать физический выход ПЛК и выход ФБ регулятора.


7. Вход XN, это т. н. гитерезис?
Это т.н. зона нечувствительности.
Например, вы задали уставку в 30 градусов и 2 градуса на зону нечувствительности. Регулятор не будет менять выходную мощность на отметках от 29 градусов до 31 градуса.
Этот параметр необходим для того, чтобы регулятор не реагировал на мелкие колебания температуры.


Для чего нужны блоки SET_APID и GET_APID и нужно ли мне их использовать и если нужно то для чего? Просто хочу понимать до конца суть.
Блоки GET получают текущие настройки регулятора.
Блоки SET, соответственно, могут записывать настройки в ФБ регулятора.

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

nordth
07.08.2018, 01:50
Добрый день!

Вы используете ПЛК63/73?
Если да, то ознакомились ли Вы с описанием этой библиотеки?
Файл описания приложен к посту.

Если же Вы используете ПЛК1хх, то эта библиотека в них не поддержана. Для этой серии контроллеров предусмотрена библиотека Pid_Regulators. Скачать можно по ссылке (http://www.owen.ru/uploads/txtlic.php?url=http:/kipshop.ru/CoDeSys/bibl/Lib_OWEN_PLC1xx_v8.12.zip).


Использую ПЛК 110. Следовательно pid_reg2 мне нельзя брать получается? В моем распоряжении только библиотека Pid_Regulators? И самый подходящий вариант как я понимаю PID_2POS_IM_ANR?

Ниже представлены ответы на Ваши вопросы:



Какой модуль вывода Вы используете?
В этот параметр Вы должны передавать циклическое время измерения значения в канале.

МВ 110-224. Беру температуру с регистров 4-5, следовательно Pv_Time: это с регистра 3 Register Input Module прямо и без всяких преобразований?



Если Ваш ТЭН может работать в режиме ШИМ (постоянно и часто включаться/выключаться), то Вам необходимо просто связать физический выход ПЛК и выход ФБ регулятора.


А как же разница типов, физические выходы ПЛК имеют тип BOOL, а выход регулятора или REAL или WORD?

Остальные вопросы тогда пока оставлю до выяснения с библиотекой.

Спасибо.

Sulfur
07.08.2018, 06:11
nordth
1. В пакете библиотек OSCAT есть преобразователь значения REAL в ШИМ (выход BOOL) с настраиваемым периодом.
2. Если использовать модуль дискретных выходов МУ110-8(16), то преобразовав выход ПИД-регулятора из REAL (0..1) в WORD (0-1000) можно можно направить в определенные регистры этого модуля, и модуль сам будет отрабатывать ШИМ. Период (цикл) ШИМ в таком случае настраивается в конфигураторе модуля.

Зинько Владислав
07.08.2018, 10:57
Использую ПЛК 110. Следовательно pid_reg2 мне нельзя брать получается? В моем распоряжении только библиотека Pid_Regulators? И самый подходящий вариант как я понимаю PID_2POS_IM_ANR?

Да, совершенно верно.
Назначение блока APID_PWM схоже с PID_2POS_IM_ANR.


МВ 110-224. Беру температуру с регистров 4-5, следовательно Pv_Time: это с регистра 3 Register Input Module прямо и без всяких преобразований?
Вы не указали полную маркировку модуля, но если Вы используете МВ110-8А, то да, верно.
Считываете без всяких преобразований.

nordth
07.08.2018, 11:26
Спасибо, пока что вопросов больше нет.

nordth
09.08.2018, 00:53
Итак, продолжил делать задуманное и вот что получил, был бы благодарен, если бы проверили и внесли бы критику, правильно ли все по входным переменным блока PID у меня сделано?

Объявление:
APID: PID_2POS_IM_ANR;
period: UINT := 1000; (* ms *)

Код:

APID(PV:=trmp, PV_TIME:= ptm1, SP:=SetPoint, START_ANR:=TRUE, YDOP:=2, _IMIN:=-1, _IMAX:=1);
ten:= TIME_TO_DWORD(TIME()) MOD period < APID.OUT_VAL * period;

К сожалению блоком PWM_PW из библиотеки OSCAT воспользоваться не представляется возможным, так как OSCAT конфликтует с библиотекой СМС которая мне необходима. Называется "повезло". ((( Поэтому взял конструкцию по ШИМ из реал с просторов этого же форума. Подойдет ли такое решение?

A.Simonov
10.08.2018, 16:35
Итак, продолжил делать задуманное и вот что получил, был бы благодарен, если бы проверили и внесли бы критику, правильно ли все по входным переменным блока PID у меня сделано?

Объявление:
APID: PID_2POS_IM_ANR;
period: UINT := 1000; (* ms *)

Код:

APID(PV:=trmp, PV_TIME:= ptm1, SP:=SetPoint, START_ANR:=TRUE, YDOP:=2, _IMIN:=-1, _IMAX:=1);
ten:= TIME_TO_DWORD(TIME()) MOD period < APID.OUT_VAL * period;

К сожалению блоком PWM_PW из библиотеки OSCAT воспользоваться не представляется возможным, так как OSCAT конфликтует с библиотекой СМС которая мне необходима. Называется "повезло". ((( Поэтому взял конструкцию по ШИМ из реал с просторов этого же форума. Подойдет ли такое решение?

Добрый день.

Разъясните содержание этой строки.

ten:= TIME_TO_DWORD(TIME()) MOD period < APID.OUT_VAL * period;

Чем Вам не нравится встроенный в ПЛК модуль ШИМ?
РП страницы 75-76
http://www.owen.ru/uploads/rp_plk110.160.pdf

nordth
10.08.2018, 21:11
Добрый день.
Чем Вам не нравится встроенный в ПЛК модуль ШИМ?
РП страницы 75-76
http://www.owen.ru/uploads/rp_plk110.160.pdf

Заняты 3 из 4-х быстрых выходов, а перевод на ШИМ осуществляется целиком для блока выходов, поэтому нужно именно какое то программное решение.

nordth
10.08.2018, 21:26
Нашел еще одно программное решение, именно для этого блока PID регулятора (не мое). Оно мне более понятно почти, кроме одного, как так удалось скрестить REAL и TIME переменные?

Объявления:
period: TIME:=t#5s; (*Период ШИМ*)
blinker: BLINK;


Код:
IF PID.OUT_VAL>0 THEN
imp_on:= PID.OUT_VAL*period/100; (*Длина импульса на включение*)
ELSE imp_on:=0;
END_IF

imp_off:= period - imp_on; (*Длина импульса на отключение*)

blinker(ENABLE:=TRUE, TIMELOW:=imp_off, TIMEHIGH:=imp_on, OUT=> heater);

nordth
10.08.2018, 21:56
Лично мне видится что в данном решении не хватает просто преобразований.

Проверьте пожалуйста, если не трудно, правильно ли так?

Объявления:
period: TIME:=t#5s; (*Период ШИМ*)
blinker: BLINK;


Код:
IF PID.OUT_VAL>0 THEN
imp_on:= REAL_TO_TIME(PID.OUT_VAL*TIME_TO_REAL(period)/100)); (*Длина импульса на включение*)
ELSE imp_on:=REAL_TO_TIME(0); (*или T#0s*)
END_IF

imp_off:= period - imp_on; (*Длина импульса на отключение*)

blinker(ENABLE:=TRUE, TIMELOW:=imp_off, TIMEHIGH:=imp_on, OUT=> heater);

Спасибо.

nordth
17.08.2018, 18:17
Всем спасибо за помощь и поддержку. Все получилось. ) Последний вариант кода для ШИМ рабочий. )

Serhioromano
02.09.2018, 18:32
Другой вопрос, как правильно подобрать период ШИМ? Есть ли какое решение для автоподбора? Что бы можно было динамически менять период.

Konstantin_M
09.07.2019, 22:39
Здравствуйте! Подскажите пожалуйста, какую переменную указывать на входе FB (Pointer to FB) функциональных блоков SET_APID_ и GET_APID_ библиотеки CmpOwenPidRegs?
Ошибка:
Невозможно конвертировать тип 'OPR.APID_PWM(cmpowenpidregs, 3.5.11.1 (production association owen))' в тип 'POINTER TO APID_PWM'
43567

Codesys 3.5.11
СПК 107

Ponkratovanton
26.05.2020, 12:55
ADR(APID_PWM_0) по умолчанию ADR(имя ФБ к которому ссылаетесь)