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

19 KiB

FUNCTION_BLOCK "MFMAnalogValues"
{ S7_Optimized_Access := 'FALSE' }
AUTHOR : 'Author'
FAMILY : TASK0
NAME : 'Name'
VERSION : 1.0
   VAR 
      mCO2InjPressure : Real;
      mCarboCO2DeltaPSim : Real;
      mWaterFlowTmp : Real;
      mSyrupFlowTmp : Real;
      mCarboCO2FlowTmp : Real;
      mWaterVFMError : Real;
      mWaterDRand : Real;
      mCO2WaterEffectDRand : Real;
      mCO2WaterCoupling : Real;
      mSyrupMFMError : Real;
      mSyrupDRand : Real;
      mCO2MFMError : Real;
      mCO2DRand : Real;
      mCO2DensSim : Real;
      mWaterFlowDld : "Delay";
      mSyrupFlowDld : "Delay";
      mCarboCO2FlowDld : "Delay";
      mCO2InjPressFlted : "LowPassFilter";
      mProdFlowFlt : "LowPassFilter";
      mProdFlowFlted : "LowPassFilter";
      mH2OValveSlew : "SlewLimit";
      mH2OFlowFlted : "LowPassFilter";
      mSyrValveSlew : "SlewLimit";
      mSyrFlowFlted : "LowPassFilter";
      mCarboCO2ValveSlew : "SlewLimit";
      mCarboCO2FlowFlted : "LowPassFilter";
   END_VAR

   VAR_TEMP 
      mAux0 : Real;
      mAux1 : Real;
      mTime_sec : Real;
   END_VAR


BEGIN
	
	
	IF NOT "HMI_Blender_Parameters".Processor_Options.Blender_OPT._Simulation THEN
	    IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._Conductimeter_Profibus THEN
	      "Profibus_Variables".gCTS301_Cond := "P_CTS301_Conductivity" ;
	      "Profibus_Variables".gCTS301_Cond_State :=  "P_CTS301_Conductiv_State" ;
	      "HMI_Instrument".CTS301.PV := 1000 * "Profibus_Variables".gCTS301_Cond;
	
	      "Profibus_Variables".gCTS301_Temp := "P_CTS301_Temperature";
	      "Profibus_Variables".gCTS301_Temp_State := "P_CTS301_Temperat_State" ;
	      "HMI_Instrument".TT_S5.PV := "P_CTS301_Temperature" ;
	      
	      "Profibus_Variables".gCTS302_Cond := "P_CTS302_Conductivity" ;
	      "Profibus_Variables".gCTS302_Cond_State :=  "P_CTS302_Conductiv_State" ;
	      "HMI_Instrument".CTS302.PV := 1 * "Profibus_Variables".gCTS302_Cond;
	
	      "Profibus_Variables".gCTS302_Temp := "P_CTS302_Temperature" ;
	      "Profibus_Variables".gCTS302_Temp_State :=  "P_CTS302_Temperat_State" ;
	      "HMI_Instrument".TTS305_1.PV := "P_CTS302_Temperature" ;
	    END_IF ;
	(*  "Profibus_Variables".gVFM_ProductFlow :=  ;            (* Product Flowrate Reading From FM Node17 *)
	    "Profibus_Variables".gVFM_ProductFlow_State :=  ;        (* Product Flowrate Error Code *)
	
	    "Profibus_Variables".gVFM_ProductTotalizer :=  ;            (* Product Totalizer Reading From FM Node17 *)
	    "Profibus_Variables".gVFM_ProductTot_State:=  ;    (* Product Totalizer Error Code *)
	
	    "Profibus_Variables".gProdPH_PHValue :=  ;
	    "Profibus_Variables".gProdPH_PHValue_State :=   ;
	
	    "Profibus_Variables".gProdPH_Temperature :=  ;
	    "Profibus_Variables".gProdPH_Temp_State :=   ;      
	
	    "Profibus_Variables".gProdCond_Conductivity :=  ;
	    "Profibus_Variables".gProdCond_Cond_State :=   ;
	    "Blender_Variables".gProductConductivity := 1000 * "Profibus_Variables".gProdCond_Conductivity;
	
	    "Profibus_Variables".gProdCond_Temperature :=  ;
	    "Profibus_Variables".gProdCond_Temp_State :=   ;      *)
	
	    IF NOT "HMI_Blender_Parameters".Processor_Options.Blender_OPT._FlowMeterType THEN
	        (* Endress Hauser *)
	      "Profibus_Variables".gFTN301_Flow := "P_FTN301_Flow" ;          (* Water Flowrate Reading From VFM Node20 *)
	      "Profibus_Variables".gFTN301_Flow_State := "P_FTN301_Flow_State";     (* Water Flowrate Error Code *)
	  
	      "Profibus_Variables".gFTN301_Tot := "P_FTN301_Totalizer" ;     (* Water Totalizer Reading From VFM Node20 *)
	      "Profibus_Variables".gFTN301_Tot_State := "P_FTN301_Totaliz_State" ;      (* Water Totalizer Error Code *)
	
	      IF ("HMI_Blender_Parameters".Processor_Options.Blender_OPT._Promass > 1) THEN
	          "Profibus_Variables".gFTP302_Flow := "P_FTP302_Flow";        (* Syrup Flowrate Reading From MFM Node21 *)
	          "Profibus_Variables".gFTP302_Flow_State := "P_FTP302_Flow_State";        (* Syrup Flowrate Error Code *)
	          
	          "Profibus_Variables".gFTP302_Temp := "P_FTP302_Temp";  (* Syrup Temperature Reading From MFM Node21 *)
	          IF "Profibus_Variables".gFTP302_Temp > 200 THEN
	              "Profibus_Variables".gFTP302_Temp := "Profibus_Variables".gFTP302_Temp - "Blender_Constants".gZeroAbsolute;
	          END_IF;
	          "Profibus_Variables".gFTP302_Temp_State := "P_FTP302_Temp_State";    (* Syrup Temperature Error Code *)
	          
	          "Profibus_Variables".gFTP302_Tot := "P_FTP302_Totalizer";
	          "Profibus_Variables".gFTP302_Tot_State := "P_FTP302_Totaliz_State";
	          
	          "Profibus_Variables".gFTP302_Density := "P_FTP302_Density" ;
	          "Profibus_Variables".gFTP302_Density_State := "P_FTP302_Density_State";
	          
	          IF "gWorkshopTest" THEN
	              "Profibus_Variables".gFTP302_Brix := "Blender_Constants".gTestSyrBrix;
	          ELSE
	              "Profibus_Variables".gFTP302_Brix := "P_FTP302_Brix";
	          END_IF;
	          "Profibus_Variables".gFTP302_Brix_State := "P_FTP302_Brix_State";
	      END_IF;
	      
	      IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._CarboPresent THEN
	          "Profibus_Variables".gFTM303_Flow := "P_FTM303_Flow" ;
	          "Profibus_Variables".gFTM303_Flow_State := "P_FTM303_Flow_State"; 
	    
	          "Profibus_Variables".gFTM303_Temp := "P_FTM303_Temperature" ;
	          IF "Profibus_Variables".gFTM303_Temp > 200 THEN
	             "Profibus_Variables".gFTM303_Temp := "Profibus_Variables".gFTM303_Temp - "Blender_Constants".gZeroAbsolute  ;
	          END_IF;
	          "Profibus_Variables".gFTM303_Temp_State :=  "P_FTM303_Temperature_State" ; 
	    
	          "Profibus_Variables".gFTM303_Density := "P_FTM303_Density" ;
	          "Profibus_Variables".gFTM303_Density_State := "P_FTM303_Density_State" ; 
	    
	          "Profibus_Variables".gFTM303_Tot := "P_FTM303_Totalizer" ;
	          "Profibus_Variables".gFTM303_Tot_State := "P_FTM303_Totalizer_State" ; 
	      END_IF ;
	    ELSE
	        (* MicroMotion *)
	      IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._WaterPromass THEN
	        "Profibus_Variables".gFTN301_Flow := "P_FTN301_Flow" ;          (* Water Flowrate Reading From VFM Node20 *)
	        "Profibus_Variables".gFTN301_Tot := "P_FTN301_Totalizer" ;     (* Water Totalizer Reading From VFM Node20 *)
	      ELSE
	         (* Promag 53 *)
	        "Profibus_Variables".gFTN301_Flow := "P_FTN301_Flow" ;          (* Water Flowrate Reading From VFM Node20 *)
	        "Profibus_Variables".gFTN301_Flow_State := "P_FTN301_Flow_State";     (* Water Flowrate Error Code *)
	  
	        "Profibus_Variables".gFTN301_Tot := "P_FTN301_Totalizer" ;     (* Water Totalizer Reading From VFM Node20 *)
	        "Profibus_Variables".gFTN301_Tot_State := "P_FTN301_Totaliz_State" ;      (* Water Totalizer Error Code *)
	      END_IF;
	
	      IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._Promass > 1 THEN
	          "Profibus_Variables".gFTP302_Flow :=  "P_FTP302_Flow" ;        (* Syrup Flowrate Reading From MFM Node21 *)
	          "Profibus_Variables".gFTP302_Flow_State := "P_FTP302_Flow_State" ;        (* Syrup Flowrate Error Code *)
	    
	          "Profibus_Variables".gFTP302_Temp := "P_FTP302_Temp" ;  (* Syrup Temperature Reading From MFM Node21 *)
	          IF "Profibus_Variables".gFTP302_Temp > 200 THEN
	             "Profibus_Variables".gFTP302_Temp := "Profibus_Variables".gFTP302_Temp - "Blender_Constants".gZeroAbsolute ;
	          END_IF;
	    
	          "Profibus_Variables".gFTP302_Tot := "P_FTP302_Totalizer" ;
	    
	          "Profibus_Variables".gFTP302_Density := "P_FTP302_Density" ;
	    
	          IF "gWorkshopTest" AND NOT "HMI_Service".Workshop_Test.SyrupTestRequest  THEN
	             "Profibus_Variables".gFTP302_Brix := "Blender_Constants".gTestSyrBrix ;
	          ELSE
	             "Profibus_Variables".gFTP302_Brix := "P_FTP302_Brix" ;
	          END_IF;
	      END_IF ;
	
	      IF "HMI_Blender_Parameters".Processor_Options.Blender_OPT._CarboPresent THEN
	          "Profibus_Variables".gFTM303_Flow := "P_FTM303_Flow" ;
	          "Profibus_Variables".gFTM303_Flow_State := "P_FTM303_Flow_State" ; 
	    
	          "Profibus_Variables".gFTM303_Temp := "P_FTM303_Temperature" ;
	          IF "Profibus_Variables".gFTM303_Temp > 200 THEN
	             "Profibus_Variables".gFTM303_Temp := "Profibus_Variables".gFTM303_Temp - "Blender_Constants".gZeroAbsolute  ;
	          END_IF;
	          (* "Profibus_Variables".gFTM303_Temp_State :=  "MFM_CO2_Temper_State" ; *)
	    
	          "Profibus_Variables".gFTM303_Density := "P_FTM303_Density" ;
	    
	          "Profibus_Variables".gFTM303_Tot := "P_FTM303_Totalizer" ;
	      END_IF;
	    END_IF;
	
	    #mCO2InjPressure := "CO2InjPressure"(i_Temp := "Profibus_Variables".gFTM303_Temp,
	                                              i_Dens := "Profibus_Variables".gFTM303_Density);
	ELSE     // Simulation active
	    IF "gBlenderProdMode" THEN
	       //Calculates the flow across the water valve 
	         (* classic code: #mH2OValveSlew(i_InValue := "HMI_PID".RMM301.Out,
	                       i_SlewMax := 15.0,
	                       i_Cycle   := "Time_50ms",
	                       out       := "PID_Variables".Simulation.H2OValve_Slew_Out );*)
	         #mH2OValveSlew(i_InValue := "HMI_PID".RMM301.Out,
	                       i_SlewMax := REAL#15.0,
	                       i_Cycle   := "Time_50ms",
	                       out       := "PID_Variables".Simulation.H2OValve_Slew_Out ); 
	                       
	        IF ("Procedure_Variables"."CarboWaterLine".Running OR "Procedure_Variables".TN301_StartUp.Running ) AND "HMI_Device".AVM322.Out THEN
	            "PID_Variables".Simulation.H2OValve_Slew_Out := 4 ;
	        END_IF;
	        #mCarboCO2DeltaPSim := "DeltaP"(i_Flow  := "PID_Variables".Simulation.CarboCO2_Flow,
	                                      i_K     := "Blender_Constants".gRMM303ValveCv,
	                                      i_Valve :=  "PID_Variables".Simulation.CarboCO2_Slew_Out);
	                                      
	        (* classic code: #mWaterFlowTmp := "ValveFlow"(i_DeltaP  := "PID_Variables".RMM301DeltaP - 0.02 * #mCarboCO2DeltaPSim,
	                                    i_ValveOp := "PID_Variables".Simulation.H2OValve_Slew_Out,
	                                    i_KFF     := 0.055,
	                                    i_Dens    := "Blender_Constants".gH2O_Density )+ #mWaterVFMError + #mCO2WaterCoupling ;*)
	        #mWaterFlowTmp := "ValveFlow"(i_DeltaP  := "PID_Variables".RMM301DeltaP - REAL#0.02 * #mCarboCO2DeltaPSim,
	                                    i_ValveOp := "PID_Variables".Simulation.H2OValve_Slew_Out,
	                                    i_KFF     := REAL#0.055,
	                                    i_Dens    := "Blender_Constants".gH2O_Density )+ #mWaterVFMError + #mCO2WaterCoupling ;
	                                                        
	        #mH2OFlowFlted(i_Value  := #mWaterFlowTmp, 
	                      i_Num    := 10, 
	                      i_Enable := TRUE);
	
	        #mWaterFlowDld(i_Value  := #mH2OFlowFlted.FilterOut,
	                      i_Sample := 2);           
	       
	        "FW_DRand"(Channel      := 100, 
	                 RandomNumber => #mCO2WaterEffectDRand); 
	         
	        IF ("Blender_Variables_Pers".gCarboStillProduct OR "HMI_Blender_Parameters".Processor_Options.Blender_OPT._DoubleDeair) AND "Blender_Variables".gWaterPipe_Vel > 0 AND "gBlenderStableFlow" THEN
	            (* classic code: #mCO2WaterCoupling := #mCO2WaterEffectDRand * (1 / SQR("Blender_Variables".gWaterPipe_Vel)* "Blender_Variables".gWaterPipe_Vel ) * #mWaterFlowDld.i_out * 0.02 ;*)
	            #mCO2WaterCoupling := #mCO2WaterEffectDRand * (1 / SQR("Blender_Variables".gWaterPipe_Vel)* "Blender_Variables".gWaterPipe_Vel ) * #mWaterFlowDld.i_out * REAL#0.02 ;
	        ELSE
	            (* classic code: #mCO2WaterCoupling := 0.0 ;*)
	            #mCO2WaterCoupling := REAL#0.0 ;
	        END_IF;
	    
	        "FW_DRand"(Channel      := 101, 
	                 RandomNumber => #mWaterDRand);        
	        #mWaterVFMError := #mWaterDRand * "Blender_Variables".gWaterVFMCalcError ;
	        "PID_Variables".Simulation.Water_Flow := #mWaterFlowDld.i_out ;
	
	        #mSyrValveSlew(i_InValue := "HMI_PID".RMP302.Out, 
	                      i_SlewMax := 20,
	                      i_Cycle   := "Time_50ms",
	                      out       := "PID_Variables".Simulation.SyrupValve_Slew_Out); 
	 
	        (* classic code: #mSyrupFlowTmp := "ValveFlow"(i_DeltaP  := "PID_Variables".RMP302DeltaP,
	                                    i_ValveOp := "PID_Variables".Simulation.SyrupValve_Slew_Out,
	                                    i_KFF     := 0.35,
	                                    i_Dens    := "HMI_Blender_Parameters".Actual_Recipe_Parameters._SyrupDensity)+ #mSyrupMFMError;*)
	        #mSyrupFlowTmp := "ValveFlow"(i_DeltaP  := "PID_Variables".RMP302DeltaP,
	                                    i_ValveOp := "PID_Variables".Simulation.SyrupValve_Slew_Out,
	                                    i_KFF     := REAL#0.35,
	                                    i_Dens    := "HMI_Blender_Parameters".Actual_Recipe_Parameters._SyrupDensity)+ #mSyrupMFMError;
	               
	        #mSyrFlowFlted(i_Value  := #mSyrupFlowTmp, 
	                      i_Num    := 10, 
	                      i_Enable := TRUE);
	                      
	        #mSyrupFlowDld(i_Value  := #mSyrFlowFlted.FilterOut,
	                      i_Sample := 5);
	                      
	        "FW_DRand"(Channel      := 102, 
	                 RandomNumber => #mSyrupDRand);
	        #mSyrupMFMError := #mSyrupDRand * "Blender_Variables".gSyrupMFMCalcError ;
	        "PID_Variables".Simulation.Syrup_Flow := #mSyrupFlowDld.i_out ;
	
	        #mCarboCO2ValveSlew(i_InValue := "HMI_PID".RMM303.Out, 
	                           i_SlewMax := 20,
	                           i_Cycle   := "Time_50ms",
	                           out       := "PID_Variables".Simulation.CarboCO2_Slew_Out); 
	
	        (* classic code: #mCarboCO2FlowTmp := "ValveFlow"(i_DeltaP  := "PID_Variables".RMM303DeltaP,
	                                       i_ValveOp := "PID_Variables".Simulation.CarboCO2_Slew_Out,
	                                       i_KFF     := 0.34,
	                                       i_Dens    := "Blender_Constants".gCO2_Density / 1000)+ #mCO2MFMError;*)
	        #mCarboCO2FlowTmp := "ValveFlow"(i_DeltaP  := "PID_Variables".RMM303DeltaP,
	                                       i_ValveOp := "PID_Variables".Simulation.CarboCO2_Slew_Out,
	                                       i_KFF     := REAL#0.34,
	                                       i_Dens    := "Blender_Constants".gCO2_Density / 1000)+ #mCO2MFMError;
	           
	        #mCarboCO2FlowFlted(i_Value  := #mCarboCO2FlowTmp, 
	                           i_Num    := 10, 
	                           i_Enable := TRUE);
	
	        #mCarboCO2FlowDld(i_Value  := #mCarboCO2FlowFlted.FilterOut,
	                         i_Sample := 3);
	                         
	        "FW_DRand"(Channel      := 2147483647, 
	                 RandomNumber => #mCO2DRand);
	        #mCO2MFMError := #mCO2DRand * "Blender_Variables".gCO2MFMCalcError ;
	        "PID_Variables".Simulation.CarboCO2_Flow := #mCarboCO2FlowDld.i_out ;
	
	        "Profibus_Variables".gFTN301_Flow := "PID_Variables".Simulation.Water_Flow ;
	        "Profibus_Variables".gFTP302_Flow := "PID_Variables".Simulation.Syrup_Flow ;
	        "Profibus_Variables".gFTM303_Flow := "PID_Variables".Simulation.CarboCO2_Flow ;
	
	        #mAux0 := DINT_TO_REAL(TIME_TO_DINT("gSystem_Time")/10 MOD 100);
	        #mAux1 := DINT_TO_REAL(TIME_TO_DINT("gSystem_Time")/1000 MOD 60);
	        (* classic code: #mTime_sec := #mAux1 + #mAux0 / 100.0;*)
	        #mTime_sec := #mAux1 + #mAux0 / REAL#100.0;
	
	        (* classic code: #mCO2DensSim := 0.028 + 0.0015 * SIN(2 * "Blender_Constants".gP_Greek * #mTime_sec * 5 / 60) ;*)
	        #mCO2DensSim := REAL#0.028 + REAL#0.0015 * SIN(2 * "Blender_Constants".gP_Greek * #mTime_sec * 5 / 60) ;
	        (* classic code: #mCO2InjPressure := "CO2InjPressure"(i_Temp := 20.0, 
	                                                  i_Dens := #mCO2DensSim);*)
	        #mCO2InjPressure := "CO2InjPressure"(i_Temp := REAL#20.0, 
	                                                  i_Dens := #mCO2DensSim);
	                             
	        "Profibus_Variables".gFTP302_Brix := "Blender_Constants".gTestSyrBrix;
	        "Profibus_Variables".gFTP302_Density := "SyrupDensity"(i_SyrupBrix := "Blender_Constants".gTestSyrBrix );                                                                   
	    END_IF;
	END_IF;
	 
	#mCO2InjPressFlted(i_Value  := #mCO2InjPressure, 
	                  i_Num    := 8, 
	                  i_Enable := TRUE);
	(* classic code: "Blender_Variables".gCO2InjPressureCalc := LIMIT(MN:= 10,IN:= #mCO2InjPressFlted.FilterOut,MX:= 20) * 1.0 ;*)
	"Blender_Variables".gCO2InjPressureCalc := LIMIT(MN:= 10,IN:= #mCO2InjPressFlted.FilterOut,MX:= 20) * REAL#1.0 ;
	
	#mProdFlowFlted(i_Value  := "Profibus_Variables".gVFM_ProductFlow, 
	               i_Num    := 8, 
	               i_Enable := TRUE);
	"Blender_Variables".gProd_Flow_Meas := #mProdFlowFlted.FilterOut ;
	
	IF "gBlenderProdMode" THEN
	    #mH2OFlowFlted(i_Value  := "Profibus_Variables".gFTN301_Flow, 
	                  i_Num    := 6, 
	                  i_Enable := "gBlenderFlowFltEn");
	    "Blender_Variables".gH2O_Flow_Meas := #mH2OFlowFlted.FilterOut ;
	    
	    #mSyrFlowFlted(i_Value  := "Profibus_Variables".gFTP302_Flow, 
	                  i_Num    := 6, 
	                  i_Enable := "gBlenderFlowFltEn");
	    "Blender_Variables".gSYR_Flow_Meas := #mSyrFlowFlted.FilterOut ;
	    
	    #mCarboCO2FlowFlted(i_Value  := "Profibus_Variables".gFTM303_Flow, 
	                       i_Num    := 6, 
	                       i_Enable := "gBlenderFlowFltEn");
	    "MFMAnalogValues_Totalize"();
	ELSE
	    #mH2OFlowFlted(i_Value  := "Profibus_Variables".gFTN301_Flow, 
	                  i_Num    := 10, 
	                  i_Enable := "gBlenderFlowFltEn");
	    "Blender_Variables".gH2O_Flow_Meas := #mH2OFlowFlted.FilterOut ;
	    
	    #mSyrFlowFlted(i_Value  := "Profibus_Variables".gFTP302_Flow, 
	                  i_Num    := 0, 
	                  i_Enable := "gBlenderFlowFltEn");
	    "Blender_Variables".gSYR_Flow_Meas := #mSyrFlowFlted.FilterOut ;
	    
	    #mCarboCO2FlowFlted(i_Value  := "Profibus_Variables".gFTM303_Flow, 
	                       i_Num    := 0, 
	                       i_Enable := "gBlenderFlowFltEn");         
	END_IF;
	
	IF "Blender_Constants".gCO2_Density <> 0 THEN
	    "Blender_Variables".gCO2_Flow_Meas := #mCarboCO2FlowFlted.FilterOut / "Blender_Constants".gCO2_Density ;
	END_IF;
	
	IF "Blender_Constants".gCO2_Density <> 0 AND "gWorkshopTest" AND "HMI_Service".Workshop_Test.CO2TestRequest THEN
	    "Blender_Variables".gCO2_Flow_Meas := #mCarboCO2FlowFlted.FilterOut / "Blender_Constants".gAir_Density ;
	END_IF;
	
	IF "Blender_Variables".gActualSyrupDens > 0 THEN
	    "Blender_Variables".gSYR_Vol_Flow_Meas := "Blender_Variables".gSYR_Flow_Meas / "Blender_Variables".gActualSyrupDens ;
	ELSE
	    "Blender_Variables".gSYR_Vol_Flow_Meas := "Blender_Variables".gSYR_Flow_Meas ;
	END_IF;
	#mProdFlowFlt(i_Value  := "Blender_Variables".gH2O_Flow_Meas + "Blender_Variables".gSYR_Vol_Flow_Meas, 
	                       i_Num    := 18, 
	                       i_Enable := "gBlenderFlowFltEn");
	"Blender_Variables".gActual_Prod_Flow := #mProdFlowFlt.FilterOut ;
	
	
END_FUNCTION_BLOCK