Страница 47 из 52 ПерваяПервая ... 374546474849 ... ПоследняяПоследняя
Показано с 461 по 470 из 540

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

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    По умолчанию

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

  2. #2

    По умолчанию

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

  3. #3

    По умолчанию

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

  4. #4

    По умолчанию

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

  5. #5

    По умолчанию

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

  6. #6

    По умолчанию

    Цитата Сообщение от krollcbas Посмотреть сообщение
    Выслал. На что будет ругаться - закомментируйте, это отладочная информация
    Пока ругаться не на что. Менял уставку, параметр, Setpoint. Никакой реакции на выходах. Непонятно, как использовать этот ФБ. Это не ПИД регулятор, и не ШИМ. Если бы был один единственный вход разбаланса от ПИД регулятора, и два выхода (больше, меньше), тогда было бы понятно. Если на входе меньше нуля, нужно ОТК, если больше нуля нужно ЗАКР. И чтобы скважность и длительность импульсов была пропорциональна величине разбаланса. Пример: на входе -1.0 значит импульс 0.2 сек скважность 10 сек. на выходе ОТКР. Если на входе -10.0, тогда импульс 2 сек, скважность 8 сек. Если на входе -50, тогда импульс выход ОТКР вообще не гаснет. И тоже самое для +1...+50 только для сигнала ЗАКР.
    Вы конечно мне можете посоветовать самому написать алгоритм. Но я только три недели в теме, потому что на больничном. и когда выйду на работу, мне нужно будет сделать главному инженеру техническое решение на реконструкцию автоматики одному из шести котлоагрегатов. Там 14 регуляторов. Хорошие регуляторы у ЗЭИМ на ПЛК, но они дорогие, и с закрытым доступом к программированию.
    Если я эту проблему не решу в оставшиеся две недели, то ухожу с этой темы.
    Снимок экрана (3).png

  7. #7

    По умолчанию

    Делал на основе ФБ 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. #8

    По умолчанию

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

  9. #9

    По умолчанию

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

  10. #10

    По умолчанию

    Цитата Сообщение от Игорь Владиславович Посмотреть сообщение
    Снимок экрана (1).png
    Не хочет моргать. На F_TRIG приходит , на выходе нуль.
    В комментариях к ФБ есть строки
    Блоки из овеновских библиотек работают только на ОВЕН ПЛК,
    т.к. реализация кода зашита в сам контроллер.
    Поэтому в эмуляции работать ничего не будет.
    Что они означают?

Страница 47 из 52 ПерваяПервая ... 374546474849 ... ПоследняяПоследняя

Похожие темы

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

Ваши права

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