```pascal FUNCTION_BLOCK "BlenderPID_PIDSPCalc" { S7_Optimized_Access := 'FALSE' } AUTHOR : 'Author' FAMILY : TASK1 NAME : 'Name' VERSION : 1.0 VAR mCriticalBlending : Bool; TimerConvDINT : DInt; TimerConvTIME : Time; TimerConvS5TIME : S5Time; mTargetRatioSlewOut : Real; mBevBrixDelta : Real; mTargetProdSlwd : "SlewLimit"; mTargetFillerProdSlwd : "SlewLimit"; mTargetRatioSlwd : "SlewLimit"; mTargetSyrupLvlSlwd : "SlewLimit"; mTargetDeairLvlSlwd : "SlewLimit"; mTargetStorgLvlSlwd : "SlewLimit"; END_VAR VAR_TEMP ValBinTmr131 : Word; ValBcdTmr131 : S5Time; END_VAR BEGIN IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._BrixMeter AND "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdMeterHighBrix > "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductBrix AND "AUX FALSE" THEN (* classic code: #mBevBrixDelta := ("HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdMeterHighBrix - "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductBrix) / 2.0 ;*) #mBevBrixDelta := ("HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdMeterHighBrix - "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductBrix) / REAL#2.0 ; ELSE // mBevBrixDelta := 0.1 ; Pepsico Vitoria Plant - New Eurostar 2000 140 Valves (* classic code: #mBevBrixDelta := 0.06 ;*) #mBevBrixDelta := REAL#0.06 ; //Coca Cola Begano Plant - New Starcans 2000 91 Valves END_IF; IF "Blender_Variables_Pers".gSugarBeverage AND "HMI_Blender_Parameters".Actual_Recipe_Parameters._SyrupBrix <> 0 THEN IF "Procedure_Variables".First_Production.Latch THEN "Blender_Variables".gActualSyrupPerc := ("HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductBrix + "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdBrixOffset + "Blender_Variables".gFirstProdExtraBrix) / "Blender_Variables".gActualSyrupBrix ; ELSE "Blender_Variables".gActualSyrupPerc := ("HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductBrix + "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdBrixOffset + "Blender_Variables".gBrixTrackingCorr) / "Blender_Variables".gActualSyrupBrix ; END_IF; ELSE IF "Procedure_Variables".First_Production.Latch THEN "Blender_Variables".gActualSyrupPerc := 1 / ("HMI_Blender_Parameters".Actual_Recipe_Parameters._Ratio + 1 ) + "Blender_Variables".gFirstProdDietExtraSyr ; // During First Production: syrup injection 1.2% more ELSE "Blender_Variables".gActualSyrupPerc := 1 / ("HMI_Blender_Parameters".Actual_Recipe_Parameters._Ratio + 1 ) ; END_IF; END_IF; IF "Blender_Variables_Pers".gWaterRecipe THEN (* classic code: "Blender_Variables".gActualWaterPerc := 1.0 ;*) "Blender_Variables".gActualWaterPerc := REAL#1.0 ; (* classic code: "Blender_Variables".gActualSyrupPerc := 0.0 ;*) "Blender_Variables".gActualSyrupPerc := REAL#0.0 ; ELSE "Blender_Variables".gActualWaterPerc := 1 - "Blender_Variables".gActualSyrupPerc ; END_IF; IF "Blender_Variables".gActualSyrupPerc <> 0 THEN (* classic code: IF "Blender_Variables".gActualSyrupDens > 0.99 AND NOT "Blender_Variables_Pers".gSugarBeverage THEN*) IF "Blender_Variables".gActualSyrupDens > REAL#0.99 AND NOT "Blender_Variables_Pers".gSugarBeverage THEN "Blender_Variables".gActual_RatioM := "Blender_Variables".gActualWaterPerc / ("Blender_Variables".gActualSyrupPerc * "Blender_Variables".gActualSyrupDens) ; ELSE "Blender_Variables".gActual_RatioM := "Blender_Variables".gActualWaterPerc / "Blender_Variables".gActualSyrupPerc ; END_IF; END_IF; IF "Blender_Constants".gH2O_Density <> 0 THEN "gActualSP_RatioVol" := "Blender_Variables".gActual_RatioM * "Blender_Variables".gActualSyrupDens / "Blender_Constants".gH2O_Density ; END_IF; IF "gActualSP_RatioVol" = 0 THEN (* classic code: "gActualSP_RatioVol" := 0.01 ;*) "gActualSP_RatioVol" := REAL#0.01 ; END_IF; IF "Blender_Constants".gModValveFullStrokeTime <> 0 THEN "Blender_Variables".gBlenderProdSlewMax := "Blender_Variables".gBlenderNomSpeed / "Blender_Constants".gModValveFullStrokeTime ; IF "Blender_Constants".gProductionSlewRate > "Blender_Variables".gBlenderProdSlewMax THEN "Blender_Constants".gProductionSlewRate := "Blender_Variables".gBlenderProdSlewMax ; END_IF; END_IF; //Limit the minimum and maximum recipe Production Rate IF "Blender_Variables".gActual_Prod_SP > "Blender_Variables".gBlenderNomSpeed THEN "Blender_Variables".gActual_Prod_SP := "Blender_Variables".gBlenderNomSpeed ; END_IF; IF "Blender_Variables".gActual_Prod_SP < "Blender_Variables".gMinProduction AND NOT "Procedure_Variables".Blender_Run.Wait THEN "Blender_Variables".gActual_Prod_SP := "Blender_Variables".gMinProduction ; END_IF; IF "gBlenderProdMode" THEN //Calculates the CO2 Equilibrium Pressure plus 0.5 Atm, to Pressurize Product Tank IF "Blender_Variables_Pers".gCarboStillRecipe THEN (* classic code: "Blender_Variables".gCO2EqPressure := LIMIT (MN:= 0, IN:= "CO2EqPress"(i_CO2Vol := "HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Vols * "Blender_Variables".gFirstProdExtraCO2Fact * "HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Fact , i_Temp := "HMI_Blender_Parameters".Actual_Recipe_Parameters._SP_ProdTemp ), MX:= "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdTankPress) + 0.3 ;*) "Blender_Variables".gCO2EqPressure := LIMIT(MN := 0, IN := "CO2EqPress"(i_CO2Vol := "HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Vols * "Blender_Variables".gFirstProdExtraCO2Fact * "HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Fact, i_Temp := "HMI_Blender_Parameters".Actual_Recipe_Parameters._SP_ProdTemp), MX := "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdTankPress) + REAL#0.8; // REAL#0.3 ; ELSE "Blender_Variables".gCO2EqPressure := "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdTankPress ; END_IF; // Transfer the Set Point TO the PID's SP Input IF "gBlenderRinseMode" AND NOT "Procedure_Variables".TM301_Drain.Latch THEN "HMI_PID".RVM301.Sp := "HMI_Blender_Parameters".ProcessSetup._RinseTM301Press ; ELSIF "Procedure_Variables".TM301_Drain.Latch THEN "HMI_PID".RVM301.Sp := "HMI_Blender_Parameters".ProcessSetup._DrainTM301Press ; ELSIF NOT "gWaitLevToHold_TankPress" AND NOT "Procedure_Variables".First_Production.Done THEN "HMI_PID".RVM301.Sp := "Blender_Variables".gCO2EqPressure ; ELSE "HMI_PID".RVM301.Sp := "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdTankPress ; END_IF; IF "Procedure_Variables".First_Production.Latch AND NOT "Procedure_Variables".Blender_Run.Wait THEN // During First Production set minimum speed "Blender_Variables".gActual_Prod_SP := "Blender_Variables".gMinProduction * "Blender_Constants".gFirstProdSpeedGain ; END_IF; IF "gBlenderStartPumps" AND NOT "gBlenderBlending" AND "gEnRampDownToStop" THEN // Start blending with minimum speed (* classic code: IF "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductionRate >= (0.5 * "Blender_Variables".gBlenderNomSpeed) THEN*) IF "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductionRate >= (REAL#0.5 * "Blender_Variables".gBlenderNomSpeed) THEN (* classic code: "Blender_Variables".gActual_Prod_SP := 0.5 * "Blender_Variables".gBlenderNomSpeed ;*) "Blender_Variables".gActual_Prod_SP := REAL#0.5 * "Blender_Variables".gBlenderNomSpeed ; ELSE "Blender_Variables".gActual_Prod_SP := "Blender_Variables".gMinProduction ; END_IF; ELSIF NOT "gEnRampDownToStop" THEN "Blender_Variables".gActual_Prod_SP := "Blender_Variables".gSP_ProdTrackFiller ; ELSE IF NOT "Procedure_Variables".First_Production.Latch AND "gBlenderEnToRamp" THEN #mTargetFillerProdSlwd(i_InValue := "Blender_Variables".gSP_ProdTrackFiller , i_SlewMax := "Blender_Constants".gFillerSpeedTrackSlew , i_Cycle := "Time_300ms" , out := "Blender_Variables".gActual_Prod_SP) ; END_IF; IF "Procedure_Variables".Blender_Run.Wait THEN // Stop Blender with the Maximum Slope (* classic code: #mTargetProdSlwd(i_InValue := 0.0 , i_SlewMax := "Blender_Variables".gBlenderProdSlewMax , i_Cycle := "Time_300ms" , out := "Blender_Variables".gActual_Prod_SP ) ;*) #mTargetProdSlwd(i_InValue := REAL#0.0 , i_SlewMax := "Blender_Variables".gBlenderProdSlewMax , i_Cycle := "Time_300ms" , out := "Blender_Variables".gActual_Prod_SP ) ; // Slewed AT ""Blender_Variables".gBlenderProdSlewMax" L/sec END_IF; END_IF; ELSE (* classic code: "Blender_Variables".gActual_Prod_SP := 0.0 ;*) "Blender_Variables".gActual_Prod_SP := REAL#0.0 ; END_IF; (* classic code: #mTargetRatioSlwd(i_InValue := "gActualSP_RatioVol", i_SlewMax := 0.02, i_Cycle := "Time_300ms", out := #mTargetRatioSlewOut ) ;*) #mTargetRatioSlwd(i_InValue := "gActualSP_RatioVol", i_SlewMax := REAL#0.02, i_Cycle := "Time_300ms", out := #mTargetRatioSlewOut ) ; // Slewed AT 0.02 IF "Procedure_Variables".Blender_Run.Running AND NOT "gBlenderRinseMode" THEN (* classic code: IF NOT "Blender_Variables_Pers".gWaterRecipe AND ("gActualSP_RatioVol" + 1.0) <> 0 THEN*) IF NOT "Blender_Variables_Pers".gWaterRecipe AND ("gActualSP_RatioVol" + REAL#1.0) <> 0 THEN (* classic code: "Blender_Variables".gSP_H2O := "Blender_Variables".gActual_Prod_SP / ("gActualSP_RatioVol" + 1.0) * "gActualSP_RatioVol" ;*) "Blender_Variables".gSP_H2O := "Blender_Variables".gActual_Prod_SP / ("gActualSP_RatioVol" + REAL#1.0) * "gActualSP_RatioVol" ; ELSE "Blender_Variables".gSP_H2O := "Blender_Variables".gActual_Prod_SP ; END_IF; ELSE (* classic code: "Blender_Variables".gSP_H2O := 0.0 ;*) "Blender_Variables".gSP_H2O := REAL#0.0 ; END_IF; IF "HMI_PID".RMM301.Sp > 0 THEN (* classic code: IF ABS("Blender_Variables".gBlendError) > 0.5 AND ABS(("HMI_PID".RMM301.Sp - "HMI_PID".RMM301.Pv) / "HMI_PID".RMM301.Sp) > 0.2 AND ("Blender_Variables".gActual_Prod_SP >(0.6 * "Blender_Variables".gBlenderNomSpeed)) AND "gFlowToFiller" THEN*) IF ABS("Blender_Variables".gBlendError) > REAL#0.5 AND ABS(("HMI_PID".RMM301.Sp - "HMI_PID".RMM301.Pv) / "HMI_PID".RMM301.Sp) > REAL#0.2 AND ("Blender_Variables".gActual_Prod_SP >(REAL#0.6 * "Blender_Variables".gBlenderNomSpeed)) AND "gFlowToFiller" THEN #mCriticalBlending := TRUE ; ELSE #mCriticalBlending := FALSE ; END_IF; ELSE #mCriticalBlending := FALSE ; END_IF; #TimerConvDINT := REAL_TO_DINT ("Blender_Constants".gModValveFullStrokeTime * 1000) ; #TimerConvTIME := DINT_TO_TIME (#TimerConvDINT); #TimerConvS5TIME := TIME_TO_S5TIME(IN := #TimerConvTIME // IN: TIME FC40 ); // S5TIME #ValBcdTmr131:= S_OFFDT (T_NO := "mCriticalBlendingTOF" , S := #mCriticalBlending , TV := #TimerConvS5TIME , // Timer in sec R := "AUX FALSE" , BI => #ValBinTmr131 , Q => "gCriticalBlending" ) ; IF ("gBlenderEnToRamp" AND ("HMI_PID".RMM301.Out > 95)) OR "gCriticalBlending" OR ("gBlenderStopping" AND "gBlenderBlending") OR "HMI_Blender_Parameters".Processor_Options.Blender_OPT._TrackH2OEnable THEN "PID_Variables".Track_H2O_Enable := TRUE ; ELSE "PID_Variables".Track_H2O_Enable := FALSE ; END_IF; IF "Procedure_Variables".Blender_Run.Running AND NOT "Blender_Variables_Pers".gWaterRecipe AND NOT "gBlenderRinseMode" AND NOT "Procedure_Variables".FTP302Line_Preparation.Latch THEN IF "gBlenderStableFlow" THEN IF "PID_Variables".Track_H2O_Enable AND "gBlenderEnToRamp" THEN "Blender_Variables".gSyrSPRef := "Blender_Variables".gH2O_Flow_Meas / "gActualSP_RatioVol" ; ELSE (* classic code: "Blender_Variables".gSyrSPRef := "Blender_Variables".gActual_Prod_SP / ("gActualSP_RatioVol" + 1.0) ;*) "Blender_Variables".gSyrSPRef := "Blender_Variables".gActual_Prod_SP / ("gActualSP_RatioVol" + REAL#1.0) ; END_IF; ELSE IF "PID_Variables".Track_H2O_Enable THEN "Blender_Variables".gSyrSPRef := "Blender_Variables".gH2O_Flow_Meas / "gActualSP_RatioVol" ; ELSE (* classic code: "Blender_Variables".gSyrSPRef := "Blender_Variables".gActual_Prod_SP / ("gActualSP_RatioVol" + 1.0) ;*) "Blender_Variables".gSyrSPRef := "Blender_Variables".gActual_Prod_SP / ("gActualSP_RatioVol" + REAL#1.0) ; END_IF; END_IF; (* classic code: "Blender_Variables".gSyrSPTemp := LIMIT(MN:= (-1.0 * "Blender_Variables".gSyrSPRef * "Blender_Constants".gSyrupSPRecFact), IN:= ("Blender_Variables".gBlendError * "Blender_Variables".gK_RecBlendError), MX:= ("Blender_Variables".gSyrSPRef * "Blender_Constants".gSyrupSPRecFact));*) "Blender_Variables".gSyrSPTemp := LIMIT(MN:= (REAL#-1.0 * "Blender_Variables".gSyrSPRef * "Blender_Constants".gSyrupSPRecFact), IN:= ("Blender_Variables".gBlendError * "Blender_Variables".gK_RecBlendError), MX:= ("Blender_Variables".gSyrSPRef * "Blender_Constants".gSyrupSPRecFact)); "Blender_Variables".gSP_SYR := ("Blender_Variables".gSyrSPRef + "Blender_Variables".gSyrSPTemp) * "Blender_Variables".gActualSyrupDens ; ELSIF "Procedure_Variables".FTP302Line_Preparation.Latch OR "Procedure_Variables".FTP302_StartUp.Latch THEN "Blender_Variables".gSP_SYR := "Blender_Constants".gTP301_FirstProdRate; ELSIF "gSyrupQcoRinse" THEN "Blender_Variables".gSP_SYR := "Blender_Constants".gTP301_RinseRate; ELSE (* classic code: "Blender_Variables".gSP_SYR := 0.0 ;*) "Blender_Variables".gSP_SYR := REAL#0.0 ; END_IF; "Blender_Variables".gDeairCO2Comp := "DeairCO2TempComp"(i_Temp := "HMI_Instrument".TTN321.PVFiltered, i_CO2Off := "HMI_Blender_Parameters".Processor_Options.Blender_OPT._CO2_Offset) ; "Blender_Variables".gWaterO2 := "PPM O2"(i_Temp := "HMI_Instrument".TTN321.PVFiltered); "Blender_Variables".gSyrupO2 := "PPM O2"(i_Temp := "Profibus_Variables".gFTP302_Temp) * (1 - "HMI_Blender_Parameters".Actual_Recipe_Parameters._SyrupBrix / 100) ; IF ("Blender_Variables".gActual_RatioM + 1) <> 0 THEN "Blender_Variables".gProductO2 := ("Blender_Variables".gActual_RatioM * "Blender_Variables".gDeairWaterO2 + "Blender_Variables".gSyrupO2) / ("Blender_Variables".gActual_RatioM + 1) ; END_IF; "Blender_Variables".gCO2Solubility := "CO2 Solubility"(i_Temp :="HMI_Instrument".TTN321.PVFiltered) *"Blender_Constants".gTN301Efficiency ; IF "gBlenderEnToRamp" OR "gBlenderRinseMode" OR "gBlenderCIPMode" OR "Procedure_Variables"."CarboWaterLine".Latch THEN "Blender_Variables".gDeairCO2Vol := "MaxCarboCO2 Vol"(i_Temp := "HMI_Instrument".TTN321.PVFiltered, i_Press := "Blender_Constants".gTN301Pressure) * "Blender_Constants".gTN301Efficiency ; END_IF; IF NOT "gOUT_PPN304_Run" THEN "Blender_Variables".gDeairCO2Comp := "Blender_Variables".gDeairCO2Vol - "HMI_Blender_Parameters".Processor_Options.Blender_OPT._CO2_Offset ; ELSE (* classic code: "Blender_Variables".gDeairCO2Comp := 0.0 ;*) "Blender_Variables".gDeairCO2Comp := REAL#0.0 ; END_IF ; "Blender_Variables".gFillerCO2Loss := "HMI_Blender_Parameters".Processor_Options.Blender_OPT._CO2_Offset ; IF "Procedure_Variables".First_Production.Latch THEN (* classic code: "Blender_Variables".gActual_SP_CO2 := ("HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Vols - "Blender_Variables".gDeairCO2Comp) * "Blender_Variables".gFirstProdExtraCO2Fact * "HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Fact * (1 - "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductBrix / 100.0) ;*) "Blender_Variables".gActual_SP_CO2 := ("HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Vols - "Blender_Variables".gDeairCO2Comp) * "Blender_Variables".gFirstProdExtraCO2Fact * "HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Fact * (1 - "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductBrix / REAL#100.0) ; // nL/MIN ELSE (* classic code: "Blender_Variables".gActual_SP_CO2 := ("HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Vols - "Blender_Variables".gDeairCO2Comp + "Blender_Variables".gCO2TrackingCorr) * "HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Fact * (1 - "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductBrix / 100.0) ;*) "Blender_Variables".gActual_SP_CO2 := ("HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Vols - "Blender_Variables".gDeairCO2Comp + "Blender_Variables".gCO2TrackingCorr) * "HMI_Blender_Parameters".Actual_Recipe_Parameters._CO2Fact * (1 - "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductBrix / REAL#100.0) ; // nL/MIN END_IF; IF "gBlenderBlending" AND "Blender_Variables_Pers".gCarboStillProduct AND "gBlenderStableFlow" AND NOT "gBlenderRinseMode" THEN "Blender_Variables".gCO2SPRef := "Blender_Variables".gActual_SP_CO2 * "Blender_Variables".gActual_Prod_Flow ; "Blender_Variables".gCO2SPTemp2 := "Blender_Variables".gCarboCO2Error * "Blender_Variables".gK_RecCarboCO2Error ; ELSIF "gBlenderBlending" AND NOT "gBlenderStableFlow" AND "Blender_Variables_Pers".gCarboStillProduct AND NOT "gBlenderRinseMode" THEN "Blender_Variables".gCO2SPRef := "Blender_Variables".gActual_SP_CO2 * "Blender_Variables".gActual_Prod_SP ; "Blender_Variables".gCO2SPTemp2 := "Blender_Variables".gCarboCO2Error * "Blender_Variables".gK_RecCarboCO2Error ; ELSIF "gP_CarboPipe_En" AND "Blender_Variables_Pers".gCarboStillProduct AND NOT "gBlenderRinseMode" THEN IF "gActualSP_RatioVol" <> 0 AND NOT "Blender_Variables_Pers".gWaterRecipe THEN "Blender_Variables".gCO2SPRef := "Blender_Variables".gActual_SP_CO2 *("Blender_Variables".gH2O_Flow_Meas + "Blender_Variables".gH2O_Flow_Meas / "gActualSP_RatioVol") ; (* classic code: "Blender_Variables".gCO2SPTemp2 := 0.0 ;*) "Blender_Variables".gCO2SPTemp2 := REAL#0.0 ; ELSE "Blender_Variables".gCO2SPRef := ("Blender_Variables".gActual_SP_CO2 * "Blender_Variables".gActual_Prod_Flow) ; (* classic code: "Blender_Variables".gCO2SPTemp2 := 0.0 ;*) "Blender_Variables".gCO2SPTemp2 := REAL#0.0 ; END_IF; (*ELSIF "HMI_Service".Workshop_Test.CO2TestRequest AND "gWorkshopTest" THEN "Blender_Variables".gCO2SPRef := "HMI_Service".Workshop_Test.SIMCO2_Test_SP ; (* classic code: "Blender_Variables".gCO2SPTemp2 := 0.0 ;*) "Blender_Variables".gCO2SPTemp2 := REAL#0.0 ;*) ELSE (* classic code: "Blender_Variables".gCO2SPRef := 0.0 ;*) "Blender_Variables".gCO2SPRef := REAL#0.0 ; (* classic code: "Blender_Variables".gCO2SPTemp2 := 0.0 ;*) "Blender_Variables".gCO2SPTemp2 := REAL#0.0 ; END_IF; (* classic code: "Blender_Variables".gCO2SPTemp := LIMIT(MN:= (-1.0 * "Blender_Variables".gCO2SPRef * "Blender_Constants".gCO2SPRecFact), IN:= ("Blender_Variables".gCO2SPTemp2), MX:= ("Blender_Variables".gCO2SPRef * "Blender_Constants".gCO2SPRecFact));*) "Blender_Variables".gCO2SPTemp := LIMIT(MN:= (REAL#-1.0 * "Blender_Variables".gCO2SPRef * "Blender_Constants".gCO2SPRecFact), IN:= ("Blender_Variables".gCO2SPTemp2), MX:= ("Blender_Variables".gCO2SPRef * "Blender_Constants".gCO2SPRecFact)); "Blender_Variables".gSP_CO2 := "Blender_Variables".gCO2SPRef + "Blender_Variables".gCO2SPTemp ; // SECOND GAS INJECTION IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._CO2_GAS2_Injection THEN (* classic code: "Blender_Variables".gActual_SP_GAS2 := "HMI_Blender_Parameters".Actual_Recipe_Parameters._Gas2Vols * "HMI_Blender_Parameters".Actual_Recipe_Parameters._Gas2Fact * (1 - "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductBrix / 100.0) ;*) "Blender_Variables".gActual_SP_GAS2 := "HMI_Blender_Parameters".Actual_Recipe_Parameters._Gas2Vols * "HMI_Blender_Parameters".Actual_Recipe_Parameters._Gas2Fact * (1 - "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProductBrix / REAL#100.0) ; // nL/MIN IF "gBlenderBlending" AND "gBlenderStableFlow" AND NOT "gBlenderRinseMode" THEN "Blender_Variables".gSP_GAS2 := "Blender_Variables".gActual_SP_GAS2 * "Blender_Variables".gActual_Prod_Flow ; ELSIF "gBlenderBlending" AND NOT "gBlenderStableFlow" AND NOT "gBlenderRinseMode" THEN "Blender_Variables".gSP_GAS2 := "Blender_Variables".gActual_SP_GAS2 * "Blender_Variables".gActual_Prod_SP ; ELSE (* classic code: "Blender_Variables".gSP_GAS2 := 0.0 ;*) "Blender_Variables".gSP_GAS2 := REAL#0.0 ; END_IF ; ELSE (* classic code: "Blender_Variables".gSP_GAS2 := 0.0 ;*) "Blender_Variables".gSP_GAS2 := REAL#0.0 ; END_IF ; //"HMI_PID".RMM301.SP := "Blender_Variables".gSP_H2O ; //"HMI_PID".RMP302.SP := "Blender_Variables".gSP_SYR ; (* classic code: "Blender_Variables".gMaxCarboCO2_V := "MaxCarboCO2 Vol"(i_Temp := "HMI_Instrument".TTN321.PVFiltered , i_Press := "HMI_Blender_Parameters".ProcessSetup._PPN301Pressure - 1.5 ) ;*) "Blender_Variables".gMaxCarboCO2_V := "MaxCarboCO2 Vol"(i_Temp := "HMI_Instrument".TTN321.PVFiltered , i_Press := "HMI_Blender_Parameters".ProcessSetup._PPN301Pressure - REAL#1.5 ) ; IF NOT ("gP_CarboPipe_En" OR ("HMI_Service".Workshop_Test.CO2TestRequest AND "gWorkshopTest")) THEN "Blender_Variables".gSP_CO2 := LIMIT(MN:= 0, IN:= "Blender_Variables".gSP_CO2, MX:= ("Blender_Variables".gMaxCarboCO2_V * "Blender_Variables".gSP_H2O)) ; END_IF; IF "gBlenderProdMode" THEN IF "gBlenderRinseMode" AND NOT "System_RunOut_Variables".FastChangeOverActivated THEN "Blender_Variables".gSP_SYR_Level := "Blender_Constants".gTP301FirstProdLvl; ELSIF "Procedure_Variables".FTP302Line_Preparation.Latch OR "Procedure_Variables".FTP302_StartUp.Latch THEN "Blender_Variables".gSP_SYR_Level := "Blender_Constants".gTP301FirstProdLvl; ELSIF "Procedure_Variables".First_Production.Running AND "gBlenderBlending" THEN #mTargetSyrupLvlSlwd(i_InValue:="Blender_Constants".gTP301ProdLvl , i_SlewMax:="Blender_Constants".gTP301_LvlSlewRate , i_Cycle:="Time_300ms" , out:="Blender_Variables".gSP_SYR_Level ) ; ELSIF "Procedure_Variables".Syr_RunOut.Latch AND "gBlenderBlending" THEN #mTargetSyrupLvlSlwd(i_InValue:="Blender_Constants".gTP301FirstProdLvl , i_SlewMax:="Blender_Constants".gTP301_LvlSlewRate , i_Cycle:="Time_300ms" , out:="Blender_Variables".gSP_SYR_Level ) ; "Blender_Variables".gSP_SYR_Level := "Blender_Constants".gTP301ProdLvl; ELSIF "System_RunOut_Variables".FastChangeOverActivated AND "gSyrupQcoRinse" THEN "Blender_Variables".gSP_SYR_Level := "HMI_Blender_Parameters".ProcessSetup._CIPTP301MinLevel; ELSIF "Procedure_Variables".First_Production.Done AND NOT "Procedure_Variables".Syr_RunOut.Latch THEN "Blender_Variables".gSP_SYR_Level := "Blender_Constants".gTP301ProdLvl; END_IF ; ELSE IF "HMI_Variables_Status".Procedures.CIP_SyrTankFloodRun THEN (* classic code: "Blender_Variables".gSP_SYR_Level := 100.0 ;*) "Blender_Variables".gSP_SYR_Level := REAL#100.0 ; ELSE "Blender_Variables".gSP_SYR_Level := "HMI_Blender_Parameters".ProcessSetup._CIPTP301MinLevel; END_IF ; END_IF; IF "gBlenderProdMode" THEN IF "gBlenderRinseMode" THEN "Blender_Variables".gSP_DEAIR_Level := "HMI_Blender_Parameters".ProcessSetup._CIPTN301MinLevel; ELSIF "Procedure_Variables".TN301_StartUp.Latch OR ("Procedure_Variables".First_Production.Running AND "gBlenderBlending") THEN #mTargetDeairLvlSlwd(i_InValue:="Blender_Constants".gTN301ProdLvl , i_SlewMax:="Blender_Constants".gTN301_LvlSlewRate , i_Cycle:="Time_300ms" , out:="Blender_Variables".gSP_DEAIR_Level ) ; ELSIF "Procedure_Variables".First_Production.Done THEN "Blender_Variables".gSP_DEAIR_Level := "Blender_Constants".gTN301ProdLvl; END_IF ; ELSE IF "HMI_Variables_Status".Procedures.CIP_DeairTankFloodRun THEN (* classic code: "Blender_Variables".gSP_DEAIR_Level := 100.0 ;*) "Blender_Variables".gSP_DEAIR_Level := REAL#100.0 ; ELSE "Blender_Variables".gSP_DEAIR_Level := "HMI_Blender_Parameters".ProcessSetup._CIPTN301MinLevel; END_IF ; END_IF; IF "gBlenderProdMode" THEN IF "Procedure_Variables".BlendFill_StartUp.Latch THEN #mTargetStorgLvlSlwd(i_InValue:="Blender_Variables".gProdTankTargetLvl , i_SlewMax:="Blender_Constants".gTM301_LvlSlewRate , i_Cycle:="Time_300ms" , out:="Blender_Variables".gSP_STORAGE_Level ) ; ELSIF "Procedure_Variables".First_Production.Done THEN "Blender_Variables".gSP_STORAGE_Level := "Blender_Variables".gProdTankTargetLvl ; END_IF ; END_IF; IF "gBlenderProdMode" THEN IF "gProductChillerEn" OR "gProdDoubleChillerEn" THEN "Blender_Variables".gSP_H2O_Temperature := "HMI_Blender_Parameters".Actual_Recipe_Parameters._SP_ProdTemp ; "Blender_Variables".gSP_Prod_Temperature := "HMI_Blender_Parameters".Actual_Recipe_Parameters._SP_ProdTemp ; ELSIF "gWaterChillerEn" THEN "Blender_Variables".gSP_H2O_Temperature := "HMI_Blender_Parameters".Actual_Recipe_Parameters._SP_ProdTemp - ("Blender_Constants".gCpSyrup * ("Blender_Variables".gMeterSyrTemp - "HMI_Blender_Parameters".Actual_Recipe_Parameters._SP_ProdTemp) * "Blender_Variables".gActualSyrupDens / "Blender_Constants".gCpH2O) ; END_IF; IF "HMI_Variables_Status".Procedures.ColdRinseRun OR "Procedure_Variables".First_Production.Latch OR "Procedure_Variables"."CarboWaterLine".Latch THEN "Blender_Variables".gSP_H2O_Temperature := "Blender_Constants".gFirstProdRinseTempSP ; "Blender_Variables".gSP_Prod_Temperature := "Blender_Constants".gFirstProdRinseTempSP ; END_IF; ELSIF "gBlenderCIPMode" AND "gGencoldChillerEn" THEN (* classic code: "Blender_Variables".gSP_H2O_Temperature := 0.0 ;*) "Blender_Variables".gSP_H2O_Temperature := REAL#0.0 ; (* classic code: "Blender_Variables".gSP_Prod_Temperature := 0.0 ;*) "Blender_Variables".gSP_Prod_Temperature := REAL#0.0 ; ELSE (* classic code: "Blender_Variables".gSP_H2O_Temperature := 100.0 ;*) "Blender_Variables".gSP_H2O_Temperature := REAL#100.0 ; (* classic code: "Blender_Variables".gSP_Prod_Temperature := 100.0 ;*) "Blender_Variables".gSP_Prod_Temperature := REAL#100.0 ; END_IF; IF "gBlenderProdMode" AND "HMI_Device".RVN301.Out OR "Procedure_Variables".TN301_StartUp.Latch THEN IF "gBlenderRinseMode" OR "Procedure_Variables"."CarboWaterLine".Running THEN (*"HMI_PID".RVN304.Sp := "Blender_Variables".gH2O_Flow_Meas *"HMI_Blender_Parameters".Actual_Recipe_Parameters._DeareationFactor;*) "HMI_PID".RVN304.Sp := "Blender_Variables".gH2O_Flow_Meas *0.7 ; ; ELSE "HMI_PID".RVN304.Sp := "Blender_Variables".gH2O_Flow_Meas * "HMI_Blender_Parameters".Actual_Recipe_Parameters._DeareationFactor; END_IF ; IF "gDeairTank_Loading" OR (NOT "HMI_Digital".LSN301L.Filtered AND NOT "Procedure_Variables".TN301_StartUp.Done) THEN "HMI_PID".RVN304.Sp := "Blender_Variables".gBlenderNomSpeed * "HMI_Blender_Parameters".Actual_Recipe_Parameters._DeareationFactor; ELSIF "HMI_Digital".LSN301L.Filtered AND NOT "Procedure_Variables".TN301_StartUp.Done THEN "HMI_PID".RVN304.Sp := "Blender_Variables".gMinProduction ; END_IF ; IF NOT "Blender_Variables_Pers".gCarboStillRecipe OR NOT "HMI_Blender_Parameters".Processor_Options.Blender_OPT._Deaireation THEN "HMI_PID".RVN304.Sp := "HMI_PID".RVN304.Sp / 10 ; END_IF ; ELSE (* classic code: "HMI_PID".RVN304.Sp := 0.0;*) "HMI_PID".RVN304.Sp := REAL#0.0; END_IF ; IF NOT "HMI_Device".AVN347.Out AND NOT "HMI_Blender_Parameters".Processor_Options.Blender_OPT._Flowtronic THEN "HMI_PID".RVN304.Sp := "HMI_Instrument".RVN304.PVFiltered ; END_IF ; END_FUNCTION_BLOCK ```