



|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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; |
|