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

12 KiB

// Block Type: FB
// Block Number: 1791
// Original Network Languages: LAD, STL

FUNCTION_BLOCK "PID_Filling_Head"
{ S7_Optimized_Access := 'TRUE' }
VERSION : 0.1

VAR_INPUT
  i_InValue : Real;
  i_SlewMax : Real;
  i_Cycle : Real;
END_VAR

VAR_OUTPUT
  LMN_P : Real;
  LMN_I : Real;
  LMN_D : Real;
END_VAR

VAR_INOUT
  TNKLev : Real;
END_VAR

VAR_STAT
  mFillerProdSlew : Real;
  mPIDFillHeadProp : Real;
  mPIDFillHeadInt : Real;
  mPIDFillHeadDer : Real;
  mFillerEstSlew : "SlewLimit";
  mFillingHead_PID : "PIDControl";
  Calcolous : "PID_Filling_Head_Calc";
  mReset_Int_ONS : Bool;
END_VAR

VAR_TEMP
  mDummy : Bool;
  mAuxCalc : Real;
  mHr_Hs : Real;
  Block_Move_Err : Int;
  __PlcmigTempFillBits_12B0 : Array[0..7] of Bool;
END_VAR

BEGIN

  // Network 1: To HMI (0: PID        1: fixed values) (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."ConfigPID" := "HMI_PID"."PPM303"."ConfigPID";

  // Network 2: To HMI (0: PID        1: fixed values) (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Hold_Int" := "HMI_PID"."PPM303"."Hold_Int";

  // Network 3: To HMI (0: PID        1: fixed values) (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."I_ITL" := "HMI_PID"."PPM303"."I_ITL";

  // Network 4: To HMI (0: PID        1: fixed values) (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Alarm" := "HMI_PID"."PPM303"."Alarm";

  // Network 5: To HMI (0: PID        1: fixed values) (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Config" := "HMI_PID"."PPM303"."Config";

  // Network 6: To HMI (0: PID        1: fixed values) (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."High_Limit" := "HMI_PID"."PPM303"."High_Limit";

  // Network 7: To HMI (0: PID        1: fixed values) (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Low_Limit" := "HMI_PID"."PPM303"."Low_Limit";

  // Network 8: From HMI - Local (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."ManualControl"."LocalSP" := "HMI_PID"."PPM303"."ManualControl"."LocalSP";

  // Network 9: BP (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Bp" := "HMI_PID"."PPM303"."Bp";

  // Network 10: Integral (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Ti" := "HMI_PID"."PPM303"."Ti";

  // Network 11: Differential (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Td" := "HMI_PID"."PPM303"."Td";

  // Network 12: Feed Forward (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Ff" := "HMI_PID"."PPM303"."Ff";

  // Network 13: Proportional (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."KP" := "HMI_PID"."PPM303"."KP";

  // Network 14: PV (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Pv" := "HMI_PID"."PPM303"."Pv";

  // Network 15: Limit (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."OutMaxHmi" := "HMI_PID"."PPM303"."OutMaxHmi";

  // Network 16: Limit (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Lsp" := "HMI_PID"."PPM303"."Lsp";

  // Network 17: Cycle Time (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Cycle_Time" := "HMI_PID"."PPM303"."Cycle_Time";

  // Network 18: Integral (Original Language: LAD)

  IF "gIN_FillerBottleFilling" THEN
    "Filler_Head_Variables"."FillerHead"."I_ITLVAL" := "HMI_PID"."PPM303"."I_ITLVAL";
  END_IF;

  // Network 19: Dead band (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Dead_Band" := "HMI_PID"."PPM303"."Dead_Band";

  // Network 20: Fillig Head Calculation (Original Language: LAD)

  "Calcolous"();

  // Network 21: Estimated Product Flow in l/min (Original Language: LAD)

  TankLevelToHeight(Level_Height0 := "HMI_Blender_Parameters"."ProcessSetup"."_TM301Height_0", Level_Height1 := "HMI_Blender_Parameters"."ProcessSetup"."_TM301Height_2", Level_Perc0 := 0.0, Level_Perc1 := "HMI_Blender_Parameters"."ProcessSetup"."_TM301LevelPerc_2", Level_Percentage := "HMI_Instrument"."LTM302"."PVFiltered");

  "Filler_Head_Variables"."TM301_Height" := "HMI_Variables_Status"."Analog_Values"."TM301Heigh";

  FillingTime(i_BottleSize := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_BottleSize", i_FillingValveHead := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_FillingValveHead_SP");

  "HMI_Blender_Parameters"."ProcessSetup"."_FillingTime" := "Filler_Head_Variables"."FillingTime";

  "mDummy" := TRUE;

  // Network 22: Estimated Product Flow  in l/min (Original Language: LAD)

  "mAuxCalc" := "Filler_Head_Variables"."Filler_Speed" / 60.0;

  "Filler_Head_Variables"."Prod_FlowEstimated" := "mAuxCalc" * "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_BottleSize";

  // Network 23: Estimated Product Flow in l/min (Original Language: LAD)

  SEL_R(G := "Filler_Head_Variables"."FillingTime" > 0.0, IN0 := 1.0, IN1 := "Filler_Head_Variables"."FillingTime");

  "mAuxCalc" := "Filler_Head_Variables"."Prod_FlowEstimated" / "mAuxCalc";

  SEL_R(G := "Filler_Head_Variables"."Filler_Speed" > 0.0, IN0 := "mFillerProdSlew", IN1 := "mAuxCalc");

  // Network 24: Estimated Product Flow in l/min (Original Language: LAD)

  SEL_R(G := "gIN_FillerBottleFilling", IN0 := 0.0, IN1 := "Filler_Head_Variables"."Prod_FlowEstimated");

  LIMIT_R(IN := "mFillerProdSlew", MN := 0.5, MX := 100000.0);

  "mFillerEstSlew"(i_Cycle := "HMI_PID"."PPM303"."Cycle_Time", i_InValue := "Filler_Head_Variables"."Prod_FlowEstimated", i_SlewMax := "mFillerProdSlew", out := "Filler_Head_Variables"."Prod_FlowEstimatedSlw");

  // Network 25: 1 = CIP or Rinse (Original Language: LAD)

  "Filler_Head_Variables"."Head_CIP_Rinse" := "gBlenderCIPMode" OR ("gBlenderRinseMode" AND "Blender_Variables_Pers"."gFillerRinse_DoneLatch");

  // Network 26: From HMI (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."ManualControl"."ManOut" := "HMI_PID"."PPM303"."ManualControl"."ManOut" OR "Filler_Head_Variables"."Head_Drain";

  // Network 27: Out min (Original Language: LAD)

  Freq_To_mmH2O(i_Freq := "HMI_PID"."PPM303"."OutMin", i_K_freq := "HMI_Blender_Parameters"."ProcessSetup"."_KPPM303");

  // Network 28: Out Max (Original Language: LAD)

  SEL_R(G := "Filler_Head_Variables"."FillerHead"."ManualControl"."ManOut", IN0 := "Filler_Head_Variables"."Prod_HeadPIDMax_Freq", IN1 := "HMI_PID"."PPM303"."OutMax");

  Freq_To_mmH2O(i_Freq := "mAuxCalc", i_K_freq := "HMI_Blender_Parameters"."ProcessSetup"."_KPPM303");

  // Network 29: 1 = Enable Filling Valve Head PID (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."ManualControl"."PidEnable" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" AND (("Filler_Head_Variables"."Head_CIP_Rinse" AND "Procedure_Variables"."Blender_Run"."Latch") OR ("gIN_Filler_AVM346_En" AND "HMI_Device"."AVM346"."Alarm" AND "gIN_Filler_AVM362_En" AND "HMI_Device"."AVM362"."Alarm" AND "gDiffSensor_Analog_Fault" AND ("gP_PID_Head_Enable" OR ("System_RunOut_Variables"."ProdPipe_RunOut"."Done" AND "Procedure_Variables"."BlendFill_StartUp"."Done"))));

  "HMI_PID"."PPM303"."ManualControl"."PidEnable" := "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" AND (("Filler_Head_Variables"."Head_CIP_Rinse" AND "Procedure_Variables"."Blender_Run"."Latch") OR ("gIN_Filler_AVM346_En" AND "HMI_Device"."AVM346"."Alarm" AND "gIN_Filler_AVM362_En" AND "HMI_Device"."AVM362"."Alarm" AND "gDiffSensor_Analog_Fault" AND ("gP_PID_Head_Enable" OR ("System_RunOut_Variables"."ProdPipe_RunOut"."Done" AND "Procedure_Variables"."BlendFill_StartUp"."Done"))));

  // Network 30: Integral PID Hold (Original Language: LAD)

  "Filler_Head_Variables"."FillerHead"."Hold_Int" := "Filler_Head_Variables"."FillerHead"."ManualControl"."PidEnable" OR "Procedure_Variables"."BlendFill_StartUp"."Latch";

  // Network 31: Integral PID Inizilize (Original Language: STL)
  //   #mReset_Int_ONS

  // --- BEGIN STL Network 31 ---
   
     	A_BRACK
     	O	"Filler_Head_Variables".FillerHead.ManualControl.ManOut
     	O	"Filler_Head_Variables".Head_CIP_Rinse
     	ON	"gIN_FillerBottleFilling"
     	BRACKET
     	Rise	"FillingHeadIntegrInit"
     	=	"__PlcmigTempFillBits_12B0"[0]
     	A	"__PlcmigTempFillBits_12B0"[0]
     	JC	ZERO
     	JU	NORM
     ZERO:   		L	0.0
     	T	"Filler_Head_Variables".FillerHead.I_ITLVAL
     NORM:   		NOP_0
   
  // --- END STL Network 31 ---

  // Network 32: Centrifugal Head (Original Language: LAD)

  Cetrifugal_Head(i_Diameter := "HMI_Blender_Parameters"."ProcessSetup"."_FillerDiameter", i_NumValve := "HMI_Blender_Parameters"."ProcessSetup"."_FillingValveNum", i_Speed := "Filler_Head_Variables"."Filler_Speed");

  // Network 33: Estimated Product Flow in l/min (Original Language: LAD)

  "mAuxCalc" := "Filler_Head_Variables"."Prod_Flow";

  LIMIT_R(IN := "mAuxCalc", MN := 10.0, MX := 4000.0);

  Flow_To_Press_Loss(i_Flow := "mAuxCalc", i_K_Loss := "Filler_Head_Variables"."mKp_Loss");

  // Network 34: FILLING HEAD SETPOINT SELECTION (Original Language: LAD)
  //   during the startup use fixed Filling head = 2,5 M

  SEL_R(G := "Procedure_Variables"."BlendFill_StartUp"."Latch", IN0 := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_FillingValveHead_SP", IN1 := 2.5);

  "Filler_Head_Variables"."FillerHead"."Sp" := "mAuxCalc";

  "HMI_PID"."PPM303"."Sp" := "mAuxCalc";

  // Network 35: FEEDFORWARD CALCULATION (Original Language: LAD)

  "mAuxCalc" := "mAuxCalc" + "HMI_Blender_Parameters"."ProcessSetup"."_FillingValveHeight";

  "mAuxCalc" := "mAuxCalc" - "Filler_Head_Variables"."TM301_Height";

  "mAuxCalc" := "Filler_Head_Variables"."TotalPressLoss" + "mAuxCalc";

  LIMIT_R(IN := "mAuxCalc", MN := 0.0, MX := "Filler_Head_Variables"."FillerHead"."OutMax");

  // Network 36: Feed Forward Out (Original Language: LAD)

  mmH2O_TO_Freq(i_Head := "Filler_Head_Variables"."FillerHead"."FfOut", i_K_Pump := "HMI_Blender_Parameters"."ProcessSetup"."_KPPM303");

  // Network 37: Diff Height (Original Language: LAD)

  "mAuxCalc" := "HMI_Blender_Parameters"."ProcessSetup"."_DiffSensor_Height" + "HMI_Blender_Parameters"."ProcessSetup"."_DiffSensor_DeltaHeight";

  "Filler_Head_Variables"."DiffSensor_Height" := "mAuxCalc" - "HMI_Blender_Parameters"."ProcessSetup"."_DiffSensor_Offset";

  // Network 38: PV (Original Language: LAD)

  "mHr_Hs" := "HMI_Blender_Parameters"."ProcessSetup"."_FillingValveHeight" - "Filler_Head_Variables"."DiffSensor_Height";

  "mAuxCalc" := "HMI_Instrument"."PTF203"."PVFiltered" + "Filler_Head_Variables"."FillerCentrifugalHead";

  "Filler_Head_Variables"."FillerHead"."Pv" := "mAuxCalc" - "mHr_Hs";

  "HMI_PID"."PPM303"."Pv" := "Filler_Head_Variables"."FillerHead"."Pv";

  // Network 39: Out Manual (Original Language: LAD)

  Freq_To_mmH2O(i_Freq := "HMI_PID"."PPM303"."OutMan", i_K_freq := "HMI_Blender_Parameters"."ProcessSetup"."_KPPM303");

  // Network 40: PID Control (Original Language: LAD)

  "mFillingHead_PID"(D_Sel := "AUX TRUE", FF_Enable := "AUX TRUE", I_Sel := "AUX TRUE", LMN_FAC := 1.0, LMN_OFF := 0.0, MAN_ON := "Filler_Head_Variables"."FillerHead"."ManualControl"."ManOut", PID_Data := "Filler_Head_Variables"."FillerHead", PID_Enable := "Filler_Head_Variables"."FillerHead"."ManualControl"."PidEnable" OR "Filler_Head_Variables"."FillerHead"."I_ITL", P_Sel := "AUX TRUE", REG_INV := "AUX FALSE");

  // Network 41: Integral PID Inizilize (Original Language: LAD)

  IF "Filler_Head_Variables"."FillerHead"."I_ITL" THEN
    "Filler_Head_Variables"."FillerHead"."I_ITL" := FALSE;
  END_IF;

  // Network 42: Valve Output (Original Language: LAD)

  SEL_R(G := "Filler_Head_Variables"."FillerHead"."ManualControl"."PidEnable", IN0 := 0.0, IN1 := "Filler_Head_Variables"."FillerHead"."Out");

  mmH2O_TO_Freq(i_Head := "Filler_Head_Variables"."FillerHead"."Out", i_K_Pump := "HMI_Blender_Parameters"."ProcessSetup"."_KPPM303");

  // Network 43: Setpoint (Original Language: LAD)

  "HMI_PID"."PPM303"."Sp" := "Filler_Head_Variables"."FillerHead"."Sp";

END_FUNCTION_BLOCK