using System; using System.Collections.Generic; using System.Windows.Forms; namespace SHARP_CLAS_UI { public class AblationStage2 : AblationStage { #region Enum private enum StageSteps { S0000_WAIT, S9000_SCRAP_START, S9100_VACUUM_OFF, S9110_DATA_SET, S9999_SCRAP_END, } #endregion #region Property public bool IsPickEnable { get { if (IsExist && Step == AblationStageSteps.S6200_PANEL_EMPTY_CHECK) { return true; } else { return false; } } } public bool IsPlaceEnable { get { if (IsExist == false && Step == AblationStageSteps.S1200_PANEL_EXIST_CHECK) { return true; } else { return false; } } } public override Panel_Info Panel1 { get { return Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.Ablation_2_1); } set { Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.Ablation_2_1, value); } } public override Panel_Info Panel2 { get { return Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.Ablation_2_2); } set { Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.Ablation_2_2, value); } } public override bool IsStayPosition { get { object value; double get_position; equipment.sm.Get_Value(Position_Parameter_Address.Ablation_Stage_2_Y_Load_Position, out value); get_position = double.Parse($"{value}"); return MotorY.Is_Inposition(get_position, equipment.Setting.Inposition_Offset); } } public bool IsUnloadPosition { get { object value; equipment.sm.Get_Value(Position_Parameter_Address.Ablation_Stage_2_Y_Unload_Position, out value); var position = double.Parse($"{value}"); return MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset); } } public override bool IsWorkEnd { get { if (Step == AblationStageSteps.S0000_WAIT) { return true; } else { return false; } } } public AblationStageSteps Step { get { return _step; } set { _step = value; } } #endregion #region Field private Timer tmrUi = new Timer(); public Time_Checker Tact_Move = new Time_Checker(); private Form_User_Command_Set _fineAlignUserCommand; private AblationStageSteps _step; private AblationStageSteps _oldStep; private AblationStageHomeSteps _homeStep; private StageSteps _stage1Step; private StageSteps _stage2Step; private int _fineAlignRetryCount; private bool _fineAlignCommandShowBit; #endregion #region Construct public AblationStage2(Equipment equipment) : base(equipment, MotorAxis.Ablation_Y_2, "Ablation_Stage_2") { Step = AblationStageSteps.S0000_WAIT; _oldStep = AblationStageSteps.S0000_WAIT; Stage1.Initialize(OutputData.Ablation_Stage_3_1_Vaccum_On_Sol_Valve, OutputData.Ablation_Stage_3_2_Vaccum_On_Sol_Valve, OutputData.Ablation_Stage_3_1_Blow_On_Sol_Valve, OutputData.Ablation_Stage_3_2_Blow_On_Sol_Valve, InputData.Ablation_Stage_3_1_Vaccum_On_Check, InputData.Ablation_Stage_3_2_Vaccum_On_Check, En_Alarm_List.AL_0684_ABLATION_STAGE_3_1_VACUUM_ON_CHECK, En_Alarm_List.AL_0685_ABLATION_STAGE_3_2_VACUUM_ON_CHECK); Stage2.Initialize(OutputData.Ablation_Stage_4_1_Vaccum_On_Sol_Valve, OutputData.Ablation_Stage_4_2_Vaccum_On_Sol_Valve, OutputData.Ablation_Stage_4_1_Blow_On_Sol_Valve, OutputData.Ablation_Stage_4_2_Blow_On_Sol_Valve, InputData.Ablation_Stage_4_1_Vaccum_On_Check, InputData.Ablation_Stage_4_2_Vaccum_On_Check, En_Alarm_List.AL_0686_ABLATION_STAGE_4_1_VACUUM_ON_CHECK, En_Alarm_List.AL_0687_ABLATION_STAGE_4_2_VACUUM_ON_CHECK); pauseDisableList.Add(AblationStageSteps.S1105_POSITION_CHECK); pauseDisableList.Add(AblationStageSteps.S2105_POSITION_CHECK); pauseDisableList.Add(AblationStageSteps.S3105_POSITION_CHECK); pauseDisableList.Add(AblationStageSteps.S3205_POSITION_CHECK); pauseDisableList.Add(AblationStageSteps.S4105_POSITION_CHECK); pauseDisableList.Add(AblationStageSteps.S4205_POSITION_CHECK); pauseDisableList.Add(AblationStageSteps.S5105_POSITION_CHECK); pauseDisableList.Add(AblationStageSteps.S5205_POSITION_CHECK); pauseDisableList.Add(AblationStageSteps.S6105_POSITION_CHECK); MotorY.Check_Jog_Interlock = Jog_Interlock; MotorY.Check_Move_Interlock = Move_Interlock; tmrUi.Tick += TmrUi_Tick; tmrUi.Interval = 5000; tmrUi.Start(); } #endregion #region Function private bool Move_Interlock() { if (equipment.User.Level != En_User_Level.Master && equipment.Door_Opened) { return true; } return false; } private bool Jog_Interlock(bool positive) { if (equipment.User.Level != En_User_Level.Master && equipment.Door_Opened) { return true; } return false; } private void TmrUi_Tick(object sender, EventArgs e) { if (_fineAlignCommandShowBit && _fineAlignUserCommand != null) { _fineAlignUserCommand.Show(); _fineAlignCommandShowBit = false; } } public void Init_Seq() { Step = AblationStageSteps.S0000_WAIT; _homeStep = AblationStageHomeSteps.S0000_WAIT; Tact_Move.Reset(); } public void ExecuteAuto() { if (Step == AblationStageSteps.S0000_WAIT) { if (IsExist) { if (equipment.Mode.Cell_Id_Bcr_Skip == false && ((Stage1.IsExist && Panel1.IsPanelIdReadWorked == false) || (Stage2.IsExist && Panel2.IsPanelIdReadWorked == false))) { Step = AblationStageSteps.S2000_PANEL_ID_READ_START; } else if (equipment.Mode.Fine_Align_Skip == false && ((Stage1.IsExist && Panel1.Fine_Align_Ack == false) || (Stage2.IsExist && Panel2.Fine_Align_Ack == false))) { Step = AblationStageSteps.S3000_FINE_ALIGN_START; } else if (equipment.Mode.Ablation_Skip == false && ((Stage1.IsExist && Panel1.IsAblationWorked == false && Panel1.Ablation_Run == true) || (Stage2.IsExist && Panel2.IsAblationWorked == false && Panel2.Ablation_Run == true))) { Step = AblationStageSteps.S4000_ABLATION_START; } else if (equipment.Mode.Plasma_Skip == false && ((Stage1.IsExist && Panel1.IsPlasmaWorked == false && Panel1.Ablation_Run == true) || (Stage2.IsExist && Panel2.IsPlasmaWorked == false && Panel2.Ablation_Run == true))) { Step = AblationStageSteps.S5000_PLASMA_START; } else { Step = AblationStageSteps.S6000_PANEL_UNLOAD_START; } } else { Step = AblationStageSteps.S1000_PANEL_LOAD_START; } } } public override void MonitoringStatus() { if (UnitMode == En_Equipment_Mode.Auto || UnitMode == En_Equipment_Mode.Manual) { if (Stage1.IsWorkEnd) { if (Stage1.VacuumSol1On && Stage1.IsVacuum1Sensor == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0684_ABLATION_STAGE_3_1_VACUUM_ON_CHECK); } if (Stage1.VacuumSol2On && Stage1.IsVacuum2Sensor == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0685_ABLATION_STAGE_3_2_VACUUM_ON_CHECK); } } if (Stage2.IsWorkEnd) { if (Stage2.VacuumSol1On && Stage2.IsVacuum1Sensor == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0686_ABLATION_STAGE_4_1_VACUUM_ON_CHECK); } if (Stage2.VacuumSol2On && Stage2.IsVacuum2Sensor == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0687_ABLATION_STAGE_4_2_VACUUM_ON_CHECK); } } } if (equipment.User.Level != En_User_Level.Master && equipment.Door_Opened) { if (MotorY.MotionComplete == false) { MotorY.Move_Stop(); } } } public override void ExecuteStep() { if (_oldStep != Step) { sequenceChangedTime.Restart(); _oldStep = Step; WriteSequenceLog(Step.ToString()); } Stage1.ExecuteProcess(); Stage2.ExecuteProcess(); Seq_Stage1Step(); Seq_Stage2Step(); if (UnitMode == En_Equipment_Mode.Stop) { Init_Seq(); equipment.process.TactTime2.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_Load(); Seq_PanelIdRead(); Seq_FineAlign(); Seq_Ablation(); Seq_Plasma(); Seq_Unload(); } } private void ExecuteHome() { switch (_homeStep) { case AblationStageHomeSteps.S0000_WAIT: { _homeStep = AblationStageHomeSteps.S1000_STATUS_CHECK; break; } case AblationStageHomeSteps.S1000_STATUS_CHECK: { if (MotorY.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0301_ABLATION_Y_2_ERROR_STOP); } else if (!MotorY.PowerOn) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0300_ABLATION_Y_2_POWER_OFF); } else { _homeStep = AblationStageHomeSteps.S2000_Y_HOME_START; } break; } case AblationStageHomeSteps.S2000_Y_HOME_START: { if (MotorY.Home()) { homeCheckedTime.Restart(); _homeStep = AblationStageHomeSteps.S2100_Y_HOME_CHECK; } break; } case AblationStageHomeSteps.S2100_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_0301_ABLATION_Y_2_ERROR_STOP); } } else { _homeStep = AblationStageHomeSteps.S3000_MOVE_LOAD_POSITION; } break; } case AblationStageHomeSteps.S3000_MOVE_LOAD_POSITION: { if (Move_Y_Load_Position()) { homeCheckedTime.Restart(); _homeStep = AblationStageHomeSteps.S3100_POSITION_CHECK; } break; } case AblationStageHomeSteps.S3100_POSITION_CHECK: { if (homeCheckedTime.Seconds < 1) return; if (MotorY.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0301_ABLATION_Y_2_ERROR_STOP); } else if (MotorY.MotionComplete) { if (IsStayPosition) { _homeStep = AblationStageHomeSteps.S9999_END; } else { Interlock_Manager.Add_Interlock_Msg("Ablation Stage 2 Home can't run.", "Ablation Stage Y 2 is not load position."); } } break; } case AblationStageHomeSteps.S9999_END: { isHomeComplete = true; _homeStep = AblationStageHomeSteps.S0000_WAIT; break; } } } private void Seq_Load() { switch (Step) { case AblationStageSteps.S1000_PANEL_LOAD_START: { Step = AblationStageSteps.S1100_MOVE_STAY_POSITION; break; } case AblationStageSteps.S1100_MOVE_STAY_POSITION: { if (Move_Y_Load_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Loading Position [Start]"); Step = AblationStageSteps.S1105_POSITION_CHECK; } break; } case AblationStageSteps.S1105_POSITION_CHECK: { if (MotorY.MotionComplete) { if (IsStayPosition) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Loading Position [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Loading Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S1200_PANEL_EXIST_CHECK; } else { Step = AblationStageSteps.S1100_MOVE_STAY_POSITION; } } break; } case AblationStageSteps.S1200_PANEL_EXIST_CHECK: { if (IsExist && equipment.before.Handler2.Picker1.IsUp && equipment.before.Handler2.Picker2.IsUp) { equipment.process.TactTime2.Restart(); Step = AblationStageSteps.S1999_PANEL_LOAD_END; } break; } case AblationStageSteps.S1999_PANEL_LOAD_END: { Tact_Move.Stop(); Step = AblationStageSteps.S0000_WAIT; break; } } } private void Seq_PanelIdRead() { switch (Step) { case AblationStageSteps.S2000_PANEL_ID_READ_START: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Panel ID Position [Start]"); Step = AblationStageSteps.S2100_MOVE_STAGE_BCR_POSITION; break; } case AblationStageSteps.S2100_MOVE_STAGE_BCR_POSITION: { if (MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Ablation_MCR_2_Y, 500)) { Step = AblationStageSteps.S2105_POSITION_CHECK; } break; } case AblationStageSteps.S2105_POSITION_CHECK: { if (MotorY.MotionComplete) { if (MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Ablation_MCR_2_Y, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Panel ID Position [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Panel ID Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S2100_FINE_ALIGN_STATUS_CHECK; } else { Step = AblationStageSteps.S2100_MOVE_STAGE_BCR_POSITION; } } break; } case AblationStageSteps.S2100_FINE_ALIGN_STATUS_CHECK: { if (AblationStageSteps.S2100_FINE_ALIGN_STATUS_CHECK < equipment.process.ablation_stage_1.Step && equipment.process.ablation_stage_1.Step <= AblationStageSteps.S3999_FINE_ALIGN_END) { } else { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Panel ID Reading [Start]"); Step = AblationStageSteps.S2300_READ_BCR_START; } break; } case AblationStageSteps.S2300_READ_BCR_START: { if (equipment.process.fine_align.Stage2PanelIdReadStart()) { Step = AblationStageSteps.S2310_READ_BCR_WAIT; } break; } case AblationStageSteps.S2310_READ_BCR_WAIT: { if (equipment.process.fine_align.IsWorkEnd) { Step = AblationStageSteps.S2999_PANEL_ID_READ_END; } break; } case AblationStageSteps.S2999_PANEL_ID_READ_END: { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Panel ID Reading [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Panel ID Reading [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S0000_WAIT; break; } } } private void Seq_FineAlign() { switch (Step) { case AblationStageSteps.S3000_FINE_ALIGN_START: { Tact_Move.Start(); _fineAlignRetryCount = 0; equipment.Write_Tact_Time_Log($"Ablation Stage 2, FineAlign [Start]"); Step = AblationStageSteps.S3100_MOVE_STAGE_FINE_ALIGN_LEFT_POSITION; break; } case AblationStageSteps.S3100_MOVE_STAGE_FINE_ALIGN_LEFT_POSITION: { if (MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Fine_Align_2_Left_Y, 500)) { Step = AblationStageSteps.S3105_POSITION_CHECK; } break; } case AblationStageSteps.S3105_POSITION_CHECK: { if (MotorY.MotionComplete) { if (MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Fine_Align_2_Left_Y, equipment.Setting.Inposition_Offset)) { Step = AblationStageSteps.S3110_FINE_ALIGN_LEFT_START; } else { Step = AblationStageSteps.S3100_MOVE_STAGE_FINE_ALIGN_LEFT_POSITION; } } break; } case AblationStageSteps.S3110_FINE_ALIGN_LEFT_START: { if (AblationStageSteps.S3110_FINE_ALIGN_LEFT_START < equipment.process.ablation_stage_1.Step && equipment.process.ablation_stage_1.Step <= AblationStageSteps.S3999_FINE_ALIGN_END) { } else { if (equipment.process.fine_align.Stage2FineAlignLeftStart()) { Step = AblationStageSteps.S3120_FINE_ALIGN_LEFT_WAIT; } } break; } case AblationStageSteps.S3120_FINE_ALIGN_LEFT_WAIT: { if (equipment.process.fine_align.IsWorkEnd) { Step = AblationStageSteps.S3200_MOVE_STAGE_FINE_ALIGN_RIGHT_POSITION; } break; } case AblationStageSteps.S3200_MOVE_STAGE_FINE_ALIGN_RIGHT_POSITION: { if (MotorY.Move_Absolute_Pos(equipment.Cur_Main_Recipe.vision_info.Fine_Align_2_Right_Y, 500)) { Step = AblationStageSteps.S3205_POSITION_CHECK; } break; } case AblationStageSteps.S3205_POSITION_CHECK: { if (MotorY.MotionComplete) { if (MotorY.Is_Inposition(equipment.Cur_Main_Recipe.vision_info.Fine_Align_2_Right_Y, equipment.Setting.Inposition_Offset)) { Step = AblationStageSteps.S3210_FINE_ALIGN_RIGHT_START; } else { Step = AblationStageSteps.S3200_MOVE_STAGE_FINE_ALIGN_RIGHT_POSITION; } } break; } case AblationStageSteps.S3210_FINE_ALIGN_RIGHT_START: { if (equipment.process.fine_align.Stage2FineAlignRightStart()) { Step = AblationStageSteps.S3220_FINE_ALIGN_RIGHT_WAIT; } break; } case AblationStageSteps.S3220_FINE_ALIGN_RIGHT_WAIT: { if (equipment.process.fine_align.IsWorkEnd) { Step = AblationStageSteps.S3300_FINE_ALIGN_CHECK; } break; } case AblationStageSteps.S3300_FINE_ALIGN_CHECK: { object value_offset; var info1 = Panel1; var info2 = Panel2; var isPanel1FineAlignResult = Stage1.IsExist == false || info1.Fine_Align_Result; var isPanel2FineAlignResult = Stage2.IsExist == false || info2.Fine_Align_Result; var max = equipment.Cur_Main_Recipe.vision_info.Fine_Align_Mark_Distance + equipment.Setting.Fine_Align_Mark_Offset_Range; var min = equipment.Cur_Main_Recipe.vision_info.Fine_Align_Mark_Distance - equipment.Setting.Fine_Align_Mark_Offset_Range; if ((isPanel1FineAlignResult || equipment.sm.Get_Bit(Vision_Address.Fine_Align_Left_Ack)) && (isPanel2FineAlignResult || equipment.sm.Get_Bit(Vision_Address.Fine_Align_Right_Ack))) { if (Stage1.IsExist && info1.Fine_Align_Result == false) { info1.Fine_Align_Ack = true; info1.Fine_Align_Result = equipment.sm.Get_Bit(Vision_Address.Fine_Align_Left_Result); equipment.Write_Exception_Log($"Fine Align Result Left {info1.Fine_Align_Result}"); Panel1 = info1; isPanel1FineAlignResult = Stage1.IsExist == false || info1.Fine_Align_Result; } if (Stage2.IsExist && info2.Fine_Align_Result == false) { info2.Fine_Align_Ack = true; info2.Fine_Align_Result = equipment.sm.Get_Bit(Vision_Address.Fine_Align_Right_Result); equipment.Write_Exception_Log($"Fine Align Result Right {info2.Fine_Align_Result}"); Panel2 = info2; isPanel2FineAlignResult = Stage2.IsExist == false || info2.Fine_Align_Result; } if (isPanel1FineAlignResult && isPanel2FineAlignResult) { if (Stage1.IsExist && info1.Fine_Align_Result && info1.Ablation_Run) { equipment.sm.Get_Value(Vision_Address.Fine_Align_Left_Offset_X, out value_offset); info1.Fine_Align_X_Offset = double.Parse(value_offset.ToString()); info1.Fine_Align_X_Offset = double.Parse(info1.Fine_Align_X_Offset.ToString("F3")); equipment.sm.Get_Value(Vision_Address.Fine_Align_Left_Offset_Y, out value_offset); info1.Fine_Align_Y_Offset = double.Parse(value_offset.ToString()); info1.Fine_Align_Y_Offset = double.Parse(info1.Fine_Align_Y_Offset.ToString("F3")); equipment.sm.Get_Value(Vision_Address.Fine_Align_Left_Offset_T, out value_offset); info1.Fine_Align_T_Offset = double.Parse(value_offset.ToString()); info1.Fine_Align_T_Offset = double.Parse(info1.Fine_Align_T_Offset.ToString("F3")); equipment.sm.Get_Value(Vision_Address.Fine_Align_Left_Mark_Distance, out value_offset); info1.Fine_Align_Distatnce = double.Parse(value_offset.ToString()); Panel1 = info1; } if (Stage2.IsExist && info2.Fine_Align_Result && info2.Ablation_Run) { equipment.sm.Get_Value(Vision_Address.Fine_Align_Right_Offset_X, out value_offset); info2.Fine_Align_X_Offset = double.Parse(value_offset.ToString()); info2.Fine_Align_X_Offset = double.Parse(info2.Fine_Align_X_Offset.ToString("F3")); equipment.sm.Get_Value(Vision_Address.Fine_Align_Right_Offset_Y, out value_offset); info2.Fine_Align_Y_Offset = double.Parse(value_offset.ToString()); info2.Fine_Align_Y_Offset = double.Parse(info2.Fine_Align_Y_Offset.ToString("F3")); equipment.sm.Get_Value(Vision_Address.Fine_Align_Right_Offset_T, out value_offset); info2.Fine_Align_T_Offset = double.Parse(value_offset.ToString()); info2.Fine_Align_T_Offset = double.Parse(info2.Fine_Align_T_Offset.ToString("F3")); equipment.sm.Get_Value(Vision_Address.Fine_Align_Right_Mark_Distance, out value_offset); info2.Fine_Align_Distatnce = double.Parse(value_offset.ToString()); Panel2 = info2; } double leftDistatnce = info1.Fine_Align_Distatnce; double rightDistatnce = info2.Fine_Align_Distatnce; if ((Stage1.IsExist && info1.Ablation_Run && (leftDistatnce < min || max < leftDistatnce)) || (Stage2.IsExist && info2.Ablation_Run && (rightDistatnce < min || max < rightDistatnce))) { if (Stage1.IsExist && info1.Ablation_Run && (leftDistatnce < min || max < leftDistatnce)) { info1.Fine_Align_Result = false; Panel1 = info1; equipment.Write_Exception_Log($"Fine Align Distance Error, Distance : {leftDistatnce}, Min : {min} Max : {max}"); Interlock_Manager.Add_Interlock_Msg("Ablation 2-1 Fine Align Distance Error", $"Distance : {leftDistatnce}, Min : {min} Max : {max}"); } if (Stage2.IsExist && info2.Ablation_Run && (rightDistatnce < min || max < rightDistatnce)) { info2.Fine_Align_Result = false; Panel2 = info2; equipment.Write_Exception_Log($"Fine Align Distance Error, Distance : {rightDistatnce}, Min : {min} Max : {max}"); Interlock_Manager.Add_Interlock_Msg("Ablation 2-2 Fine Align Distance Error", $"Distance : {rightDistatnce}, Min : {min} Max : {max}"); } Step = AblationStageSteps.S3310_USER_COMMAND_START; } else { Step = AblationStageSteps.S3999_FINE_ALIGN_END; } } else { _fineAlignRetryCount++; if (_fineAlignRetryCount >= equipment.Setting.Vision_Retry_Count) { Step = AblationStageSteps.S3310_USER_COMMAND_START; } else { Step = AblationStageSteps.S3100_MOVE_STAGE_FINE_ALIGN_LEFT_POSITION; } } } else { if (sequenceChangedTime.Seconds > equipment.Setting.Vision_Timeout) { _fineAlignRetryCount++; if (_fineAlignRetryCount > equipment.Setting.Vision_Retry_Count) { if (sequenceChangedTime.Minute > 5) { Step = AblationStageSteps.S3310_USER_COMMAND_START; } } else if (_fineAlignRetryCount == equipment.Setting.Vision_Retry_Count) { Step = AblationStageSteps.S3310_USER_COMMAND_START; } else { Step = AblationStageSteps.S3100_MOVE_STAGE_FINE_ALIGN_LEFT_POSITION; } } } break; } case AblationStageSteps.S3310_USER_COMMAND_START: { if (Stage1.IsExist && Panel1.Fine_Align_Result == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0884_FINE_ALIGN_LEFT_ERROR); } if (Stage2.IsExist && Panel2.Fine_Align_Result == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0885_FINE_ALIGN_RIGHT_ERROR); } _fineAlignUserCommand = new Form_User_Command_Set("Ablation 2 Fine Align"); _fineAlignCommandShowBit = true; Step = AblationStageSteps.S3320_USER_COMMAND_WAIT; break; } case AblationStageSteps.S3320_USER_COMMAND_WAIT: { Panel_Info info1 = Panel1; Panel_Info info2 = Panel2; if (_fineAlignUserCommand.Command_Type == En_User_Command.Scrap) { if (Stage1.IsExist && info1.Fine_Align_Result == false) { Panel1 = new Panel_Info(); equipment.Align_vision.Send_Fine_Align_Command(0, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (Stage2.IsExist && info2.Fine_Align_Result == false) { Panel1 = new Panel_Info(); equipment.Align_vision.Send_Fine_Align_Command(0, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } Step = AblationStageSteps.S3999_FINE_ALIGN_END; } else if (_fineAlignUserCommand.Command_Type == En_User_Command.Retry) { if (Stage1.IsExist && info1.Fine_Align_Result == false) { equipment.Align_vision.Send_Fine_Align_Command(1, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (Stage2.IsExist && info2.Fine_Align_Result == false) { equipment.Align_vision.Send_Fine_Align_Command(1, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } _fineAlignRetryCount = 0; Step = AblationStageSteps.S3100_MOVE_STAGE_FINE_ALIGN_LEFT_POSITION; } else if (_fineAlignUserCommand.Command_Type == En_User_Command.Skip) { if (Stage1.IsExist && info1.Fine_Align_Result == false) { info1.Fine_Align_Ack = true; info1.Fine_Align_Result = true; info1.Ablation_Run = false; Panel1 = info1; equipment.Align_vision.Send_Fine_Align_Command(2, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (Stage2.IsExist && info2.Fine_Align_Result == false) { info2.Fine_Align_Ack = true; info2.Fine_Align_Result = true; info2.Ablation_Run = false; Panel2 = info2; equipment.Align_vision.Send_Fine_Align_Command(2, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } Step = AblationStageSteps.S3300_FINE_ALIGN_CHECK; } else if (_fineAlignUserCommand.Command_Type == En_User_Command.Pass) { if (Stage1.IsExist && info1.Fine_Align_Result == false) { info1.Fine_Align_Ack = true; Panel1 = info1; equipment.Align_vision.Send_Fine_Align_Command(3, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (Stage2.IsExist && info2.Fine_Align_Result == false) { info2.Fine_Align_Ack = true; Panel2 = info2; equipment.Align_vision.Send_Fine_Align_Command(3, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } Step = AblationStageSteps.S3999_FINE_ALIGN_END; } else if (_fineAlignUserCommand.Command_Type == En_User_Command.Manual) { if (Stage1.IsExist && info1.Fine_Align_Result == false) { equipment.sm.Set_Bit(Vision_Address.Fine_Align_Left_Ack, false); equipment.sm.Set_Bit(Vision_Address.Fine_Align_Left_Result, false); equipment.Align_vision.Send_Fine_Align_Command(4, 0, info1.Tray_Num, info1.Panel_Num, info1.Panel_ID); } if (Stage2.IsExist && info2.Fine_Align_Result == false) { equipment.sm.Set_Bit(Vision_Address.Fine_Align_Right_Ack, false); equipment.sm.Set_Bit(Vision_Address.Fine_Align_Right_Result, false); equipment.Align_vision.Send_Fine_Align_Command(4, 1, info2.Tray_Num, info2.Panel_Num, info2.Panel_ID); } Step = AblationStageSteps.S3300_FINE_ALIGN_CHECK; } break; } case AblationStageSteps.S3999_FINE_ALIGN_END: { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, FineAlign [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, FineAlign [Tact : {Tact_Move.Seconds} (sec)]"); if (equipment.Mode.Ablation_Stage_1_1_Skip == false || equipment.Mode.Ablation_Stage_1_2_Skip == false) { equipment.process.fine_align.Stage1WaitPositionMove(); } Step = AblationStageSteps.S0000_WAIT; break; } } } private void Seq_Ablation() { switch (Step) { case AblationStageSteps.S4000_ABLATION_START: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Position [Start]"); if (Stage1.IsExist && (Panel1.IsAblationWorked == false && Panel1.Ablation_Run == true)) { Step = AblationStageSteps.S4100_MOVE_STAGE_ABLATION_LEFT_POSITION; } else if (Stage2.IsExist && (Panel2.IsAblationWorked == false && Panel2.Ablation_Run == true)) { Step = AblationStageSteps.S4200_MOVE_STAGE_ABLATION_RIGHT_POSITION; } else { Step = AblationStageSteps.S4999_ABLATION_END; } break; } case AblationStageSteps.S4100_MOVE_STAGE_ABLATION_LEFT_POSITION: { double position = Panel1.Fine_Align_Y_Offset + equipment.Cur_Main_Recipe.process_info.Scanner_Y_B1 + equipment.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_B1; position = double.Parse(position.ToString("F3")); if (MotorY.Move_Absolute_Pos(position, 500)) { Step = AblationStageSteps.S4105_POSITION_CHECK; } break; } case AblationStageSteps.S4105_POSITION_CHECK: { double position = Panel1.Fine_Align_Y_Offset + equipment.Cur_Main_Recipe.process_info.Scanner_Y_B1 + equipment.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_B1; position = double.Parse(position.ToString("F3")); if (MotorY.MotionComplete) { if (MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Position [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S4110_ABLATION_STATUS_CHECK; } else { Step = AblationStageSteps.S4100_MOVE_STAGE_ABLATION_LEFT_POSITION; } } break; } case AblationStageSteps.S4110_ABLATION_STATUS_CHECK: { if (equipment.process.ablation.Step != AblationSteps.S0000_WAIT || (AblationStageSteps.S4105_POSITION_CHECK < equipment.process.ablation_stage_1.Step && equipment.process.ablation_stage_1.Step <= AblationStageSteps.S4999_ABLATION_END)) { } else { Step = AblationStageSteps.S4120_ABLATION_LEFT_START; } break; } case AblationStageSteps.S4120_ABLATION_LEFT_START: { if (equipment.process.ablation.StageB1AblationStart()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Start [Start]"); Step = AblationStageSteps.S4130_ABLATION_WAIT; } break; } case AblationStageSteps.S4130_ABLATION_WAIT: { if (equipment.process.ablation.IsWorkEnd) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Start [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Start [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S4200_MOVE_STAGE_ABLATION_RIGHT_POSITION; } break; } case AblationStageSteps.S4200_MOVE_STAGE_ABLATION_RIGHT_POSITION: { if (Stage2.IsExist && (Panel2.IsAblationWorked == false && Panel2.Ablation_Run == true)) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Position [Start]"); double position = Panel2.Fine_Align_Y_Offset + +equipment.Cur_Main_Recipe.process_info.Scanner_Y_B2 + equipment.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_B2; position = double.Parse(position.ToString("F3")); if (MotorY.Move_Absolute_Pos(position, 500)) { equipment.process.ablation.StageB2AblationStart(); Step = AblationStageSteps.S4205_POSITION_CHECK; } } else { Step = AblationStageSteps.S4999_ABLATION_END; } break; } case AblationStageSteps.S4205_POSITION_CHECK: { double position = Panel2.Fine_Align_Y_Offset + equipment.Cur_Main_Recipe.process_info.Scanner_Y_B2 + equipment.Cur_Main_Recipe.panel_type_info.Scanner_Offset_Y_B2; position = double.Parse(position.ToString("F3")); if (MotorY.MotionComplete) { if (MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Position [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S4210_ABLATION_STATUS_CHECK; } else { Step = AblationStageSteps.S4200_MOVE_STAGE_ABLATION_RIGHT_POSITION; } } break; } case AblationStageSteps.S4210_ABLATION_STATUS_CHECK: { if (equipment.process.ablation.Step != AblationSteps.S0000_WAIT) { Step = AblationStageSteps.S4220_ABLATION_RIGHT_START; } else { if (equipment.process.ablation.StageB2AblationStart()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Start [Start]"); } } break; } case AblationStageSteps.S4220_ABLATION_RIGHT_START: { Step = AblationStageSteps.S4230_ABLATION_WAIT; break; } case AblationStageSteps.S4230_ABLATION_WAIT: { if (equipment.process.ablation.IsWorkEnd) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Start [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Start [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S4999_ABLATION_END; } break; } case AblationStageSteps.S4999_ABLATION_END: { if (equipment.Mode.Ablation_Stage_1_1_Skip == false || equipment.Mode.Ablation_Stage_1_2_Skip == false) { equipment.process.ablation.Stage1WaitPositionMove(); } Step = AblationStageSteps.S0000_WAIT; break; } } } private void Seq_Plasma() { switch (Step) { case AblationStageSteps.S5000_PLASMA_START: { Step = AblationStageSteps.S5100_MOVE_STAGE_PLASMA_LEFT_POSITION; break; } case AblationStageSteps.S5100_MOVE_STAGE_PLASMA_LEFT_POSITION: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Ablation Position [Start]"); double position = Panel1.Fine_Align_Y_Offset + equipment.Cur_Main_Recipe.process_info.Plasma_Y_B1; position = double.Parse(position.ToString("F3")); if (MotorY.Move_Absolute_Pos(position, 500)) { Step = AblationStageSteps.S5105_POSITION_CHECK; } break; } case AblationStageSteps.S5105_POSITION_CHECK: { double position = Panel1.Fine_Align_Y_Offset + equipment.Cur_Main_Recipe.process_info.Plasma_Y_B1; position = double.Parse(position.ToString("F3")); if (MotorY.MotionComplete) { if (MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Plasma Position [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Plasma Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S5110_PLASMA_STATUS_CHECK; } else { Step = AblationStageSteps.S5100_MOVE_STAGE_PLASMA_LEFT_POSITION; } } break; } case AblationStageSteps.S5110_PLASMA_STATUS_CHECK: { if (AblationStageSteps.S5110_PLASMA_STATUS_CHECK < equipment.process.ablation_stage_1.Step && equipment.process.ablation_stage_1.Step < AblationStageSteps.S5999_PLASMA_END) { } else { Step = AblationStageSteps.S5120_PLASMA_LEFT_START; } break; } case AblationStageSteps.S5120_PLASMA_LEFT_START: { if (equipment.process.plasma.StageB1PlasmaStart()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Plasma Start [Start]"); Step = AblationStageSteps.S5130_PLASMA_WAIT; } break; } case AblationStageSteps.S5130_PLASMA_WAIT: { if (equipment.process.plasma.IsWorkEnd) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Plasma Start [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Plasma Start [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S5200_MOVE_STAGE_PLASMA_RIGHT_POSITION; } break; } case AblationStageSteps.S5200_MOVE_STAGE_PLASMA_RIGHT_POSITION: { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Plasma Position [Start]"); double position = Panel2.Fine_Align_Y_Offset + equipment.Cur_Main_Recipe.process_info.Plasma_Y_B2; position = double.Parse(position.ToString("F3")); if (MotorY.Move_Absolute_Pos(position, 500)) { Step = AblationStageSteps.S5205_POSITION_CHECK; } break; } case AblationStageSteps.S5205_POSITION_CHECK: { double position = Panel2.Fine_Align_Y_Offset + equipment.Cur_Main_Recipe.process_info.Plasma_Y_B2; position = double.Parse(position.ToString("F3")); if (MotorY.MotionComplete) { if (MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Plasma Position [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Plasma Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S5210_PLASMA_STATUS_CHECK; } else { Step = AblationStageSteps.S5200_MOVE_STAGE_PLASMA_RIGHT_POSITION; } } break; } case AblationStageSteps.S5210_PLASMA_STATUS_CHECK: { Step = AblationStageSteps.S5220_PLASMA_RIGHT_START; break; } case AblationStageSteps.S5220_PLASMA_RIGHT_START: { if (equipment.process.plasma.StageB2PlasmaStart()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Plasma Start [Start]"); Step = AblationStageSteps.S5230_PLASMA_WAIT; } break; } case AblationStageSteps.S5230_PLASMA_WAIT: { if (equipment.process.plasma.IsWorkEnd) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Plasma Start [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Plasma Start [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S5999_PLASMA_END; } break; } case AblationStageSteps.S5999_PLASMA_END: { Step = AblationStageSteps.S0000_WAIT; break; } } } private void Seq_Unload() { switch (Step) { case AblationStageSteps.S6000_PANEL_UNLOAD_START: { Step = AblationStageSteps.S6100_MOVE_UNLOAD_POSITION; break; } case AblationStageSteps.S6100_MOVE_UNLOAD_POSITION: { if (Move_Y_Unload_Position()) { Tact_Move.Start(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Unloading Position [Start]"); Step = AblationStageSteps.S6105_POSITION_CHECK; } break; } case AblationStageSteps.S6105_POSITION_CHECK: { if (MotorY.MotionComplete) { if (IsUnloadPosition) { Tact_Move.Stop(); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Unloading Position [End]"); equipment.Write_Tact_Time_Log($"Ablation Stage 2, Unloading Position [Tact : {Tact_Move.Seconds} (sec)]"); Step = AblationStageSteps.S6200_PANEL_EMPTY_CHECK; } else { Step = AblationStageSteps.S6100_MOVE_UNLOAD_POSITION; } } break; } case AblationStageSteps.S6200_PANEL_EMPTY_CHECK: { if (IsExist == false && equipment.after.Handler2.Picker1.IsUp && equipment.after.Handler2.Picker2.IsUp) { equipment.process.TactTime2.Stop(); Step = AblationStageSteps.S6999_PANEL_UNLOAD_END; } break; } case AblationStageSteps.S6999_PANEL_UNLOAD_END: { Step = AblationStageSteps.S0000_WAIT; break; } } } public void Seq_Stage1Step() { switch (_stage1Step) { case StageSteps.S9000_SCRAP_START: { _stage1Step = StageSteps.S9100_VACUUM_OFF; break; } case StageSteps.S9100_VACUUM_OFF: { if (Stage1.IsWorkEnd) { if (Stage1.VacuumSol1On == false && Stage1.VacuumSol2On == false) { _stage1Step = StageSteps.S9110_DATA_SET; } else { Stage1.VacuumOff(); } } break; } case StageSteps.S9110_DATA_SET: { Panel1 = new Panel_Info(); _stage1Step = StageSteps.S9999_SCRAP_END; break; } case StageSteps.S9999_SCRAP_END: { _stage1Step = StageSteps.S0000_WAIT; break; } } } public void Seq_Stage2Step() { switch (_stage2Step) { case StageSteps.S9000_SCRAP_START: { _stage2Step = StageSteps.S9100_VACUUM_OFF; break; } case StageSteps.S9100_VACUUM_OFF: { if (Stage2.IsWorkEnd) { if (Stage2.VacuumSol1On == false && Stage2.VacuumSol2On == false) { _stage2Step = StageSteps.S9110_DATA_SET; } else { Stage2.VacuumOff(); } } break; } case StageSteps.S9110_DATA_SET: { Panel2 = new Panel_Info(); _stage2Step = StageSteps.S9999_SCRAP_END; break; } case StageSteps.S9999_SCRAP_END: { _stage2Step = StageSteps.S0000_WAIT; break; } } } public bool Move_Y_Load_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.Ablation_Stage_2_Y_Load_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.Ablation_Stage_2_Y_Load_Velocity, out value); velocity = double.Parse($"{value}"); return MotorY.Move_Absolute_Pos(position, velocity); } public bool Move_Y_Unload_Position() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.Ablation_Stage_2_Y_Unload_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.Ablation_Stage_2_Y_Unload_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("Ablation_2_1 Scrap Can't Start", "Equipment mode is Auto."); return false; } _stage1Step = StageSteps.S9000_SCRAP_START; return true; } public bool Picker_2_Scrap() { if (UnitMode == En_Equipment_Mode.Auto || equipment.Auto_Mode) { Interlock_Manager.Add_Interlock_Msg("Ablation_2_2 Scrap Can't Start", "Equipment mode is Auto."); return false; } _stage2Step = StageSteps.S9000_SCRAP_START; return true; } #endregion } }