```pascal // Block Type: FB // Block Number: 1719 // Original Network Languages: LAD, STL FUNCTION_BLOCK "BlenderRun_MeasFilSpeed" { S7_Optimized_Access := 'TRUE' } VERSION : 0.1 VAR_INPUT i_Value : Real; i_Num : Int; i_Enable : Bool; END_VAR VAR_OUTPUT FilterOut : Real; END_VAR VAR_STAT mNumOfCycle : Int; mInitialLevel : Real; mPrevSpeed : Real; mAcqTime : Real; mProdLt : Real; mSaveDeltaV : Real; mFillerTracked : Bool; mFillerTrackedTmrON : Bool; mFlrFlowDelayOnON : Bool; mFlrFlowDelayOffON : Bool; mFillerTrackedTmr : STRUCT PT : Time; ET : Time; IN : Bool; Q : Bool; END_STRUCT; mFlrFlowDelayOn : STRUCT PT : Time; ET : Time; IN : Bool; Q : Bool; END_STRUCT; mFlrFlowDelayOff : STRUCT PT : Time; ET : Time; IN : Bool; Q : Bool; END_STRUCT; mFillerDeltaVFilter : "LowPassFilter"; mFillerSpeedFilter : "LowPassFilter"; END_VAR VAR_TEMP mReadLevel : Bool; mNotZero : Bool; mSave : Bool; gBlenderSpeedUp : Bool; gBlenderSpeedDown : Bool; mDummy : Bool; Aux_calc1 : Real; Aux_calc2 : Real; mTemp : Real; mSpeedPerc : Real; mFillerEstimatedFlow : Real; __PlcmigTempFillBits_22B0 : Array[0..7] of Bool; END_VAR #_20S : Bool; // Auto-generated temporary #TON_INSTANCE_29 : Bool; // Auto-generated temporary BEGIN // Network 1: Track Filler Speed Start (Original Language: LAD) IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_TrackFillerSpeed" THEN "gTrackFillerSpeed" := TRUE; END_IF; // Network 2: Track Filler Speed Stop (Original Language: LAD) IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_TrackFillerSpeed" OR "HMI_PID"."RMM301"."ManualControl"."ManOut" THEN "gTrackFillerSpeed" := FALSE; END_IF; // Network 3: Qualifier (Original Language: LAD) "Procedure_Variables"."Filler_Speed"."Qualifier" := "Procedure_Variables"."Blender_Run"."Latch" OR "AUX FALSE"; // Network 4: Read Level (Original Language: LAD) "mReadLevel" := Eq("mNumOfCycle", 0); // Network 5: Read level & Product Target (Original Language: LAD) IF "mReadLevel" THEN "mInitialLevel" := "HMI_Instrument"."LTM302"."PVFiltered"; "mPrevSpeed" := "Blender_Variables"."gActual_Prod_SP"; END_IF; // Network 6: Acquisition Time (Original Language: LAD) IF "Procedure_Variables"."Filler_Speed"."Qualifier" AND "Procedure_Variables"."Filler_Speed"."Latch" THEN "mAcqTime" := "mAcqTime" + "Time_300ms"; END_IF; // Network 7: Speed Request (Original Language: LAD) IF "Procedure_Variables"."Filler_Speed"."Qualifier" THEN "mNumOfCycle" := "mNumOfCycle" + 1; END_IF; "Procedure_Variables"."Filler_Speed"."Request" := "mNumOfCycle" > 8; // Network 8: Speed Latch (Original Language: LAD) "Procedure_Variables"."Filler_Speed"."Latch" := ("FirstScan" AND "Procedure_Variables"."Filler_Speed"."Done" AND "Procedure_Variables"."Filler_Speed"."Qualifier" AND "Procedure_Variables"."Filler_Speed"."Latch") OR ("FirstScan" AND "Procedure_Variables"."Filler_Speed"."Done" AND "Procedure_Variables"."Filler_Speed"."Qualifier" AND "Procedure_Variables"."Filler_Speed"."Request"); // Network 9: Product Liters Calculation (Original Language: LAD) IF "Procedure_Variables"."Filler_Speed"."Latch" THEN "Aux_calc1" := "Blender_Variables"."gProdTankVolume" - "Blender_Variables"."gProdTankBottomVol"; "mNumOfCycle" := 0; END_IF; IF "Procedure_Variables"."Filler_Speed"."Latch" THEN "Aux_calc1" := "Aux_calc1" / 100.0; END_IF; IF "Procedure_Variables"."Filler_Speed"."Latch" THEN "Aux_calc2" := "mInitialLevel" - "HMI_Instrument"."LTM302"."PVFiltered"; END_IF; IF "Procedure_Variables"."Filler_Speed"."Latch" THEN "mProdLt" := "Aux_calc1" * "Aux_calc2"; END_IF; // Network 10: Reset Product Liters (Original Language: LAD) IF "Procedure_Variables"."First_Production"."Done" THEN "mProdLt" := 0.0; END_IF; // Network 11: Acquisition Time not Zero (Original Language: LAD) "mNotZero" := Ne("mAcqTime", 0.0); // Network 12: Filler DeltaV Filter (Original Language: STL) // Aggiungere il LowPassFilter!! // --- BEGIN STL Network 12 --- A "mNotZero" A "Procedure_Variables".Filler_Speed.Latch = "__PlcmigTempFillBits_22B0"[0] A "AUX TRUE" = "__PlcmigTempFillBits_22B0"[1] BLD 103 A_BRACK A_BRACK A "__PlcmigTempFillBits_22B0"[0] JNB _00b L "mProdLt" L "mAcqTime" DIV_R T "Aux_calc1" AN _Statusword_? SAVE CLR _00b: A _Statusword_? BRACKET JNB _00c L "Aux_calc1" L 60.0 MUL_R T "Aux_calc1" AN _Statusword_? SAVE CLR _00c: A _Statusword_? BRACKET JNB _00d CALL "mFillerDeltaVFilter" _00d: NOP_0 A "__PlcmigTempFillBits_22B0"[0] JNB _00e L 0 T "mAcqTime" _00e: NOP_0 // --- END STL Network 12 --- // Network 13: Save (Original Language: LAD) IF "Procedure_Variables"."Filler_Speed"."Qualifier" THEN "Aux_calc1" := "mSaveDeltaV" - "Blender_Variables"."gBlenderFillerDeltaV"; END_IF; "mSave" := "Aux_calc1" < 20.0; // Network 14: Delta V (Original Language: LAD) "Blender_Variables"."gBlenderFillerDeltaV" := "mSaveDeltaV"; // Network 15: Actual Product Target With Slew Limitation (Original Language: LAD) "gBlenderSpeedUp" := "Blender_Variables"."gActual_Prod_SP" > "mPrevSpeed"; // Network 16: Actual Product Target With Slew Limitation (Original Language: LAD) "gBlenderSpeedDown" := "mPrevSpeed" < "Blender_Variables"."gActual_Prod_SP"; // Network 17: FillerTracked (Original Language: LAD) #TON_INSTANCE_29(IN := "HMI_Device"."PPM303"."Out" AND "HMI_Device"."AVM362"."Out" AND "DI_Flr1_PROD_ok", PT := T#20S); // TODO: Declarar #TON_INSTANCE_29 : TON; "gFlowToFiller" := #TON_INSTANCE_29.Q; // Network 18: Calculates blender target production Set Point TO track Filler. (Original Language: LAD) // Calculates blender target production Set Point TO track Filler. "Aux_calc1" := "Blender_Variables"."gBlenderFillerDeltaV" / 4.0; "mTemp" := "Blender_Variables"."gActual_Prod_SP" + "Aux_calc1"; // Network 19: Blender Filler Production Rate difference - L/min - (Original Language: LAD) "Aux_calc1" := "Blender_Variables"."gSP_ProdTrackFiller" - "mTemp"; // Network 20: Product Tank Bottom Volume Below level Probe (Original Language: LAD) IF "gWorkshopTest" THEN SpeedAdjust(i_IstLvl := "Blender_Constants"."gTM301TargetL_Ist", i_PrdTnkLvl := "HMI_Instrument"."LTM302"."PVFiltered", i_SpeedPerc := "Blender_Constants"."gTM301LvlPercRange", i_TrgTnkLvl := "Blender_Variables"."gProdTankTargetLvl"); END_IF; IF "gWorkshopTest" THEN "mSpeedPerc" := 1.0; END_IF; "mDummy" := "gWorkshopTest"; // Network 21: Speed Perc (Original Language: LAD) IF "gWorkshopTest" AND "AUX TRUE" THEN SpeedAdjust(i_IstLvl := "Blender_Constants"."gTM301TargetL_Ist", i_PrdTnkLvl := "HMI_Instrument"."LTM302"."PVFiltered", i_SpeedPerc := "Blender_Constants"."gTM301LvlPercRange", i_TrgTnkLvl := "Blender_Variables"."gProdTankTargetLvl"); END_IF; IF "gWorkshopTest" AND "AUX TRUE" THEN "mSpeedPerc" := 1.0; END_IF; // Network 22: Estimated Filler Speed (Original Language: LAD) IF "mFillerTracked" THEN "mFillerSpeedFilter"(i_Enable := "gBlenderBlending" AND "gBlenderStableFlow", i_Num := 10, i_Value := "mTemp"); END_IF; // Network 23: Estimated Flow (Original Language: LAD) IF "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" THEN "mFillerEstimatedFlow" := "Filler_Head_Variables"."Prod_FlowEstimatedSlw"; END_IF; IF NOT "HMI_Blender_Parameters"."Processor_Options"."Blender_OPT"."_BlendFillSystem" THEN "mFillerEstimatedFlow" := "Blender_Variables"."gEstimateFillerSpeed"; END_IF; // Network 24: Estimated Flow (Original Language: LAD) IF NOT "gTrackFillerSpeed" OR NOT "gEnRampDownToStop" THEN "mFillerEstimatedFlow" := "HMI_Blender_Parameters"."Actual_Recipe_Parameters"."_ProductionRate"; END_IF; // Network 25: L / min (Original Language: LAD) "Blender_Variables"."gSP_ProdTrackFiller" := "mFillerEstimatedFlow" * "mSpeedPerc"; // Network 26: Analog Values (Original Language: LAD) "HMI_Variables_Status"."Analog_Values"."BlenderProd" := "Blender_Variables"."gActual_Prod_SP"; "HMI_Variables_Status"."Analog_Values"."EstFillerProd" := "Blender_Variables"."gEstimateFillerSpeed"; "mDummy" := TRUE; // Network 27: Speed Measuring Done (Original Language: LAD) "Procedure_Variables"."Filler_Speed"."Done" := "Procedure_Variables"."Filler_Speed"."Latch" AND "Procedure_Variables"."Filler_Speed"."Request"; END_FUNCTION_BLOCK ```