Home

 

Erfahrung

 

Referenzen

 

Sondermaschinen

 

MSR-Maschinen

 

SPS-Programmierung

 

Visualisierung HMI

 

Elektro CAD

 

Leistungsprofil

 

Personalia

 

SW-Development

 

Dokumentation

 

 

 

Impressum & DSGVO

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

FB32 SEQ1 P01 : Delta Picker Sorting Robot

 

 

 

Network 1: Pre-Setting

"DI MAIN P01".M00.ReadyToStart := "DI MAIN P01".M00.HomePos_IS AND "DI MAIN GLB".M00.AutoEntirePlant_run;

 

 

 

Network 2: Define last step

#SSM(LAST_STEP := 15);

 

 

 

Network 3: Step Switching Mechanism (SSM)

CASE #SSM.S.stepact OF

    0: // Waiting for SEQ to start

        "DI OUT P01".CAMERA.Recording.Done := "DI MAIN P01".M00.SEQ1_Busy := FALSE;

        "DI MAIN P01".to_P02.Pallet_A_Request := "DI MAIN P01".to_P02.Pallet_B_Request := "DI MAIN P01".M00.ReadyToStart;

        #SSM.S.stepd := #SSM.S.steps AND "DI MAIN P01".M00.ReadyToStart AND "DI MAIN P02".to_P01.Pallet_A_EnabledToRun AND "DI MAIN P02".to_P01.Pallet_B_EnabledToRun;

       

    1: // Waiting for CAMERA.Recording.Done

        IF #SSM.S.stepfc THEN

            IF "HMI KEY".PlantInfo.Product_Packaging_Done THEN

                "HMI KEY".PlantInfo.Product_Packaging_Done := FALSE;

                #Pallet_A_Index_Layer := #Pallet_B_Index_Layer := 1;

                #Pallet_A_CurrentParts := #Pallet_B_CurrentParts := "DI MAIN P01".M00.ProductCounter.GoodParts := 0;

            END_IF;

            "DI MAIN P01".M00.SEQ1_Busy := TRUE;

            #Pallet_A_Totalparts := "DI OUT P01".Pallet_A.Layer * "DI OUT P01".Pallet_A.Places;

            #Pallet_B_Totalparts := "DI OUT P01".Pallet_B.Layer * "DI OUT P01".Pallet_B.Places;

            "DI MAIN P01".M00.ProductCounter.TotalParts := #Pallet_A_Totalparts + #Pallet_B_Totalparts;

            "DI OUT P01".G120C.DRV.Support.SetVelo := "HMI KEY".PlantInfo.Work_Velocity;

            #RunTimeCounter := 0;

        ELSE

            "DI OUT P01".G120C.DRV.Support.Cmd_MoveJogWP := "HMI KEY".P01.G120C.F12_Enable_WP AND #SSM.S.stepa;

            #SSM.S.stepd := "DI OUT P01".CAMERA.Recording.Done;

            "DI OUT P01".CAMERA.CmdExe_ON := NOT #SSM.S.stepd AND "DI OUT P01".G120C.DRV.Support.LampON AND "DI OUT P01".TRACK_CONVEYOR.DRV.MC_MeasuringInput.Execute;

        END_IF;

       

    2: // Calculated_Pos_Pallet_A or B, ELSE Product_C

        IF #SSM.S.stepfc THEN

            IF "DI OUT P01".CAMERA.Recording.Product_A THEN

                "DI OUT P01".Pallet_A.Code := "DI OUT P01".CAMERA.Recording.CEA_Code;

                #Pallet_A_Index_Pos += 1;

                #Coordinate_XY(MOD_Y := "DI OUT P01".Pallet_A.Layer_Data.MOD_Y,

                               INDEX_POS := #Pallet_A_Index_Pos,

                               GAP_FACTOR_X := "DI OUT P01".Pallet_A.Layer_Data.Gap_X,

                               GAP_FACTOR_Y := "DI OUT P01".Pallet_A.Layer_Data.Gap_Y,

                               PLACES_ON_X := "DI OUT P01".Pallet_A.Layer_Data.PlacesOn_X,

                               PLACES_ON_Y := "DI OUT P01".Pallet_A.Layer_Data.PlacesOn_Y,

                               REF_POS := "DI OUT P01".Pallet_A.Layer_Data.Reference_Pos,

                               TARGET_POS := #Pallet_A_Calculated_Pos);

                IF #Pallet_A_Index_Pos = "DI OUT P01".Pallet_A.Places THEN

                    "DI OUT P01".Pallet_A.Distance_to_LayerTop -= "DI OUT P01".Pallet_A.Layer_Data.Gap_Z;

                END_IF;

                #SSM.S.stepd := TRUE;

            ELSIF "DI OUT P01".CAMERA.Recording.Product_B THEN

                "DI OUT P01".Pallet_B.Code := "DI OUT P01".CAMERA.Recording.CEA_Code;

                #Pallet_B_Index_Pos += 1;

                #Coordinate_XY(MOD_Y := "DI OUT P01".Pallet_B.Layer_Data.MOD_Y,

                               INDEX_POS := #Pallet_B_Index_Pos,

                               GAP_FACTOR_X := "DI OUT P01".Pallet_B.Layer_Data.Gap_X,

                               GAP_FACTOR_Y := "DI OUT P01".Pallet_B.Layer_Data.Gap_Y,

                               PLACES_ON_X := "DI OUT P01".Pallet_B.Layer_Data.PlacesOn_X,

                               PLACES_ON_Y := "DI OUT P01".Pallet_B.Layer_Data.PlacesOn_Y,

                               REF_POS := "DI OUT P01".Pallet_B.Layer_Data.Reference_Pos,

                               TARGET_POS := #Pallet_B_Calculated_Pos);

                IF #Pallet_B_Index_Pos = "DI OUT P01".Pallet_B.Places THEN

                    "DI OUT P01".Pallet_B.Distance_to_LayerTop -= "DI OUT P01".Pallet_B.Layer_Data.Gap_Z;

                END_IF;

                #SSM.S.stepd := TRUE;

            ELSIF "DI OUT P01".CAMERA.Recording.Product_C THEN

                #SSM.S.stepnew := 0;

                #SSM.S.stepd := TRUE;

            END_IF;

        END_IF;

       

    3: // DELTA_PICKER MoveLinearAbsolut towards Pick-up position WCS-UP

        IF #SSM.S.stepfc THEN

            "DI OUT P01".TRACK_CONVEYOR.DRV.Support.Enable_ReMeasuring := TRUE;

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Velocity := -1.0;

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.CoordSystem := 0;

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.BufferMode := 1;

            "DI OUT P01".TRACK_CONVEYOR.DRV.Support.Measuring_Offset := "DI OUT P01".CAMERA.Recording_Axis[1] + "HMI KEY".PlantInfo.Object_Offset;

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position[1] :=

            "DI OUT P01".TRACK_CONVEYOR.DRV.Support.Measuring_Offset + "DI OUT P01".TRACK_CONVEYOR.DRV.Support.Measuring_Shift_Distance;

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position[2] :=

            "DI OUT P01".CAMERA.Recording_Axis[2] + "DI OUT P01".TRACK_CONVEYOR.DRV.MC_TrackConveyorBelt.ConveyorBeltOrigin.y;

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position[3] :=

            "DI OUT P01".TRACK_CONVEYOR.DRV.MC_TrackConveyorBelt.ConveyorBeltOrigin.z + "HMI KEY".PlantInfo.Pick_Distance_to_ConveyorBelt;

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position[4] := "DI OUT P01".CAMERA.Recording_Axis[4];

        ELSE

            #SSM.S.stepd := "DI OUT P01".DELTA_PICKER.DRV.Support.InPos AND NOT #SSM.S.steplo;

            "DI OUT P01".DELTA_PICKER.DRV.Support.Cmd_MoveLinearAbsolute :=

            "DI OUT P01".DELTA_PICKER.DRV.Support.KINEMATICS_Enabled AND NOT #SSM.S.stepd AND #SSM.S.stepa;

        END_IF;

       

    4: // G120C Move objekt towards Delta Picker Pick-up positon WCS-UP

        IF ABS("DI OUT P01".G120C.DRV.Support.ActPos - "DI OUT P01".TRACK_CONVEYOR.DRV.Support.InitialObjectPosition_x) < "HMI KEY".PlantInfo.Window THEN

            #SSM.S.stepd := TRUE;

        END_IF;

       

    5: // MC_TrackConveyorBelt.Execute

        IF #SSM.S.stepfc THEN

            "DI OUT P01".TRACK_CONVEYOR.DRV.MC_TrackConveyorBelt.Execute := TRUE;

        ELSE

            #SSM.S.stepd := "DI OUT P01".TRACK_CONVEYOR.DRV.MC_TrackConveyorBelt.Done;

        END_IF;

       

    6: // DELTA_PICKER MoveLinearAbsolute.Active synchronously DOWN OCS1

        IF #SSM.S.stepfc THEN

            #No := 1;

            #SSM.S.c1.start := TRUE;

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.DynamicAdaption := 0; // no adaption!

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearRelative.DynamicAdaption := 0; // no adaption!

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.CoordSystem := 1;

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position[2] := "DI OUT P01".CAMERA.Recording_Axis[2];

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position[3] := "HMI KEY".PlantInfo.MoveLinear_WCS[#No].Axis[3];

        ELSE

            #SSM.S.stepd := "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Active AND NOT #SSM.S.steplo;

            "DI OUT P01".DELTA_PICKER.DRV.Support.Cmd_MoveLinearAbsolute :=

            "DI OUT P01".DELTA_PICKER.DRV.Support.KINEMATICS_Enabled AND NOT #SSM.S.stepd AND #SSM.S.stepa AND #SSM.S.c1.done;

        END_IF;

       

    7: // DELTA_PICKER MoveLinearAbsolute.Active synchronously FOLLOW OCS1

        IF #SSM.S.stepfc THEN

            #No := 2;

            #SSM.S.c1.start := TRUE;

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position[1] += "HMI KEY".PlantInfo.MoveLinear_WCS[#No].Axis[1]; // 120.0

        ELSE

            #SSM.S.stepd := "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Active AND NOT #SSM.S.steplo;

            "DI OUT P01".DELTA_PICKER.DRV.Support.Cmd_MoveLinearAbsolute :=

            "DI OUT P01".DELTA_PICKER.DRV.Support.KINEMATICS_Enabled AND NOT #SSM.S.stepd AND #SSM.S.stepa AND #SSM.S.c1.done;

            "DI OUT P01".Y100.VLV_O.CmdExe_WP := "HMI KEY".P01.Y100.F12_Enable_WP;

        END_IF;

       

    8: // DELTA_PICKER MoveLinearAbsolute synchron UP OCS1 synchronously UP

        IF #SSM.S.stepfc THEN

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position[3] += "HMI KEY".PlantInfo.Pick_Distance_to_ConveyorBelt;

        ELSE

            #SSM.S.stepd := "DI OUT P01".DELTA_PICKER.DRV.Support.InPos AND NOT #SSM.S.steplo;

            "DI OUT P01".DELTA_PICKER.DRV.Support.Cmd_MoveLinearAbsolute :=

            "DI OUT P01".DELTA_PICKER.DRV.Support.KINEMATICS_Enabled AND NOT #SSM.S.stepd AND #SSM.S.stepa;

        END_IF;

       

    9: // DELTA_PICKER MoveLinearAbsolute towards Pallet A or B UP WCS

        IF #SSM.S.stepfc THEN

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.CoordSystem := 0;

            IF "DI OUT P01".CAMERA.Recording.Product_A THEN

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position := #Pallet_A_Calculated_Pos;

            ELSE

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position := #Pallet_B_Calculated_Pos;

            END_IF;

        END_IF;

        #SSM.S.stepd := "DI OUT P01".DELTA_PICKER.DRV.Support.InPos AND NOT #SSM.S.steplo;

        "DI OUT P01".DELTA_PICKER.DRV.Support.Cmd_MoveLinearAbsolute :=

        "DI OUT P01".DELTA_PICKER.DRV.Support.KINEMATICS_Enabled AND NOT #SSM.S.stepd AND #SSM.S.stepa;

       

    10: // DELTA_PICKER MoveLinearRelative place DOWN WCS

        IF #SSM.S.stepfc THEN

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearRelative.Velocity := "HMI KEY".PlantInfo.Slow_Velocity;

            IF "DI OUT P01".CAMERA.Recording.Product_A THEN

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearRelative.Distance[1] := 0.0;

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearRelative.Distance[2] := 0.0;

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearRelative.Distance[3] := - "DI OUT P01".Pallet_A.Distance_to_LayerTop;

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearRelative.Distance[4] := 0.0;

            ELSE

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearRelative.Distance[1] := 0.0;

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearRelative.Distance[2] := 0.0;

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearRelative.Distance[3] := - "DI OUT P01".Pallet_B.Distance_to_LayerTop;

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearRelative.Distance[4] := 0.0;

            END_IF;

        ELSE

            #SSM.S.stepd := "DI OUT P01".DELTA_PICKER.DRV.Support.InPos AND NOT #SSM.S.steplo;

            "DI OUT P01".DELTA_PICKER.DRV.Support.Cmd_MoveLinearRelative :=

            "DI OUT P01".DELTA_PICKER.DRV.Support.KINEMATICS_Enabled AND NOT #SSM.S.stepd AND #SSM.S.stepa;

        END_IF;

       

    11: // Y100 Packaging Gripper PLACE

        "DI OUT P01".Y100.VLV_O.CmdExe_WP := FALSE;

        "DI OUT P01".Y100.VLV_O.CmdExe_HP := TRUE;

        #SSM.S.stepd := "DI OUT P01".Y100.FEEDBACK_HP;

       

    12: // DELTA_PICKER MoveLinearAbsolute towards Pallet A or B UP WCS

        IF #SSM.S.stepfc THEN

            IF "DI OUT P01".CAMERA.Recording.Product_A THEN

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position := #Pallet_A_Calculated_Pos;

            ELSE

                "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position := #Pallet_B_Calculated_Pos;

            END_IF;

        END_IF;

        #SSM.S.stepd := "DI OUT P01".DELTA_PICKER.DRV.Support.InPos AND NOT #SSM.S.steplo;

        "DI OUT P01".DELTA_PICKER.DRV.Support.Cmd_MoveLinearAbsolute :=

        "DI OUT P01".DELTA_PICKER.DRV.Support.KINEMATICS_Enabled AND NOT #SSM.S.stepd AND #SSM.S.stepa;

       

    13: // Query Product_Packaging_Done Pallet A or B

        IF #SSM.S.stepfc THEN

            #SSM.S.c1.set := 20;

            IF "DI MAIN P01".M00.ProductCounter.GoodParts < "DI MAIN P01".M00.ProductCounter.TotalParts THEN

                "DI MAIN P01".M00.ProductCounter.GoodParts += 1;

                IF "DI OUT P01".CAMERA.Recording.Product_A THEN

                    #Pallet_A_CurrentParts += 1;

                    "DI MAIN P01".to_P02.Pallet_A_Done := #Pallet_A_CurrentParts >= #Pallet_A_Totalparts;

                    IF #Pallet_A_Index_Pos >= "DI OUT P01".Pallet_A.Places THEN

                        #Pallet_A_Index_Pos := 0;

                        #Pallet_A_Index_Layer += 1;

                        #Pallet_A_Index_Layer := LIMIT(MN := 1, IN := #Pallet_A_Index_Layer, MX := "DI OUT P01".Pallet_A.Layer);

                    END_IF;

                ELSE

                    #Pallet_B_CurrentParts += 1;

                    "DI MAIN P01".to_P02.Pallet_B_Done := #Pallet_B_CurrentParts >= #Pallet_B_Totalparts;

                    IF #Pallet_B_Index_Pos >= "DI OUT P01".Pallet_B.Places THEN

                        #Pallet_B_Index_Pos := 0;

                        #Pallet_B_Index_Layer += 1;

                        #Pallet_B_Index_Layer := LIMIT(MN := 1, IN := #Pallet_B_Index_Layer, MX := "DI OUT P01".Pallet_B.Layer);

                    END_IF;

                END_IF;

            END_IF;

        END_IF;

        IF "DI MAIN P01".to_P02.Pallet_A_Done AND "DI MAIN P01".to_P02.Pallet_B_Done THEN

            #SSM.S.stepnew := 14;

            "DI OUT P01".G120C.DRV.Support.Cmd_MoveJogWP := FALSE;

            #SSM.S.stepd := "DI OUT P01".G120C.DRV.Support.LampOFF;

        END_IF;

       

        #SSM.S.c1.start := "DI OUT P01".G120C.DRV.Support.LampON AND NOT #SSM.S.steplo;

        IF #SSM.S.c1.done THEN

            #SSM.S.stepnew := 0;

            #SSM.S.stepd := TRUE;

        END_IF;

       

    14: // DELTA_PICKER MoveLinearAbsolut towards base position

        IF #SSM.S.stepfc THEN

            #No := 0;

            "DI OUT P01".DELTA_PICKER.DRV.MC_MoveLinearAbsolute.Position := "HMI KEY".PlantInfo.MoveLinear_WCS[#No].Axis;

        ELSE

            "HMI KEY".PlantInfo.Product_Packaging_Done :=

            #SSM.S.stepd := "DI OUT P01".DELTA_PICKER.DRV.Support.InPos

            AND "DI MAIN P02".to_P01.Pallet_A_ReadyToEnd AND "DI MAIN P02".to_P01.Pallet_B_ReadyToEnd AND NOT #SSM.S.steplo;

            "DI OUT P01".DELTA_PICKER.DRV.Support.Cmd_MoveLinearAbsolute :=

            "DI OUT P01".DELTA_PICKER.DRV.Support.KINEMATICS_Enabled AND NOT #SSM.S.stepd AND #SSM.S.stepa;

        END_IF;

       

    15: // Query End Sorting Product Packaging

        IF "HMI KEY".PlantInfo.Product_Packaging_Done AND NOT ("DI MAIN P02".to_P01.Pallet_A_ReadyToEnd OR "DI MAIN P02".to_P01.Pallet_B_ReadyToEnd) THEN

            "DI MAIN P01".to_P02.Pallet_A_Done := "DI MAIN P01".to_P02.Pallet_B_Done := FALSE;

            IF "HMI KEY".P00.GLB.F6_OM_RUN_DOWN_ON THEN

                "HMI KEY".P00.GLB.F6_OM_RUN_DOWN_ON :=

                "DI MAIN GLB".M00.AutoEntirePlant_run := FALSE;

                "DI MAIN P02".M00.SEQ1_Done := "DI MAIN P01".M00.SEQ1_Done := TRUE;

            ELSE

                #SSM.S.stepd := TRUE;

            END_IF;

        END_IF;

END_CASE;