using System; namespace SHARP_CLAS_UI { public class UnloaderHandler2 : Handler { #region Enum private enum PickerSteps { S0000_WAIT, S1000_PICK_ABLATION_STAGE_1_START, S1100_PICKER_DOWN, S1110_VACUUM_ON, S1120_ABLATION_STAGE_1_VACUUM_OFF, S1130_ABLATION_STAGE_1_BLOW_ON, S1140_PICKER_UP, S1150_ABLATION_STAGE_1_BLOW_OFF, S1160_DATA_SET, S2000_PICK_ABLATION_STAGE_2_START, S2100_PICKER_DOWN, S2110_VACUUM_ON, S2120_ABLATION_STAGE_2_VACUUM_OFF, S2130_ABLATION_STAGE_2_BLOW_ON, S2140_PICKER_UP, S2150_ABLATION_STAGE_2_BLOW_OFF, S2160_DATA_SET, S3000_PLACE_AOI_STAGE_START, S3100_PICKER_DOWN, S3110_AOI_STAGE_VACUUM_ON, S3120_VACUUM_OFF, S1330_DATA_SET, 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_2_1); } set { Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.ULD_Handler_2_1, value); } } public override Panel_Info Panel2 { get { return Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Handler_2_2); } set { Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.ULD_Handler_2_2, value); } } public override bool IsWorkEnd { get { if(Step == UnloaderHandler2Steps.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_2_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_2_Y_Stay_Position, out value); get_position = double.Parse($"{value}"); return MotorY.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } } public UnloaderHandler2Steps Step { get { return _step; } set { _step = value; } } #endregion #region Field private UnloaderHandler2Steps _step; private UnloaderHandler2Steps _oldStep; private HandlerHomeSteps _homeStep; private PickerSteps _picker1Step; private PickerSteps _picker2Step; public Time_Checker Tact_Move = new Time_Checker(); #endregion #region Construct public UnloaderHandler2(Equipment equipment) : base(equipment, MotorAxis.ULD_Handler_2_X, MotorAxis.ULD_Handler_2_Y, "UnloaderHandler2") { Step = UnloaderHandler2Steps.S0000_WAIT; _oldStep = UnloaderHandler2Steps.S0000_WAIT; Picker1.Initialize(OutputData.ULD_Handler_2_1_Down, InputData.ULD_Handler_Picker_2_1_Up_Sensor, InputData.ULD_Handler_Picker_2_1_Down_Sensor, En_Alarm_List.AL_0832_ULD_HANDLER_2_1_UP_SENSOR_CHECK, En_Alarm_List.AL_0833_ULD_HANDLER_2_1_DOWN_SENSOR_CHECK, OutputData.ULD_Cell_Handler_2_1_Vaccum_On_Sol_Valve, OutputData.ULD_Cell_Handler_2_1_Blow_On_Sol_Valve, InputData.ULD_Cell_Handler_2_1_Vaccum_On_Check, En_Alarm_List.AL_0830_ULD_HANDLER_2_1_VACUUM_ON_CHECK); Picker2.Initialize(OutputData.ULD_Handler_2_2_Down, InputData.ULD_Handler_Picker_2_2_Up_Sensor, InputData.ULD_Handler_Picker_2_2_Down_Sensor, En_Alarm_List.AL_0834_ULD_HANDLER_2_2_UP_SENSOR_CHECK, En_Alarm_List.AL_0835_ULD_HANDLER_2_2_DOWN_SENSOR_CHECK, OutputData.ULD_Cell_Handler_2_2_Vaccum_On_Sol_Valve, OutputData.ULD_Cell_Handler_2_2_Blow_On_Sol_Valve, InputData.ULD_Cell_Handler_2_2_Vaccum_On_Check, En_Alarm_List.AL_0831_ULD_HANDLER_2_2_VACUUM_ON_CHECK); pauseDisableList.Add(UnloaderHandler2Steps.S1205_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler2Steps.S2215_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler2Steps.S3220_POSITION_CHECK); pauseDisableList.Add(UnloaderHandler2Steps.S4220_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; } #endregion #region Function private bool Home_Interlock() { if (Picker1.IsUp == false || Picker2.IsUp == false) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 2 Picker Down", "Picker is Down, Can't Move."); return true; } return false; } private bool Move_Interlock() { if (Picker1.IsUp == false || Picker2.IsUp == false) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 2 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.IsUp == false || Picker2.IsUp == false) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 2 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; } public void Init_Seq() { Step = UnloaderHandler2Steps.S0000_WAIT; _homeStep = HandlerHomeSteps.S0000_WAIT; Tact_Move.Reset(); } private void ExecuteAuto() { if(Step == UnloaderHandler2Steps.S0000_WAIT) { if (equipment.process.ablation.Is_Power_Measure) return; if(IsExist) { if (equipment.after.AoiStage.IsPlaceEnable && equipment.after.ReverseStage.IsPlaceEnable) { double position = equipment.unloader.Handler1.Get_Position_Y_Stay(); if (position >= equipment.unloader.Handler1.MotorY.Position || equipment.unloader.Handler1.MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) { Step = UnloaderHandler2Steps.S4000_PLACE_AOI_STAGE_START; } else { if (IsStayPosition == false) { Step = UnloaderHandler2Steps.S1000_MOVE_STAY_POSITION_START; } } } else { if (IsStayPosition == false) { Step = UnloaderHandler2Steps.S1000_MOVE_STAY_POSITION_START; } } } else { if (equipment.process.ablation_stage_1.IsPickEnable) { Step = UnloaderHandler2Steps.S2100_ABLATION_STAGE_1_POSITION_CHECK; } else if (equipment.process.ablation_stage_2.IsPickEnable) { Step = UnloaderHandler2Steps.S3100_ABLATION_STAGE_2_POSITION_CHECK; } else { if (IsStayPosition == false) { Step = UnloaderHandler2Steps.S1000_MOVE_STAY_POSITION_START; } } } } } public override void MonitoringStatus() { if (UnitMode == En_Equipment_Mode.Auto || UnitMode == En_Equipment_Mode.Manual) { if (Picker1.IsWorkEnd) { if (Picker1.VacuumSolOn && Picker1.IsVacuumSensor == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0830_ULD_HANDLER_2_1_VACUUM_ON_CHECK); } } if (Picker2.IsWorkEnd) { if (Picker2.VacuumSolOn && Picker2.IsVacuumSensor == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0831_ULD_HANDLER_2_2_VACUUM_ON_CHECK); } } } 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(); 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_PickAblation1(); Seq_PickAblation2(); Seq_PlaceAoiStage(); } } private 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_0421_ULD_HANDLER_2_X_ERROR_STOP); } else if (MotorY.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0441_ULD_HANDLER_2_Y_ERROR_STOP); } else if (!MotorX.PowerOn) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0420_ULD_HANDLER_2_X_POWER_OFF); } else if (!MotorY.PowerOn) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0440_ULD_HANDLER_2_Y_POWER_OFF); } else if (Picker1.IsUp == false) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 2 Home can't run.", "ULD Handler Picker 2-1 Up."); } else if (Picker2.IsUp == false) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 2 Home can't run.", "ULD Handler Picker 2-2 Up."); } else { _homeStep = HandlerHomeSteps.S1100_TRAY_TRANSFER_HOME_CHECK; } break; } case HandlerHomeSteps.S1100_TRAY_TRANSFER_HOME_CHECK: { _homeStep = HandlerHomeSteps.S1200_TRAY_TRANSFER_POSITION_CHECK; break; } case HandlerHomeSteps.S1200_TRAY_TRANSFER_POSITION_CHECK: { _homeStep = HandlerHomeSteps.S1300_MOTOR_Y_HOME; 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_0441_ULD_HANDLER_2_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_0421_ULD_HANDLER_2_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_0421_ULD_HANDLER_2_X_ERROR_STOP); } if (MotorY.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0441_ULD_HANDLER_2_Y_ERROR_STOP); } } else if (MotorX.MotionComplete && MotorY.MotionComplete) { if (IsMotorXStayPosition && IsMotorYStayPosition) { _homeStep = HandlerHomeSteps.S1999_END; } else { if (!IsMotorXStayPosition) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 2 Home can't run.", "X Position is not stay."); } if (!IsMotorYStayPosition) { Interlock_Manager.Add_Interlock_Msg("ULD Handler 2 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 UnloaderHandler2Steps.S1000_MOVE_STAY_POSITION_START: { Step = UnloaderHandler2Steps.S1100_PICKER_UP; break; } case UnloaderHandler2Steps.S1100_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { Step = UnloaderHandler2Steps.S1200_MOVE_STAY_POSITION; } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler2Steps.S1200_MOVE_STAY_POSITION: { if (Move_X_Stay_Position() && Move_Y_Stay_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 2, Stay Position [Start]"); Step = UnloaderHandler2Steps.S1205_POSITION_CHECK; } break; } case UnloaderHandler2Steps.S1205_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (IsMotorXStayPosition && IsMotorYStayPosition) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 2, Stay Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 2, Stay Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler2Steps.S1999_MOVE_STAY_POSITION_END; } else { Step = UnloaderHandler2Steps.S1200_MOVE_STAY_POSITION; } } break; } case UnloaderHandler2Steps.S1999_MOVE_STAY_POSITION_END: { Step = UnloaderHandler2Steps.S0000_WAIT; break; } } } private void Seq_PickAblation1() { switch(Step) { case UnloaderHandler2Steps.S2000_PICK_ABLATION_STAGE_1_START: { Step = UnloaderHandler2Steps.S2100_ABLATION_STAGE_1_POSITION_CHECK; break; } case UnloaderHandler2Steps.S2100_ABLATION_STAGE_1_POSITION_CHECK: { if(equipment.process.ablation_stage_1.IsUnloadPosition) { Step = UnloaderHandler2Steps.S2200_PICKER_UP; } break; } case UnloaderHandler2Steps.S2200_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { Step = UnloaderHandler2Steps.S2210_MOVE_ABLATION_STAGE_1; } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler2Steps.S2210_MOVE_ABLATION_STAGE_1: { if(Move_X_Ablation_Stage_1_Position() && Move_Y_Ablation_Stage_1_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 1 Position [Start]"); Step = UnloaderHandler2Steps.S2215_POSITION_CHECK; } break; } case UnloaderHandler2Steps.S2215_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (Get_Is_Position_X_Ablation_1() && Get_Is_Position_Y_Ablation_1()) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 1 Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 1 Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler2Steps.S2220_PLACE_START; } else { Step = UnloaderHandler2Steps.S2210_MOVE_ABLATION_STAGE_1; } } break; } case UnloaderHandler2Steps.S2220_PLACE_START: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 1 Pick [Start]"); if (equipment.process.ablation_stage_1.Stage1.IsExist) { _picker1Step = PickerSteps.S1000_PICK_ABLATION_STAGE_1_START; } if (equipment.process.ablation_stage_1.Stage2.IsExist) { _picker2Step = PickerSteps.S1000_PICK_ABLATION_STAGE_1_START; } Step = UnloaderHandler2Steps.S2225_PLACE_WAIT; break; } case UnloaderHandler2Steps.S2225_PLACE_WAIT: { if(_picker1Step == PickerSteps.S0000_WAIT && _picker2Step == PickerSteps.S0000_WAIT) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 1 Pick [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 1 Pick [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler2Steps.S2999_PICK_ABLATION_STAGE_1_END; } break; } case UnloaderHandler2Steps.S2999_PICK_ABLATION_STAGE_1_END: { Step = UnloaderHandler2Steps.S0000_WAIT; break; } } } private void Seq_PickAblation2() { switch (Step) { case UnloaderHandler2Steps.S3000_PICK_ABLATION_STAGE_2_START: { Step = UnloaderHandler2Steps.S3100_ABLATION_STAGE_2_POSITION_CHECK; break; } case UnloaderHandler2Steps.S3100_ABLATION_STAGE_2_POSITION_CHECK: { if (equipment.process.ablation_stage_2.IsUnloadPosition) { Step = UnloaderHandler2Steps.S3230_PICKER_UP; } break; } case UnloaderHandler2Steps.S3230_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { Step = UnloaderHandler2Steps.S3200_MOVE_ABLATION_STAGE_2; } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler2Steps.S3200_MOVE_ABLATION_STAGE_2: { if (Move_X_Ablation_Stage_2_Position() && Move_Y_Ablation_Stage_2_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 2 Position [Start]"); Step = UnloaderHandler2Steps.S3220_POSITION_CHECK; } break; } case UnloaderHandler2Steps.S3220_POSITION_CHECK: { if (MotorX.MotionComplete && MotorY.MotionComplete) { if (Get_Is_Position_X_Ablation_2() && Get_Is_Position_Y_Ablation_2()) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 2 Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 2 Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler2Steps.S3300_PLACE_START; } else { Step = UnloaderHandler2Steps.S3200_MOVE_ABLATION_STAGE_2; } } break; } case UnloaderHandler2Steps.S3300_PLACE_START: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 2 Pick [Start]"); if (equipment.process.ablation_stage_2.Stage1.IsExist) { _picker1Step = PickerSteps.S2000_PICK_ABLATION_STAGE_2_START; } if (equipment.process.ablation_stage_2.Stage2.IsExist) { _picker2Step = PickerSteps.S2000_PICK_ABLATION_STAGE_2_START; } Step = UnloaderHandler2Steps.S3310_PLACE_WAIT; break; } case UnloaderHandler2Steps.S3310_PLACE_WAIT: { if (_picker1Step == PickerSteps.S0000_WAIT && _picker2Step == PickerSteps.S0000_WAIT) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 2 Pick [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 2, Ablation 2 Pick [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler2Steps.S3999_PICK_ABLATION_STAGE_2_END; } break; } case UnloaderHandler2Steps.S3999_PICK_ABLATION_STAGE_2_END: { Step = UnloaderHandler2Steps.S0000_WAIT; break; } } } private void Seq_PlaceAoiStage() { switch(Step) { case UnloaderHandler2Steps.S4000_PLACE_AOI_STAGE_START: { Step = UnloaderHandler2Steps.S4100_ULD_HANDLER_1_POSITION_CHECK; break; } case UnloaderHandler2Steps.S4100_ULD_HANDLER_1_POSITION_CHECK: { double position = equipment.unloader.Handler1.Get_Position_Y_Stay(); if (position >= equipment.unloader.Handler1.MotorY.Position || equipment.unloader.Handler1.MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) { Step = UnloaderHandler2Steps.S4110_ULD_REVERSE_STAGE_POSITION_CHECK; } break; } case UnloaderHandler2Steps.S4110_ULD_REVERSE_STAGE_POSITION_CHECK: { if (equipment.after.ReverseStage.IsStayPosition) { Step = UnloaderHandler2Steps.S4220_PICKER_UP; } break; } case UnloaderHandler2Steps.S4220_PICKER_UP: { if (Picker1.IsWorkEnd && Picker2.IsWorkEnd) { if (Picker1.IsUp && Picker2.IsUp) { Step = UnloaderHandler2Steps.S4200_MOVE_AOI_STAGE; } else { if (Picker1.IsUp == false) { Picker1.Up(); } if (Picker2.IsUp == false) { Picker2.Up(); } } } break; } case UnloaderHandler2Steps.S4200_MOVE_AOI_STAGE: { if (Move_X_AOI_Position() && Move_Y_AOI_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 2, AOI Stage Position [Start]"); Step = UnloaderHandler2Steps.S4220_POSITION_CHECK; } break; } case UnloaderHandler2Steps.S4220_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 2, AOI Stage Position [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 2, AOI Stage Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler2Steps.S4300_PLACE_START; } else { Step = UnloaderHandler2Steps.S4200_MOVE_AOI_STAGE; } } break; } case UnloaderHandler2Steps.S4300_PLACE_START: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"ULD Handler 2, AOI Stage Place [Start]"); if (Picker1.IsExist) { _picker1Step = PickerSteps.S3000_PLACE_AOI_STAGE_START; } if (Picker2.IsExist) { _picker2Step = PickerSteps.S3000_PLACE_AOI_STAGE_START; } Step = UnloaderHandler2Steps.S4310_PLACE_WAIT; break; } case UnloaderHandler2Steps.S4310_PLACE_WAIT: { if (_picker1Step == PickerSteps.S0000_WAIT && _picker2Step == PickerSteps.S0000_WAIT) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"ULD Handler 2, AOI Stage Place [End]"); equipment.Write_Tact_Time_Log($"ULD Handler 2, AOI Stage Place [Tact : {Tact_Move.Seconds} (sec)]"); Step = UnloaderHandler2Steps.S4999_PLACE_AOI_STAGE_END; } break; } case UnloaderHandler2Steps.S4999_PLACE_AOI_STAGE_END: { Step = UnloaderHandler2Steps.S0000_WAIT; break; } } } private void Seq_Picker1Step() { switch(_picker1Step) { case PickerSteps.S1000_PICK_ABLATION_STAGE_1_START: { _picker1Step = PickerSteps.S1100_PICKER_DOWN; break; } case PickerSteps.S1100_PICKER_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_ABLATION_STAGE_1_VACUUM_OFF; } else { Picker1.VacuumOn(); } } break; } case PickerSteps.S1120_ABLATION_STAGE_1_VACUUM_OFF: { if (equipment.process.ablation_stage_1.Stage1.IsWorkEnd) { if (equipment.process.ablation_stage_1.Stage1.VacuumSol1On == false && equipment.process.ablation_stage_1.Stage1.VacuumSol2On == false) { _picker1Step = PickerSteps.S1130_ABLATION_STAGE_1_BLOW_ON; } else { equipment.process.ablation_stage_1.Stage1.VacuumOff(); } } break; } case PickerSteps.S1130_ABLATION_STAGE_1_BLOW_ON: { if (equipment.process.ablation_stage_1.Stage1.IsWorkEnd) { if (equipment.process.ablation_stage_1.Stage1.BlowSol1On == true && equipment.process.ablation_stage_1.Stage1.BlowSol1On == true) { picker1Timer.Restart(); _picker1Step = PickerSteps.S1140_PICKER_UP; } else { equipment.process.ablation_stage_1.Stage1.BlowSol1On = true; equipment.process.ablation_stage_1.Stage1.BlowSol2On = true; } } break; } case PickerSteps.S1140_PICKER_UP: { if (picker1Timer.Seconds < pickerUpWaitTime) { return; } if (Picker1.IsWorkEnd) { if (Picker1.IsUp) { _picker1Step = PickerSteps.S1150_ABLATION_STAGE_1_BLOW_OFF; } else { Picker1.Up(); } } break; } case PickerSteps.S1150_ABLATION_STAGE_1_BLOW_OFF: { if (equipment.process.ablation_stage_1.Stage1.IsWorkEnd) { if (equipment.process.ablation_stage_1.Stage1.BlowSol1On == false && equipment.process.ablation_stage_1.Stage1.BlowSol2On == false) { _picker1Step = PickerSteps.S1160_DATA_SET; } else { equipment.process.ablation_stage_1.Stage1.BlowSol1On = false; equipment.process.ablation_stage_1.Stage1.BlowSol2On = false; } } break; } case PickerSteps.S1160_DATA_SET: { Panel1 = equipment.process.ablation_stage_1.Panel1; equipment.process.ablation_stage_1.Panel1 = new Panel_Info(); _picker1Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S2000_PICK_ABLATION_STAGE_2_START: { _picker1Step = PickerSteps.S2100_PICKER_DOWN; break; } case PickerSteps.S2100_PICKER_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_ABLATION_STAGE_2_VACUUM_OFF; } else { Picker1.VacuumOn(); } } break; } case PickerSteps.S2120_ABLATION_STAGE_2_VACUUM_OFF: { if (equipment.process.ablation_stage_2.Stage1.IsWorkEnd) { if (equipment.process.ablation_stage_2.Stage1.IsVacuum1Sensor == false && equipment.process.ablation_stage_2.Stage1.IsVacuum2Sensor == false) { _picker1Step = PickerSteps.S2130_ABLATION_STAGE_2_BLOW_ON; } else { equipment.process.ablation_stage_2.Stage1.VacuumOff(); } } break; } case PickerSteps.S2130_ABLATION_STAGE_2_BLOW_ON: { if (equipment.process.ablation_stage_2.Stage1.IsWorkEnd) { if (equipment.process.ablation_stage_2.Stage1.BlowSol1On == true && equipment.process.ablation_stage_2.Stage1.BlowSol2On == true) { picker1Timer.Restart(); _picker1Step = PickerSteps.S2140_PICKER_UP; } else { equipment.process.ablation_stage_2.Stage1.BlowSol1On = true; equipment.process.ablation_stage_2.Stage1.BlowSol2On = true; } } break; } case PickerSteps.S2140_PICKER_UP: { if (picker1Timer.Seconds < pickerUpWaitTime) { return; } if (Picker1.IsWorkEnd) { if (Picker1.IsUp) { _picker1Step = PickerSteps.S2150_ABLATION_STAGE_2_BLOW_OFF; } else { Picker1.Up(); } } break; } case PickerSteps.S2150_ABLATION_STAGE_2_BLOW_OFF: { if (equipment.process.ablation_stage_2.Stage1.IsWorkEnd) { if (equipment.process.ablation_stage_2.Stage1.BlowSol1On == false && equipment.process.ablation_stage_2.Stage1.BlowSol2On == false) { _picker1Step = PickerSteps.S2160_DATA_SET; } else { equipment.process.ablation_stage_2.Stage1.BlowSol1On = false; equipment.process.ablation_stage_2.Stage1.BlowSol2On = false; } } break; } case PickerSteps.S2160_DATA_SET: { Panel1 = equipment.process.ablation_stage_2.Panel1; equipment.process.ablation_stage_2.Panel1 = new Panel_Info(); _picker1Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S3000_PLACE_AOI_STAGE_START: { _picker1Step = PickerSteps.S3100_PICKER_DOWN; break; } case PickerSteps.S3100_PICKER_DOWN: { if (Picker1.IsWorkEnd) { if (Picker1.IsDown) { _picker1Step = PickerSteps.S3110_AOI_STAGE_VACUUM_ON; } else { Picker1.Down(); } } break; } case PickerSteps.S3110_AOI_STAGE_VACUUM_ON: { if (equipment.after.AoiStage.Stage1.IsWorkEnd) { if (equipment.after.AoiStage.Stage1.VacuumSolOn) { _picker1Step = PickerSteps.S3120_VACUUM_OFF; } else { equipment.after.AoiStage.Stage1.VacuumOn(); } } break; } case PickerSteps.S3120_VACUUM_OFF: { if (Picker1.IsWorkEnd) { if (Picker1.VacuumSolOn == false) { _picker1Step = PickerSteps.S1330_DATA_SET; } else { Picker1.VacuumOff(); } } break; } case PickerSteps.S1330_DATA_SET: { equipment.after.AoiStage.Panel1 = Panel1; Panel1 = new Panel_Info(); _picker1Step = PickerSteps.S9200_PICKER_UP; 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_ABLATION_STAGE_1_START: { _picker2Step = PickerSteps.S1100_PICKER_DOWN; break; } case PickerSteps.S1100_PICKER_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_ABLATION_STAGE_1_VACUUM_OFF; } else { Picker2.VacuumOn(); } } break; } case PickerSteps.S1120_ABLATION_STAGE_1_VACUUM_OFF: { if (equipment.process.ablation_stage_1.Stage2.IsWorkEnd) { if (equipment.process.ablation_stage_1.Stage2.VacuumSol1On == false && equipment.process.ablation_stage_1.Stage2.VacuumSol2On == false) { picker2Timer.Restart(); _picker2Step = PickerSteps.S1130_ABLATION_STAGE_1_BLOW_ON; } else { equipment.process.ablation_stage_1.Stage2.VacuumOff(); } } break; } case PickerSteps.S1130_ABLATION_STAGE_1_BLOW_ON: { if (picker2Timer.Seconds < pickerUpWaitTime) { return; } if (equipment.process.ablation_stage_1.Stage2.IsWorkEnd) { if (equipment.process.ablation_stage_1.Stage2.BlowSol1On == true && equipment.process.ablation_stage_1.Stage2.BlowSol2On == true) { picker2Timer.Restart(); _picker2Step = PickerSteps.S1140_PICKER_UP; } else { equipment.process.ablation_stage_1.Stage2.BlowSol1On = true; equipment.process.ablation_stage_1.Stage2.BlowSol2On = true; } } break; } case PickerSteps.S1140_PICKER_UP: { if (picker2Timer.Seconds < pickerUpWaitTime) { return; } if (Picker2.IsWorkEnd) { if (Picker2.IsUp) { _picker2Step = PickerSteps.S1150_ABLATION_STAGE_1_BLOW_OFF; } else { Picker2.Up(); } } break; } case PickerSteps.S1150_ABLATION_STAGE_1_BLOW_OFF: { if (equipment.process.ablation_stage_1.Stage2.IsWorkEnd) { if (equipment.process.ablation_stage_1.Stage2.BlowSol1On == false && equipment.process.ablation_stage_1.Stage2.BlowSol2On == false) { _picker2Step = PickerSteps.S1160_DATA_SET; } else { equipment.process.ablation_stage_1.Stage2.BlowSol1On = false; equipment.process.ablation_stage_1.Stage2.BlowSol2On = false; } } break; } case PickerSteps.S1160_DATA_SET: { Panel2 = equipment.process.ablation_stage_1.Panel2; equipment.process.ablation_stage_1.Panel2 = new Panel_Info(); _picker2Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S2000_PICK_ABLATION_STAGE_2_START: { _picker2Step = PickerSteps.S2100_PICKER_DOWN; break; } case PickerSteps.S2100_PICKER_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_ABLATION_STAGE_2_VACUUM_OFF; } else { Picker2.VacuumOn(); } } break; } case PickerSteps.S2120_ABLATION_STAGE_2_VACUUM_OFF: { if (equipment.process.ablation_stage_2.Stage2.IsWorkEnd) { if (equipment.process.ablation_stage_2.Stage2.VacuumSol1On == false && equipment.process.ablation_stage_2.Stage2.VacuumSol2On == false) { _picker2Step = PickerSteps.S2130_ABLATION_STAGE_2_BLOW_ON; } else { equipment.process.ablation_stage_2.Stage2.VacuumOff(); } } break; } case PickerSteps.S2130_ABLATION_STAGE_2_BLOW_ON: { if (equipment.process.ablation_stage_2.Stage2.IsWorkEnd) { if (equipment.process.ablation_stage_2.Stage2.BlowSol1On == true && equipment.process.ablation_stage_2.Stage2.BlowSol2On == true) { picker2Timer.Restart(); _picker2Step = PickerSteps.S2140_PICKER_UP; } else { equipment.process.ablation_stage_2.Stage2.BlowSol1On = true; equipment.process.ablation_stage_2.Stage2.BlowSol2On = true; } } break; } case PickerSteps.S2140_PICKER_UP: { if (picker2Timer.Seconds < pickerUpWaitTime) { return; } if (Picker2.IsWorkEnd) { if (Picker2.IsUp) { _picker2Step = PickerSteps.S2150_ABLATION_STAGE_2_BLOW_OFF; } else { Picker2.Up(); } } break; } case PickerSteps.S2150_ABLATION_STAGE_2_BLOW_OFF: { if (equipment.process.ablation_stage_2.Stage2.IsWorkEnd) { if (equipment.process.ablation_stage_2.Stage2.BlowSol1On == false && equipment.process.ablation_stage_2.Stage2.BlowSol2On == false) { _picker2Step = PickerSteps.S2160_DATA_SET; } else { equipment.process.ablation_stage_2.Stage2.BlowSol1On = false; equipment.process.ablation_stage_2.Stage2.BlowSol2On = false; } } break; } case PickerSteps.S2160_DATA_SET: { Panel2 = equipment.process.ablation_stage_2.Panel2; equipment.process.ablation_stage_2.Panel2 = new Panel_Info(); _picker2Step = PickerSteps.S9200_PICKER_UP; break; } case PickerSteps.S3000_PLACE_AOI_STAGE_START: { _picker2Step = PickerSteps.S3100_PICKER_DOWN; break; } case PickerSteps.S3100_PICKER_DOWN: { if (Picker2.IsWorkEnd) { if (Picker2.IsDown) { _picker2Step = PickerSteps.S3110_AOI_STAGE_VACUUM_ON; } else { Picker2.Down(); } } break; } case PickerSteps.S3110_AOI_STAGE_VACUUM_ON: { if (equipment.after.AoiStage.Stage2.IsWorkEnd) { if (equipment.after.AoiStage.Stage2.VacuumSolOn) { _picker2Step = PickerSteps.S3120_VACUUM_OFF; } else { equipment.after.AoiStage.Stage2.VacuumOn(); } } break; } case PickerSteps.S3120_VACUUM_OFF: { if (Picker2.IsWorkEnd) { if (Picker2.VacuumSolOn == false) { _picker2Step = PickerSteps.S1330_DATA_SET; } else { Picker2.VacuumOff(); } } break; } case PickerSteps.S1330_DATA_SET: { equipment.after.AoiStage.Panel2 = Panel2; Panel2 = new Panel_Info(); _picker2Step = PickerSteps.S9200_PICKER_UP; 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; } } } public bool Get_Is_Position_X_AOI() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_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_2_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_Ablation_1() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_X_Ablation_Stage_1_Position, out value); get_position = double.Parse($"{value}"); return MotorX.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } public bool Get_Is_Position_Y_Ablation_1() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_Y_Ablation_Stage_1_Position, out value); get_position = double.Parse($"{value}"); return MotorY.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } public bool Get_Is_Position_X_Ablation_2() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_X_Ablation_Stage_2_Position, out value); get_position = double.Parse($"{value}"); return MotorX.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } public bool Get_Is_Position_Y_Ablation_2() { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_Y_Ablation_Stage_2_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_2_Y_Stay_Position, out value); get_position = double.Parse($"{value}"); return get_position; } public bool Move_X_Stay_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_X_Stay_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_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_2_Y_Stay_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_Y_Stay_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_2_X_AOI_Stage_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_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_2_Y_AOI_Stage_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_Y_AOI_Stage_Velocity, out value); velocity = double.Parse($"{value}"); return MotorY.Move_Absolute_Pos(position, velocity); } public bool Move_X_Ablation_Stage_1_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_X_Ablation_Stage_1_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_X_Ablation_Stage_1_Velocity, out value); velocity = double.Parse($"{value}"); return MotorX.Move_Absolute_Pos(position, velocity); } public bool Move_Y_Ablation_Stage_1_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_Y_Ablation_Stage_1_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_Y_Ablation_Stage_1_Velocity, out value); velocity = double.Parse($"{value}"); return MotorY.Move_Absolute_Pos(position, velocity); } public bool Move_X_Ablation_Stage_2_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_X_Ablation_Stage_2_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_X_Ablation_Stage_2_Velocity, out value); velocity = double.Parse($"{value}"); return MotorX.Move_Absolute_Pos(position, velocity); } public bool Move_Y_Ablation_Stage_2_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_Y_Ablation_Stage_2_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Handler_2_Y_Ablation_Stage_2_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_2_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_2_2 Scrap Can't Start", "Equipment mode is Auto."); return false; } _picker2Step = PickerSteps.S9000_SCRAP_START; return true; } #endregion } }