Obsidean_VM/04-SIDEL/06 - E5.007363 - Modifica O.../Source/source/BlenderPID__Main.md

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