FUNCTION_BLOCK PID_control_2 VAR_INPUT ProcesVal :INT; (*proceswaarde*) SetVal :LREAL; (*wenswaarde*) Auto :BOOL; (*als true dan automatisch regelen*) Direct :BOOL; (*als true dan direct acting*) Gain :LREAL; (* Kp *) ResetRate :LREAL; (* Tr *) Derivative :LREAL; (* Td *) END_VAR VAR_OUTPUT ControllerOut :LREAL; (* output in 1/10% *) Err :LREAL; (* eigenlijk geen output, maar handig bij inregelen *) END_VAR VAR testbit : BOOL; TON_pulstijd : TON; TON_pauzetijd : TON; Puls : R_TRIG; ProcesVal_D : LREAL; ProcesValLast : LREAL; ControllerOut_temp : LREAL; Feedback : LREAL; END_VAR testbit := TRUE; (*cyclustijd PID regeling*) TON_pulstijd (in := NOT ton_pauzetijd.Q, PT := t#5s); TON_pauzetijd (in := ton_pulstijd.Q, PT := t#5s); Puls (clk := TON_pulstijd.Q); (*PID regeling*) IF Puls.Q THEN IF (*---------------------------------------------------------------------auto mode*) auto THEN ProcesVal_D := ProcesVal + ( ProcesVal - ProcesValLast ) * Derivative; ProcesValLast := ProcesVal; Err := SetVal - ProcesVal_D; IF direct THEN Err := 0 - Err; END_IF ControllerOut_temp := Err * Gain + Feedback; IF ControllerOut_temp > 1000 THEN ControllerOut_temp := 1000; END_IF IF ControllerOut_temp < 0 THEN ControllerOut_temp := 0; END_IF ControllerOut := ControllerOut_temp; Feedback := Feedback + ( Controllerout - Feedback ) * ResetRate; ELSE ProcesValLast := Procesval; Feedback := 0; ControllerOut := 0; END_IF (*-------------------------------------------------------------------------------*) END_IF