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

11 KiB

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