0% found this document useful (0 votes)
143 views4 pages

Continuous PID Controller Guide

This document describes a continuous PID controller function block. It contains inputs for setpoint, process value, PID parameters, limits and other values. It performs PID control logic to calculate the controller output signal, including proportional, integral and derivative terms. Output values include the controller output signal, process value and error.

Uploaded by

Bassel Almouie
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
143 views4 pages

Continuous PID Controller Guide

This document describes a continuous PID controller function block. It contains inputs for setpoint, process value, PID parameters, limits and other values. It performs PID control logic to calculate the controller output signal, including proportional, integral and derivative terms. Output values include the controller output signal, process value and error.

Uploaded by

Bassel Almouie
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 4

FUNCTION_BLOCK "CONT_C"

TITLE ='continuous PID controller'


AUTHOR : MT
FAMILY : ICONT
NAME : CONT_C
VERSION : '1.5'
KNOW_HOW_PROTECT
VAR_INPUT
COM_RST : BOOL := FALSE;
MAN_ON : BOOL := TRUE;
PVPER_ON: BOOL := FALSE;
P_SEL : BOOL := TRUE;
I_SEL : BOOL := TRUE;
INT_HOLD: BOOL := FALSE;
I_ITL_ON : BOOL := FALSE;
D_SEL : BOOL := FALSE;
CYCLE : TIME := T#1S;
SP_INT : REAL := 0.0;
PV_IN : REAL := 0.0;
PV_PER : WORD := W#16#0;
MAN : REAL := 0.0;
GAIN : REAL := 2.0;
TI : TIME := T#20S;
TD : TIME := T#10S;
TM_LAG : TIME := T#2S;
DEADB_W : REAL := 0.0;
LMN_HLM : REAL := 100.0;
LMN_LLM : REAL := 0.0;
PV_FAC : REAL := 1.0;
PV_OFF : REAL := 0.0;
LMN_FAC : REAL := 1.0;
LMN_OFF : REAL := 0.0;
I_ITLVAL : REAL := 0.0;
DISV : REAL := 0.0;
END_VAR
VAR_OUTPUT
LMN : REAL := 0.0;
LMN_PER : WORD := W#16#0;
QLMN_HLM : BOOL := FALSE;
QLMN_LLM : BOOL := FALSE;
LMN_P : REAL := 0.0;
LMN_I : REAL := 0.0;
LMN_D : REAL := 0.0;
PV : REAL := 0.0;
ER : REAL := 0.0;
END_VAR
VAR
sInvAlt : REAL := 0.0;
sIanteilAlt : REAL := 0.0;
sRestInt : REAL := 0.0;
sRestDif : REAL := 0.0;
sRueck : REAL := 0.0;
sLmn : REAL := 0.0;
sbArwHLmOn : BOOL := FALSE;
sbArwLLmOn : BOOL := FALSE;
sbILimOn : BOOL := TRUE;
END_VAR
VAR_TEMP
rCycle : REAL ;
Iant : REAL ;
Diff : REAL ;
Istwert : REAL ;
ErKp : REAL ;
rTi : REAL ;
rTd : REAL ;
rTmLag : REAL ;
Panteil : REAL ;
Ianteil : REAL ;
Danteil : REAL ;
Verstaerk : REAL ;
RueckDiff : REAL ;
RueckAlt : REAL ;
dLmn : REAL ;
gf : REAL ;
rVal : REAL ;
END_VAR
IF COM_RST THEN
sIanteilAlt := I_ITLVAL ;
LMN := 0.0 ;
QLMN_HLM := FALSE ;
QLMN_LLM := FALSE ;
LMN_P := 0.0 ;
LMN_I := 0.0 ;
LMN_D := 0.0 ;
LMN_PER := W#16#0 ;
PV := 0.0 ;
ER := 0.0 ;
sInvAlt := 0.0 ;
sRestInt := 0.0 ;
SRestDif := 0.0 ;
sRueck := 0.0 ;
sLmn := 0.0 ;
sbArwHLmOn := FALSE ;
sbArwLLmOn := FALSE ;
ELSE
rCycle := DINT_TO_REAL( TIME_TO_DINT( CYCLE ) ) / 1000.0 ;
Istwert := DINT_TO_REAL( INT_TO_DINT( WORD_TO_INT ( PV_PER ) ) ) *
0.003616898 ;
Istwert := Istwert * PV_FAC + PV_OFF ;
IF NOT PVPER_ON THEN
Istwert := PV_IN ;
END_IF;
PV := Istwert ;
ErKp := SP_INT - PV ;
IF ErKp < -DEADB_W THEN
ER := ErKp + DEADB_W ;
ELSIF ErKp > DEADB_W THEN
ER := ErKp - DEADB_W ;
ELSE
ER := 0.0 ;
END_IF;
ErKp := ER * GAIN ;
rTi := DINT_TO_REAL( TIME_TO_DINT( TI ) ) / 1000.0 ;
rTd := DINT_TO_REAL( TIME_TO_DINT( TD ) ) / 1000.0 ;
rTmLag := DINT_TO_REAL( TIME_TO_DINT( TM_LAG ) ) / 1000.0 ;
IF rTi < rCycle * 0.5 THEN
rTi := rCycle * 0.5 ;
END_IF;
IF rTd < rCycle THEN
rTd := rCycle ;
END_IF;
IF rTmLag < rCycle * 0.5 THEN
rTmLag := rCycle * 0.5 ;
END_IF;
IF P_SEL THEN
Panteil := ErKp ;
ELSE
Panteil := 0.0 ;
END_IF;
IF I_SEL THEN
IF I_ITL_ON THEN
Ianteil := I_ITLVAL ;
sRestInt := 0.0 ;
ELSIF MAN_ON THEN
Ianteil := sLmn - Panteil - DISV ;
sRestInt := 0.0 ;
ELSE //????
Iant := ( rCycle / rTi ) * ( ErKp + sInvAlt ) * 0.5 + sRestInt ;
IF ( ( Iant > 0.0 AND sbArwHLmOn ) OR INT_HOLD ) OR ( Iant < 0.0 AND
sbArwLLmOn )THEN
Iant := 0.0 ;
END_IF;
Ianteil := sIanteilAlt + Iant ;
sRestInt := sIanteilAlt - Ianteil + Iant ;
END_IF;
ELSE
Ianteil := 0.0 ;
sRestInt := 0.0 ;
END_IF;
Diff := ErKp ;
IF NOT MAN_ON AND D_SEL THEN
Verstaerk := rTd / ( rCycle * 0.5 + rTmLag ) ;
Danteil := ( Diff - sRueck ) * Verstaerk ;
RueckAlt := sRueck ;
RueckDiff := rCycle / rTd * Danteil + sRestDif ;
sRueck := RueckDiff + RueckAlt ;
sRestDif := RueckAlt - sRueck + RueckDiff ;
ELSE //
Danteil := 0.0 ;
sRestDif := 0.0 ;
sRueck := Diff ;
END_IF;
dLmn := Panteil + Ianteil + Danteil + DISV ;
IF MAN_ON THEN
dLmn := MAN ;
ELSE
IF NOT I_ITL_ON AND I_SEL THEN
IF Ianteil > LMN_HLM - DISV AND dLmn > LMN_HLM AND dLmn - LMN_D >
LMN_HLM THEN
rVal := LMN_HLM - DISV ;
gf := dLmn - LMN_HLM ;
rVal := Ianteil - rVal ;
IF rVal > gf THEN
rVal := gf ;
END_IF;
Ianteil := Ianteil - rVal ;
ELSIF Ianteil < LMN_LLM - DISV AND dLmn < LMN_LLM AND dLmn - LMN_D
< LMN_LLM THEN
rVal := LMN_LLM - DISV ;
gf := dLmn - LMN_LLM ;
rVal := Ianteil - rVal ;
IF rVal < gf THEN
rVal := gf ;
END_IF;
Ianteil := Ianteil - rVal ;
END_IF;
END_IF;
END_IF;
LMN_P := Panteil ;
LMN_I := Ianteil ;
LMN_D := Danteil ;
sInvAlt := Erkp ;
sIanteilAlt := Ianteil ;
sbArwHLmOn := FALSE ;
sbArwLLmOn := FALSE ;
IF dlmn >= LMN_HLM THEN
QLMN_HLM := TRUE ;
QLMN_LLM := FALSE ;
dlmn := LMN_HLM ;
sbArwHLmOn := TRUE ;
ELSE
QLMN_HLM := FALSE ;
IF dLmn <= LMN_LLM THEN
QLMN_LLM := TRUE ;
dlmn := LMN_LLM ;
sbArwLLmOn := TRUE ;
ELSE
QLMN_LLM := FALSE ;
END_IF;
END_IF;
sLmn := dLmn ;
dLmn := dLmn * LMN_FAC + LMN_OFF ;
LMN := dLmn ;
dLmn := dLmn* 276.48 ;
IF dLmn >= 32512.0 THEN
dLmn := 32512.0 ;
ELSIF dLmn <= -32512.0 THEN
dLmn := -32512.0 ;
END_IF;
LMN_PER := INT_TO_WORD( DINT_TO_INT( REAL_TO_DINT( dLmn) ) ) ;
END_IF;
END_FUNCTION_BLOCK

You might also like