22 KiB
22 KiB
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