Здравствуйте! Скажите, пожалуйста, как пользоваться функциями этой библиотеки в языке 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
Здравствуйте! Скажите, пожалуйста, как пользоваться функциями этой библиотеки в языке 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
Ау! Почему вы молчите?
Напишите в разделе объявлений
PID: PID_2POS_IM_ANR;
а в программе
OUT_VAL:=PID(PV,PV_TIME,SP,START_ANR,Y DOP,_IMIN,_IMAX);
Еще проверьте, добавили ли Вы библиотеку с ПИД-регуляторами в проект
И симтомы должны пройти
Последний раз редактировалось Партизан; 09.10.2008 в 11:42.
Здравствуйте.
К сожалению в техподдержке работают не 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. Объясните, пожалуйста, как правильно должна быть написана программа.
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
Последний раз редактировалось Партизан; 09.10.2008 в 15:52.
Большое спасибо за столь подробную консультацию! Завтра обязательно все попробую и о результатах отпишусь!
А как определить период? Или он подбирается в каждом конкретном случае?period: TIME:=t#5s; (*Период ШИМ*)
Период ШИМ определяется Вами.
Сильное увеличение времени ухудшает регулирование.
Сильно малое число сильно нагружает исполнительный механизм.
Здравствуйте еще раз! Попробовал пример, выложенный ПАРТИЗАНом. Вроде все хорошо регулируется. Спасибо ОГРОМНОЕ вам за помощь! И еще, если не трудно, объясните, пожалуйста, смысл понятий "МИНИМУМ ИНТЕГРАЛЬНОЙ СОСТАВЛЯЮЩЕЙ" и "МАКСИМУМ ИНТЕГРАЛЬНОЙ СОСТАВЛЯЮЩЕЙ" и какие значения им лучше задать?