```pascal 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 ```