OSCAT Forum

oscat.lib => oscat.lib fuer Step 7 => Thema gestartet von: mg in 16. Dezember 2025, 06:43:55

Titel: S7-1200 FT_PIWL
Beitrag von: mg in 16. Dezember 2025, 06:43:55

(* initialize at power_up *)
IF NOT #init OR #RST  THEN
    #init := TRUE;
    #in_last := #IN;
    #t_last := "T_PLC_US"();
    #i := 0.0;
    #tc := 0.0;
ELSE
    (* read last cycle time in Microseconds *)
    #tx := "System_Time_DB".us_dw;
    #tc := 1000.0/1024.0*DINT_TO_REAL(DWORD_TO_DINT(#tx) - DWORD_TO_DINT(#t_last));
    #t_last := #tx;

    (* calculate proportional part *)
    #p := #KP * #IN;

    (* run integrator *)
    #i := (#IN + #in_last) * 5.0E-7 * #KI * #tc + #i;
    #in_last := #IN;

    (* calculate output Y *)
    #Y := #p + #i;

    (* check output for limits *)
    IF #Y >= #LIM_H THEN
        #Y := #LIM_H;
        IF #KI <> 0.0 THEN 
            #i := #LIM_H - #p;
        ELSE
            #i := 0.0;
        END_IF;
        #LIM := TRUE;
    ELSIF #Y <= #LIM_L THEN
        #Y := #LIM_L;
        IF #KI <> 0.0 THEN
            #i := #LIM_L - #p;
        ELSE
            #i := 0.0;
        END_IF;
        #LIM := TRUE;
    ELSE
        #LIM := FALSE;
    END_IF;
END_IF;


(* revision history
hm 13. jun. 2008    rev 1.0
    original version

hm  27. oct. 2008   rev 1.1
    integrator will not be adjusted when ki = 0

hm  25. jan 2009    rev 1.2
    module will also work with negative K

hm  11. mar. 2009   rev 1.3
    real constants updated to new systax using dot
*)