PDA

Просмотр полной версии : Работа ТЭНа с ПИД регулятором



V0lodya
02.05.2023, 16:08
Добрый вечер. Столкнулся с проблемой вывода значения в ПИД регуляторе, принцип работы у него простой:
На вх. значение подаётся температура в шкафу, она должна добраться до уставки, при этом не выходя за пределы этой уставки благодаря изменению выходного сигнала, т.е. изменению мощности работы ТЭНа.
На деле получается, что температура доходит до уставки, и только потом вых. значение начинает меняться, до изменения она стабильно висит на 100%. Что подскажете делать?

V0lodya
02.05.2023, 16:09
Дополню: делаю на Codesys 3.5 SP16 patch 3

west
02.05.2023, 19:18
На вх. значение подаётся температура в шкафу
Может я стал плохо видеть, но вход регулятора (PID), подаётся выход (word) со счётчика импульсов.

krollcbas
03.05.2023, 03:43
Вам нужно на выходе с блока PID придумать ШИМ

67676

67677

SlavikP
03.05.2023, 06:56
делал нечто подобное, но использовал стандартные библиотечные блоки.


FUNCTION_BLOCK MY_PWM
VAR_INPUT
Enable:BOOL; //Разрешение работы
Y:REAL; //Вход от ПИД регулятора 0...100%
END_VAR
VAR_OUTPUT
Out:BOOL; //Выход на исполнительный механизм (нагреватель)
END_VAR
VAR
TL,TH:lin_trafo;
Time_Low,Time_High:TIME;
BL:blink;
END_VAR

TL(IN:=Y, IN_MIN:=0,IN_MAX:=100,OUT_MIN:=9500,OUT_MAX:=500); // Расчет длительности паузы (мс)
TH(IN:=Y, IN_MIN:=0,IN_MAX:=100,OUT_MIN:=500,OUT_MAX:=9500); //Расчет длительности импульса (мс)
Time_Low:=REAL_TO_TIME(TL.OUT);
Time_High:=REAL_TO_TIME(TH.OUT);
BL(ENABLE:=TRUE, TIMELOW:=Time_Low, TIMEHIGH:=Time_High);
Out:=BL.OUT AND Enable;

Существует еще блок CTRL_PWM в библиотеке OSCAT, который делает в сущности то же самое.

Sulfur
04.05.2023, 07:46
V0lodya
У меня есть подозрения, что в данном случае коэффициенты Ki и Kd имеют слишком малое значение.
--
Можно попробовать принудительно ограничить мощность по мере похода актуального значения к уставке.
Например:
IF sett-ACTUAL <= 2 //если разница между заданием и актуальными данными меньше 2;
THEN Y_MAX :=90; //то ограничиваем выход ПИД до 90%
ELSE Y_MAX :=100; //иначе работаем без ограничений
END_IF;