Просмотр полной версии : Работа с библиотекой PID_Regulators
Здравствуйте! Скажите, пожалуйста, как пользоваться функциями этой библиотеки в языке 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
Партизан
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. Объявляете экземпляр ФБ
Спасибо, после некоторых "ковыряний" начало работать... но не так, как нужно. 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
Большое спасибо за столь подробную консультацию! Завтра обязательно все попробую и о результатах отпишусь!
period: TIME:=t#5s; (*Период ШИМ*)
А как определить период? Или он подбирается в каждом конкретном случае?
Николаев Андрей
12.10.2008, 15:14
Период ШИМ определяется Вами.
Сильное увеличение времени ухудшает регулирование.
Сильно малое число сильно нагружает исполнительный механизм.
Здравствуйте еще раз! Попробовал пример, выложенный ПАРТИЗАНом. Вроде все хорошо регулируется. Спасибо ОГРОМНОЕ вам за помощь! И еще, если не трудно, объясните, пожалуйста, смысл понятий "МИНИМУМ ИНТЕГРАЛЬНОЙ СОСТАВЛЯЮЩЕЙ" и "МАКСИМУМ ИНТЕГРАЛЬНОЙ СОСТАВЛЯЮЩЕЙ" и какие значения им лучше задать?
Малышев Олег
13.10.2008, 14:52
Суть интегральной составляющей - уже набранная объектом энергия. В установившихся режимах она практически не меняется. Для уменьшения перерегулирования можно ограничить ее рамки опытным путем. Максимум минимум 1..-1.
Спасибо! А как быть, если в процессе работы мне нужно просто включить нагреватель пока температура не достигнет определённого значения? Например, реализовать предварительный разогрев. Средствами 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
Нет, Вы не совсем правильно меня поняли. Переменная 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
Здравствуйте!
Подскажите пожалуйста новичку, какой ПИД лучше использовать с блоком VALVE_REG для управления 3х позиционным КЗР с датчиком ОС.
Николаев Андрей
06.11.2009, 10:32
Используйте либо простой регулятор Pid_Function либо ПИД регулятор из Util.lib
Powered by vBulletin® Version 4.2.3 Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot