using System; using System.Windows.Forms; namespace SHARP_CLAS_UI { public class ULD_Handler_1 : Handler { #region Enum private enum PickerSteps { S0000_WAIT, S1000_PICK_AOI_STAGE_START, S1100_DOWN, S1110_VACUUM_ON, S1120_AOI_STAGE_VACUUM_OFF, S1130_AOI_STAGE_BLOW_ON, S1140_PICKER_UP, S1150_AOI_STAGE_BLOW_OFF, S1160_DATA_SET, S2000_PICK_REVERSE_START, S2100_DOWN, S2110_VACUUM_ON, S2120_VACUUM_CHECK, S5130_REVERSE_STAGE_MOVE_UP, S2140_VACUUM_CHECK, S2150_REVERSE_STAGE_VACUUM_OFF, S2160_REVERSE_STAGE_MOVE_STAY, S2170_DATA_SET, S3000_PLACE_REVERSE_STAGE_START, S3100_PICKER_DOWN, S3110_REVERSE_STAGE_VACUUM_ON, S3120_VACUUM_OFF, S3130_DATA_SET, S4000_PLACE_TRAY_PANEL_START, S4100_PICKER_DOWN, S4110_VACUUM_OFF, S9000_SCRAP_START, S9100_VACUUM_OFF, S9110_DATA_SET, S9200_PICKER_UP, S9999_STEP_END, } #endregion #region Property public override Panel_Info Panel1 { get { return Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Handler_1_1); } set { Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.ULD_Handler_1_1, value); } } public override Panel_Info Panel2 { get { return Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Handler_1_2); } set { Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.ULD_Handler_1_2, value); } } public override bool IsWorkEnd { get { if (Step == UnloaderHandler1Steps.S0000_WAIT) { return true; } else { return false; } } } public override bool IsStayPosition { get { if (IsMotorXStayPosition && IsMotorYStayPosition) { return true; } else { return false; } } } public bool IsMotorXStayPosition { get { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Stay_Position, out value); get_position = double.Parse($"{value}"); return MotorX.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } } public bool IsMotorYStayPosition { get { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_Y_Stay_Position, out value); get_position = double.Parse($"{value}"); return MotorY.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } } public UnloaderHandler1Steps Step { get { return _step; } set { _step = value; } } #endregion #region Field private UnloaderHandler1Steps _step; private UnloaderHandler1Steps _oldStep; private HandlerHomeSteps _homeStep; private PickerSteps _picker1Step; private PickerSteps _picker2Step; private int place_panel_num; private double place_position_x; private double place_position_y; private double pick_velocity = 500; private double handler_pitch = 220; private double reversestage_move_position = -0.5; public Time_Checker Tact_AOI = new Time_Checker(); public Time_Checker Tact_Move = new Time_Checker(); public Time_Checker vision_delay = new Time_Checker(); Form_User_Command_Set measurement_user_command; Tray_QR_Code_Command qr_code_user_command; bool measurement_user_command_show; bool qr_code_user_command_show; int measurement_retry_cnt; int Bcr_retry_cnt; string BCR_Data; int cim_row; int cim_column; bool ng_place_runned; private Timer tmrUi = new Timer(); System.Threading.Thread BCR_Read_Th; #endregion #region Construct public ULD_Handler_1(Equipment equipment) : base(equipment, MotorAxis.ULD_Handler_1_X, MotorAxis.ULD_Handler_1_Y, "UnloaderHandler1") { Step = UnloaderHandler1Steps.S0000_WAIT; _oldStep = UnloaderHandler1Steps.S0000_WAIT; Picker1.Initialize(OutputData.ULD_Handler_1_1_Down, InputData.ULD_Handler_Picker_1_1_Up_Sensor, InputData.ULD_Handler_Picker_1_1_Down_Sensor, En_Alarm_List.AL_0822_ULD_HANDLER_1_1_UP_SENSOR_CHECK, En_Alarm_List.AL_0823_ULD_HANDLER_1_1_DOWN_SENSOR_CHECK, OutputData.ULD_Cell_Handler_1_1_Vaccum_On_Sol_Valve, OutputData.ULD_Cell_Handler_1_1_Blow_On_Sol_Valve, InputData.ULD_Cell_Handler_1_1_Vaccum_On_Check, En_Alarm_List.AL_0820_ULD_HANDLER_1_1_VACUUM_ON_CHECK); Picker2.Initialize(OutputData.ULD_Handler_1_2_Down, InputData.ULD_Handler_Picker_1_2_Up_Sensor, InputData.ULD_Handler_Picker_1_2_Down_Sensor, En_Alarm_List.AL_0824_ULD_HANDLER_1_2_UP_SENSOR_CHECK, En_Alarm_List.AL_0825_ULD_HANDLER_1_2_DOWN_SENSOR_CHECK, OutputData.ULD_Cell_Handler_1_2_Vaccum_On_Sol_Valve, OutputData.ULD_Cell_Handler_1_2_Blow_On_Sol_Valve, InputData.ULD_Cell_Handler_1_2_Vaccum_On_Check, En_Alarm_List.AL_0821_ULD_HANDLER_1_2_VACUUM_ON_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S1205_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S1215_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S1305_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S2230_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S3230_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S4205_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S4305_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S4405_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S4505_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S5205_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S6205_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S7205_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S7305_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S8305_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S8505_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S8515_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S8705_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S8905_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler1Steps.S8915_POSITION_CHECK); MotorX.Check_Jog_Interlock = Jog_Interlock; MotorX.Check_Move_Interlock = Move_Interlock; MotorX.Check_Home_Interlock = Home_Interlock; MotorY.Check_Jog_Interlock = Jog_Interlock; MotorY.Check_Move_Interlock = Move_Interlock; MotorY.Check_Home_Interlock = Home_Interlock; tmrUi.Tick += TmrUi_Tick; tmrUi.Interval = 3000; tmrUi.Start(); } #endregion #region Function private bool Home_Interlock() { if (Picker1.IsDownSensor || Picker2.IsDownSensor) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 1 Picker Down", "Picker is Down, Can't Move."); return true; } return false; } private bool Move_Interlock() { if (Picker1.IsDownSensor || Picker2.IsDownSensor) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 1 Picker Down", "Picker is Down, Can't Move."); return true; } if (equipment.User.Level != En_User_Level.Master && equipment.Door_Opened) { return true; } return false; } private bool Jog_Interlock(bool positive) { if (Picker1.IsDownSensor || Picker2.IsDownSensor) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 1 Picker Down", "Picker is Down, Can't Move."); return true; } if (equipment.User.Level != En_User_Level.Master && equipment.Door_Opened) { return true; } return false; } private void TmrUi_Tick(object sender, EventArgs e) { if (measurement_user_command_show && measurement_user_command != null) { measurement_user_command.Show(); measurement_user_command_show = false; } if (qr_code_user_command_show && qr_code_user_command != null) { qr_code_user_command.Show(); qr_code_user_command_show = false; } } public void Init_Seq() { Step = UnloaderHandler1Steps.S0000_WAIT; _homeStep = HandlerHomeSteps.S0000_WAIT; Tact_AOI.Reset(); Tact_Move.Reset(); } public void ExecuteAuto() { if(Step == UnloaderHandler1Steps.S0000_WAIT) { if (equipment.unloader.LiftOk.is_Tray_Id_Read_Enable) { Step = UnloaderHandler1Steps.S2000_TRAY_OK_ID_READ_START; } else if (equipment.unloader.LiftNg.is_Tray_Id_Read_Enable) { Step = UnloaderHandler1Steps.S3000_TRAY_NG_ID_READ_START; } else if (equipment.after.AoiStage.IsMeasurementEnable) { Step = UnloaderHandler1Steps.S4000_MEASUREMENT_START; } else { if (equipment.process.ablation.Is_Power_Measure) return; if (IsExist) { if (equipment.unloader.LiftNg.IsPanelPlaceEnable && equipment.unloader.LiftOk.IsPanelPlaceEnable) { bool isPick1PlaceEnable = true; bool isPick2PlaceEnable = true; int panel_num = 0; if (Picker1.IsExist) { if ((equipment.Mode.Film_Judge_Skip || Panel1.Film_Judge_Result) && (equipment.Mode.Measurement_Skip || Panel1.Measurement_Result)) { isPick1PlaceEnable = Get_Handler_1_1_Tray_OK_Panel_Num(out panel_num); } else { isPick1PlaceEnable = Get_Handler_1_1_Tray_NG_Panel_Num(out panel_num); } } else { isPick1PlaceEnable = false; } if (Picker2.IsExist) { if ((equipment.Mode.Film_Judge_Skip || Panel2.Film_Judge_Result) && (equipment.Mode.Measurement_Skip || Panel2.Measurement_Result)) { isPick2PlaceEnable = Get_Handler_1_2_Tray_OK_Panel_Num(out panel_num); } else { isPick2PlaceEnable = Get_Handler_1_2_Tray_NG_Panel_Num(out panel_num); } } else { isPick2PlaceEnable = false; } if (isPick1PlaceEnable || isPick2PlaceEnable) { Step = UnloaderHandler1Steps.S8000_PLACE_TO_TRAY_START; } else { if (equipment.after.Handler2.IsExist && equipment.after.AoiStage.IsExist == false) { if (IsStayPosition == false) { Step = UnloaderHandler1Steps.S1000_MOVE_TO_STAY_START; } } else { Step = UnloaderHandler1Steps.S7000_PLACE_TO_REVERSE_STAGE_CHANGE_START; } } } else { if(IsStayPosition == false) { Step = UnloaderHandler1Steps.S1000_MOVE_TO_STAY_START; } } } else { if (equipment.after.ReverseStage.IsPickEnable) { Step = UnloaderHandler1Steps.S6000_PICK_TO_REVERSE_STAGE_START; } else if (equipment.Cur_Main_Recipe.tray_info.Uld_Reverse == false && equipment.after.AoiStage.IsPickEnable) { Step = UnloaderHandler1Steps.S5000_PICK_TO_AOI_STAGE_START; } else { if (IsStayPosition == false) { Step = UnloaderHandler1Steps.S1000_MOVE_TO_STAY_START; } } } } } } public override void MonitoringStatus() { if (UnitMode == En_Equipment_Mode.Auto || UnitMode == En_Equipment_Mode.Manual) { if (Picker1.IsWorkEnd && Picker1.VacuumSolOn == true && Picker1.IsVacuumSensor == false && Picker1.IsUp) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0820_ULD_HANDLER_1_1_VACUUM_ON_CHECK); } if (Picker2.IsWorkEnd && Picker2.VacuumSolOn == true && Picker2.IsVacuumSensor == false && Picker2.IsUp) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0821_ULD_HANDLER_1_2_VACUUM_ON_CHECK); } } if (Alarm_Manager.Instance.Occured_List.Exists(X => X.Code == En_Alarm_List.AL_0511_AOI_VISION_DISCONNECT)) { if (UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY < Step && Step < UnloaderHandler1Steps.S4550_MEASUREMENT_CHECK) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } } if (equipment.User.Level != En_User_Level.Master && equipment.Door_Opened) { if (MotorX.MotionComplete == false) { MotorX.Move_Stop(); } if (MotorY.MotionComplete == false) { MotorY.Move_Stop(); } } } public override void ExecuteStep() { if (_oldStep != Step) { sequenceChangedTime.Restart(); _oldStep = Step; WriteSequenceLog(Step.ToString()); } Picker1.ExecuteProcess(); Picker2.ExecuteProcess(); Seq_Picker1Step(); Seq_Picker2Step(); if (UnitMode == En_Equipment_Mode.Stop) { Init_Seq(); equipment.unloader.TactTime.Reset(); isHomeComplete = false; return; } else if (UnitMode == En_Equipment_Mode.Pause) { sequenceChangedTime.Stop(); return; } else if (UnitMode == En_Equipment_Mode.Home) { if (IsHomeComplete == false) { ExecuteHome(); } return; } else if (UnitMode == En_Equipment_Mode.Auto || UnitMode == En_Equipment_Mode.Manual) { sequenceChangedTime.Start(); if (equipment.equip_mode == En_Equipment_Mode.Pause) { if (pauseDisableList.Contains(Step) == false) { UnitMode = En_Equipment_Mode.Pause; return; } } if (UnitMode == En_Equipment_Mode.Auto) ExecuteAuto(); Seq_MoveStayPosition(); Seq_TrayOkIdRead(); Seq_TrayNgIdRead(); Seq_Measurement(); Seq_PickAOIStage(); Seq_PickReverseStage(); Seq_PlaceReverseStage(); Seq_PlaceTrayPanel(); } } public void ExecuteHome() { switch(_homeStep) { case HandlerHomeSteps.S0000_WAIT: { _homeStep = HandlerHomeSteps.S1000_STATUS_CHECK; break; } case HandlerHomeSteps.S1000_STATUS_CHECK: { if (MotorX.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0411_ULD_HANDLER_1_X_ERROR_STOP); } else if (MotorY.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0431_ULD_HANDLER_1_Y_ERROR_STOP); } else if (!MotorX.PowerOn) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0410_ULD_HANDLER_1_X_POWER_OFF); } else if (!MotorY.PowerOn) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0430_ULD_HANDLER_1_Y_POWER_OFF); } else if (Picker1.IsUp == false) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 1 Home can't run.", "ULD Handler Picker 1-1 Up."); } else if (Picker2.IsUp == false) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 1 Home can't run.", "ULD Handler Picker 1-2 Up."); } else { _homeStep = HandlerHomeSteps.S1100_TRAY_TRANSFER_HOME_CHECK; } break; } case HandlerHomeSteps.S1100_TRAY_TRANSFER_HOME_CHECK: { if (equipment.unloader.TrayTransfer.IsHomeComplete) { _homeStep = HandlerHomeSteps.S1200_TRAY_TRANSFER_POSITION_CHECK; } break; } case HandlerHomeSteps.S1200_TRAY_TRANSFER_POSITION_CHECK: { if (equipment.unloader.TrayTransfer.IsStayPosition) { _homeStep = HandlerHomeSteps.S1300_MOTOR_Y_HOME; } else { Interlock_Manager.Add_Interlock_Msg("ULD Handler 1 Home can't run.", "Tray TR Position is not empty."); } break; } case HandlerHomeSteps.S1300_MOTOR_Y_HOME: { if (MotorY.Home()) { homeCheckedTime.Restart(); _homeStep = HandlerHomeSteps.S1305_MOTOR_Y_HOME_CHECK; } break; } case HandlerHomeSteps.S1305_MOTOR_Y_HOME_CHECK: { if (homeCheckedTime.Seconds < 1) return; if (!MotorY.IsHomed) { if (MotorY.Homing == false && MotorY.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0431_ULD_HANDLER_1_Y_ERROR_STOP); } } else { _homeStep = HandlerHomeSteps.S1310_MOTOR_X_HOME; } break; } case HandlerHomeSteps.S1310_MOTOR_X_HOME: { if (MotorX.Home()) { homeCheckedTime.Restart(); _homeStep = HandlerHomeSteps.S1315_MOTOR_X_HOME_CHECK; } break; } case HandlerHomeSteps.S1315_MOTOR_X_HOME_CHECK: { if (homeCheckedTime.Seconds < 1) return; if (!MotorX.IsHomed) { if (MotorX.Homing == false && MotorX.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0411_ULD_HANDLER_1_X_ERROR_STOP); } } else { _homeStep = HandlerHomeSteps.S1400_MOVE_STAY_POSITION; } break; } case HandlerHomeSteps.S1400_MOVE_STAY_POSITION: { if (Move_X_Stay_Position()) { if (Move_Y_Stay_Position()) { homeCheckedTime.Restart(); _homeStep = HandlerHomeSteps.S1405_POSITION_CHECK; } } break; } case HandlerHomeSteps.S1405_POSITION_CHECK: { if (homeCheckedTime.Seconds < 1) return; if (MotorX.ErrorStop || MotorY.ErrorStop) { if (MotorX.ErrorStop) Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0411_ULD_HANDLER_1_X_ERROR_STOP); if (MotorY.ErrorStop) Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0431_ULD_HANDLER_1_Y_ERROR_STOP); } else if (MotorX.MotionComplete && MotorY.MotionComplete) { if (Get_Is_Position_X_Stay() && Get_Is_Position_Y_Stay()) { _homeStep = HandlerHomeSteps.S1999_END; } else { if (!Get_Is_Position_X_Stay()) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 1 Home can't run.", "X Position is not stay."); } if (!Get_Is_Position_Y_Stay()) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 1 Home can't run.", "Y Position is not stay."); } } } break; } case HandlerHomeSteps.S1999_END: { isHomeComplete = true; _homeStep = HandlerHomeSteps.S0000_WAIT; break; } } } private void Seq_MoveStayPosition() { switch (Step) { case UnloaderHandler1Steps.S1000_MOVE_TO_STAY_START: { Step = UnloaderHandler1Steps.S1100_PICKER_UP; break; } case UnloaderHandler1Steps.S1100_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { if (ng_place_runned) { Step = UnloaderHandler1Steps.S1200_MOVE_X_STAY; } else { Step = UnloaderHandler1Steps.S1300_MOVE_STAY_POSITION; } } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler1Steps.S1200_MOVE_X_STAY: { if(Move_X_Stay_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Stay Position [Start]"); Step = UnloaderHandler1Steps.S1205_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S1205_POSITION_CHECK: { if (MotorX.MotionComplete) { if (IsMotorXStayPosition) { Step = UnloaderHandler1Steps.S1210_MOVE_Y_STAY; } else { Step = UnloaderHandler1Steps.S1200_MOVE_X_STAY; } } break; } case UnloaderHandler1Steps.S1210_MOVE_Y_STAY: { if (Move_Y_Stay_Position()) { Step = UnloaderHandler1Steps.S1215_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S1215_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (IsMotorXStayPosition && IsMotorYStayPosition) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Stay Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Stay Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S1999_MOVE_TO_STAY_END; } } else { Step = UnloaderHandler1Steps.S1200_MOVE_X_STAY; } break; } case UnloaderHandler1Steps.S1300_MOVE_STAY_POSITION: { if (Move_X_Stay_Position() && Move_Y_Stay_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Stay Position [Start]"); Step = UnloaderHandler1Steps.S1305_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S1305_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (IsStayPosition) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Stay Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Stay Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S1999_MOVE_TO_STAY_END; } else { Step = UnloaderHandler1Steps.S1300_MOVE_STAY_POSITION; } } break; } case UnloaderHandler1Steps.S1999_MOVE_TO_STAY_END: { ng_place_runned = false; Step = UnloaderHandler1Steps.S0000_WAIT; break; } } } private void Seq_TrayOkIdRead() { switch (Step) { case UnloaderHandler1Steps.S2000_TRAY_OK_ID_READ_START: { Step = UnloaderHandler1Steps.S2100_PICKER_UP; break; } case UnloaderHandler1Steps.S2100_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { Step = UnloaderHandler1Steps.S2200_ULD_TRAY_TR_POSITION_CHECK; } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler1Steps.S2200_ULD_TRAY_TR_POSITION_CHECK: { if (equipment.unloader.TrayTransfer.IsStayPosition) { Step = UnloaderHandler1Steps.S2210_MOVE_TRAY_OK_BCR_POS; } break; } case UnloaderHandler1Steps.S2210_MOVE_TRAY_OK_BCR_POS: { if (Move_X(equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_BCR_X) && Move_Y(equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_BCR_Y)) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray QR Code Position [Start]"); Step = UnloaderHandler1Steps.S2230_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S2230_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_BCR_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_BCR_Y, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray QR Code Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray QR Code Position [Tact : {Tact_Move.Seconds} (sec)]"); Bcr_retry_cnt = 0; Step = UnloaderHandler1Steps.S2240_BCR_DATA_READ; } else { Step = UnloaderHandler1Steps.S2210_MOVE_TRAY_OK_BCR_POS; } } break; } case UnloaderHandler1Steps.S2240_BCR_DATA_READ: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray QR Code Reading [Start]"); BCR_Read_Th = new System.Threading.Thread(() => BCR_Read()); BCR_Read_Th.Start(); Step = UnloaderHandler1Steps.S2245_BCR_DATA_READ_WAIT; break; } case UnloaderHandler1Steps.S2245_BCR_DATA_READ_WAIT: { if (BCR_Read_Th != null && BCR_Read_Th.ThreadState != System.Threading.ThreadState.Stopped) return; Tact_Move.Stop(); if (BCR_Data != null && BCR_Data.Length == 14) { equipment.sm.Set_Value(Process_Memory_Address.ULD_Tray_Ok_ID, BCR_Data); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray QR Code Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray QR Code Reading [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S2999_TRAY_OK_ID_READ_END; } else { if (Bcr_retry_cnt > equipment.Setting.Bcr_Retry_Count) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0865_ULD_TRAY_OK_ID_READ_ERROR); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray QR Code Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray QR Code Reading [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S2250_BCR_USER_COMMAND_START; return; } equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray QR Code Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray QR Code Reading [Tact : {Tact_Move.Seconds} (sec)]"); Bcr_retry_cnt++; Step = UnloaderHandler1Steps.S2240_BCR_DATA_READ; } break; } case UnloaderHandler1Steps.S2250_BCR_USER_COMMAND_START: { qr_code_user_command = new Tray_QR_Code_Command("ULD TRAY OK QR CODE"); qr_code_user_command_show = true; Step = UnloaderHandler1Steps.S2260_BCR_USER_COMMAND_CHECK; break; } case UnloaderHandler1Steps.S2260_BCR_USER_COMMAND_CHECK: { if (qr_code_user_command.Command_Type == En_User_Command.Retry) { Bcr_retry_cnt = 0; Step = UnloaderHandler1Steps.S2240_BCR_DATA_READ; } else if (qr_code_user_command.Command_Type == En_User_Command.Pass) { equipment.ULD_Tray_BCR.BCR_Stop(); equipment.UnloaderOkTrayCount = equipment.UnloaderOkTrayCount - 1; Step = UnloaderHandler1Steps.S2999_TRAY_OK_ID_READ_END; } break; } case UnloaderHandler1Steps.S2999_TRAY_OK_ID_READ_END: { equipment.unloader.LiftOk.IsBcrReadBit = false; Step = UnloaderHandler1Steps.S0000_WAIT; break; } } } private void Seq_TrayNgIdRead() { switch (Step) { case UnloaderHandler1Steps.S3000_TRAY_NG_ID_READ_START: { Step = UnloaderHandler1Steps.S3100_PICKER_UP; break; } case UnloaderHandler1Steps.S3100_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { Step = UnloaderHandler1Steps.S3200_ULD_TRAY_TR_POSITION_CHECK; } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler1Steps.S3200_ULD_TRAY_TR_POSITION_CHECK: { if (equipment.unloader.TrayTransfer.IsStayPosition) { Step = UnloaderHandler1Steps.S3210_MOVE_TRAY_NG_BCR_POS; } break; } case UnloaderHandler1Steps.S3210_MOVE_TRAY_NG_BCR_POS: { if (Move_X(equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_BCR_X) && Move_Y(equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_BCR_Y)) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray QR Code Position [Start]"); Step = UnloaderHandler1Steps.S3230_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S3230_POSITION_CHECK: { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_BCR_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_BCR_Y, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray QR Code Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray QR Code Position [Tact : {Tact_Move.Seconds} (sec)]"); Bcr_retry_cnt = 0; Step = UnloaderHandler1Steps.S3240_BCR_DATA_READ; } break; } case UnloaderHandler1Steps.S3240_BCR_DATA_READ: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray QR Code Reading [Start]"); BCR_Read_Th = new System.Threading.Thread(() => BCR_Read()); BCR_Read_Th.Start(); Step = UnloaderHandler1Steps.S3245_BCR_DATA_READ_WAIT; break; } case UnloaderHandler1Steps.S3245_BCR_DATA_READ_WAIT: { if (BCR_Read_Th != null && BCR_Read_Th.ThreadState != System.Threading.ThreadState.Stopped) return; Tact_Move.Stop(); if (BCR_Data != null && BCR_Data.Length == 14) { equipment.unloader.LiftNg.TrayID = BCR_Data; equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray QR Code Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray QR Code Reading [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S3999_TRAY_NG_ID_READ_END; } else { if (Bcr_retry_cnt > equipment.Setting.Bcr_Retry_Count) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0866_ULD_TRAY_NG_ID_READ_ERROR); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray QR Code Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray QR Code Reading [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S3250_BCR_USER_COMMAND_START; return; } equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray QR Code Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray QR Code Reading [Tact : {Tact_Move.Seconds} (sec)]"); Bcr_retry_cnt++; Step = UnloaderHandler1Steps.S3240_BCR_DATA_READ; } break; } case UnloaderHandler1Steps.S3250_BCR_USER_COMMAND_START: { qr_code_user_command = new Tray_QR_Code_Command("ULD TRAY NG QR CODE"); qr_code_user_command_show = true; Step = UnloaderHandler1Steps.S3260_BCR_USER_COMMAND_CHECK; break; } case UnloaderHandler1Steps.S3260_BCR_USER_COMMAND_CHECK: { if (qr_code_user_command.Command_Type == En_User_Command.Retry) { Bcr_retry_cnt = 0; Step = UnloaderHandler1Steps.S3240_BCR_DATA_READ; } else if (qr_code_user_command.Command_Type == En_User_Command.Pass) { equipment.ULD_Tray_BCR.BCR_Stop(); equipment.UnloaderNgTrayCount = equipment.UnloaderNgTrayCount - 1; Step = UnloaderHandler1Steps.S3999_TRAY_NG_ID_READ_END; } break; } case UnloaderHandler1Steps.S3999_TRAY_NG_ID_READ_END: { equipment.unloader.LiftNg.IsBcrReadBit = false; Step = UnloaderHandler1Steps.S0000_WAIT; break; } } } private void Seq_Measurement() { var aoiStage = equipment.after.AoiStage; var isAoiPanel1MeasurementAck = aoiStage.Stage1.IsExist == false || aoiStage.Panel1.Measurement_Ack; var isAoiPanel2MeasurementAck = aoiStage.Stage2.IsExist == false || aoiStage.Panel2.Measurement_Ack; var isAoiPanel1WidthMeasurementAck = aoiStage.Stage1.IsExist == false || aoiStage.Panel1.WidthMeasurement_Ack; var isAoiPanel2WidthMeasurementAck = aoiStage.Stage2.IsExist == false || aoiStage.Panel2.WidthMeasurement_Ack; switch (Step) { case UnloaderHandler1Steps.S4000_MEASUREMENT_START: { Tact_AOI.Start(); measurement_retry_cnt = 0; Step = UnloaderHandler1Steps.S4100_ULD_HANDLER_2_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4100_ULD_HANDLER_2_POSITION_CHECK: { double position = equipment.after.Handler2.Get_Position_Y_Stay(); if (position >= equipment.after.Handler2.MotorY.Position || equipment.after.Handler2.MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) { Step = UnloaderHandler1Steps.S4110_REVERSE_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S4110_REVERSE_POSITION_CHECK: { if (equipment.after.ReverseStage.IsStayPosition) { Step = UnloaderHandler1Steps.S4120_PICKER_UP; } break; } case UnloaderHandler1Steps.S4120_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Ready [Start]"); var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1MeasurementAck) { Step = UnloaderHandler1Steps.S4150_RIGHT_CAMERA_GRAB_READY; return; } if (equipment.Aoi_vision.Send_Measurement_Grab_Ready_Req(0, 0, 0, info.Stage_Num, info.Tray_Num, info.Panel_Num, info.Panel_ID)) Step = UnloaderHandler1Steps.S4140_LEFT_CAMERA_GRAB_READY_WAIT; break; } case UnloaderHandler1Steps.S4140_LEFT_CAMERA_GRAB_READY_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Ready_Ack)) { Step = UnloaderHandler1Steps.S4150_RIGHT_CAMERA_GRAB_READY; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4150_RIGHT_CAMERA_GRAB_READY: { if (sequenceChangedTime.Seconds < 0.1) break; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2MeasurementAck) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Ready [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Ready [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4200_MOVE_MEASUREMENT_MARK1_POSITION; return; } if (equipment.Aoi_vision.Send_Measurement_Grab_Ready_Req(1, 0, 0, info.Stage_Num, info.Tray_Num, info.Panel_Num, info.Panel_ID)) Step = UnloaderHandler1Steps.S4160_RIGHT_CAMERA_GRAB_READY_WAIT; break; } case UnloaderHandler1Steps.S4160_RIGHT_CAMERA_GRAB_READY_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Ready_Ack)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Ready [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Ready [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4200_MOVE_MEASUREMENT_MARK1_POSITION; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4200_MOVE_MEASUREMENT_MARK1_POSITION: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Reading Position [Start]"); if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.AOI_Mark1_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.AOI_Mark1_Y, 500)) Step = UnloaderHandler1Steps.S4205_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4205_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.AOI_Mark1_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.AOI_Mark1_Y, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Reading Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Reading Position [Tact : {Tact_Move.Seconds} (sec)]"); vision_delay.Start(); Step = UnloaderHandler1Steps.S4210_LEFT_CAMERA_MARK_1_GRAB_START; } else { Step = UnloaderHandler1Steps.S4200_MOVE_MEASUREMENT_MARK1_POSITION; } } break; } case UnloaderHandler1Steps.S4210_LEFT_CAMERA_MARK_1_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Reading [Start]"); var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1MeasurementAck) { Step = UnloaderHandler1Steps.S4230_RIGHT_CAMERA_MARK_1_GRAB_START; return; } if (equipment.Aoi_vision.Send_Measurement_Grab_Start_Req(0, 0, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4220_LEFT_CAMERA_MARK_1_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4220_LEFT_CAMERA_MARK_1_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4230_RIGHT_CAMERA_MARK_1_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4230_RIGHT_CAMERA_MARK_1_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2MeasurementAck) { Step = UnloaderHandler1Steps.S4300_MOVE_MEASUREMENT_MARK2_POSITION; return; } if (equipment.Aoi_vision.Send_Measurement_Grab_Start_Req(1, 0, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4240_RIGHT_CAMERA_MARK_1_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4240_RIGHT_CAMERA_MARK_1_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { Step = UnloaderHandler1Steps.S4300_MOVE_MEASUREMENT_MARK2_POSITION; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4300_MOVE_MEASUREMENT_MARK2_POSITION: { if (sequenceChangedTime.Seconds < equipment.Setting.Vision_Move_Delay) break; if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.AOI_Mark2_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.AOI_Mark2_Y, 500)) Step = UnloaderHandler1Steps.S4305_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4305_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.AOI_Mark2_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.AOI_Mark2_Y, equipment.Setting.Inposition_Offset)) { vision_delay.Start(); Step = UnloaderHandler1Steps.S4310_LEFT_CAMERA_MARK_2_GRAB_START; } else { Step = UnloaderHandler1Steps.S4300_MOVE_MEASUREMENT_MARK2_POSITION; } } break; } case UnloaderHandler1Steps.S4310_LEFT_CAMERA_MARK_2_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1MeasurementAck) { Step = UnloaderHandler1Steps.S4330_RIGHT_CAMERA_MARK_2_GRAB_START; return; } if (equipment.Aoi_vision.Send_Measurement_Grab_Start_Req(0, 1, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4320_LEFT_CAMERA_MARK_2_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4320_LEFT_CAMERA_MARK_2_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4330_RIGHT_CAMERA_MARK_2_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4330_RIGHT_CAMERA_MARK_2_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2MeasurementAck) { sequenceChangedTime.Start(); if (equipment.Cur_Main_Recipe.vision_info.AoiMark34Use) { Step = UnloaderHandler1Steps.S4400_MOVE_MEASUREMENT_MARK3_POSITION; } else { Step = UnloaderHandler1Steps.S4550_MEASUREMENT_CHECK; } return; } if (equipment.Aoi_vision.Send_Measurement_Grab_Start_Req(1, 1, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4340_RIGHT_CAMERA_MARK_2_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4340_RIGHT_CAMERA_MARK_2_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { if (equipment.Cur_Main_Recipe.vision_info.AoiMark34Use) { Step = UnloaderHandler1Steps.S4400_MOVE_MEASUREMENT_MARK3_POSITION; } else { Step = UnloaderHandler1Steps.S4550_MEASUREMENT_CHECK; } } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4400_MOVE_MEASUREMENT_MARK3_POSITION: { if (sequenceChangedTime.Seconds < equipment.Setting.Vision_Move_Delay) break; if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.AOI_Mark3_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.AOI_Mark3_Y, 500)) Step = UnloaderHandler1Steps.S4405_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4405_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.AOI_Mark3_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.AOI_Mark3_Y, equipment.Setting.Inposition_Offset)) { vision_delay.Start(); Step = UnloaderHandler1Steps.S4410_LEFT_CAMERA_MARK_3_GRAB_START; } else { Step = UnloaderHandler1Steps.S4400_MOVE_MEASUREMENT_MARK3_POSITION; } } break; } case UnloaderHandler1Steps.S4410_LEFT_CAMERA_MARK_3_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1MeasurementAck) { Step = UnloaderHandler1Steps.S4430_RIGHT_CAMERA_MARK_3_GRAB_START; return; } if (equipment.Aoi_vision.Send_Measurement_Grab_Start_Req(0, 2, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4420_LEFT_CAMERA_MARK_3_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4420_LEFT_CAMERA_MARK_3_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4430_RIGHT_CAMERA_MARK_3_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4430_RIGHT_CAMERA_MARK_3_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2MeasurementAck) { sequenceChangedTime.Start(); Step = UnloaderHandler1Steps.S4500_MOVE_MEASUREMENT_MARK4_POSITION; return; } if (equipment.Aoi_vision.Send_Measurement_Grab_Start_Req(1, 2, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4440_RIGHT_CAMERA_MARK_3_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4440_RIGHT_CAMERA_MARK_3_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { Step = UnloaderHandler1Steps.S4500_MOVE_MEASUREMENT_MARK4_POSITION; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4500_MOVE_MEASUREMENT_MARK4_POSITION: { if (sequenceChangedTime.Seconds < equipment.Setting.Vision_Move_Delay) break; if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.AOI_Mark4_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.AOI_Mark4_Y, 500)) Step = UnloaderHandler1Steps.S4505_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4505_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.AOI_Mark4_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.AOI_Mark4_Y, equipment.Setting.Inposition_Offset)) { vision_delay.Start(); Step = UnloaderHandler1Steps.S4510_LEFT_CAMERA_MARK_4_GRAB_START; } else { Step = UnloaderHandler1Steps.S4500_MOVE_MEASUREMENT_MARK4_POSITION; } } break; } case UnloaderHandler1Steps.S4510_LEFT_CAMERA_MARK_4_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1MeasurementAck) { Step = UnloaderHandler1Steps.S4530_RIGHT_CAMERA_MARK_4_GRAB_START; return; } if (equipment.Aoi_vision.Send_Measurement_Grab_Start_Req(0, 3, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4520_LEFT_CAMERA_MARK_4_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4520_LEFT_CAMERA_MARK_4_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4530_RIGHT_CAMERA_MARK_4_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4530_RIGHT_CAMERA_MARK_4_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2MeasurementAck) { sequenceChangedTime.Start(); Step = UnloaderHandler1Steps.S4550_MEASUREMENT_CHECK; return; } if (equipment.Aoi_vision.Send_Measurement_Grab_Start_Req(1, 3, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4540_RIGHT_CAMERA_MARK_4_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4540_RIGHT_CAMERA_MARK_4_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { Step = UnloaderHandler1Steps.S4550_MEASUREMENT_CHECK; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4550_MEASUREMENT_CHECK: { var aoistage = equipment.after.AoiStage; var info1 = aoistage.Panel1; var info2 = aoistage.Panel2; object value; bool result; if ((isAoiPanel1MeasurementAck || equipment.sm.Get_Bit(Vision_Address.Measurement_Left_Ack)) && (isAoiPanel2MeasurementAck || equipment.sm.Get_Bit(Vision_Address.Measurement_Right_Ack))) { if (aoistage.Stage1.IsExist && info1.Measurement_Ack == false) { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Left_Align_Result)) { info1.Measurement_Ack = true; if(equipment.sm.Get_Bit(Vision_Address.Measurement_Left_Result, out result)) { info1.Measurement_Result = result; } else { return; } info1.End_Time = DateTime.Now; equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_1_Point_1, out value); info1.Mark1Point1 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_1_Point_2, out value); info1.Mark1Point2 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_2_Point_1, out value); info1.Mark2Point1 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_2_Point_2, out value); info1.Mark2Point2 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_3_Point_1, out value); info1.Mark3Point1 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_3_Point_2, out value); info1.Mark3Point2 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_4_Point_1, out value); info1.Mark4Point1 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_4_Point_2, out value); info1.Mark4Point2 = double.Parse(value.ToString()); aoistage.Panel1 = info1; isAoiPanel1MeasurementAck = aoiStage.Stage1.IsExist == false || aoiStage.Panel1.Measurement_Ack; } } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Right_Align_Result)) { info2.Measurement_Ack = true; if (equipment.sm.Get_Bit(Vision_Address.Measurement_Right_Result, out result)) { info2.Measurement_Result = result; } else { return; } info2.End_Time = DateTime.Now; equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_1_Point_1, out value); info2.Mark1Point1 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_1_Point_2, out value); info2.Mark1Point2 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_2_Point_1, out value); info2.Mark2Point1 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_2_Point_2, out value); info2.Mark2Point2 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_3_Point_1, out value); info2.Mark3Point1 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_3_Point_2, out value); info2.Mark3Point2 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_4_Point_1, out value); info2.Mark4Point1 = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_4_Point_2, out value); info2.Mark4Point2 = double.Parse(value.ToString()); aoistage.Panel2 = info2; isAoiPanel2MeasurementAck = aoiStage.Stage2.IsExist == false || aoiStage.Panel2.Measurement_Ack; } } Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Reading [Tact : {Tact_Move.Seconds} (sec)]"); if (isAoiPanel1MeasurementAck && isAoiPanel2MeasurementAck) { //AOI 완료. -> Width meausrement 여기에 추가 해야 될듯..? if (equipment.Mode.Width_Measurement_Skip || equipment.WidthMeasurementCount < equipment.Setting.Width_Measurement_Count) { equipment.WidthMeasurementCount = equipment.WidthMeasurementCount + 1; if (equipment.cim_mode == En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S4800_PANEL_LEFT_CIM_SEND; } else { Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; } } else { equipment.WidthMeasurementCount = 0; measurement_retry_cnt = 0; Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } } else { equipment.Aoi_vision.WriteClientLog("no align result"); measurement_retry_cnt++; if (measurement_retry_cnt >= equipment.Setting.Vision_Retry_Count) { Step = UnloaderHandler1Steps.S4560_USER_COMMAND_START; } else { Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } } } else { if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { measurement_retry_cnt++; if (measurement_retry_cnt > equipment.Setting.Vision_Retry_Count) { if (sequenceChangedTime.Minute > 5) { Step = UnloaderHandler1Steps.S4560_USER_COMMAND_START; } } else if (measurement_retry_cnt == equipment.Setting.Vision_Retry_Count) { equipment.Aoi_vision.WriteClientLog("no ack result"); Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Reading [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4560_USER_COMMAND_START; } else { equipment.Aoi_vision.WriteClientLog("no ack result"); Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Reading [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } } } break; } case UnloaderHandler1Steps.S4560_USER_COMMAND_START: { var aoistage = equipment.after.AoiStage; Panel_Info info1 = aoistage.Panel1; Panel_Info info2 = aoistage.Panel2; if (aoistage.Stage1.IsExist && info1.Measurement_Ack == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0886_MEASUREMENT_LEFT_ERROR); } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0887_MEASUREMENT_RIGHT_ERROR); } measurement_user_command = new Form_User_Command_Set("Measurement"); measurement_user_command_show = true; Step = UnloaderHandler1Steps.S4570_USER_COMMAND_WAIT; break; } case UnloaderHandler1Steps.S4570_USER_COMMAND_WAIT: { var aoistage = equipment.after.AoiStage; Panel_Info info1 = aoistage.Panel1; Panel_Info info2 = aoistage.Panel2; if (measurement_user_command.Command_Type == En_User_Command.Scrap) { if (aoistage.Stage1.IsExist && info1.Measurement_Ack == false) { aoistage.Panel1 = new Panel_Info(); aoistage.Stage_1_Scrap(); equipment.Aoi_vision.Send_Measurement_Command_Req(0, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { aoistage.Panel2 = new Panel_Info(); aoistage.Stage_2_Scrap(); equipment.Aoi_vision.Send_Measurement_Command_Req(0, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; } else if (measurement_user_command.Command_Type == En_User_Command.Retry) { if (aoistage.Stage1.IsExist && info1.Measurement_Ack == false) { equipment.Aoi_vision.Send_Measurement_Command_Req(1, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { equipment.Aoi_vision.Send_Measurement_Command_Req(1, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } measurement_retry_cnt = 0; Step = UnloaderHandler1Steps.S4130_LEFT_CAMERA_GRAB_READY; } else if (measurement_user_command.Command_Type == En_User_Command.Skip) { if (aoistage.Stage1.IsExist && info1.Measurement_Ack == false) { equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Ack, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Align_Result, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Result, false); equipment.Aoi_vision.Send_Measurement_Command_Req(2, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Ack, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Align_Result, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Result, false); equipment.Aoi_vision.Send_Measurement_Command_Req(2, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } Step = UnloaderHandler1Steps.S4550_MEASUREMENT_CHECK; } else if (measurement_user_command.Command_Type == En_User_Command.Pass) { if (aoistage.Stage1.IsExist && info1.Measurement_Ack == false) { equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Ack, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Align_Result, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Result, false); equipment.Aoi_vision.Send_Measurement_Command_Req(3, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Ack, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Align_Result, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Result, false); equipment.Aoi_vision.Send_Measurement_Command_Req(3, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } Step = UnloaderHandler1Steps.S4550_MEASUREMENT_CHECK; } else if (measurement_user_command.Command_Type == En_User_Command.Manual) { if (aoistage.Stage1.IsExist && info1.Measurement_Ack == false) { equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Ack, false); equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Align_Result, false); equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Result, false); equipment.Aoi_vision.Send_Measurement_Command_Req(4, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Ack, false); equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Align_Result, false); equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Result, false); equipment.Aoi_vision.Send_Measurement_Command_Req(4, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } Step = UnloaderHandler1Steps.S4550_MEASUREMENT_CHECK; } break; } case UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Ready [Start]"); var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4602_RIGHT_CAMERA_GRAB_READY; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Ready_Req(0, 0, 0, info.Stage_Num, info.Tray_Num, info.Panel_Num, info.Panel_ID)) Step = UnloaderHandler1Steps.S4601_LEFT_CAMERA_GRAB_READY_WAIT; break; } case UnloaderHandler1Steps.S4601_LEFT_CAMERA_GRAB_READY_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Ready_Ack)) { Step = UnloaderHandler1Steps.S4602_RIGHT_CAMERA_GRAB_READY; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4602_RIGHT_CAMERA_GRAB_READY: { if (sequenceChangedTime.Seconds < 0.1) break; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2WidthMeasurementAck) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Ready [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Ready [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4610_MOVE_MEASUREMENT_MARK1_POSITION; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Ready_Req(1, 0, 0, info.Stage_Num, info.Tray_Num, info.Panel_Num, info.Panel_ID)) Step = UnloaderHandler1Steps.S4603_RIGHT_CAMERA_GRAB_READY_WAIT; break; } case UnloaderHandler1Steps.S4603_RIGHT_CAMERA_GRAB_READY_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Ready_Ack)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Ready [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Ready [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4610_MOVE_MEASUREMENT_MARK1_POSITION; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4610_MOVE_MEASUREMENT_MARK1_POSITION: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading Position [Start]"); if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark1_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark1_Y, 500)) Step = UnloaderHandler1Steps.S4611_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4611_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark1_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark1_Y, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading Position [Tact : {Tact_Move.Seconds} (sec)]"); vision_delay.Start(); Step = UnloaderHandler1Steps.S4612_LEFT_CAMERA_MARK_1_GRAB_START; } else { Step = UnloaderHandler1Steps.S4610_MOVE_MEASUREMENT_MARK1_POSITION; } } break; } case UnloaderHandler1Steps.S4612_LEFT_CAMERA_MARK_1_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [Start]"); var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4614_RIGHT_CAMERA_MARK_1_GRAB_START; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(0, 0, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4613_LEFT_CAMERA_MARK_1_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4613_LEFT_CAMERA_MARK_1_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4614_RIGHT_CAMERA_MARK_1_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4614_RIGHT_CAMERA_MARK_1_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4620_MOVE_MEASUREMENT_MARK2_POSITION; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(1, 0, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4615_RIGHT_CAMERA_MARK_1_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4615_RIGHT_CAMERA_MARK_1_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { Step = UnloaderHandler1Steps.S4620_MOVE_MEASUREMENT_MARK2_POSITION; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4620_MOVE_MEASUREMENT_MARK2_POSITION: { if (sequenceChangedTime.Seconds < equipment.Setting.Vision_Move_Delay) break; if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark2_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark2_Y, 500)) Step = UnloaderHandler1Steps.S4621_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4621_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark2_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark2_Y, equipment.Setting.Inposition_Offset)) { vision_delay.Start(); Step = UnloaderHandler1Steps.S4622_LEFT_CAMERA_MARK_2_GRAB_START; } else { Step = UnloaderHandler1Steps.S4620_MOVE_MEASUREMENT_MARK2_POSITION; } } break; } case UnloaderHandler1Steps.S4622_LEFT_CAMERA_MARK_2_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4624_RIGHT_CAMERA_MARK_2_GRAB_START; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(0, 1, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4623_LEFT_CAMERA_MARK_2_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4623_LEFT_CAMERA_MARK_2_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4624_RIGHT_CAMERA_MARK_2_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4624_RIGHT_CAMERA_MARK_2_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2WidthMeasurementAck) { sequenceChangedTime.Start(); Step = UnloaderHandler1Steps.S4630_MOVE_MEASUREMENT_MARK3_POSITION; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(1, 1, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4625_RIGHT_CAMERA_MARK_2_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4625_RIGHT_CAMERA_MARK_2_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { Step = UnloaderHandler1Steps.S4630_MOVE_MEASUREMENT_MARK3_POSITION; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4630_MOVE_MEASUREMENT_MARK3_POSITION: { if (sequenceChangedTime.Seconds < equipment.Setting.Vision_Move_Delay) break; if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark3_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark3_Y, 500)) Step = UnloaderHandler1Steps.S4631_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4631_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark3_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark3_Y, equipment.Setting.Inposition_Offset)) { vision_delay.Start(); Step = UnloaderHandler1Steps.S4632_LEFT_CAMERA_MARK_3_GRAB_START; } else { Step = UnloaderHandler1Steps.S4630_MOVE_MEASUREMENT_MARK3_POSITION; } } break; } case UnloaderHandler1Steps.S4632_LEFT_CAMERA_MARK_3_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4634_RIGHT_CAMERA_MARK_3_GRAB_START; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(0, 2, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4633_LEFT_CAMERA_MARK_3_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4633_LEFT_CAMERA_MARK_3_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4634_RIGHT_CAMERA_MARK_3_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4634_RIGHT_CAMERA_MARK_3_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2WidthMeasurementAck) { sequenceChangedTime.Start(); Step = UnloaderHandler1Steps.S4640_MOVE_MEASUREMENT_MARK4_POSITION; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(1, 2, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4635_RIGHT_CAMERA_MARK_3_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4635_RIGHT_CAMERA_MARK_3_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { Step = UnloaderHandler1Steps.S4640_MOVE_MEASUREMENT_MARK4_POSITION; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4640_MOVE_MEASUREMENT_MARK4_POSITION: { if (sequenceChangedTime.Seconds < equipment.Setting.Vision_Move_Delay) break; if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark4_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark4_Y, 500)) Step = UnloaderHandler1Steps.S4641_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4641_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark4_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark4_Y, equipment.Setting.Inposition_Offset)) { vision_delay.Start(); Step = UnloaderHandler1Steps.S4642_LEFT_CAMERA_MARK_4_GRAB_START; } else { Step = UnloaderHandler1Steps.S4640_MOVE_MEASUREMENT_MARK4_POSITION; } } break; } case UnloaderHandler1Steps.S4642_LEFT_CAMERA_MARK_4_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4644_RIGHT_CAMERA_MARK_4_GRAB_START; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(0, 3, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4643_LEFT_CAMERA_MARK_4_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4643_LEFT_CAMERA_MARK_4_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4644_RIGHT_CAMERA_MARK_4_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4644_RIGHT_CAMERA_MARK_4_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2WidthMeasurementAck) { sequenceChangedTime.Start(); Step = UnloaderHandler1Steps.S4650_MEASUREMENT_CHECK; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(1, 3, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4645_RIGHT_CAMERA_MARK_4_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4645_RIGHT_CAMERA_MARK_4_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { Step = UnloaderHandler1Steps.S4650_MEASUREMENT_CHECK; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4650_MEASUREMENT_CHECK: { var aoistage = equipment.after.AoiStage; var info1 = aoistage.Panel1; var info2 = aoistage.Panel2; object value; if ((isAoiPanel1WidthMeasurementAck || equipment.sm.Get_Bit(Vision_Address.Measurement_Left_Ack)) && (isAoiPanel2WidthMeasurementAck || equipment.sm.Get_Bit(Vision_Address.Measurement_Right_Ack))) { if (aoistage.Stage1.IsExist && info1.WidthMeasurement_Ack == false) { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Left_Ack)) { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Left_Result)) { info1.WidthMeasurement_Ack = true; info1.WidthMeasurement_Result = true; info1.End_Time = DateTime.Now; equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_1_Point_1, out value); info1.Mark1Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_2_Point_1, out value); info1.Mark2Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_3_Point_1, out value); info1.Mark3Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_4_Point_1, out value); info1.Mark4Width = double.Parse(value.ToString()); aoistage.Panel1 = info1; isAoiPanel1WidthMeasurementAck = aoiStage.Stage1.IsExist == false || aoiStage.Panel1.WidthMeasurement_Ack; } } else { return; } } if (aoistage.Stage2.IsExist && info2.WidthMeasurement_Ack == false) { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Right_Ack)) { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Right_Result)) { info2.WidthMeasurement_Ack = true; info2.WidthMeasurement_Result = true; info2.End_Time = DateTime.Now; equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_1_Point_1, out value); info2.Mark1Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_2_Point_1, out value); info2.Mark2Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_3_Point_1, out value); info2.Mark3Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_4_Point_1, out value); info2.Mark4Width = double.Parse(value.ToString()); aoistage.Panel2 = info2; isAoiPanel2WidthMeasurementAck = aoiStage.Stage2.IsExist == false || aoiStage.Panel2.WidthMeasurement_Ack; } } else { return; } } Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [Tact : {Tact_Move.Seconds} (sec)]"); if (isAoiPanel1WidthMeasurementAck && isAoiPanel2WidthMeasurementAck) { if(equipment.Cur_Main_Recipe.vision_info.Width_AOI_8Use) { info1.WidthMeasurement_Ack = false; info2.WidthMeasurement_Ack = false; info1.WidthMeasurement_Result = false; info2.WidthMeasurement_Result = false; aoistage.Panel1 = info1; aoistage.Panel2 = info2; Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } else { if (equipment.cim_mode == En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S4800_PANEL_LEFT_CIM_SEND; } else { Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; } } } else { equipment.Aoi_vision.WriteClientLog("no align result"); measurement_retry_cnt++; if (measurement_retry_cnt >= equipment.Setting.Vision_Retry_Count) { Step = UnloaderHandler1Steps.S4660_USER_COMMAND_START; } else { Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } } } else { if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { measurement_retry_cnt++; if (measurement_retry_cnt == equipment.Setting.Vision_Retry_Count) { equipment.Aoi_vision.WriteClientLog("no ack result"); Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4660_USER_COMMAND_START; } else { equipment.Aoi_vision.WriteClientLog("no ack result"); Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } } } break; } case UnloaderHandler1Steps.S4660_USER_COMMAND_START: { var aoistage = equipment.after.AoiStage; Panel_Info info1 = aoistage.Panel1; Panel_Info info2 = aoistage.Panel2; if (aoistage.Stage1.IsExist && info1.WidthMeasurement_Ack == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0888_MEASUREMENT_WIDTH_ERROR); } if (aoistage.Stage2.IsExist && info2.WidthMeasurement_Ack == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0888_MEASUREMENT_WIDTH_ERROR); } measurement_user_command = new Form_User_Command_Set("Width Measurement"); measurement_user_command.UserManualEnable(false); measurement_user_command_show = true; Step = UnloaderHandler1Steps.S4670_USER_COMMAND_WAIT; break; } case UnloaderHandler1Steps.S4670_USER_COMMAND_WAIT: { var aoistage = equipment.after.AoiStage; Panel_Info info1 = aoistage.Panel1; Panel_Info info2 = aoistage.Panel2; if (measurement_user_command.Command_Type == En_User_Command.Scrap) { if (aoistage.Stage1.IsExist && info1.Measurement_Ack == false) { aoistage.Panel1 = new Panel_Info(); aoistage.Stage_1_Scrap(); equipment.Aoi_vision.Send_Measurement_Command_Req(0, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { aoistage.Panel2 = new Panel_Info(); aoistage.Stage_2_Scrap(); equipment.Aoi_vision.Send_Measurement_Command_Req(0, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; } else if (measurement_user_command.Command_Type == En_User_Command.Retry) { if (aoistage.Stage1.IsExist && info1.Measurement_Ack == false) { equipment.Aoi_vision.Send_Measurement_Command_Req(1, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { equipment.Aoi_vision.Send_Measurement_Command_Req(1, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } measurement_retry_cnt = 0; Step = UnloaderHandler1Steps.S4600_LEFT_CAMERA_GRAB_READY; } else if (measurement_user_command.Command_Type == En_User_Command.Skip) { if (aoistage.Stage1.IsExist && info1.WidthMeasurement_Ack == false) { equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Ack, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Align_Result, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Result, false); equipment.Aoi_vision.Send_Measurement_Command_Req(2, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); info1.Measurement_Result = false; aoistage.Panel1 = info1; } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Ack, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Align_Result, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Result, false); equipment.Aoi_vision.Send_Measurement_Command_Req(2, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); info2.Measurement_Result = false; aoistage.Panel2 = info2; } if (equipment.cim_mode == En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S4800_PANEL_LEFT_CIM_SEND; } else { Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; } } break; } case UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Ready [Start]"); var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4702_RIGHT_CAMERA_GRAB_READY; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Ready_Req(0, 0, 0, info.Stage_Num, info.Tray_Num, info.Panel_Num, info.Panel_ID)) Step = UnloaderHandler1Steps.S4701_LEFT_CAMERA_GRAB_READY_WAIT; break; } case UnloaderHandler1Steps.S4701_LEFT_CAMERA_GRAB_READY_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Ready_Ack)) { Step = UnloaderHandler1Steps.S4702_RIGHT_CAMERA_GRAB_READY; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4702_RIGHT_CAMERA_GRAB_READY: { if (sequenceChangedTime.Seconds < 0.1) break; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2WidthMeasurementAck) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Ready [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Ready [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4710_MOVE_MEASUREMENT_MARK1_POSITION; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Ready_Req(1, 0, 0, info.Stage_Num, info.Tray_Num, info.Panel_Num, info.Panel_ID)) Step = UnloaderHandler1Steps.S4703_RIGHT_CAMERA_GRAB_READY_WAIT; break; } case UnloaderHandler1Steps.S4703_RIGHT_CAMERA_GRAB_READY_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Ready_Ack)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Ready [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Ready [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4710_MOVE_MEASUREMENT_MARK1_POSITION; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4710_MOVE_MEASUREMENT_MARK1_POSITION: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading Position [Start]"); if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark5_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark5_Y, 500)) Step = UnloaderHandler1Steps.S4711_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4711_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark5_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark5_Y, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading Position [Tact : {Tact_Move.Seconds} (sec)]"); vision_delay.Start(); Step = UnloaderHandler1Steps.S4712_LEFT_CAMERA_MARK_1_GRAB_START; } else { Step = UnloaderHandler1Steps.S4710_MOVE_MEASUREMENT_MARK1_POSITION; } } break; } case UnloaderHandler1Steps.S4712_LEFT_CAMERA_MARK_1_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [Start]"); var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4714_RIGHT_CAMERA_MARK_1_GRAB_START; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(0, 0, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4713_LEFT_CAMERA_MARK_1_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4713_LEFT_CAMERA_MARK_1_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4714_RIGHT_CAMERA_MARK_1_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4714_RIGHT_CAMERA_MARK_1_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4720_MOVE_MEASUREMENT_MARK2_POSITION; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(1, 0, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4715_RIGHT_CAMERA_MARK_1_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4715_RIGHT_CAMERA_MARK_1_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { Step = UnloaderHandler1Steps.S4720_MOVE_MEASUREMENT_MARK2_POSITION; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4720_MOVE_MEASUREMENT_MARK2_POSITION: { if (sequenceChangedTime.Seconds < equipment.Setting.Vision_Move_Delay) break; if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark6_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark6_Y, 500)) Step = UnloaderHandler1Steps.S4721_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4721_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark6_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark6_Y, equipment.Setting.Inposition_Offset)) { vision_delay.Start(); Step = UnloaderHandler1Steps.S4722_LEFT_CAMERA_MARK_2_GRAB_START; } else { Step = UnloaderHandler1Steps.S4720_MOVE_MEASUREMENT_MARK2_POSITION; } } break; } case UnloaderHandler1Steps.S4722_LEFT_CAMERA_MARK_2_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4724_RIGHT_CAMERA_MARK_2_GRAB_START; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(0, 1, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4723_LEFT_CAMERA_MARK_2_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4723_LEFT_CAMERA_MARK_2_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4724_RIGHT_CAMERA_MARK_2_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4724_RIGHT_CAMERA_MARK_2_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2WidthMeasurementAck) { sequenceChangedTime.Start(); Step = UnloaderHandler1Steps.S4730_MOVE_MEASUREMENT_MARK3_POSITION; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(1, 1, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4725_RIGHT_CAMERA_MARK_2_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4725_RIGHT_CAMERA_MARK_2_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { Step = UnloaderHandler1Steps.S4730_MOVE_MEASUREMENT_MARK3_POSITION; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4730_MOVE_MEASUREMENT_MARK3_POSITION: { if (sequenceChangedTime.Seconds < equipment.Setting.Vision_Move_Delay) break; if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark7_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark7_Y, 500)) Step = UnloaderHandler1Steps.S4731_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4731_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark7_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark7_Y, equipment.Setting.Inposition_Offset)) { vision_delay.Start(); Step = UnloaderHandler1Steps.S4732_LEFT_CAMERA_MARK_3_GRAB_START; } else { Step = UnloaderHandler1Steps.S4730_MOVE_MEASUREMENT_MARK3_POSITION; } } break; } case UnloaderHandler1Steps.S4732_LEFT_CAMERA_MARK_3_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4734_RIGHT_CAMERA_MARK_3_GRAB_START; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(0, 2, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4733_LEFT_CAMERA_MARK_3_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4733_LEFT_CAMERA_MARK_3_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4734_RIGHT_CAMERA_MARK_3_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4734_RIGHT_CAMERA_MARK_3_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2WidthMeasurementAck) { sequenceChangedTime.Start(); Step = UnloaderHandler1Steps.S4740_MOVE_MEASUREMENT_MARK4_POSITION; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(1, 2, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4735_RIGHT_CAMERA_MARK_3_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4735_RIGHT_CAMERA_MARK_3_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { Step = UnloaderHandler1Steps.S4740_MOVE_MEASUREMENT_MARK4_POSITION; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4740_MOVE_MEASUREMENT_MARK4_POSITION: { if (sequenceChangedTime.Seconds < equipment.Setting.Vision_Move_Delay) break; if (MotorX.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark8_X, 500) && MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark8_Y, 500)) Step = UnloaderHandler1Steps.S4741_POSITION_CHECK; break; } case UnloaderHandler1Steps.S4741_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark8_X, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Width_AOI_Mark8_Y, equipment.Setting.Inposition_Offset)) { vision_delay.Start(); Step = UnloaderHandler1Steps.S4742_LEFT_CAMERA_MARK_4_GRAB_START; } else { Step = UnloaderHandler1Steps.S4740_MOVE_MEASUREMENT_MARK4_POSITION; } } break; } case UnloaderHandler1Steps.S4742_LEFT_CAMERA_MARK_4_GRAB_START: { if (vision_delay.Seconds < equipment.Setting.Vision_Move_Delay) return; var info = equipment.after.AoiStage.Panel1; if (isAoiPanel1WidthMeasurementAck) { Step = UnloaderHandler1Steps.S4744_RIGHT_CAMERA_MARK_4_GRAB_START; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(0, 3, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4743_LEFT_CAMERA_MARK_4_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4743_LEFT_CAMERA_MARK_4_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Left_Ack)) { Step = UnloaderHandler1Steps.S4744_RIGHT_CAMERA_MARK_4_GRAB_START; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4744_RIGHT_CAMERA_MARK_4_GRAB_START: { if (sequenceChangedTime.Seconds < 0.1) return; var info = equipment.after.AoiStage.Panel2; if (isAoiPanel2WidthMeasurementAck) { sequenceChangedTime.Start(); Step = UnloaderHandler1Steps.S4750_MEASUREMENT_CHECK; return; } if (equipment.Aoi_vision.Send_WidthMeasurement_Grab_Start_Req(1, 3, MotorX.Position, MotorY.Position)) Step = UnloaderHandler1Steps.S4745_RIGHT_CAMERA_MARK_4_GRAB_WAIT; break; } case UnloaderHandler1Steps.S4745_RIGHT_CAMERA_MARK_4_GRAB_WAIT: { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Grab_Start_Right_Ack)) { Step = UnloaderHandler1Steps.S4750_MEASUREMENT_CHECK; } else if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } break; } case UnloaderHandler1Steps.S4750_MEASUREMENT_CHECK: { var aoistage = equipment.after.AoiStage; var info1 = aoistage.Panel1; var info2 = aoistage.Panel2; object value; if ((isAoiPanel1WidthMeasurementAck || equipment.sm.Get_Bit(Vision_Address.Measurement_Left_Ack)) && (isAoiPanel2WidthMeasurementAck || equipment.sm.Get_Bit(Vision_Address.Measurement_Right_Ack))) { if (aoistage.Stage1.IsExist && info1.WidthMeasurement_Ack == false) { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Left_Ack)) { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Left_Result)) { info1.WidthMeasurement_Ack = true; info1.WidthMeasurement_Result = true; info1.End_Time = DateTime.Now; equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_1_Point_1, out value); info1.Mark5Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_2_Point_1, out value); info1.Mark6Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_3_Point_1, out value); info1.Mark7Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Left_Mark_4_Point_1, out value); info1.Mark8Width = double.Parse(value.ToString()); aoistage.Panel1 = info1; isAoiPanel1WidthMeasurementAck = aoiStage.Stage1.IsExist == false || aoiStage.Panel1.WidthMeasurement_Result; } } else { return; } } if (aoistage.Stage2.IsExist && info2.WidthMeasurement_Ack == false) { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Right_Ack)) { if (equipment.sm.Get_Bit(Vision_Address.Measurement_Right_Result)) { info2.WidthMeasurement_Ack = true; info2.WidthMeasurement_Result = true; info2.End_Time = DateTime.Now; equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_1_Point_1, out value); info2.Mark5Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_2_Point_1, out value); info2.Mark6Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_3_Point_1, out value); info2.Mark7Width = double.Parse(value.ToString()); equipment.sm.Get_Value(Vision_Address.Measurement_Right_Mark_4_Point_1, out value); info2.Mark8Width = double.Parse(value.ToString()); aoistage.Panel2 = info2; isAoiPanel2WidthMeasurementAck = aoiStage.Stage2.IsExist == false || aoiStage.Panel2.WidthMeasurement_Result; } } else { return; } } Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [Tact : {Tact_Move.Seconds} (sec)]"); if (isAoiPanel1WidthMeasurementAck && isAoiPanel2WidthMeasurementAck) { if (equipment.cim_mode == En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S4800_PANEL_LEFT_CIM_SEND; } else { Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; } } else { equipment.Aoi_vision.WriteClientLog("no align result"); measurement_retry_cnt++; if (measurement_retry_cnt >= equipment.Setting.Vision_Retry_Count) { Step = UnloaderHandler1Steps.S4760_USER_COMMAND_START; } else { Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } } } else { if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { measurement_retry_cnt++; if (measurement_retry_cnt == equipment.Setting.Vision_Retry_Count) { equipment.Aoi_vision.WriteClientLog("no ack result"); Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4760_USER_COMMAND_START; } else { equipment.Aoi_vision.WriteClientLog("no ack result"); Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Widht AOI Reading [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } } } break; } case UnloaderHandler1Steps.S4760_USER_COMMAND_START: { var aoistage = equipment.after.AoiStage; Panel_Info info1 = aoistage.Panel1; Panel_Info info2 = aoistage.Panel2; if (aoistage.Stage1.IsExist && info1.WidthMeasurement_Ack == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0888_MEASUREMENT_WIDTH_ERROR); } if (aoistage.Stage2.IsExist && info2.WidthMeasurement_Ack == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0888_MEASUREMENT_WIDTH_ERROR); } measurement_user_command = new Form_User_Command_Set("Width Measurement"); measurement_user_command.UserManualEnable(false); measurement_user_command_show = true; Step = UnloaderHandler1Steps.S4770_USER_COMMAND_WAIT; break; } case UnloaderHandler1Steps.S4770_USER_COMMAND_WAIT: { var aoistage = equipment.after.AoiStage; Panel_Info info1 = aoistage.Panel1; Panel_Info info2 = aoistage.Panel2; if (measurement_user_command.Command_Type == En_User_Command.Scrap) { if (aoistage.Stage1.IsExist && info1.Measurement_Ack == false) { aoistage.Panel1 = new Panel_Info(); aoistage.Stage_1_Scrap(); equipment.Aoi_vision.Send_Measurement_Command_Req(0, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { aoistage.Panel2 = new Panel_Info(); aoistage.Stage_2_Scrap(); equipment.Aoi_vision.Send_Measurement_Command_Req(0, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; } else if (measurement_user_command.Command_Type == En_User_Command.Retry) { if (aoistage.Stage1.IsExist && info1.Measurement_Ack == false) { equipment.Aoi_vision.Send_Measurement_Command_Req(1, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (aoistage.Stage2.IsExist && info2.Measurement_Ack == false) { equipment.Aoi_vision.Send_Measurement_Command_Req(1, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } measurement_retry_cnt = 0; Step = UnloaderHandler1Steps.S4700_LEFT_CAMERA_GRAB_READY; } else if (measurement_user_command.Command_Type == En_User_Command.Skip) { if (aoistage.Stage1.IsExist && info1.WidthMeasurement_Ack == false) { equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Ack, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Align_Result, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Left_Result, false); equipment.Aoi_vision.Send_Measurement_Command_Req(2, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); info1.Measurement_Result = false; aoistage.Panel1 = info1; } if (aoistage.Stage2.IsExist && info2.WidthMeasurement_Ack == false) { equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Ack, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Align_Result, true); equipment.sm.Set_Bit(Vision_Address.Measurement_Right_Result, false); equipment.Aoi_vision.Send_Measurement_Command_Req(2, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); info2.Measurement_Result = false; aoistage.Panel2 = info2; } if (equipment.cim_mode == En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S4800_PANEL_LEFT_CIM_SEND; } else { Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; } } break; } case UnloaderHandler1Steps.S4800_PANEL_LEFT_CIM_SEND: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; return; } Panel_Info info1 = equipment.after.AoiStage.Panel1; if (equipment.after.AoiStage.Stage1.IsExist == false || info1.IsPanelIdRead == false) { Step = UnloaderHandler1Steps.S4820_PANEL_RIGHT_CIM_SEND; return; } else { if (equipment.cim_client.Send_Process_End("E123456", info1)) { Step = UnloaderHandler1Steps.S4810_PANEL_LEFT_CIM_SEND_WAIT; } } break; } case UnloaderHandler1Steps.S4810_PANEL_LEFT_CIM_SEND_WAIT: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; return; } if (equipment.cim_client.Get_Command_Ack(En_Cim_Command.PREND)) { if (equipment.cim_client.Get_Command_Result(En_Cim_Command.PREND)) { Step = UnloaderHandler1Steps.S4820_PANEL_RIGHT_CIM_SEND; } else { Step = UnloaderHandler1Steps.S4800_PANEL_LEFT_CIM_SEND; } } break; } case UnloaderHandler1Steps.S4820_PANEL_RIGHT_CIM_SEND: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; return; } Panel_Info info2 = equipment.after.AoiStage.Panel2; if (equipment.after.AoiStage.Stage2.IsExist == false || info2.IsPanelIdRead == false) { Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; } else { if (equipment.cim_client.Send_Process_End("E123456", info2)) { Step = UnloaderHandler1Steps.S4830_PANEL_RIGHT_CIM_SEND_WAIT; } } break; } case UnloaderHandler1Steps.S4830_PANEL_RIGHT_CIM_SEND_WAIT: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; return; } if (equipment.cim_client.Get_Command_Ack(En_Cim_Command.PREND)) { if (equipment.cim_client.Get_Command_Result(En_Cim_Command.PREND)) { Step = UnloaderHandler1Steps.S4999_MEASUREMENT_END; } else { Step = UnloaderHandler1Steps.S4820_PANEL_RIGHT_CIM_SEND; } } break; } case UnloaderHandler1Steps.S4999_MEASUREMENT_END: { Tact_AOI.Stop(); if (IsStayPosition) { Step = UnloaderHandler1Steps.S0000_WAIT; } else Step = UnloaderHandler1Steps.S1000_MOVE_TO_STAY_START; break; } } } private void Seq_PickAOIStage() { switch(Step) { case UnloaderHandler1Steps.S5000_PICK_TO_AOI_STAGE_START: { Step = UnloaderHandler1Steps.S5100_ULD_HANDLER_2_POSITION_CHECK; break; } case UnloaderHandler1Steps.S5100_ULD_HANDLER_2_POSITION_CHECK: { double position = equipment.after.Handler2.Get_Position_Y_Stay(); if (position >= equipment.after.Handler2.MotorY.Position || equipment.after.Handler2.MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) { Step = UnloaderHandler1Steps.S5110_REVERSE_STAGE_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S5110_REVERSE_STAGE_POSITION_CHECK: { if (equipment.after.ReverseStage.IsStayPosition) { Step = UnloaderHandler1Steps.S5120_PICKER_UP; } break; } case UnloaderHandler1Steps.S5120_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { Step = UnloaderHandler1Steps.S5200_MOVE_AOI_STAGE_POSITION; } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler1Steps.S5200_MOVE_AOI_STAGE_POSITION: { if(Move_X_AOI_Position() && Move_Y_AOI_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Stage Position [Start]"); Step = UnloaderHandler1Steps.S5205_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S5205_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (Get_Is_Position_X_AOI() && Get_Is_Position_Y_AOI()) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Stage Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Stage Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S5210_PICK_START; } else { Step = UnloaderHandler1Steps.S5200_MOVE_AOI_STAGE_POSITION; } } break; } case UnloaderHandler1Steps.S5210_PICK_START: { if (_picker1Step == PickerSteps.S0000_WAIT && _picker2Step == PickerSteps.S0000_WAIT) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Stage Pick [Start]"); if (equipment.after.AoiStage.Stage1.IsExist) { _picker1Step = PickerSteps.S1000_PICK_AOI_STAGE_START; } if (equipment.after.AoiStage.Stage2.IsExist) { _picker2Step = PickerSteps.S1000_PICK_AOI_STAGE_START; } Step = UnloaderHandler1Steps.S5220_PICK_WAIT; } break; } case UnloaderHandler1Steps.S5220_PICK_WAIT: { if(_picker1Step == PickerSteps.S0000_WAIT && _picker2Step == PickerSteps.S0000_WAIT) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Stage Pick [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, AOI Stage Pick [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S5999_PICK_TO_AOI_STAGE_END; } break; } case UnloaderHandler1Steps.S5999_PICK_TO_AOI_STAGE_END: { Tact_Move.Stop(); Step = UnloaderHandler1Steps.S0000_WAIT; break; } } } private void Seq_PickReverseStage() { switch (Step) { case UnloaderHandler1Steps.S6000_PICK_TO_REVERSE_STAGE_START: { Step = UnloaderHandler1Steps.S6100_ULD_HANDLER_2_POSITION_CHECK; break; } case UnloaderHandler1Steps.S6100_ULD_HANDLER_2_POSITION_CHECK: { double position = equipment.after.Handler2.Get_Position_Y_Stay(); if (position >= equipment.after.Handler2.MotorY.Position || equipment.after.Handler2.MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) { Step = UnloaderHandler1Steps.S6110_REVERSE_STAGE_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S6110_REVERSE_STAGE_POSITION_CHECK: { if (equipment.after.ReverseStage.IsStayPosition) { Step = UnloaderHandler1Steps.S6120_PICKER_UP; } break; } case UnloaderHandler1Steps.S6120_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { Step = UnloaderHandler1Steps.S6200_MOVE_REVERSE_STAGE_POSITION; } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler1Steps.S6200_MOVE_REVERSE_STAGE_POSITION: { if (Move_X_Reverse_Position() && Move_Y_Reverse_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Position [Start]"); Step = UnloaderHandler1Steps.S6205_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S6205_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (Get_Is_Position_X_Reverse() && Get_Is_Position_Y_Reverse()) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S6210_PICK_START; } else { Step = UnloaderHandler1Steps.S6200_MOVE_REVERSE_STAGE_POSITION; } } break; } case UnloaderHandler1Steps.S6210_PICK_START: { if (_picker1Step == PickerSteps.S0000_WAIT && _picker2Step == PickerSteps.S0000_WAIT) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Pick [Start]"); if (equipment.after.ReverseStage.Stage1.IsExist) { _picker1Step = PickerSteps.S2000_PICK_REVERSE_START; } if (equipment.after.ReverseStage.Stage2.IsExist) { _picker2Step = PickerSteps.S2000_PICK_REVERSE_START; } Step = UnloaderHandler1Steps.S6220_PICK_WAIT; } break; } case UnloaderHandler1Steps.S6220_PICK_WAIT: { if (_picker1Step == PickerSteps.S0000_WAIT && _picker2Step == PickerSteps.S0000_WAIT) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Pick [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Pick [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S6999_PICK_TO_REVERSE_STAGE_END; } break; } case UnloaderHandler1Steps.S6999_PICK_TO_REVERSE_STAGE_END: { Step = UnloaderHandler1Steps.S0000_WAIT; break; } } } private void Seq_PlaceReverseStage() { switch (Step) { case UnloaderHandler1Steps.S7000_PLACE_TO_REVERSE_STAGE_CHANGE_START: { Step = UnloaderHandler1Steps.S7100_ULD_HANDLER_2_POSITION_CHECK; break; } case UnloaderHandler1Steps.S7100_ULD_HANDLER_2_POSITION_CHECK: { double position = equipment.after.Handler2.Get_Position_Y_Stay(); if (position >= equipment.after.Handler2.MotorY.Position || equipment.after.Handler2.MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) { Step = UnloaderHandler1Steps.S7110_REVERSE_STAGE_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S7110_REVERSE_STAGE_POSITION_CHECK: { if (equipment.after.ReverseStage.IsStayPosition) { Step = UnloaderHandler1Steps.S7120_PICKER_UP; } break; } case UnloaderHandler1Steps.S7120_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { Step = UnloaderHandler1Steps.S7130_VACUUM_CHECK; } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler1Steps.S7130_VACUUM_CHECK: { double position = equipment.after.Handler2.Get_Position_Y_Stay(); if (position >= equipment.after.Handler2.MotorY.Position || equipment.after.Handler2.MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) { if (Picker1.IsExist) { Step = UnloaderHandler1Steps.S7200_MOVE_PICKER1_REVERSE_STAGE_POSITION; } else if (Picker2.IsExist) { Step = UnloaderHandler1Steps.S7300_MOVE_PICKER2_REVERSE_STAGE_POSITION; } } break; } case UnloaderHandler1Steps.S7200_MOVE_PICKER1_REVERSE_STAGE_POSITION: { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Reverse_Stage_Position, out value); position = double.Parse($"{value}"); position = position + handler_pitch; position = double.Parse(position.ToString("F3")); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Reverse_Stage_Velocity, out value); velocity = double.Parse($"{value}"); if (MotorX.Move_Absolute_Pos(position, velocity) && Move_Y_Reverse_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Buffer Position [Start]"); Step = UnloaderHandler1Steps.S7205_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S7205_POSITION_CHECK: { object value; double position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Reverse_Stage_Position, out value); position = double.Parse($"{value}"); position = position + handler_pitch; position = double.Parse(position.ToString("F3")); if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(position, equipment.Setting.Inposition_Offset) && Get_Is_Position_Y_Reverse()) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Buffer Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Buffer Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S7210_PICKER1_PLACE_START; } else { Step = UnloaderHandler1Steps.S7200_MOVE_PICKER1_REVERSE_STAGE_POSITION; } } break; } case UnloaderHandler1Steps.S7210_PICKER1_PLACE_START: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #1 Place [Start]"); _picker1Step = PickerSteps.S3000_PLACE_REVERSE_STAGE_START; Step = UnloaderHandler1Steps.S7220_PICKER1_PLACE_WAIT; break; } case UnloaderHandler1Steps.S7220_PICKER1_PLACE_WAIT: { if (_picker1Step == PickerSteps.S0000_WAIT) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #1 Place [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #1 Place [Tact : {Tact_Move.Seconds} (sec)]"); if(Picker2.IsExist) { Step = UnloaderHandler1Steps.S7300_MOVE_PICKER2_REVERSE_STAGE_POSITION; } else { Step = UnloaderHandler1Steps.S7999_PLACE_TO_REVERSE_STAGE_CHANGE_END; } } break; } case UnloaderHandler1Steps.S7300_MOVE_PICKER2_REVERSE_STAGE_POSITION: { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Reverse_Stage_Position, out value); position = double.Parse($"{value}"); position = position - handler_pitch; position = double.Parse(position.ToString("F3")); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Reverse_Stage_Velocity, out value); velocity = double.Parse($"{value}"); if (MotorX.Move_Absolute_Pos(position, velocity) && Move_Y_Reverse_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Buffer Position [Start]"); Step = UnloaderHandler1Steps.S7305_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S7305_POSITION_CHECK: { object value; double position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Reverse_Stage_Position, out value); position = double.Parse($"{value}"); position = position - handler_pitch; position = double.Parse(position.ToString("F3")); if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(position, equipment.Setting.Inposition_Offset) && Get_Is_Position_Y_Reverse()) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Buffer Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Reverse Stage Buffer Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S7310_PICKER2_PLACE_START; } else { Step = UnloaderHandler1Steps.S7300_MOVE_PICKER2_REVERSE_STAGE_POSITION; } } break; } case UnloaderHandler1Steps.S7310_PICKER2_PLACE_START: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #2 Place [Start]"); _picker2Step = PickerSteps.S3000_PLACE_REVERSE_STAGE_START; Step = UnloaderHandler1Steps.S7320_PICKER2_PLACE_WAIT; break; } case UnloaderHandler1Steps.S7320_PICKER2_PLACE_WAIT: { if (_picker2Step == PickerSteps.S0000_WAIT) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #2 Place [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #2 Place [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S7999_PLACE_TO_REVERSE_STAGE_CHANGE_END; } break; } case UnloaderHandler1Steps.S7999_PLACE_TO_REVERSE_STAGE_CHANGE_END: { Step = UnloaderHandler1Steps.S0000_WAIT; break; } } } private void Seq_PlaceTrayPanel() { switch (Step) { case UnloaderHandler1Steps.S8000_PLACE_TO_TRAY_START: { Tact_Move.Start(); Step = UnloaderHandler1Steps.S8100_ULD_TRAY_TR_POSITION_CHECK; break; } case UnloaderHandler1Steps.S8100_ULD_TRAY_TR_POSITION_CHECK: { if(equipment.unloader.TrayTransfer.IsStayPosition) { Step = UnloaderHandler1Steps.S8110_PICKER_UP; } break; } case UnloaderHandler1Steps.S8110_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { Step = UnloaderHandler1Steps.S8200_PICKER1_DATA_CHECK; } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler1Steps.S8200_PICKER1_DATA_CHECK: { if(Picker1.IsExist) { if((equipment.Mode.Film_Judge_Skip || Panel1.Film_Judge_Result) && (equipment.Mode.Measurement_Skip || Panel1.Measurement_Result)) { Step = UnloaderHandler1Steps.S8210_PICKER1_GET_OK_PANEL_NUM; } else { Step = UnloaderHandler1Steps.S8400_PICKER1_GET_NG_PANEL_NUM; } } else { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; } break; } case UnloaderHandler1Steps.S8210_PICKER1_GET_OK_PANEL_NUM: { int panel_num = 0; if(Get_Handler_1_1_Tray_OK_Panel_Num(out panel_num)) { place_panel_num = panel_num; Step = UnloaderHandler1Steps.S8220_PICKER1_GET_PLACE_POSITION; } else { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; } break; } case UnloaderHandler1Steps.S8220_PICKER1_GET_PLACE_POSITION: { double position_x; double position_y; if (Get_Tray_OK_ULD_Handler_1_X_Position(place_panel_num, out position_x) && Get_Tray_OK_ULD_Handler_1_Y_Position(place_panel_num, out position_y)) { place_position_x = position_x; place_position_y = position_y; Step = UnloaderHandler1Steps.S8300_MOVE_PLACE_POSITION; } break; } case UnloaderHandler1Steps.S8300_MOVE_PLACE_POSITION: { if(Move_X(place_position_x) && Move_Y(place_position_y)) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray Position [Start]"); Step = UnloaderHandler1Steps.S8305_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S8305_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(place_position_x, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(place_position_y, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S8310_PICKER1_PLACE_START; } else { Step = UnloaderHandler1Steps.S8300_MOVE_PLACE_POSITION; } } break; } case UnloaderHandler1Steps.S8310_PICKER1_PLACE_START: { if (Picker1.IsExist) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #1 Place [Start]"); _picker1Step = PickerSteps.S4000_PLACE_TRAY_PANEL_START; Step = UnloaderHandler1Steps.S8315_PICKER1_PLACE_WAIT; } else { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; } break; } case UnloaderHandler1Steps.S8315_PICKER1_PLACE_WAIT: { if(_picker1Step == PickerSteps.S0000_WAIT) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #1 Place [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #1 Place [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S8320_TRAY_OK_DATA_SET; } break; } case UnloaderHandler1Steps.S8320_TRAY_OK_DATA_SET: { Panel_Info info = Panel1; info.Panel_Num = place_panel_num; if (Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.ULD_Tray_Ok, info)) { equipment.Write_Panel_Info_Log($"{equipment.equipment_info.Device_ID},{equipment.equipment_info.Process_Number},{equipment.equipment_info.Module_Model_ID},{info.Panel_ID},판정,{info.Start_Time},{info.End_Time},{info.Film_Judge_Result},OK"); equipment.panel_count_info.Day_ULD_OK_Count++; equipment.panel_count_info.Minute_ULD_OK_Count++; Panel_Count_Info_Manager.Instance.Save_Panel_Count_Info(equipment.panel_count_info); //210923 hslee, chs 220530 Tray -> Panel 로 변경.==================================================================================== object value; equipment.sm.Get_Value(Data_Interpretation_Memory_Address.OK_Out_Cnt, out value); equipment.sm.Set_Value(Data_Interpretation_Memory_Address.OK_Out_Cnt, Convert.ToInt32(value) + 1); equipment.SaveTempGlassOutCnt(); //================================================================================================= Panel1 = new Panel_Info(); } else { return; } if (equipment.cim_mode == En_Cim_Mode.Online && info.IsPanelIdRead) { Step = UnloaderHandler1Steps.S8330_TRAY_IN_CIM_SEND; } else { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; } ng_place_runned = false; break; } case UnloaderHandler1Steps.S8330_TRAY_IN_CIM_SEND: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; return; } object value; equipment.sm.Get_Value(Process_Memory_Address.ULD_Tray_Ok_ID, out value); Panel_Info info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ok, place_panel_num); if (!equipment.cim_client.Send_Panel_Tray_In("E123456", value.ToString(), info.Panel_ID, $"{cim_column}{cim_row + 1}", En_Port_ID.P03)) return; Step = UnloaderHandler1Steps.S8340_TRAY_IN_CIM_SEND_WAIT; break; } case UnloaderHandler1Steps.S8340_TRAY_IN_CIM_SEND_WAIT: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; return; } if (equipment.cim_client.Get_Command_Ack(En_Cim_Command.PTINR)) { if(equipment.cim_client.Get_Command_Result(En_Cim_Command.PTINR)) { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; } else { Step = UnloaderHandler1Steps.S8330_TRAY_IN_CIM_SEND; } } break; } case UnloaderHandler1Steps.S8400_PICKER1_GET_NG_PANEL_NUM: { int panel_num = 0; if (Get_Handler_1_1_Tray_NG_Panel_Num(out panel_num)) { place_panel_num = panel_num; Step = UnloaderHandler1Steps.S8410_PICKER1_GET_PLACE_POSITION; } else { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; } break; } case UnloaderHandler1Steps.S8410_PICKER1_GET_PLACE_POSITION: { double position_x; double position_y; if (Get_Tray_NG_ULD_Handler_1_X_Position(place_panel_num, out position_x) && Get_Tray_NG_ULD_Handler_1_Y_Position(place_panel_num, out position_y)) { place_position_x = position_x; place_position_y = position_y; Step = UnloaderHandler1Steps.S8500_MOVE_Y_PLACE_POSITION; } break; } case UnloaderHandler1Steps.S8500_MOVE_Y_PLACE_POSITION: { if (Move_Y(place_position_y)) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray Position [Start]"); Step = UnloaderHandler1Steps.S8505_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S8505_POSITION_CHECK: { if (MotorY.MotionComplete) { if (MotorY.Is_Inposition(place_position_y, equipment.Setting.Inposition_Offset)) { Step = UnloaderHandler1Steps.S8510_MOVE_X_PLACE_POSITION; } else { Step = UnloaderHandler1Steps.S8500_MOVE_Y_PLACE_POSITION; } } break; } case UnloaderHandler1Steps.S8510_MOVE_X_PLACE_POSITION: { if (Move_X(place_position_x)) { Step = UnloaderHandler1Steps.S8515_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S8515_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(place_position_x, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(place_position_y, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S8520_PICKER1_PLACE_START; } else { Step = UnloaderHandler1Steps.S8500_MOVE_Y_PLACE_POSITION; } } break; } case UnloaderHandler1Steps.S8520_PICKER1_PLACE_START: { if (Picker1.IsExist) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #1 Place [Start]"); _picker1Step = PickerSteps.S4000_PLACE_TRAY_PANEL_START; Step = UnloaderHandler1Steps.S8525_PICKER1_PLACE_WAIT; } else { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; } break; } case UnloaderHandler1Steps.S8525_PICKER1_PLACE_WAIT: { if (_picker1Step == PickerSteps.S0000_WAIT) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #1 Place [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #1 Place [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S8530_TRAY_NG_DATA_SET; } break; } case UnloaderHandler1Steps.S8530_TRAY_NG_DATA_SET: { Panel_Info info = Panel1; info.Panel_Num = place_panel_num; if (Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, info)) { equipment.Write_Panel_Info_Log($"{equipment.equipment_info.Device_ID},{equipment.equipment_info.Process_Number},{equipment.equipment_info.Module_Model_ID},{info.Panel_ID},판정,{info.Start_Time},{info.End_Time},{info.Film_Judge_Result},NG"); equipment.panel_count_info.Day_ULD_NG_Count++; equipment.panel_count_info.Minute_ULD_NG_Count++; Panel_Count_Info_Manager.Instance.Save_Panel_Count_Info(equipment.panel_count_info); //210923 hslee, chs 220530 Tray -> Panel 로 변경.==================================================================================== object value; equipment.sm.Get_Value(Data_Interpretation_Memory_Address.NG_Out_Cnt, out value); equipment.sm.Set_Value(Data_Interpretation_Memory_Address.NG_Out_Cnt, Convert.ToInt32(value) + 1); equipment.SaveTempGlassOutCnt(); //================================================================================================= Panel1 = new Panel_Info(); } else { return; } ng_place_runned = true; if (equipment.cim_mode == En_Cim_Mode.Online && info.IsPanelIdRead) { Step = UnloaderHandler1Steps.S8540_TRAY_IN_CIM_SEND; } else { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; } break; } case UnloaderHandler1Steps.S8540_TRAY_IN_CIM_SEND: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; return; } Panel_Info info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, place_panel_num); if (!equipment.cim_client.Send_Panel_Tray_In("E123456", equipment.unloader.LiftNg.TrayID, info.Panel_ID, $"{cim_column}{cim_row + 1}", En_Port_ID.P04)) return; Step = UnloaderHandler1Steps.S8550_TRAY_IN_CIM_SEND_WAIT; break; } case UnloaderHandler1Steps.S8550_TRAY_IN_CIM_SEND_WAIT: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; return; } if (equipment.cim_client.Get_Command_Ack(En_Cim_Command.PTINR)) { if (equipment.cim_client.Get_Command_Result(En_Cim_Command.PTINR)) { Step = UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK; } else { Step = UnloaderHandler1Steps.S8540_TRAY_IN_CIM_SEND; } } break; } case UnloaderHandler1Steps.S8600_PICKER2_DATA_CHECK: { if (Picker2.IsExist) { if ((equipment.Mode.Film_Judge_Skip || Panel2.Film_Judge_Result) && (equipment.Mode.Measurement_Skip || Panel2.Measurement_Result)) { Step = UnloaderHandler1Steps.S8610_PICKER2_GET_OK_PANEL_NUM; } else { Step = UnloaderHandler1Steps.S8800_PICKER2_GET_NG_PANEL_NUM; } } else { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; } break; } case UnloaderHandler1Steps.S8610_PICKER2_GET_OK_PANEL_NUM: { int panel_num = 0; if (Get_Handler_1_2_Tray_OK_Panel_Num(out panel_num)) { place_panel_num = panel_num; Step = UnloaderHandler1Steps.S8620_PICKER2_GET_PLACE_POSITION; } else { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; } break; } case UnloaderHandler1Steps.S8620_PICKER2_GET_PLACE_POSITION: { double position_x; double position_y; if (Get_Tray_OK_ULD_Handler_1_X_Position(place_panel_num, out position_x) && Get_Tray_OK_ULD_Handler_1_Y_Position(place_panel_num, out position_y)) { place_position_x = position_x - handler_pitch; place_position_y = position_y; place_position_x = double.Parse(place_position_x.ToString("F3")); place_position_y = double.Parse(place_position_y.ToString("F3")); Step = UnloaderHandler1Steps.S8700_MOVE_PLACE_POSITION; } break; } case UnloaderHandler1Steps.S8700_MOVE_PLACE_POSITION: { if (Move_X(place_position_x) && Move_Y(place_position_y)) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray Position [Start]"); Step = UnloaderHandler1Steps.S8705_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S8705_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(place_position_x, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(place_position_y, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, OK Tray Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S8710_PICKER2_PLACE_START; } else { Step = UnloaderHandler1Steps.S8700_MOVE_PLACE_POSITION; } } break; } case UnloaderHandler1Steps.S8710_PICKER2_PLACE_START: { if (Picker2.IsExist) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #2 Place [Start]"); _picker2Step = PickerSteps.S4000_PLACE_TRAY_PANEL_START; Step = UnloaderHandler1Steps.S8715_PICKER2_PLACE_WAIT; } else { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; } break; } case UnloaderHandler1Steps.S8715_PICKER2_PLACE_WAIT: { if (_picker2Step == PickerSteps.S0000_WAIT) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #1 Place [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #1 Place [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S8720_TRAY_OK_DATA_SET; } break; } case UnloaderHandler1Steps.S8720_TRAY_OK_DATA_SET: { Panel_Info info = Panel2; info.Panel_Num = place_panel_num; if (Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.ULD_Tray_Ok, info)) { equipment.Write_Panel_Info_Log($"{equipment.equipment_info.Device_ID},{equipment.equipment_info.Process_Number},{equipment.equipment_info.Module_Model_ID},{info.Panel_ID},판정,{info.Start_Time},{info.End_Time},{info.Film_Judge_Result},OK"); equipment.panel_count_info.Day_ULD_OK_Count++; equipment.panel_count_info.Minute_ULD_OK_Count++; Panel_Count_Info_Manager.Instance.Save_Panel_Count_Info(equipment.panel_count_info); //210923 hslee, chs 220530 Tray -> Panel 로 변경.==================================================================================== object value; equipment.sm.Get_Value(Data_Interpretation_Memory_Address.OK_Out_Cnt, out value); equipment.sm.Set_Value(Data_Interpretation_Memory_Address.OK_Out_Cnt, Convert.ToInt32(value) + 1); equipment.SaveTempGlassOutCnt(); //================================================================================================= Panel2 = new Panel_Info(); } else { return; } ng_place_runned = false; if (equipment.cim_mode == En_Cim_Mode.Online && info.IsPanelIdRead) { Step = UnloaderHandler1Steps.S8730_TRAY_IN_CIM_SEND; } else { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; } break; } case UnloaderHandler1Steps.S8730_TRAY_IN_CIM_SEND: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; return; } object value; equipment.sm.Get_Value(Process_Memory_Address.ULD_Tray_Ok_ID, out value); Panel_Info info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ok, place_panel_num); if (!equipment.cim_client.Send_Panel_Tray_In("E123456", value.ToString(), info.Panel_ID, $"{cim_column}{cim_row + 1}", En_Port_ID.P03)) return; Step = UnloaderHandler1Steps.S8740_TRAY_IN_CIM_SEND_WAIT; break; } case UnloaderHandler1Steps.S8740_TRAY_IN_CIM_SEND_WAIT: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; return; } if (equipment.cim_client.Get_Command_Ack(En_Cim_Command.PTINR)) { if (equipment.cim_client.Get_Command_Result(En_Cim_Command.PTINR)) { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; } else { Step = UnloaderHandler1Steps.S8730_TRAY_IN_CIM_SEND; } } break; } case UnloaderHandler1Steps.S8800_PICKER2_GET_NG_PANEL_NUM: { int panel_num = 0; if (Get_Handler_1_2_Tray_NG_Panel_Num(out panel_num)) { place_panel_num = panel_num; Step = UnloaderHandler1Steps.S8810_PICKER2_GET_PLACE_POSITION; } else { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; } break; } case UnloaderHandler1Steps.S8810_PICKER2_GET_PLACE_POSITION: { double position_x; double position_y; if (Get_Tray_NG_ULD_Handler_1_X_Position(place_panel_num, out position_x) && Get_Tray_NG_ULD_Handler_1_Y_Position(place_panel_num, out position_y)) { place_position_x = position_x - handler_pitch; place_position_y = position_y; Step = UnloaderHandler1Steps.S8900_MOVE_Y_PLACE_POSITION; } break; } case UnloaderHandler1Steps.S8900_MOVE_Y_PLACE_POSITION: { if (Move_Y(place_position_y)) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray Position [Start]"); Step = UnloaderHandler1Steps.S8905_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S8905_POSITION_CHECK: { if (MotorY.MotionComplete) { if (MotorY.Is_Inposition(place_position_y, equipment.Setting.Inposition_Offset)) { Step = UnloaderHandler1Steps.S8910_MOVE_X_PLACE_POSITION; } else { Step = UnloaderHandler1Steps.S8900_MOVE_Y_PLACE_POSITION; } } break; } case UnloaderHandler1Steps.S8910_MOVE_X_PLACE_POSITION: { if (Move_X(place_position_x)) { Step = UnloaderHandler1Steps.S8915_POSITION_CHECK; } break; } case UnloaderHandler1Steps.S8915_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (MotorX.Is_Inposition(place_position_x, equipment.Setting.Inposition_Offset) && MotorY.Is_Inposition(place_position_y, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, NG Tray Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S8920_PICKER2_PLACE_START; } else { Step = UnloaderHandler1Steps.S8900_MOVE_Y_PLACE_POSITION; } } break; } case UnloaderHandler1Steps.S8920_PICKER2_PLACE_START: { if (Picker2.IsExist) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #2 Place [Start]"); _picker2Step = PickerSteps.S4000_PLACE_TRAY_PANEL_START; Step = UnloaderHandler1Steps.S8925_PICKER2_PLACE_WAIT; } else { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; } break; } case UnloaderHandler1Steps.S8925_PICKER2_PLACE_WAIT: { if (_picker2Step == PickerSteps.S0000_WAIT) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #2 Place [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 1, Picker #2 Place [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler1Steps.S8930_TRAY_NG_DATA_SET; } break; } case UnloaderHandler1Steps.S8930_TRAY_NG_DATA_SET: { Panel_Info info = Panel2; info.Panel_Num = place_panel_num; if (Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, info)) { equipment.Write_Panel_Info_Log($"{equipment.equipment_info.Device_ID},{equipment.equipment_info.Process_Number},{equipment.equipment_info.Module_Model_ID},{info.Panel_ID},판정,{info.Start_Time},{info.End_Time},{info.Film_Judge_Result},NG"); equipment.panel_count_info.Day_ULD_NG_Count++; equipment.panel_count_info.Minute_ULD_NG_Count++; Panel_Count_Info_Manager.Instance.Save_Panel_Count_Info(equipment.panel_count_info); //210923 hslee, chs 220530 Tray -> Panel 로 변경.==================================================================================== object value; equipment.sm.Get_Value(Data_Interpretation_Memory_Address.NG_Out_Cnt, out value); equipment.sm.Set_Value(Data_Interpretation_Memory_Address.NG_Out_Cnt, Convert.ToInt32(value) + 1); equipment.SaveTempGlassOutCnt(); //================================================================================================= Panel2 = new Panel_Info(); } else { return; } ng_place_runned = true; if (equipment.cim_mode == En_Cim_Mode.Online && info.IsPanelIdRead) { Step = UnloaderHandler1Steps.S8940_TRAY_IN_CIM_SEND; } else { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; } break; } case UnloaderHandler1Steps.S8940_TRAY_IN_CIM_SEND: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; return; } Panel_Info info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, place_panel_num); if (!equipment.cim_client.Send_Panel_Tray_In("E123456", equipment.unloader.LiftNg.TrayID, info.Panel_ID, $"{cim_column}{cim_row + 1}", En_Port_ID.P04)) return; Step = UnloaderHandler1Steps.S8950_TRAY_IN_CIM_SEND_WAIT; break; } case UnloaderHandler1Steps.S8950_TRAY_IN_CIM_SEND_WAIT: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; return; } if (equipment.cim_client.Get_Command_Ack(En_Cim_Command.PTINR)) { if (equipment.cim_client.Get_Command_Result(En_Cim_Command.PTINR)) { Step = UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END; } else { Step = UnloaderHandler1Steps.S8940_TRAY_IN_CIM_SEND; } } break; } case UnloaderHandler1Steps.S8999_PLACE_TO_TRAY_END: { Tact_Move.Stop(); if (IsExist == false) { equipment.unloader.TactTime.Restart(); } Step = UnloaderHandler1Steps.S0000_WAIT; break; } } } private void Seq_Picker1Step() { switch(_picker1Step) { case PickerSteps.S1000_PICK_AOI_STAGE_START: { _picker1Step = PickerSteps.S1100_DOWN; break; } case PickerSteps.S1100_DOWN: { if (Picker1.IsWorkEnd) { if (Picker1.IsDown) { _picker1Step = PickerSteps.S1110_VACUUM_ON; } else { Picker1.Down(); } } break; } case PickerSteps.S1110_VACUUM_ON: { if (Picker1.IsWorkEnd) { if (Picker1.VacuumSolOn) { _picker1Step = PickerSteps.S1120_AOI_STAGE_VACUUM_OFF; } else { Picker1.VacuumOn(); } } break; } case PickerSteps.S1120_AOI_STAGE_VACUUM_OFF: { if (equipment.after.AoiStage.Stage1.IsWorkEnd) { if (equipment.after.AoiStage.Stage1.VacuumSolOn == false) { picker1Timer.Restart(); _picker1Step = PickerSteps.S1130_AOI_STAGE_BLOW_ON; } else { equipment.after.AoiStage.Stage1.VacuumOff(); } } break; } case PickerSteps.S1130_AOI_STAGE_BLOW_ON: { if (equipment.after.AoiStage.Stage1.IsWorkEnd) { if (equipment.after.AoiStage.Stage1.BlowSolOn == true) { picker1Timer.Restart(); _picker1Step = PickerSteps.S1140_PICKER_UP; } else { equipment.after.AoiStage.Stage1.BlowSolOn = true; } } break; } case PickerSteps.S1140_PICKER_UP: { if (picker1Timer.Seconds < pickerUpWaitTime) { return; } if (Picker1.IsWorkEnd) { if (Picker1.IsUp) { _picker1Step = PickerSteps.S1150_AOI_STAGE_BLOW_OFF; } else { Picker1.Up(); } } break; } case PickerSteps.S1150_AOI_STAGE_BLOW_OFF: { if (equipment.after.AoiStage.Stage1.IsWorkEnd) { if (equipment.after.AoiStage.Stage1.BlowSolOn == false) { _picker1Step = PickerSteps.S1160_DATA_SET; } else { equipment.after.AoiStage.Stage1.BlowSolOn = false; } } break; } case PickerSteps.S1160_DATA_SET: { if (picker1Timer.Seconds < pickerUpWaitTime) { return; } Panel1 = equipment.after.AoiStage.Panel1; equipment.after.AoiStage.Panel1 = new Panel_Info(); _picker1Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S2000_PICK_REVERSE_START: { _picker1Step = PickerSteps.S2100_DOWN; break; } case PickerSteps.S2100_DOWN: { if (Picker1.IsWorkEnd) { if (Picker1.IsDown) { _picker1Step = PickerSteps.S2110_VACUUM_ON; } else { Picker1.Down(); } } break; } case PickerSteps.S2110_VACUUM_ON: { if (Picker1.IsWorkEnd) { if (Picker1.VacuumSolOn) { _picker1Step = PickerSteps.S2120_VACUUM_CHECK; } else { Picker1.VacuumSolOn = true; } } break; } case PickerSteps.S2120_VACUUM_CHECK: { if(Picker1.IsVacuumSensor) { _picker1Step = PickerSteps.S2150_REVERSE_STAGE_VACUUM_OFF; } else { _picker1Step = PickerSteps.S5130_REVERSE_STAGE_MOVE_UP; } break; } case PickerSteps.S5130_REVERSE_STAGE_MOVE_UP: { if (equipment.after.ReverseStage.MotorZ1.Move_Relative_Pos(reversestage_move_position, 50)) { _picker1Step = PickerSteps.S2140_VACUUM_CHECK; } break; } case PickerSteps.S2140_VACUUM_CHECK: { if(equipment.after.ReverseStage.MotorZ1.MotionComplete) { if (Picker1.IsWorkEnd) { if (Picker1.IsExist) { _picker1Step = PickerSteps.S2150_REVERSE_STAGE_VACUUM_OFF; } else { Picker1.VacuumOn(); } } } break; } case PickerSteps.S2150_REVERSE_STAGE_VACUUM_OFF: { if (equipment.after.ReverseStage.Stage1.IsWorkEnd) { if (equipment.after.ReverseStage.Stage1.VacuumSolOn == false) { _picker1Step = PickerSteps.S2160_REVERSE_STAGE_MOVE_STAY; } else { equipment.after.ReverseStage.Stage1.VacuumOff(); } } break; } case PickerSteps.S2160_REVERSE_STAGE_MOVE_STAY: { if (equipment.after.ReverseStage.Move_Z_1_Down_Position()) { _picker1Step = PickerSteps.S2170_DATA_SET; } break; } case PickerSteps.S2170_DATA_SET: { Panel1 = equipment.after.ReverseStage.Panel1; equipment.after.ReverseStage.Panel1 = new Panel_Info(); _picker1Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S3000_PLACE_REVERSE_STAGE_START: { _picker1Step = PickerSteps.S3100_PICKER_DOWN; break; } case PickerSteps.S3100_PICKER_DOWN: { if (Picker1.IsWorkEnd) { if (Picker1.IsDown) { _picker1Step = PickerSteps.S3110_REVERSE_STAGE_VACUUM_ON; } else { Picker1.Down(); } } break; } case PickerSteps.S3110_REVERSE_STAGE_VACUUM_ON: { if (equipment.after.ReverseStage.Stage2.IsWorkEnd) { if (equipment.after.ReverseStage.Stage2.VacuumSolOn) { _picker1Step = PickerSteps.S3120_VACUUM_OFF; } else { equipment.after.ReverseStage.Stage2.VacuumOn(); } } break; } case PickerSteps.S3120_VACUUM_OFF: { if (Picker1.IsWorkEnd) { if (Picker1.VacuumSolOn == false) { _picker1Step = PickerSteps.S3130_DATA_SET; } else { Picker1.VacuumOff(); } } break; } case PickerSteps.S3130_DATA_SET: { equipment.after.ReverseStage.Panel2 = Panel1; Panel1 = new Panel_Info(); _picker1Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S4000_PLACE_TRAY_PANEL_START: { _picker1Step = PickerSteps.S4100_PICKER_DOWN; break; } case PickerSteps.S4100_PICKER_DOWN: { if (Picker1.IsWorkEnd) { if (Picker1.IsDown) { _picker1Step = PickerSteps.S4110_VACUUM_OFF; } else { Picker1.Down(); } } break; } case PickerSteps.S4110_VACUUM_OFF: { if (Picker1.IsWorkEnd) { if (Picker1.VacuumSolOn == false) { _picker1Step = PickerSteps.S9200_PICKER_UP; } else { Picker1.VacuumOff(); } } break; } case PickerSteps.S9000_SCRAP_START: { _picker1Step = PickerSteps.S9100_VACUUM_OFF; break; } case PickerSteps.S9100_VACUUM_OFF: { if (Picker1.IsWorkEnd) { if (Picker1.VacuumSolOn == false) { _picker1Step = PickerSteps.S9110_DATA_SET; } else { Picker1.VacuumOff(); } } break; } case PickerSteps.S9110_DATA_SET: { Panel1 = new Panel_Info(); _picker1Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S9200_PICKER_UP: { if (Picker1.IsWorkEnd) { if (Picker1.IsUp) { _picker1Step = PickerSteps.S9999_STEP_END; } else { Picker1.Up(); } } break; } case PickerSteps.S9999_STEP_END: { _picker1Step = PickerSteps.S0000_WAIT; break; } } } private void Seq_Picker2Step() { switch (_picker2Step) { case PickerSteps.S1000_PICK_AOI_STAGE_START: { _picker2Step = PickerSteps.S1100_DOWN; break; } case PickerSteps.S1100_DOWN: { if (Picker2.IsWorkEnd) { if (Picker2.IsDown) { _picker2Step = PickerSteps.S1110_VACUUM_ON; } else { Picker2.Down(); } } break; } case PickerSteps.S1110_VACUUM_ON: { if (Picker2.IsWorkEnd) { if (Picker2.VacuumSolOn) { _picker2Step = PickerSteps.S1120_AOI_STAGE_VACUUM_OFF; } else { Picker2.VacuumOn(); } } break; } case PickerSteps.S1120_AOI_STAGE_VACUUM_OFF: { if (equipment.after.AoiStage.Stage2.IsWorkEnd) { if (equipment.after.AoiStage.Stage2.VacuumSolOn == false) { picker2Timer.Restart(); _picker2Step = PickerSteps.S1130_AOI_STAGE_BLOW_ON; } else { equipment.after.AoiStage.Stage2.VacuumOff(); } } break; } case PickerSteps.S1130_AOI_STAGE_BLOW_ON: { if (equipment.after.AoiStage.Stage2.IsWorkEnd) { if (equipment.after.AoiStage.Stage2.BlowSolOn == true) { picker2Timer.Restart(); _picker2Step = PickerSteps.S1140_PICKER_UP; } else { equipment.after.AoiStage.Stage2.BlowSolOn = true; } } break; } case PickerSteps.S1140_PICKER_UP: { if (picker2Timer.Seconds < pickerUpWaitTime) { return; } if (Picker2.IsWorkEnd) { if (Picker2.IsUp) { _picker2Step = PickerSteps.S1150_AOI_STAGE_BLOW_OFF; } else { Picker2.Up(); } } break; } case PickerSteps.S1150_AOI_STAGE_BLOW_OFF: { if (equipment.after.AoiStage.Stage2.IsWorkEnd) { if (equipment.after.AoiStage.Stage2.BlowSolOn == false) { _picker2Step = PickerSteps.S1160_DATA_SET; } else { equipment.after.AoiStage.Stage2.BlowSolOn = false; } } break; } case PickerSteps.S1160_DATA_SET: { if (picker2Timer.Seconds < pickerUpWaitTime) { return; } Panel2 = equipment.after.AoiStage.Panel2; equipment.after.AoiStage.Panel2 = new Panel_Info(); _picker2Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S2000_PICK_REVERSE_START: { _picker2Step = PickerSteps.S2100_DOWN; break; } case PickerSteps.S2100_DOWN: { if (Picker2.IsWorkEnd) { if (Picker2.IsDown) { _picker2Step = PickerSteps.S2110_VACUUM_ON; } else { Picker2.Down(); } } break; } case PickerSteps.S2110_VACUUM_ON: { if (Picker2.IsWorkEnd) { if (Picker2.VacuumSolOn) { _picker2Step = PickerSteps.S2120_VACUUM_CHECK; } else { Picker2.VacuumSolOn = true; } } break; } case PickerSteps.S2120_VACUUM_CHECK: { if (Picker2.IsVacuumSensor) { _picker2Step = PickerSteps.S2150_REVERSE_STAGE_VACUUM_OFF; } else { _picker2Step = PickerSteps.S5130_REVERSE_STAGE_MOVE_UP; } break; } case PickerSteps.S5130_REVERSE_STAGE_MOVE_UP: { if (equipment.after.ReverseStage.MotorZ2.Move_Relative_Pos(reversestage_move_position, 50)) { _picker2Step = PickerSteps.S2140_VACUUM_CHECK; } break; } case PickerSteps.S2140_VACUUM_CHECK: { if (equipment.after.ReverseStage.MotorZ1.MotionComplete) { if (Picker2.IsWorkEnd) { if (Picker2.IsExist) { _picker2Step = PickerSteps.S2150_REVERSE_STAGE_VACUUM_OFF; } else { Picker2.VacuumOn(); } } } break; } case PickerSteps.S2150_REVERSE_STAGE_VACUUM_OFF: { if (equipment.after.ReverseStage.Stage2.IsWorkEnd) { if (equipment.after.ReverseStage.Stage2.VacuumSolOn == false) { _picker2Step = PickerSteps.S2160_REVERSE_STAGE_MOVE_STAY; } else { equipment.after.ReverseStage.Stage2.VacuumOff(); } } break; } case PickerSteps.S2160_REVERSE_STAGE_MOVE_STAY: { if (equipment.after.ReverseStage.Move_Z_2_Down_Position()) { _picker2Step = PickerSteps.S2170_DATA_SET; } break; } case PickerSteps.S2170_DATA_SET: { Panel2 = equipment.after.ReverseStage.Panel2; equipment.after.ReverseStage.Panel2 = new Panel_Info(); _picker2Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S3000_PLACE_REVERSE_STAGE_START: { _picker2Step = PickerSteps.S3100_PICKER_DOWN; break; } case PickerSteps.S3100_PICKER_DOWN: { if (Picker2.IsWorkEnd) { if (Picker2.IsDown) { _picker2Step = PickerSteps.S3110_REVERSE_STAGE_VACUUM_ON; } else { Picker2.Down(); } } break; } case PickerSteps.S3110_REVERSE_STAGE_VACUUM_ON: { if (equipment.after.ReverseStage.Stage1.IsWorkEnd) { if (equipment.after.ReverseStage.Stage1.VacuumSolOn) { _picker2Step = PickerSteps.S3120_VACUUM_OFF; } else { equipment.after.ReverseStage.Stage1.VacuumOn(); } } break; } case PickerSteps.S3120_VACUUM_OFF: { if (Picker2.IsWorkEnd) { if (Picker2.VacuumSolOn == false) { _picker2Step = PickerSteps.S3130_DATA_SET; } else { Picker2.VacuumOff(); } } break; } case PickerSteps.S3130_DATA_SET: { equipment.after.ReverseStage.Panel1 = Panel2; Panel2 = new Panel_Info(); _picker2Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S4000_PLACE_TRAY_PANEL_START: { _picker2Step = PickerSteps.S4100_PICKER_DOWN; break; } case PickerSteps.S4100_PICKER_DOWN: { if (Picker2.IsWorkEnd) { if (Picker2.IsDown) { _picker2Step = PickerSteps.S4110_VACUUM_OFF; } else { Picker2.Down(); } } break; } case PickerSteps.S4110_VACUUM_OFF: { if (Picker2.IsWorkEnd) { if (Picker2.VacuumSolOn == false) { _picker2Step = PickerSteps.S9200_PICKER_UP; } else { Picker2.VacuumOff(); } } break; } case PickerSteps.S9000_SCRAP_START: { _picker2Step = PickerSteps.S9100_VACUUM_OFF; break; } case PickerSteps.S9100_VACUUM_OFF: { if (Picker2.IsWorkEnd) { if (Picker2.VacuumSolOn == false) { _picker2Step = PickerSteps.S9110_DATA_SET; } else { Picker2.VacuumOff(); } } break; } case PickerSteps.S9110_DATA_SET: { Panel2 = new Panel_Info(); _picker2Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S9200_PICKER_UP: { if (Picker2.IsWorkEnd) { if (Picker2.IsUp) { _picker2Step = PickerSteps.S9999_STEP_END; } else { Picker2.Up(); } } break; } case PickerSteps.S9999_STEP_END: { _picker2Step = PickerSteps.S0000_WAIT; break; } } } private void BCR_Read() { BCR_Data = equipment.ULD_Tray_BCR.BCR_Read(); } public bool Get_Handler_1_1_Tray_OK_Panel_Num(out int panel_num) { int row = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row; int column = 0; panel_num = 0; bool even_num; for (int i = 0; i < row; i++) { even_num = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Column % 2 == 0; if (even_num) column = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Column / 2; else column = (equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Column / 2) + 1; for (int j = 1; j <= equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Column; j++) { panel_num++; if (j <= column) { var info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ok, panel_num); if (info.Blank) { cim_row = i; cim_column = j; return true; } } } } return false; } public bool Get_Handler_1_2_Tray_OK_Panel_Num(out int panel_num) { int row = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row; int column = 0; panel_num = 0; bool even_num; for (int i = 0; i < row; i++) { even_num = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Column % 2 == 0; if (even_num) column = (equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Column / 2); else column = (equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Column / 2) + 1; for (int j = 1; j <= equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Column; j++) { panel_num++; if (even_num) { if ((j > column)) { var info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ok, panel_num); if (info.Blank) { cim_row = i; cim_column = j; return true; } } } else { if ((j >= column)) { var info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ok, panel_num); if (info.Blank) { cim_row = i; cim_column = j; return true; } } } } } return false; } public bool Get_Tray_OK_ULD_Handler_1_X_Position(int panel_num, out double position) { position = 0; int pnum = 0; if (equipment.Cur_Main_Recipe.tray_info== null) return false; int column; for (int i = 0; i < equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row; i++) { for (int j = 1; j <= equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Column; j++) { pnum++; if (pnum == panel_num) { column = j; position = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Pick_Position_X + ((column - 1) * equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Cell_Pitch_X); position = double.Parse(position.ToString("F3")); return true; } } } return false; } public bool Get_Tray_OK_ULD_Handler_1_Y_Position(int panel_num, out double position) { position = 0; int pnum = 0; if (equipment.Cur_Main_Recipe.tray_info== null) return false; for (int i = 0; i < equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row; i++) { for (int j = 1; j <= equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Column; j++) { pnum++; if (pnum == panel_num) { position = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ok_Row_Data[i].Pick_Position_Y; position = double.Parse(position.ToString("F3")); return true; } } } return false; } public bool Get_Handler_1_1_Tray_NG_Panel_Num(out int panel_num) { int row = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row; int column = 0; panel_num = 0; bool even_num; for (int i = 0; i < row; i++) { even_num = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column % 2 == 0; if (even_num) column = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column / 2; else column = (equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column / 2) + 1; for (int j = 1; j <= equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column; j++) { panel_num++; if (j <= column) { var info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, panel_num); if (info.Blank) { cim_row = i; cim_column = j; return true; } } } } return false; } public bool Get_Handler_1_2_Tray_NG_Panel_Num(out int panel_num) { int row = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row; int column = 0; panel_num = 0; bool even_num; for (int i = 0; i < row; i++) { even_num = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column % 2 == 0; if (even_num) column = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column / 2; else column = (equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column / 2) + 1; for (int j = 1; j <= equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column; j++) { panel_num++; if (even_num) { if ((j > column)) { var info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, panel_num); if (info.Blank) { cim_row = i; cim_column = j; return true; } } } else { if ((j >= column)) { var info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, panel_num); if (info.Blank) { return true; } } } } } return false; } public bool Get_Tray_NG_ULD_Handler_1_X_Position(int panel_num, out double position) { position = 0; int pnum = 0; if (equipment.Cur_Main_Recipe.tray_info== null) return false; int column; for (int i = 0; i < equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row; i++) { for (int j = 1; j <= equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column; j++) { pnum++; if (pnum == panel_num) { column = j; position = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Pick_Position_X + ((column - 1) * equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Cell_Pitch_X); position = double.Parse(position.ToString("F3")); return true; } } } return false; } public bool Get_Tray_NG_ULD_Handler_1_Y_Position(int panel_num, out double position) { position = 0; int pnum = 0; if (equipment.Cur_Main_Recipe.tray_info== null) return false; for (int i = 0; i < equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row; i++) { for (int j = 1; j <= equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column; j++) { pnum++; if (pnum == panel_num) { position = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Pick_Position_Y; position = double.Parse(position.ToString("F3")); return true; } } } return false; } public bool Get_Is_Position_X_Stay() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Stay_Position, out value); get_position = double.Parse($"{value}"); return MotorX.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } public bool Get_Is_Position_Y_Stay() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_Y_Stay_Position, out value); get_position = double.Parse($"{value}"); return MotorY.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } public bool Get_Is_Position_X_AOI() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_AOI_Stage_Position, out value); get_position = double.Parse($"{value}"); return MotorX.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } public bool Get_Is_Position_Y_AOI() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_Y_AOI_Stage_Position, out value); get_position = double.Parse($"{value}"); return MotorY.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } public bool Get_Is_Position_X_Reverse() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Reverse_Stage_Position, out value); get_position = double.Parse($"{value}"); return MotorX.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } public bool Get_Is_Position_Y_Reverse() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_Y_Reverse_Stage_Position, out value); get_position = double.Parse($"{value}"); return MotorY.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } public double Get_Position_Y_Stay() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_Y_Stay_Position, out value); get_position = double.Parse($"{value}"); return get_position; } public bool Move_X(double position) { return MotorX.Move_Absolute_Pos(position, pick_velocity); } public bool Move_Y(double position) { return MotorY.Move_Absolute_Pos(position, pick_velocity); } public bool Move_X_Stay_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Stay_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Stay_Velocity, out value); velocity = double.Parse($"{value}"); return MotorX.Move_Absolute_Pos(position, velocity); } public bool Move_Y_Stay_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_Y_Stay_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_Y_Stay_Velocity, out value); velocity = double.Parse($"{value}"); return MotorY.Move_Absolute_Pos(position, velocity); } public bool Move_X_Reverse_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Reverse_Stage_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_Reverse_Stage_Velocity, out value); velocity = double.Parse($"{value}"); return MotorX.Move_Absolute_Pos(position, velocity); } public bool Move_Y_Reverse_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_Y_Reverse_Stage_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_Y_Reverse_Stage_Velocity, out value); velocity = double.Parse($"{value}"); return MotorY.Move_Absolute_Pos(position, velocity); } public bool Move_X_AOI_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_AOI_Stage_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_X_AOI_Stage_Velocity, out value); velocity = double.Parse($"{value}"); return MotorX.Move_Absolute_Pos(position, velocity); } public bool Move_Y_AOI_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_Y_AOI_Stage_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_1_Y_AOI_Stage_Velocity, out value); velocity = double.Parse($"{value}"); return MotorY.Move_Absolute_Pos(position, velocity); } public bool Picker_1_Scrap() { if (UnitMode == En_Equipment_Mode.Auto || equipment.Auto_Mode) { Interlock_Manager.Add_Interlock_Msg("ULD_Handler_1_1 Scrap Can't Start", "Equipment mode is Auto."); return false; } _picker1Step = PickerSteps.S9000_SCRAP_START; return true; } public bool Picker_2_Scrap() { if (UnitMode == En_Equipment_Mode.Auto || equipment.Auto_Mode) { Interlock_Manager.Add_Interlock_Msg("ULD_Handler_1_2 Scrap Can't Start", "Equipment mode is Auto."); return false; } _picker2Step = PickerSteps.S9000_SCRAP_START; return true; } #endregion } }