Показано с 1 по 10 из 19

Тема: плк63 сбой работы

Древовидный режим

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

    По умолчанию

    Цитата Сообщение от kolyan Посмотреть сообщение

    Интересно! Если у Вас вместо датчика резистор, то интегральная составляющая регулятора будет стремиться уменьшить рассогласование между входным значением и уставкой.
    Но, так как при попытках регулятора воздействовать на объект регулирования, сопротивление Вашего резистора остаётся неизменным, а значит и измеренное значение также остаётся неизменным, то начинает накапливаться интегральная составляющая. И накапливаться она будет до тех пор, пока не произойдёт переполнение. Чем меньше время интегрирования, тем быстрее произойдёт переполнение. Но, даже, если время указано значительное, то при данном опыте переполнение всё равно произойдёт, хотя и позже.
    хорошо, допустим я с этим согласен, вопрос остается тогда почему на РАБОЧЕЙ!!! установке случается даное переполнение?но я все таки не согласен:
    1. АЦП не будет держать стабильное значение, оно будет колеблится пускай даже в раене тысячных
    2. если бы было переполнение по Интегральной составляющей согласно Вашей теории то переполнение было по выходу, а на скрине видно что выход "-329,4446" это не переполнение, также видно со скрина что переполнение по входу!

    вот код ращета интегральной составляющей
    FUNCTION_BLOCK INTEGRAL
    VAR_INPUT
    IN:REAL; (* input variable *)
    TMWORD; (* time since last call in msec *)
    RESET:BOOL; (* reset: OUT is set to zero and OVERFLOW to false *)
    END_VAR
    VAR_OUTPUT
    OUT:REAL; (* value of the integral *)
    OVERFLOW:BOOL:=FALSE; (* overflow *)
    END_VAR
    VAR
    END_VAR
    IF RESET THEN
    OUT:=0;
    OVERFLOW:=FALSE;
    ELSIF NOT OVERFLOW THEN
    IF 1E38 - IN*TM < OUT OR -1E38 - IN*TM > OUT THEN
    OVERFLOW:=TRUE;
    ELSE
    OUT:=OUT+IN*TM/1000;
    END_IF;
    END_IF;
    вот как берется параметр IN
    FUNCTION_BLOCK PID
    VAR_INPUT
    ACTUAL :REAL; (* actual value, process variable *)
    SET_POINT:REAL; (* desired value, set point *)
    KP:REAL; (* proportionality const. (P)*)
    TN:REAL; (* reset time (I) in sec *)
    TV:REAL; (* rate time, derivative time (D) in sec*)
    Y_MANUAL:REAL; (* Y is set to this value as long as MANUAL=TRUE *)
    Y_OFFSET:REAL; (* offset for manipulated variable *)
    Y_MIN:REAL; (* minimum value for manipulated variable *)
    Y_MAX:REAL; (* maximum value for manipulated variable *)
    MANUAL:BOOL; (* TRUE: manual: Y is not influenced by controller,
    FALSE: controller determines Y *)
    RESET:BOOL; (* reset: set Y output to Y_OFFSET and reset integral part *)
    END_VAR
    VAR_OUTPUT
    Y:REAL; (* manipulated variable, set value*)
    LIMITS_ACTIVE:BOOL:=FALSE; (* true set value would exceed limits Y_MIN, Y_MAX *)
    OVERFLOW:BOOL:=FALSE; (* overflow in integral part *)
    END_VAR
    VAR
    CLOCK:TON;
    I: INTEGRAL;
    D: DERIVATIVE;
    TMDIFF: DWORD;
    ERROR: REAL;
    INIT: BOOL:=TRUE;
    Y_ADDOFFSET: REAL;
    KPcopy:REAL;
    TNcopy:REAL;
    TVcopy:REAL;
    END_VAR
    IF TN>0 AND KP<> 0 AND (NOT OVERFLOW OR RESET OR MANUAL) THEN
    ERROR := SET_POINT-ACTUAL; (* Regeldifferenz *)

    IF RESET OR MANUAL OR INIT OR (KP<>KPcopy OR TN<>TNcopy OR TV<>TVcopy) THEN (* Reset oder Handbetrieb *)
    I(RESET:=TRUE);
    D(RESET:=TRUE);
    OVERFLOW:=FALSE;
    LIMITS_ACTIVE:=FALSE;
    IF RESET OR INIT THEN
    Y := Y_OFFSET;
    INIT:=FALSE;
    Y_ADDOFFSET := 0;
    ELSIF MANUAL THEN
    Y := Y_MANUAL;
    Y_ADDOFFSET := Y_MANUAL-(Y_OFFSET+KP*(ERROR+I.OUT/TN+D.OUT*TV));
    ELSE
    Y_ADDOFFSET := Y - Y_OFFSET - KP*ERROR;
    END_IF
    TMDIFF:=0;
    CLOCK(IN:=FALSE); (* Timer neu starten *)
    CLOCK(PT:=t#1h, IN:=TRUE);

    TNcopy := TN;
    TVcopy := TV;
    KPcopy := KP;
    ELSE
    CLOCK; (* Timer abfragen *)
    TMDIFF:=TIME_TO_DWORD(CLOCK.ET); (* Zeitdifferenz seit letztem Aufruf *)
    END_IF;

    IF TMDIFF>0 THEN
    CLOCK(IN:=FALSE); (* Timer neu starten *)
    CLOCK(PT:=t#1h, IN:=TRUE);

    D(IN:=ERROR, TM:=TMDIFF, RESET:=FALSE); (* Differential abschдtzen *)
    I(IN:=ERROR, TM:=TMDIFF, RESET:=FALSE); (* Integral abschдtzen *)

    OVERFLOW := I.OVERFLOW;
    IF NOT OVERFLOW THEN
    Y:=Y_OFFSET+KP*(ERROR+I.OUT/TN+D.OUT*TV) + Y_ADDOFFSET;
    IF Y>1E30 OR Y<-1E30 THEN (* Overflow steht bevor, darf aber eigentlich nicht passieren *)
    OVERFLOW:=TRUE;
    END_IF;

    LIMITS_ACTIVE:=FALSE;
    IF Y_MAX>Y_MIN AND Y>Y_MAX THEN (* Stellwert-Obergrenze ьberschritten *)
    LIMITS_ACTIVE:=TRUE;
    IF KP<>0 THEN
    I(IN:=(Y_MAX-Y)*TN/KP,TM:=1000,RESET:=FALSE); (* Integral korrigieren *)
    END_IF
    Y:=Y_MAX;
    END_IF;
    IF Y_MAX>Y_MIN AND Y<Y_MIN THEN (* Stellwert-Untergrenze unterschritten *)
    LIMITS_ACTIVE:=TRUE;
    IF KP<>0 THEN
    I(IN:=(Y_MIN-Y)*TN/KP,TM:=1000,RESET:=FALSE); (* Integral korrigieren *)
    END_IF
    Y:=Y_MIN;
    END_IF;
    END_IF;
    ELSE
    CLOCK(PT:=t#1h,IN:=TRUE);
    END_IF;

    END_IF;
    собсно не понять почему если у меня вход константа происходит прыжок параметра
    Последний раз редактировалось relline; 11.03.2011 в 09:23.

Ваши права

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