FUNCTION "PidReg" : VOID
TITLE ="PID Regulation"
AUTHOR : BenBen
VERSION : 1.0
VAR_INPUT
En : BOOL ; //PID Enable
Suspend : BOOL ; //Restore the state of previous cycle
Input : REAL ; //Input value (Input = Setpoint - Mesure)
LimInpH : REAL ; //Highter limit of PID input
LimInpL : REAL ; //Lower limit of PID input
BandP : REAL ; //Symetric DeadBand applied on the proportionnal part
BandI : REAL ; //Symetric DeadBand applied on the integral part
GainP : REAL ; //KP
GainI : REAL ; //KI
GainD : REAL ; //KD
LimPH : REAL ; //Highter limit of the proportionnal part
LimPL : REAL ; //Lower limit of the proportionnal part
LimIH : REAL ; //Highter limit of the integral part
LimIL : REAL ; //Lower limit of the integral part
LimDH : REAL ; //Highter limit of the derivative part
LimDL : REAL ; //Lower limit of the derivative part
LimOutH : REAL ; //Highter limit of PID output
LimOutL : REAL ; //Lower limit of PID output
Tc : REAL ; //Cycle time
END_VAR
VAR_OUTPUT
Output : REAL ; //Output value
Out_sat : BOOL ; //Saturation of the PID
END_VAR
VAR_IN_OUT
Prop : REAL ; //Proportionnal part
Intg : REAL ; //Integral part
Der : REAL ; //Derivative part
Ecart_Prec : REAL ;
END_VAR
VAR_TEMP
Ecart : REAL ;
Ecart_Abs : REAL ;
ErrP : REAL ;
ErrI : REAL ;
ErrD : REAL ;
Intg_Prec : REAL ;
END_VAR
BEGIN
NETWORK
TITLE =Test Ecart
L #Input;
T #Ecart;
L #Intg;
T #Intg_Prec;
L #Ecart; // Test Ecart > Highter limit of PID input
L #LimInpH;
>R ;
JC jp01;
L #Ecart; // Test Ecart < Lower limit of PID input
L #LimInpL;
JC jp02;
JU jp03;
jp01: L #LimInpH;
T #Ecart;
JU jp03;
jp02: L #LimInpL;
T #Ecart;
jp03: L #Ecart;
ABS ;
T #Ecart_Abs;
NETWORK
TITLE =Calcul Proportionnel
L #Ecart_Abs; // Test Ecart > Symetric DeadBand applied on the proportionnal part
L #BandP;
>R ;
JC jp21;
L 0.000000e+000;
T #ErrP;
JU jp22;
jp21: L #Ecart;
T #ErrP;
jp22: L #GainP; // Calcul of the proportionnal part
L #ErrP;
*R ;
T #Prop;
L #Prop; // Test Prop > Highter limit of the proportionnal part
L #LimPH;
>R ;
JC jp23;
L #Prop; // Test Prop < Lower limit of the proportionnal part
L #LimPL;
JC jp24;
JU jp25;
jp23: L #LimPH;
T #Prop;
JU jp25;
jp24: L #LimPL;
T #Prop;
jp25: NOP 0;
NETWORK
TITLE =Calcul Integral
L #Ecart_Abs; // Test Ecart > Symetric DeadBand applied on the proportionnal part
L #BandI;
>R ;
JC jp31;
L 0.000000e+000;
T #ErrI;
JU jp32;
jp31: L #Ecart;
T #ErrI;
jp32: L #GainI; // Calcul of the integral part
L #ErrI;
*R ;
L #Tc;
*R ;
L #Intg_Prec;
+R ;
T #Intg;
L #Intg; // Test Intg > Highter limit of the integral part
L #LimIH;
>R ;
JC jp33;
L #Intg; // Test Intg < Lower limit of the integral part
L #LimIL;
JC jp34;
JU jp35;
jp33: L #LimIH;
T #Intg;
JU jp35;
jp34: L #LimIL;
T #Intg;
jp35: NOP 0;
NETWORK
TITLE =Calcul Derivative
L #Ecart; // Calcul of the derivative part
L #Ecart_Prec;
-R ;
L #GainD;
*R ;
L #Tc;
/R ;
T #Der;
L #Der; // Test Der > Highter limit of the derivative part
L #LimDH;
>R ;
JC jp43;
L #Der; // Test Der < Lower limit of the derivative part
L #LimDL;
JC jp44;
JU jp45;
jp43: L #LimDH;
T #Der;
JU jp45;
jp44: L #LimDL;
T #Der;
jp45: NOP 0;
NETWORK
TITLE =Output = Prop + Int + Der
A #Suspend;
JC jp50;
L #Prop; // Calcul of the output value
L #Intg;
+R ;
L #Der;
+R ;
T #Output;
L #Output; // Test Out > Highter limit of PID output
L #LimOutH;
>R ;
JC jp53;
L #Output; // Test Der < Lower limit of PID output
L #LimOutL;
JC jp54;
R #Out_sat;
JU jp50;
jp53: L #LimOutH;
T #Output;
S #Out_sat;
JU jp50;
jp54: L #LimOutL;
S #Out_sat;
T #Output;
jp50: L #Ecart;
T #Ecart_Prec;
NETWORK
TITLE =Reset
A #En;
JC jp60;
L 0.000000e+000;
T #Output;
T #Prop;
T #Intg;
T #Der;
R #Out_sat;
jp60: NOP 0;
END_FUNCTION