```pascal FUNCTION_BLOCK "BlenderPID__Main" { S7_Optimized_Access := 'FALSE' } AUTHOR : 'Author' FAMILY : TASK1 NAME : 'Name' VERSION : 1.0 VAR mSlewOk : Bool; mWaterFlowSlewMFMSav : Real; mWaterFlowSlewCycleCount : Real; mSyrupFlowSlewMFM : Real; mSyrFact : Real; mProdSimLt : Real; mProdBrixFlowF : Real; mPressCO2Flow : Real; mPressCO2Total : Real; mProdTotalizerLt : "Integral"; gBlendErrorInt : "Integral"; gCarboCO2ErrorInt : "Integral"; mProdBrixFlowFlt : "LowPassFilter"; _PID_SP_Calc : "BlenderPID_PIDSPCalc"; Init_PID_Parameters : "BlenderPID_PIDInitParam"; PID_ActualRecipe : "BlenderPID_ActualRecipe"; mAuxONS : Bool; mAux1ONS : Bool; END_VAR VAR_TEMP ValBinTmr130 : Word; ValBcdTmr130 : S5Time; mAuxONS_Q : Bool; mAux1ONS_Q : Bool; END_VAR BEGIN #Init_PID_Parameters (); #_PID_SP_Calc (); //Not A Recipe Check IF ("HMI_Blender_Parameters".Actual_Recipe_Parameters._Type >= 1) AND ("HMI_Blender_Parameters".Actual_Recipe_Parameters._Type <= 3) OR NOT "gBlenderProdMode" THEN "gNotARecipe_Fault" := FALSE ; ELSE "gNotARecipe_Fault" := TRUE ; END_IF; IF NOT "HMI_Blender_Parameters".Processor_Options.Blender_OPT._Simulation THEN "HMI_PID".RVM301.Pv := "HMI_Instrument".PTM304.PVFiltered ; END_IF; IF NOT "HMI_PID".RVP303.ManualControl.ManOut THEN "HMI_PID".RVP303.OutMan := "HMI_PID".RVP303.Out ; END_IF; IF NOT "HMI_PID".RVN302.ManualControl.ManOut AND NOT "HMI_PID".RVN302.ConfigPID THEN "HMI_PID".RVN302.OutMan := "HMI_PID".RVN302.Out ; ELSE IF "HMI_PID".RVN302.ManualControl.ManOut AND "HMI_PID".RVN302.ConfigPID AND "HMI_PID".RVN302.ManualControl.ManOut THEN "HMI_PID".RVN302.OutMan := REAL#100.0; END_IF; END_IF; IF "HMI_PID".RVN304.ManualControl.ManOut THEN "HMI_PID".RVN304.Out := "HMI_PID".RVN304.OutMan ; ELSE IF "gBlenderProdMode" AND NOT "HMI_Blender_Parameters".Processor_Options.Blender_OPT._Flowtronic THEN IF "HMI_PID".RVN304.Sp > 0 THEN IF "HMI_Device".AVN347.Out THEN "HMI_PID".RVN304.Out := "DeaireationValve"(in_DeaireationFlow:= "HMI_PID".RVN304.Sp , in_InletPressure:= "HMI_Instrument".PCM306.PVFiltered , in_FlowCoefficient:= "HMI_Blender_Parameters".ProcessSetup._RVN304KV); ELSE "HMI_PID".RVN304.Out := "DeaireationValve"(in_DeaireationFlow:= "HMI_PID".RVN304.Sp, in_InletPressure:= "HMI_Blender_Parameters".Actual_Recipe_Parameters._ProdTankPress , in_FlowCoefficient:= "HMI_Blender_Parameters".ProcessSetup._RVN304KV); END_IF; ELSE (* classic code: "HMI_PID".RVN304.Out := 0.0 ;*) "HMI_PID".RVN304.Out := REAL#0.0 ; END_IF; ELSIF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._Flowtronic AND ("Blender_Variables".gFlowTronicFullScale <> 0) THEN (* classic code: "HMI_PID".RVN304.Out := "HMI_Instrument".RVN304.PVFiltered * 100.0 / "Blender_Variables".gFlowTronicFullScale ;*) "HMI_PID".RVN304.Out := "HMI_Instrument".RVN304.PVFiltered * REAL#100.0 / "Blender_Variables".gFlowTronicFullScale ; END_IF; "HMI_PID".RVN304.OutMan := "HMI_PID".RVN304.Out ; END_IF; IF NOT "HMI_PID".RVS318.ManualControl.ManOut THEN "HMI_PID".RVS318.OutMan := "HMI_PID".RVS318.Out ; END_IF; IF NOT "HMI_PID".RVM319_PRD.ManualControl.ManOut THEN "HMI_PID".RVM319_PRD.OutMan := "HMI_PID".RVM319_PRD.Out ; END_IF; IF "gBlenderProdMode" THEN IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._Simulation THEN // Product Totalizer in Liters IF ("Procedure_Variables".TN301_StartUp.Done AND NOT "Blender_Variables_Pers".gCarboStillProduct) OR (("Blender_Variables_Pers".gCarboStillProduct AND "Procedure_Variables"."CarboWaterLine".Done) AND "Procedure_Variables"."CarboWaterLine".Done) THEN #mProdTotalizerLt.i_NewValue :=("Blender_Variables".gActual_Prod_Flow - "Blender_Variables".gFillerProductFlow) / 60 ; #mProdTotalizerLt.i_IntCycle := "Time_300ms" ; #mProdTotalizerLt(Out_Integral := #mProdSimLt) ; ELSE (* classic code: #mProdSimLt := 0.1 ;*) #mProdSimLt := REAL#0.1 ; END_IF; // Product Tank Level Variation during simulation IF #mProdSimLt > "Blender_Variables".gProdTankBottomVol THEN "HMI_Instrument".LTM302.PVFiltered := ((#mProdSimLt - "Blender_Variables".gProdTankBottomVol) / ("Blender_Variables".gProdTankVolume - "Blender_Variables".gProdTankBottomVol)) * 100 ; END_IF; IF "HMI_PID".RVM301.ManualControl.PidEnable THEN IF NOT "PID_Variables".PID_RVM301_Release THEN (* classic code: #mPressCO2Flow := "ValveFlow" (i_DeltaP := "HMI_PID".RVM301.Sp - "HMI_PID".RVM301.Pv, i_ValveOp := "HMI_PID".RVM301.Out , i_KFF := 1100.5, i_Dens := "Blender_Constants".gCO2_Density / 1000.0);*) #mPressCO2Flow := "ValveFlow" (i_DeltaP := "HMI_PID".RVM301.Sp - "HMI_PID".RVM301.Pv, i_ValveOp := "HMI_PID".RVM301.Out , i_KFF := REAL#1100.5, i_Dens := "Blender_Constants".gCO2_Density / REAL#1000.0); #mPressCO2Total := #mPressCO2Total + (#mPressCO2Flow * "HMI_PID".RVM301.Cycle_Time * 60) ; ELSE #mPressCO2Total := #mPressCO2Total - "ValveFlow"(i_DeltaP := "HMI_PID".RVM301.Pv, i_ValveOp := 9 , i_KFF := 20, i_Dens := "Blender_Constants".gCO2_Density / 1000); END_IF; END_IF; IF "HMI_Device".AVM312.Out THEN #mPressCO2Total := #mPressCO2Total - "ValveFlow"(i_DeltaP := "HMI_PID".RVM301.Pv, i_ValveOp := 2 , i_KFF := 20, i_Dens := "Blender_Constants".gCO2_Density / 1000); END_IF; IF "Blender_Variables".gProdTankVolume > 0 AND #mProdSimLt < "Blender_Variables".gProdTankVolume THEN "HMI_PID".RVM301.Pv := #mPressCO2Total / ("Blender_Variables".gProdTankVolume - #mProdSimLt) ; END_IF; ELSE ; END_IF; // End OF IF gH_Blender_OPT_Simulation THEN... // Transfer the Flowrate Measure TO the PID's PV Input "HMI_PID".RMM301.Pv := "Blender_Variables".gH2O_Flow_Meas ; "HMI_PID".RMP302.Pv := "Blender_Variables".gSYR_Flow_Meas ; "HMI_PID".RMM303.Pv := "Blender_Variables".gCO2_Flow_Meas ; "HMI_PID".RMM304.Pv := "Blender_Variables".gCO2_Flow_Meas ; IF "gBlenderStableFlow" AND ("Blender_Variables".gH2O_Flow_Meas < 50) THEN "gFTN301_FlowTooLow" := TRUE ; ELSE "gFTN301_FlowTooLow" := FALSE ; END_IF; // Calculates the actual product brix from Flows IF "Blender_Variables".gH2O_Flow_Meas <> 0 AND "Blender_Variables".gSYR_Flow_Meas <> 0 THEN #mProdBrixFlowF := ("Blender_Variables".gSYR_Flow_Meas * "Blender_Variables".gActualSyrupBrix) / ("Blender_Variables".gH2O_Flow_Meas + "Blender_Variables".gSYR_Flow_Meas ) ; #mProdBrixFlowFlt(i_Value := #mProdBrixFlowF , i_Num := 49 , i_Enable := "gBlenderBlending") ; "Blender_Variables".gFlowProdBrix := #mProdBrixFlowFlt.FilterOut ; END_IF; IF ("HMI_PID".RMM301.Sp + "HMI_PID".RMP302.Sp) <> 0 AND "Blender_Variables".gActualSyrupDens <> 0 THEN "Blender_Variables".gProductDensity := ("HMI_PID".RMM301.Sp + "HMI_PID".RMP302.Sp) / ("HMI_PID".RMM301.Sp + "HMI_PID".RMP302.Sp / "Blender_Variables".gActualSyrupDens) ; END_IF; // PID's Manual Bit IF NOT "HMI_PID".RMM301.ManualControl.ManOut THEN "HMI_PID".RMM301.OutMan := "HMI_PID".RMM301.Out ; END_IF; IF "HMI_Service".Workshop_Test.CO2TestRequest AND "gWorkshopTest" AND NOT "Procedure_Variables".Blender_Run.Running THEN // "HMI_PID".RMM301.ManualControl.ManOut := TRUE ; (* classic code: "HMI_PID".RMM301.OutMan := 60.0 ;*) "HMI_PID".RMM301.OutMan := REAL#60.0 ; END_IF; IF ("System_RunOut_Variables".ProdPipe_RunOut.Running OR "Procedure_Variables".TM301_RunOut.Running) AND "System_RunOut_Variables".ProdPipeRunOutWaterCount THEN // "HMI_PID".RMM301.ManualControl.ManOut := TRUE ; "HMI_PID".RMM301.OutMan := "System_RunOut_Variables".RMM301_OV_ProdPipeRunOut ; END_IF; IF NOT "HMI_PID".RMP302.ManualControl.ManOut THEN "HMI_PID".RMP302.OutMan := "HMI_PID".RMP302.Out ; END_IF; IF ("System_RunOut_Variables".ProdPipe_RunOut.Running OR "Procedure_Variables".TM301_RunOut.Running) AND "System_RunOut_Variables".ProdPipeRunOutWaterCount THEN // "HMI_PID".RMP302.ManualControl.ManOut := TRUE ; "HMI_PID".RMP302.OutMan := "System_RunOut_Variables".RMP302_OV_ProdPipeRunOut ; END_IF; IF NOT "HMI_PID".RMM303.ManualControl.ManOut THEN "HMI_PID".RMM303.OutMan := "HMI_PID".RMM303.Out ; END_IF; IF NOT "HMI_PID".RMM304.ManualControl.ManOut THEN "HMI_PID".RMM304.OutMan := "HMI_PID".RMM304.Out ; END_IF; IF NOT "HMI_PID".RVM301.ManualControl.ManOut AND NOT "PID_Variables".PID_RVM301_Release THEN "HMI_PID".RVM301.OutMan := "HMI_PID".RVM301.Out ; END_IF; IF "Procedure_Variables".Balaiage.Latch THEN IF "Procedure_Variables".First_Production.Latch OR (NOT "Procedure_Variables".BlendFill_StartUp.Done AND "HMI_Blender_Parameters".Processor_Options.Blender_OPT._BlendFillSystem) OR NOT "gBalaiage_MaxFlow" THEN "HMI_PID".RVM301.OutMan := "HMI_Blender_Parameters".ProcessSetup._BaialageRVM301OVMin ; ELSE "HMI_PID".RVM301.OutMan := "HMI_Blender_Parameters".ProcessSetup._BaialageRVM301OVMax ; END_IF ; END_IF ; IF "gBlenderBlending" THEN IF #mWaterFlowSlewCycleCount > 0 AND NOT #mSlewOk THEN "Blender_Variables".gWaterFlowSlewValve := "HMI_PID".RMM301.Out / #mWaterFlowSlewCycleCount ; "Blender_Variables".gWaterFlowSlewMFM := "Profibus_Variables".gFTN301_Flow / #mWaterFlowSlewCycleCount ; #mSyrupFlowSlewMFM := "Profibus_Variables".gFTP302_Flow / #mWaterFlowSlewCycleCount ; #mWaterFlowSlewCycleCount := "Time_300ms" + #mWaterFlowSlewCycleCount ; IF "Blender_Variables".gWaterFlowSlewMFM > #mWaterFlowSlewMFMSav THEN #mSlewOk := TRUE ; END_IF; #mWaterFlowSlewMFMSav := "Blender_Variables".gWaterFlowSlewMFM ; ELSE #mWaterFlowSlewCycleCount := "Time_300ms" + #mWaterFlowSlewCycleCount ; END_IF; ELSE (* classic code: #mWaterFlowSlewMFMSav := 0.0 ;*) #mWaterFlowSlewMFMSav := REAL#0.0 ; (* classic code: #mWaterFlowSlewCycleCount := 0.0 ;*) #mWaterFlowSlewCycleCount := REAL#0.0 ; (* classic code: "Blender_Variables".gWaterFlowSlewValve := 0.0 ;*) "Blender_Variables".gWaterFlowSlewValve := REAL#0.0 ; (* classic code: "Blender_Variables".gWaterFlowSlewMFM := 0.0 ;*) "Blender_Variables".gWaterFlowSlewMFM := REAL#0.0 ; (* classic code: #mSyrupFlowSlewMFM := 0.0 ;*) #mSyrupFlowSlewMFM := REAL#0.0 ; #mSlewOk := FALSE ; END_IF; IF "Blender_Variables".gSYR_Flow_Meas > 0 AND "Blender_Variables".gActualSyrupDens <> 0 THEN "Blender_Variables".gActual_Ratio := "Blender_Variables".gH2O_Flow_Meas / "Blender_Variables".gSYR_Flow_Meas * "Blender_Variables".gActualSyrupDens ; END_IF; IF "Blender_Variables".gH2O_Flow_Meas > 0 AND "Blender_Constants".gCO2_Density <> 0 AND "Blender_Variables".gActualSyrupDens <> 0 THEN "Blender_Variables".gActual_CO2_Vol := ("Blender_Variables".gCO2_Flow_Meas / "Blender_Constants".gCO2_Density) / ("Blender_Variables".gH2O_Flow_Meas + ("Blender_Variables".gSYR_Flow_Meas / "Blender_Variables".gActualSyrupDens)) ; END_IF; IF "Blender_Variables".gWaterVFM_Area <> 0 THEN (* classic code: "Blender_Variables".gWaterSpeedToStopError := "Blender_Variables".gH2O_Flow_Meas / "Blender_Variables".gWaterVFM_Area / 10.0 / 60.0 ;*) "Blender_Variables".gWaterSpeedToStopError := "Blender_Variables".gH2O_Flow_Meas / "Blender_Variables".gWaterVFM_Area / REAL#10.0 / REAL#60.0 ; // m/s (* classic code: "Blender_Variables".gWaterVFM_Vel := "Blender_Variables".gSP_H2O / "Blender_Variables".gWaterVFM_Area / 10.0 / 60.0 ;*) "Blender_Variables".gWaterVFM_Vel := "Blender_Variables".gSP_H2O / "Blender_Variables".gWaterVFM_Area / REAL#10.0 / REAL#60.0 ; // m/s END_IF; #ValBcdTmr130 := S_ODT(T_NO := "mStopErrorsTimeOut", S := NOT "gBlenderBlending", TV := S5TIME#10s, R := "AUX FALSE", BI => #ValBinTmr130, Q => "mStopErrorsTimeOut.Q"); IF "Blender_Variables".gWaterSpeedToStopError > "Blender_Constants".gFTN301_MinVel AND NOT "mStopErrorsTimeOut.Q" THEN "gStopBlendCarboError" := FALSE ; ELSE "gStopBlendCarboError" := TRUE ; END_IF; IF "Blender_Variables".gWaterVFM_Vel > "Blender_Constants".gFTN301_MinVel THEN "gFTN301_SpeedToStop" := FALSE ; ELSE "gFTN301_SpeedToStop" := TRUE ; END_IF; IF "Blender_Variables".gWaterPipe_Area <> 0 THEN (* classic code: "Blender_Variables".gWaterPipe_Vel := "Blender_Variables".gH2O_Flow_Meas / "Blender_Variables".gWaterPipe_Area / 10.0 / 60.0 ;*) "Blender_Variables".gWaterPipe_Vel := "Blender_Variables".gH2O_Flow_Meas / "Blender_Variables".gWaterPipe_Area / REAL#10.0 / REAL#60.0 ; // m/s END_IF; (* classic code: IF "gBlenderStableFlow" AND ("Blender_Variables".gWaterPipe_Vel < 0.6) AND "HMI_Blender_Parameters".Processor_Options.Blender_OPT._CarboPresent THEN*) IF "gBlenderStableFlow" AND ("Blender_Variables".gWaterPipe_Vel < REAL#0.6) AND "HMI_Blender_Parameters".Processor_Options.Blender_OPT._CarboPresent THEN "gFTN301_SpeedTooLow" := TRUE ; ELSE "gFTN301_SpeedTooLow" := FALSE ; END_IF; (********************************************************************************************************************************************************) // Calculates blend error IF "Blender_Variables".gActualSyrupDens <> 0 THEN "Blender_Variables".gSyrupVolFlow_PV := "HMI_PID".RMP302.Pv / "Blender_Variables".gActualSyrupDens ; END_IF; IF "Blender_Variables_Pers".gWaterRecipe THEN (* classic code: "Blender_Variables".gBlendError := 0.0 ;*) "Blender_Variables".gBlendError := REAL#0.0 ; END_IF; IF "PID_Variables".Blend_Error_Enable AND "Blender_Variables".gActualSyrupDens <> 0 THEN IF "Procedure_Variables".First_Production.Latch AND "Blender_Variables_Pers".gSugarBeverage THEN IF "HMI_Blender_Parameters".Actual_Recipe_Parameters._SyrupBrix <> 0 THEN #mSyrFact := "Blender_Variables".gMeterSyrBrix / "HMI_Blender_Parameters".Actual_Recipe_Parameters._SyrupBrix ; END_IF; #gBlendErrorInt.i_NewValue := ("HMI_PID".RMM301.Pv + ((1 - #mSyrFact) * "Blender_Variables".gSyrupVolFlow_PV) - "Blender_Variables".gSyrupVolFlow_PV * #mSyrFact * "gActualSP_RatioVol") / 60 ; #gBlendErrorInt.i_IntCycle := "Time_300ms" ; #gBlendErrorInt(Out_Integral:= "Blender_Variables".gBlendError); ELSE #gBlendErrorInt.i_NewValue:=("HMI_PID".RMM301.Pv - ("HMI_PID".RMP302.Pv / "Blender_Variables".gActualSyrupDens) * "gActualSP_RatioVol") / 60 ; #gBlendErrorInt.i_IntCycle := "Time_300ms" ; #gBlendErrorInt(Out_Integral:= "Blender_Variables".gBlendError) ; END_IF; ELSE // gBlendErrorInt(Out_Integral:= "Blender_Variables".gBlendError); ; END_IF; IF "PID_Variables".CarboCO2_Error_Enable THEN #gCarboCO2ErrorInt.i_NewValue:=(("Blender_Variables".gActual_Prod_Flow * "Blender_Variables".gActual_SP_CO2) - "Blender_Variables".gCO2_Flow_Meas) / 60 ; #gCarboCO2ErrorInt.i_IntCycle := "Time_300ms" ; #gCarboCO2ErrorInt(Out_Integral:="Blender_Variables".gCarboCO2Error) ; ELSE // gCarboCO2ErrorInt(Out_Integral:="Blender_Variables".gCarboCO2Error); ; END_IF; IF "gBlenderRinseMode" AND ("Procedure_Variables".TN301_StartUp.Done OR NOT "HMI_Blender_Parameters".Processor_Options.Blender_OPT._Deaireation) THEN // "HMI_PID".RMM301.ManualControl.ManOut := TRUE; IF "gCIPRinseOpenValves" THEN "HMI_PID".RMM301.OutMan := "HMI_Blender_Parameters".ProcessSetup._RinseRMM301OV ; ELSE (* classic code: "HMI_PID".RMM301.OutMan := 0.0 ;*) "HMI_PID".RMM301.OutMan := REAL#0.0 ; END_IF; END_IF; IF "gBlenderRinseMode" THEN "HMI_PID".RMP302.OutMan := "HMI_Blender_Parameters".ProcessSetup._RinseRMP302OV ; IF "gRinseDrainRunning" AND NOT "HMI_Blender_Parameters".Processor_Options.Blender_OPT._FastChangeOverEnabled THEN IF "gDrainPressNotOK" THEN "HMI_PID".RVM301.OutMan := "Blender_Constants".gRinseDrainOpPressValve ; ELSE (* classic code: "HMI_PID".RVM301.OutMan := 0.0 ;*) "HMI_PID".RVM301.OutMan := REAL#0.0 ; END_IF; END_IF; END_IF; // "HMI_PID".RVS318.SP := 0.0 ; ELSE // CIP // "HMI_PID".RVS318.SP := "CIP_Program_Variables".General_Data.SPTemperature + "Blender_Constants".gCIP_SP_DeltaT ; // Increasing REAL Temperature Set Point (* classic code: "HMI_PID".RVM301.Sp := 0.0 ;*) "HMI_PID".RVM301.Sp := REAL#0.0 ; "PID_Variables".PID_RVM301_Release := TRUE ; // "HMI_PID".RVM301.ManualControl.ManOut := TRUE ; (* classic code: "HMI_PID".RVM301.OutMan := 0.0 ;*) "HMI_PID".RVM301.OutMan := REAL#0.0 ; // "HMI_PID".RMM301.ManualControl.ManOut := TRUE ; IF "HMI_Variables_Status".Procedures.CIP_SyrTankFloodRun OR NOT "gOUT_PPN301_Run" OR NOT "gCIPRinseOpenValves" THEN (* classic code: "HMI_PID".RMM301.OutMan := 0.0 ;*) "HMI_PID".RMM301.OutMan := REAL#0.0 ; ELSE "HMI_PID".RMM301.OutMan := "HMI_Blender_Parameters".ProcessSetup._CIPRMM301OV ; END_IF; // "HMI_PID".RMP302.ManualControl.ManOut := TRUE ; IF "HMI_Variables_Status".Procedures.CIP_SyrTankFloodRun OR NOT "gOUT_PPP302_Run" OR NOT "gCIPRinseOpenRMP302" THEN (* classic code: "HMI_PID".RMP302.OutMan := 0.0 ;*) "HMI_PID".RMP302.OutMan := REAL#0.0 ; ELSE "HMI_PID".RMP302.OutMan := "HMI_Blender_Parameters".ProcessSetup._CIPRMP302OV ; END_IF; // "HMI_PID".RMM303.ManualControl.ManOut := TRUE; IF "gP_CIP_CO2_Inj" THEN "HMI_PID".RMM303.OutMan := "Blender_Constants".gCIP_CO2_InjectionValue ; ELSE (* classic code: "HMI_PID".RMM303.OutMan := 0.0;*) "HMI_PID".RMM303.OutMan := REAL#0.0; END_IF; (* classic code: "HMI_PID".RMM304.OutMan := 0.0;*) "HMI_PID".RMM304.OutMan := REAL#0.0; IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._Simulation THEN (* classic code: #mPressCO2Total := 0.0 ;*) #mPressCO2Total := REAL#0.0 ; (* classic code: #mProdSimLt := 0.0 ;*) #mProdSimLt := REAL#0.0 ; (* classic code: "HMI_Instrument".LTM302.PVFiltered := 0.0 ;*) "HMI_Instrument".LTM302.PVFiltered := REAL#0.0 ; END_IF; END_IF; IF "System_RunOut_Variables".FastChangeOverActivated THEN "ONS_R"(Enable_ONS := "System_RunOut_Variables".LoadNextRecipe, Aux_ONS := #mAux1ONS, ONS_R => #mAux1ONS_Q ); IF #mAux1ONS_Q THEN "BlenderPID_NextRecipe" () ; #PID_ActualRecipe () ; "System_RunOut_Variables".LoadNextRecipe := FALSE ; "System_RunOut_Variables".NextRecipeOk := TRUE ; END_IF; ELSE "System_RunOut_Variables".LoadNextRecipe := FALSE ; END_IF; "ONS_R"(Enable_ONS := ("HMI_Variables_Cmd".Recipe.Active_Recipe_Start OR "HMI_Variables_Cmd".Recipe.Download) AND NOT "gRecipeManagement_Busy", Aux_ONS := #mAuxONS, ONS_R => #mAuxONS_Q ); IF #mAuxONS_Q THEN #PID_ActualRecipe () ; END_IF; "HMI_PID".RVP303.Pv := "HMI_Instrument".LTP303.PVFiltered ; IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._BlendFillSystem AND "HMI_Blender_Parameters".Processor_Options.Blender_OPT._StillWaterByPass THEN IF NOT "Blender_Variables_Pers".gSkipDeaireation THEN "HMI_PID".RVN302.Pv := "HMI_Instrument".LTN301.PVFiltered; ELSE "HMI_PID".RVN302.Pv := "HMI_Instrument".LTM302.PVFiltered; END_IF; ELSE "HMI_PID".RVN302.Pv := "HMI_Instrument".LTN301.PVFiltered; END_IF ; "HMI_PID".RVS318.Pv := "HMI_Instrument".TTS305_1.PVFiltered ; "HMI_PID".RVM319_PRD.Pv := "HMI_Instrument".TTM306_PRD.PVFiltered ; END_FUNCTION_BLOCK ```