Страница 50 из 51 ПерваяПервая ... 4048495051 ПоследняяПоследняя
Показано с 491 по 500 из 509

Тема: ПИД регулятор

  1. #491

    По умолчанию

    PID_REG_CE из библиотеки PID_REG_CE (23_12_10). lib 23.12.10
    Нашел единственный регулятор который, кроме Y.REAL выход, имеет дискретный выход БОЛБШЕ, МЕНЬШЕ. При опробовании в режиме эмуляция, он моргает при разбалансе, но скважность и длительность импульсов не отличается при минимальном, максимальном разбалансе.
    Я вроде читал, что нужны разные приблуды, для формировании ШИМ на выходе регулятора. Надеюсь на совет.
    Спасибо.

  2. #492

    По умолчанию

    При управлении клапанами "Больше/меньше" использую простой блок PID
    Его выход 0 -100% завожу на свой блок разделения по импульсам.
    Если вам нужно, вышлю ЛС
    +79104444236
    С уважением,
    Лапшин Вячеслав

  3. #493

    По умолчанию

    Пожалуйста, буду весьма признателен. И Желательно, если выход -100 +100.
    Последний раз редактировалось Игорь Владиславович; 23.03.2024 в 12:30.

  4. #494

    По умолчанию

    Цитата Сообщение от krollcbas Посмотреть сообщение
    При управлении клапанами "Больше/меньше" использую простой блок PID
    Его выход 0 -100% завожу на свой блок разделения по импульсам.
    Если вам нужно, вышлю ЛС
    ООООчень нужно. Выход -100..+100

  5. #495

    По умолчанию

    Выслал. На что будет ругаться - закомментируйте, это отладочная информация
    +79104444236
    С уважением,
    Лапшин Вячеслав

  6. #496

    По умолчанию

    Цитата Сообщение от krollcbas Посмотреть сообщение
    Выслал. На что будет ругаться - закомментируйте, это отладочная информация
    не получил (

  7. #497

    По умолчанию

    Делал на основе ФБ PID из Util.lib.
    Но он получился костыль на костыле (как внутри самого ФБ, так и в программе, использующей этот ФБ), хотя и работал.
    Сам ФБ:
    Код:
    FUNCTION_BLOCK PID_3_POS
    (*
    Идея взята по ссылке
    https://www.asutp-volgograd.com/blog/pid-regulator-codesys.html
    из файла "pid_valve_new.exp"
    
    Блоки из овеновских библиотек работают только на ОВЕН ПЛК,
    т.к. реализация кода зашита в сам контроллер.
    Поэтому в эмуляции работать ничего не будет.
    
    В случае управления КЗР без обратной связи о положении штока
    ПИД на самом деле не имеет границ: при достижении условных 100%
    на выходе он сбрасывается в 0 и продолжает расти дальше.
    Следующий после перехода импульс игнорируется.
    
    Первый импульс после сброса требуется пропустить из-за того, что
    ФБ VALVE_REG_NO_POS не сбрасывает внутреннюю переменную "текущее
    положение привода" на 50%, поэтому создаётся положение, когда
    на входе IN_VAL значение 50%, а в переменной 100% (или 0%)
    и ФБ формирует импульс в противоположную сторону.
    Чтобы этот импульс быстрее выполнился - добавил замену временных
    параметров этого блока на близкие к нулю.
    
    Чтобы избежать ударного перехода Руч-Авто, значение выхода Y (PID)
    подал на вход Y_MANUAL (PID).
    
    Для исключения "залипания" внешнего сброса интегральной составляющей,
    входной сигнал bReset подал через выделитель переднего фронта.
    *)
    VAR
    	pidPID: PID;
    	ltScale: LIN_TRAFO;
    	vlValve: VALVE_REG_NO_POS;
    	ftF_TRIG: F_TRIG;
    	rsOut_Enable: RS;
    	tpAutoResetBIAS: TP;		(* таймер автоматического сброса накопленной
    								интегральной составляющей при возникновении переполнения *)
    	rtrigResetPulse: R_TRIG;
    	rFMT: REAL;		(*время полного хода - с учётом сброса накопленной интегральной*)
    	rMW: REAL;		(*минимальное время импульса с учётом сброса*)
    	rDBand: REAL;		(*зона нечувствительности позиционирования привода
    			с учётом сброса интегральной составляющей*)
    	rLT: REAL;		(*время люфта*)
    	rRT: REAL;		(*пауза перед реверсом*)
    	rMS: REAL;
    END_VAR
    VAR_INPUT
    	rPV: REAL;					(* Измеренное значение *)
    	rSP: REAL;					(* Уставка *)
    	rKp: REAL;					(* Коэффициент пропорциональности *)
    	diTi_s: DINT;				(* Время интегрирования, в секундах *)
    	rTd_s: REAL;				(* Время дифференцирования в секундах *)
    	bReset: BOOL;				(* Внешний сигнал сброса накопленной интегральной составляющей *)
    	bManual: BOOL;				(* переключение Руч/Авт 0/1 *)
    (*	rYManual: REAL;				 значение выхода при Руч *)
    	rDBF: REAL;					(* Зона нечувствительности позиционирования *)
    	rFullMotionTime: REAL;		(* Время полного хода *)
    	rLuftTime: REAL;			(* Длительность люфта *)
    	rReverseTime: REAL;			(* Пауза перед реверсом привода *)
    	rMinWork: REAL;				(* Минимальная длительность импульса на привод *)
    	rMinStop: REAL;				(* Минимальное время для остановки привода *)
    	tofOverflow: TOF;
    END_VAR
    VAR_OUTPUT
    	bClose: BOOL;
    	bOpen: BOOL;
    END_VAR
    11.PNG

    PID_3_POS.EXP.zip



    Использование:
    Код:
    FUNCTION DeadBand : REAL
    VAR_INPUT
    	rPV, rSP, rDeadBand: REAL;
    END_VAR
    VAR
    END_VAR
    
    IF rPV<rSP-rDeadBand THEN
    	DeadBand := rPV+rDeadBand;
    ELSIF rPV>rSP+rDeadBand THEN
    	DeadBand := rPV-rDeadBand;
    ELSE
    	DeadBand := rSP;
    END_IF;
    Код:
    (* Регулятор действует непрерывно *)
    pidLevel(
    	rPV				:= DeadBand(rLevel, rLevel_PID_SP, rLevel_PID_DBand),	(* Измеренное значение *)
    	rSP				:= rLevel_PID_SP,										(* Уставка *)
    	rKp				:= rLevel_PID_Kp,										(* Коэффициент пропорциональности *)
    	diTi_s			:= diLevel_PID_Ti,										(* Время интегрирования, в секундах *)
    	rTd_s			:= rLevel_PID_Td,										(* Время дифференцирования в секундах *)
    	bReset			:= FALSE,												(* Внешний сигнал сброса накопленной интегральной составляющей *)
    	bManual			:= NOT xLevelValveInAuto,								(* переключение Руч/Авт 0/1 *)
    	rDBF			:= rLevel_Act_DBand,									(* Зона нечувствительности позиционирования *)
    	rFullMotionTime	:= rLevel_Act_FullMotionTime,							(* Время полного хода *)
    	rLuftTime		:= rLevel_Act_LuftTime,									(* Длительность люфта *)
    	rReverseTime	:= rLevel_Act_ReverseTime,								(* Пауза перед реверсом привода *)
    	rMinWork		:= rLevel_Act_MinWorkTime,								(* Мининмальная длительность импульса на привод *)
    	rMinStop		:= rLevel_Act_MinStopTime,								(* Минимальное время для остановки привода *)
    	bClose			=> yLevelValveDown,
    	bOpen			=> yLevelValveUp
    );
    (* костыль для отключения переполнения при abs(Кп*(SP-PV)) >= 100 - тогда регулятор зависает и отключает выходы *)
    rTemp := (rLevel_PID_SP-DeadBand(rLevel, rLevel_PID_SP, rLevel_PID_DBand))*rLevel_PID_Kp;
    IF (ABS(rTemp) >= 100) THEN
    	IF rTemp>0 THEN
    		yLevelValveDown := FALSE;
    		yLevelValveUp := TRUE;
    	ELSE
    		yLevelValveDown := TRUE;
    		yLevelValveUp := FALSE;
    	END_IF;
    END_IF;


    Если есть время, попробуйте самостоятельно сделать и отладить ПИ регулятор по простым формулам и их физическому представлению.
    Как только у меня появилось время - сам и сделал собственный. Это несложно.


    Идея своего ПИД простая.

    Физическая аналогия следующая:
    1) по формуле ПИД производится периодическая "зарядка конденсатора"
    2) если привод перемещается, то с периодом 100 мс (или 50 мс - не важно) производится "разрядка" конденсатора на величину, пропорциональную времени полного хода, которая прекращается при "полном разряде конденсатора"

    Имеется формула ПИД в конечных разностях, т.е. по которой периодически пересчитывается выходное воздействие регулятора ("заряд конденсатора").

    Т.е. запускаете таймер BLINK с заданным периодом и по приходу фронта импульса выполняете пересчёт.

    Параллельно с этим, действует открытие или закрытие регулирующего органа, которое работает по собственному таймеру BLINK. По фронту (спаду) этого таймера производится "разряд конденсатора" на величину, пропорциональную времени полного хода.

    Также, нужно учесть возможное "взвинчивание интегральной составляющей" и ограничить "заряд конденсатора" величиной 105-120%.

    Можно поместить вызов ФБ в периодические задачи, нужно только, чтобы период вызова совпадал с пересчётом "разряда" при перемещении регулирующего органа.

    Тут подробнее описал такой ФБ для OwenLogic
    https://owen.ru/forum/showthread.php...l=1#post430251

    Свободного времени сейчас у меня мало, поэтому в CDS ничего переносить и отлаживать не буду.
    Последний раз редактировалось FPavel; 23.03.2024 в 15:13.

  8. #498

    По умолчанию

    Павел, Спасибо. Буду пробовать.

  9. #499

    По умолчанию

    Снимок экрана (1).png
    Не хочет моргать. На F_TRIG приходит , на выходе нуль.

  10. #500

    По умолчанию

    Типа, на ПИД параметр 70, уставка 50, а на выходе нуль. Попробую найти адекватный ПИД. И к тому же нужно не только открывать арматуру, но и закрывать. Нужно прикрутить еще лабуду.
    Снимок экрана (2).png

Страница 50 из 51 ПерваяПервая ... 4048495051 ПоследняяПоследняя

Похожие темы

  1. регулятор
    от Egor в разделе ПЛК63/73
    Ответов: 8
    Последнее сообщение: 23.02.2011, 10:58
  2. пид регулятор плк 150 и.м.
    от mihan-987654321 в разделе ПЛК1хх
    Ответов: 3
    Последнее сообщение: 23.09.2010, 12:17
  3. пид регулятор с шим в 110-60
    от AKHolod в разделе ПЛК1хх
    Ответов: 2
    Последнее сообщение: 07.07.2010, 14:19
  4. ПИД-регулятор
    от trunf в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 14.11.2008, 23:17
  5. ПИД регулятор
    от Александр М в разделе ПЛК1хх
    Ответов: 6
    Последнее сообщение: 22.10.2007, 08:47

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •