11 KiB
11 KiB
FUNCTION_BLOCK "BlenderPID_PIDFFCalc"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : 'Author'
FAMILY : TASK1
NAME : 'Name'
VERSION : 1.0
VAR
mWaterFF_SlewLimit : "SlewLimit";
mSP_SYR_Flow : Real;
END_VAR
BEGIN
"PID_Variables".PPN301FrictionLoss := "FrictionLoss"(i_Flow := "Blender_Variables".gSP_H2O,
i_K := "HMI_Blender_Parameters".ProcessSetup._KWaterLoss,
i_Dens := "Blender_Constants".gH2O_Density) ;
IF "PID_Variables".PPN301FrictionLoss > "HMI_Blender_Parameters".ProcessSetup._PPN301Pressure THEN
"PID_Variables".PPN301FrictionLoss := "HMI_Blender_Parameters".ProcessSetup._PPN301Pressure ;
ELSIF "PID_Variables".PPN301FrictionLoss < 0 THEN
(* classic code: "PID_Variables".PPN301FrictionLoss := 0.0 ;*)
"PID_Variables".PPN301FrictionLoss := REAL#0.0 ;
END_IF;
"PID_Variables".PPP302FrictionLoss := "FrictionLoss"(i_Flow := "Blender_Variables".gSP_SYR,
i_K := "HMI_Blender_Parameters".ProcessSetup._KSyrupLoss,
i_Dens := "Blender_Variables".gActualSyrupDens) ;
"gHProcessSetup_KWatPump" := (("HMI_Blender_Parameters".ProcessSetup._PPN301Pressure * 10) / 2500) ; (* Kwat = Pwat [METERS]/(fxf) f=50Hz*)
IF "PID_Variables".PPP302FrictionLoss > "HMI_Blender_Parameters".ProcessSetup._PPP302Pressure THEN
"PID_Variables".PPP302FrictionLoss := "HMI_Blender_Parameters".ProcessSetup._PPP302Pressure ;
ELSIF "PID_Variables".PPP302FrictionLoss < 0 THEN
(* classic code: "PID_Variables".PPP302FrictionLoss := 0.0 ;*)
"PID_Variables".PPP302FrictionLoss := REAL#0.0 ;
END_IF;
IF "gBlenderBlending" THEN
IF "HMI_PID".RMM301.ManualControl.PidEnable THEN
IF "gEqPressSelected" THEN
"PID_Variables".RMM301DeltaP := "HMI_Blender_Parameters".ProcessSetup._PPN301Pressure + "HMI_Instrument".PTN313.PVFiltered - "PID_Variables".PPN301FrictionLoss - "HMI_PID".RVM301.Pv ;
ELSE
"PID_Variables".RMM301DeltaP := "HMI_Blender_Parameters".ProcessSetup._PPN301Pressure + "HMI_Instrument".PTN313.PVFiltered - "PID_Variables".PPN301FrictionLoss - "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdTankPress ;
END_IF;
IF "gBlenderStableFlow" THEN
// 100% / 12.5 sec = 8 %/sec slew LIMIT TO Water PID Feed Forward
#mWaterFF_SlewLimit(i_InValue := "FeedForward"(i_Flow := "Blender_Variables".gSP_H2O,
i_KFF := "HMI_PID".RMM301.Ff,
i_Delta_P := "PID_Variables".RMM301DeltaP),
i_SlewMax := 8,
i_Cycle := "Time_300ms",
out := "HMI_PID".RMM301.FfOut) ;
ELSE
"HMI_PID".RMM301.FfOut := "FeedForward"(i_Flow:="Blender_Variables".gSP_H2O ,i_KFF:="HMI_PID".RMM301.Ff, i_Delta_P:="PID_Variables".RMM301DeltaP) ;
END_IF;
IF NOT "gModValveRiseTimeCalcEn" THEN
"gModValveRiseTimeCalcEn":= TRUE ;
"Blender_Variables".gH2OValveRiseUpTime := REAL_TO_INT ("HMI_PID".RMM301.FfOut / 18) ;
END_IF;
END_IF;
ELSE
(* classic code: "HMI_PID".RMM301.FfOut := 0.0 ;*)
"HMI_PID".RMM301.FfOut := REAL#0.0 ;
"gModValveRiseTimeCalcEn" := FALSE ;
END_IF;
(* classic code: IF "HMI_PID".PPN301.Out <= 0.0 THEN*)
IF "HMI_PID".PPN301.Out <= REAL#0.0 THEN
"P1_Pressure" := "HMI_Blender_Parameters".ProcessSetup._PPN301Pressure;
ELSE
"P1_Pressure" := ("gHProcessSetup_KWatPump"*(SQR("HMI_PID".PPN301.Out))/10) - "PID_Variables".PPN301FrictionLoss;
END_IF;
IF "gBlenderBlending" THEN
IF "HMI_PID".RMP302.ManualControl.PidEnable THEN
IF "Procedure_Variables".First_Production.Latch THEN
"PID_Variables".RMP302DeltaP := "HMI_Blender_Parameters".ProcessSetup._PPP302Pressure - "PID_Variables".PPP302FrictionLoss - "HMI_PID".RVM301.Pv ;
ELSE
"PID_Variables".RMP302DeltaP := "HMI_Blender_Parameters".ProcessSetup._PPP302Pressure - "PID_Variables".PPP302FrictionLoss - "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdTankPress ;
END_IF;
"HMI_PID".RMP302.FfOut := "FeedForward"(i_Flow := "Blender_Variables".gSP_SYR ,
i_KFF := "HMI_PID".RMP302.Ff ,
i_Delta_P := "PID_Variables".RMP302DeltaP) ;
END_IF;
ELSIF "gSyrupQcoRinse" OR "Procedure_Variables".FTP302Line_Preparation.Latch THEN
"PID_Variables".RMP302DeltaP := "HMI_Blender_Parameters".ProcessSetup._PPP302Pressure - "PID_Variables".PPP302FrictionLoss ;
"HMI_PID".RMP302.FfOut := "FeedForward"(i_Flow := "Blender_Variables".gSP_SYR ,
i_KFF := "HMI_PID".RMP302.Ff ,
i_Delta_P := "PID_Variables".RMP302DeltaP) ;
ELSE
(* classic code: "HMI_PID".RMP302.FfOut := 0.0 ;*)
"HMI_PID".RMP302.FfOut := REAL#0.0 ;
END_IF;
IF "gBlenderBlending" OR "gP_CarboPipe_En" OR ("HMI_Service".Workshop_Test.CO2TestRequest AND "gWorkshopTest") THEN
IF "HMI_PID".RMM303.ManualControl.PidEnable THEN
IF "HMI_Service".Workshop_Test.CO2TestRequest AND "gWorkshopTest" THEN
"PID_Variables".RMM303DeltaP := "HMI_PID".PCM306.Sp - "HMI_PID".RVM301.Pv ;
ELSE
IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._InverterWaterPumpPPN301 THEN
"PID_Variables".RMM303DeltaP := "HMI_Blender_Parameters".ProcessSetup._CarboCO2Pressure - "P1_Pressure" ;
ELSE
"PID_Variables".RMM303DeltaP := "HMI_Blender_Parameters".ProcessSetup._CarboCO2Pressure - "HMI_Blender_Parameters".ProcessSetup._PPN301Pressure ;
END_IF;
END_IF;
"HMI_PID".RMM303.FfOut := "FeedForward"(i_Flow := "Blender_Variables".gSP_CO2 ,
i_KFF := "HMI_PID".RMM303.Ff ,
i_Delta_P := "PID_Variables".RMM303DeltaP ) ;
IF "HMI_PID".RMM303.FfOut < 0 THEN
"HMI_PID".RMM303.FfOut := 0;
END_IF;
END_IF;
ELSE
(* classic code: "HMI_PID".RMM303.FfOut := 0.0 ;*)
"HMI_PID".RMM303.FfOut := REAL#0.0 ;
END_IF ;
// SECOND GAS INJECTION
IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._CO2_GAS2_Injection THEN
IF "gBlenderBlending" AND "HMI_Blender_Parameters".Actual_Recipe_Parameters._GAS2_Injection
AND ("HMI_Blender_Parameters".Processor_Options.Blender_OPT._GAS2InjectionType > 0) THEN
IF "HMI_PID".RMM304.ManualControl.PidEnable THEN
"PID_Variables".RMM304DeltaP := "HMI_Blender_Parameters".ProcessSetup._GAS2InjectionPress - "HMI_Blender_Parameters".ProcessSetup._PPN301Pressure ;
"HMI_PID".RMM304.FfOut := "FeedForward"(i_Flow := "Blender_Variables".gSP_GAS2 ,
i_KFF := "HMI_PID".RMM304.Ff ,
i_Delta_P := "PID_Variables".RMM304DeltaP ) ;
IF "HMI_PID".RMM304.FfOut < 0 THEN
"HMI_PID".RMM304.FfOut := 0;
END_IF;
END_IF;
ELSE
(* classic code: "HMI_PID".RMM304.FfOut := 0.0 ;*)
"HMI_PID".RMM304.FfOut := REAL#0.0 ;
END_IF ;
ELSE
(* classic code: "HMI_PID".RMM304.FfOut := 0.0 ;*)
"HMI_PID".RMM304.FfOut := REAL#0.0 ;
END_IF ;
IF "gBlenderBlending" THEN
#mSP_SYR_Flow := "Blender_Variables".gSP_SYR ;
ELSIF "Procedure_Variables".FTP302Line_Preparation.Latch OR "Procedure_Variables".FTP302_StartUp.Latch THEN
#mSP_SYR_Flow := "Blender_Constants".gTP301_FirstProdRate ;
ELSIF "gSyrupQcoRinse" THEN
#mSP_SYR_Flow := "Blender_Constants".gTP301_RinseRate ;
ELSE
(* classic code: #mSP_SYR_Flow := 0.0 ;*)
#mSP_SYR_Flow := REAL#0.0 ;
END_IF ;
IF "gBlenderBlending" OR "Procedure_Variables".FTP302Line_Preparation.Latch OR "Procedure_Variables".FTP302_StartUp.Latch OR "gSyrupQcoRinse" THEN
IF "HMI_PID".RVP303.ManualControl.PidEnable THEN
"HMI_PID".RVP303.FfOut := "FeedForward"(i_Flow:=#mSP_SYR_Flow ,
i_KFF:="HMI_PID".RVP303.Ff ,
i_Delta_P:= "HMI_Blender_Parameters".ProcessSetup._SyrupLinePressure) ;
END_IF ;
ELSE
(* classic code: "HMI_PID".RVP303.FfOut := 0.0 ;*)
"HMI_PID".RVP303.FfOut := REAL#0.0 ;
END_IF ;
IF NOT "Blender_Variables_Pers".gSkipDeaireation THEN
IF "gBlenderBlending" OR "Procedure_Variables".TN301_StartUp.Latch THEN
IF "HMI_PID".RVN302.ManualControl.PidEnable THEN
IF "HMI_Device".PPN304.Out THEN
"PID_Variables".RVN302DeltaP := "HMI_Blender_Parameters".ProcessSetup._WaterLinePressure - "HMI_Instrument".PTN313.PVFiltered ;
ELSE
"PID_Variables".RVN302DeltaP := "HMI_Blender_Parameters".ProcessSetup._WaterLinePressure ;
END_IF ;
"HMI_PID".RVN302.FfOut := "FeedForward"(i_Flow := "Blender_Variables".gSP_H2O ,
i_KFF := "HMI_PID".RVN302.Ff ,
i_Delta_P := "PID_Variables".RVN302DeltaP) ;
END_IF ;
ELSE
(* classic code: "HMI_PID".RVN302.FfOut := 0.0 ;*)
"HMI_PID".RVN302.FfOut := REAL#0.0 ;
END_IF ;
ELSE
IF "gBlenderBlending" OR "Procedure_Variables".BlendFill_StartUp.Latch THEN
IF "HMI_PID".RVN302.ManualControl.PidEnable THEN
"PID_Variables".RVN302DeltaP := "HMI_Blender_Parameters".ProcessSetup._WaterLinePressure ;
"HMI_PID".RVN302.FfOut := "FeedForward"(i_Flow := "Filler_Head_Variables".Prod_FlowEstimated ,
i_KFF := "HMI_PID".RVN302_TM301.Ff ,
i_Delta_P := "PID_Variables".RVN302DeltaP) ;
END_IF ;
ELSE
(* classic code: "HMI_PID".RVN302.FfOut := 0.0 ;*)
"HMI_PID".RVN302.FfOut := REAL#0.0 ;
END_IF ;
END_IF;
IF "gGencoldChillerEn" AND "HMI_Blender_Parameters".Actual_Recipe_Parameters._EnProdTemp THEN
(* classic code: "HMI_PID".RVM319_H2O.FfOut := 100.0 - "CVQ_1p7_8_Perc"("HMI_PID".RVM319_H2O.Sp) ;*)
"HMI_PID".RVM319_H2O.FfOut := REAL#100.0 - "CVQ_1p7_8_Perc"("HMI_PID".RVM319_H2O.Sp) ;
(* classic code: "HMI_PID".RVM319_PRD.FfOut := 100.0 - "CVQ_1p7_8_Perc"("HMI_PID".RVM319_PRD.Sp) ;*)
"HMI_PID".RVM319_PRD.FfOut := REAL#100.0 - "CVQ_1p7_8_Perc"("HMI_PID".RVM319_PRD.Sp);
ELSIF
NOT "gGencoldChillerEn" AND "HMI_Blender_Parameters".Actual_Recipe_Parameters._EnProdTemp THEN
(* classic code: "HMI_PID".RVM319_H2O.FfOut := 0.0 ;*)
"HMI_PID".RVM319_H2O.FfOut := REAL#80.0 ;
(* classic code: "HMI_PID".RVM319_PRD.FfOut := 0.0 ;*)
"HMI_PID".RVM319_PRD.FfOut := REAL#80.0 ;
END_IF;
END_FUNCTION_BLOCK