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