PDA

Просмотр полной версии : Работа с библиотекой PID_Regulators



mp3moto
09.10.2008, 09:41
Здравствуйте! Скажите, пожалуйста, как пользоваться функциями этой библиотеки в языке ST? Я пишу: OUT_VAL:=PID_2POS_IM_ANR(PV,PV_TIME,SP,START_ANR,Y DOP,_IMIN,_IMAX)

CoDeSys ругается: PID_2POS_IM_ANR is not a function

mp3moto
09.10.2008, 11:02
Ау! Почему вы молчите?

Партизан
09.10.2008, 11:35
Напишите в разделе объявлений

PID: PID_2POS_IM_ANR;

а в программе
OUT_VAL:=PID(PV,PV_TIME,SP,START_ANR,Y DOP,_IMIN,_IMAX);

Еще проверьте, добавили ли Вы библиотеку с ПИД-регуляторами в проект

И симтомы должны пройти

Николаев Андрей
09.10.2008, 12:43
Здравствуйте.
К сожалению в техподдержке работают не 4-х рукие шивы, поэтому опять же к сожалению несколько дел делать сразу не получается.
А в случае необходимости оперативного ответа можно звонить в техподдержку.

Функциональные блоки из данной библиотеки подключаются точно так же, как функциональные блоки из любой другой библиотеки.
Более подробно об этом можно почитать в Мануале на CoDeSys или в Help-e, которые русифицированы.
1. Подключаете библиотеку.
2. С помощью F2 выбираете из стандартных функциональных блоков нужный Вам блок - все переменные блока появляются автоматически.
3. Меняете имя блока,
4. Объявляете экземпляр ФБ

mp3moto
09.10.2008, 12:52
Спасибо, после некоторых "ковыряний" начало работать... но не так, как нужно. PLC_configuration настроил также, как и в примерах использования (файл "Описание библиотеки PID_Regulators.pdf"). Привожу код программы:

PROGRAM PLC_PRG
VAR SP1,YDOP1,_IMIN1,_IMAX1,OUT_VAL:REAL;
START_ANR1:BOOL;
PID: PID_2POS_IM_ANR; i:INT;
END_VAR

SP1:=40;
START_ANR1:=TRUE;
YDOP1:=2;
_IMIN1:=0;
_IMAX1:=100;

PID(PV:=PV1, PV_TIME:=PV_TIME1, SP:=SP1, START_ANR:=START_ANR1, YDOP:=YDOP1, _IMIN:=_IMIN1, _IMAX:=_IMAX1);
heater:=REAL_TO_WORD(PID.OUT_VAL/100);

(*PV1 - текущая температура*)

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

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

Скорее всего я не до конца понимаю что делает и как работает функция PID. Объясните, пожалуйста, как правильно должна быть написана программа.

Партизан
09.10.2008, 15:44
1. Строку START_ANR1:=TRUE; надо убрать. START_ANR1 запускает автонастройку. Это делается не так часто, поэтому можно эту переменную менять вручную.

2. Если верить документации к этой функции, на выходе вы получаете сигнал от -100 до +100. Что вы делаете: просто делите это значение на 100, т.е. на выходе от -1 до +1.

А потом преобразуете все это дело в WORD. Округление всегда идет вниз. Поясню: когда сигнал с ПИД-регулятора равен 100, на выход (heater) вы подаете 1, т.е. включаете его. Как только сигнал становится меньше 100, на heater всегда подается 0, и он выключается.

Что надо сделать: перевести аналоговый сигнал с ПИД-регулятора в ШИМ, то бишь чем больше сигнал, тем длиннее импульс на включение нагревателя.

Например:
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);

Кажется так. Проверить времени нет. И обязательно включите в проект UTIL.lib

mp3moto
12.10.2008, 12:36
Большое спасибо за столь подробную консультацию! Завтра обязательно все попробую и о результатах отпишусь!

mp3moto
12.10.2008, 12:40
period: TIME:=t#5s; (*Период ШИМ*)

А как определить период? Или он подбирается в каждом конкретном случае?

Николаев Андрей
12.10.2008, 15:14
Период ШИМ определяется Вами.
Сильное увеличение времени ухудшает регулирование.
Сильно малое число сильно нагружает исполнительный механизм.

mp3moto
13.10.2008, 13:33
Здравствуйте еще раз! Попробовал пример, выложенный ПАРТИЗАНом. Вроде все хорошо регулируется. Спасибо ОГРОМНОЕ вам за помощь! И еще, если не трудно, объясните, пожалуйста, смысл понятий "МИНИМУМ ИНТЕГРАЛЬНОЙ СОСТАВЛЯЮЩЕЙ" и "МАКСИМУМ ИНТЕГРАЛЬНОЙ СОСТАВЛЯЮЩЕЙ" и какие значения им лучше задать?

Малышев Олег
13.10.2008, 14:52
Суть интегральной составляющей - уже набранная объектом энергия. В установившихся режимах она практически не меняется. Для уменьшения перерегулирования можно ограничить ее рамки опытным путем. Максимум минимум 1..-1.

mp3moto
13.10.2008, 15:37
Спасибо! А как быть, если в процессе работы мне нужно просто включить нагреватель пока температура не достигнет определённого значения? Например, реализовать предварительный разогрев. Средствами PID это будет очень долго, т.к. нагреватель постоянно включается и выключается. Подача на heater единицы приводит к тому, что нагреватель начинает включаться и выключаться примерно раз в секунду. Задействовать второй дискретный выход? Или есть другой способ?

Партизан
13.10.2008, 15:57
Очень просто:
IF PV1<36.6 THEN (*предварительная уставка*)
heater:=TRUE;
ELSE
PID(PV:=PV1, PV_TIME:=PV_TIME1, SP:=SP1, STA..... (*и в том же духе*)
END_IF

mp3moto
13.10.2008, 16:19
Нет, Вы не совсем правильно меня поняли. Переменная heater сидит в блоке Pulse-wide modulator, который работает по своему закону, параметры которого звучат как Period of PWM in 100 mksec и Minimal Duration of impuls in 100mksec. Значение TRUE на него не подашь, хотя бы потому, что его тип WORD. Говорю еще раз, что если подать на heater 1 (TRUE), реле начинает щелкать с периодом "Period of PWM" при замкнутом состоянии "Minimal Duration of impuls" мксек. Вопрос состоит в следующем: Можно ли программно заставить работать реле в определенные моменты времени по Pulse-wide modulator-закону и по "обычному прямому" принципу работы? Или же проще задействовать второе реле для нормальной работы?

Филоненко Владислав
13.10.2008, 18:05
По "обычному закону" - это подать на вход PWM 0 и 65535 соответственно!
IF PV1<36.6 THEN (*предварительная уставка*)
heater:=65535;
ELSE
PID(PV:=PV1, PV_TIME:=PV_TIME1, SP:=SP1, STA..... (*и в том же духе*)
END_IF

Gerkules
26.06.2009, 17:12
Здравствуйте! возник вопрос по ФБ "VALVE_REG". всё работает как описано в документации, но возникают ситуации, когда при подаче на вход блока (IN_VAL) значения 15, а значение на входе (POS) при этом значени 25, не появляется сигнала на выходе (LESS). DBF=2. в чём может быть проблема?

Малышев Олег
09.07.2009, 09:08
Возможно фб пытаеся отработать мин. пуск стоп или выборку люфта. тоже может быть когда ф.б. не вызывается

Amfaromah
18.08.2009, 15:20
Доброго времени суток всем, дайте плиз ссылки на информацию по использованию библиотеки PID_Regulators, с описанием использования примерами, а конкретней меня интересует больше всего по 3х ходовым клапанам, и регулирующим, и еще один вопрос в тему или нет, я правильно думаю что датчики температуры и давления тоже нужно использовать с помощью PID???? за ранее спасибо за ответ

Малышев Олег
19.08.2009, 09:20
http://www.owen.ru/forum/showthread.php?t=551

Игор100
30.10.2009, 10:47
Здравствуйте!
Подскажите пожалуйста новичку, какой ПИД лучше использовать с блоком VALVE_REG для управления 3х позиционным КЗР с датчиком ОС.

Николаев Андрей
06.11.2009, 10:32
Используйте либо простой регулятор Pid_Function либо ПИД регулятор из Util.lib