```pascal // Block Type: FB // Block Number: 1791 // Original Network Languages: STL, LAD FUNCTION_BLOCK "PID_Filling_Head" { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 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 ```