using System; namespace SHARP_CLAS_UI { public class UnloaderLiftNg : Lift { #region Enum #endregion #region Property public bool IsPanelPlaceEnable { get { if(IsWorkEnd) { if(equipment.UnloaderNgTrayCount > 0) { if (_isCoverTraySet == false) { if (_unloadBit == false) { if (IsPanelFull == false) { return true; } } } } } return false; } } public bool is_Tray_Pick_Enable { get { if(Step == LiftOutSteps.S1400_TRAY_TRANSFER_PLACE_WAIT) { return true; } else { return false; } } } public bool is_Tray_Id_Read_Enable { get { if (Step == LiftOutSteps.S1520_TRAY_ID_READ_WAIT && IsBcrReadBit) { return true; } else { return false; } } } public override bool IsPanelEmpty { get { int panel_num = 0; 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++) { panel_num++; var info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, panel_num); if (info.Blank == false) { return false; } } } return true; } } public override bool IsPanelFull { get { int panel_num = 0; 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++) { panel_num++; var info = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, panel_num); if (info.Blank) { return false; } } } return true; } } protected override double UpPosition { get { object value; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Tray_Ng_Z_Process_Position, out value); var position = double.Parse($"{value}"); return position; } } public override double TrayInPosition { get { if (equipment.Cur_Main_Recipe.tray_info == null) return 0; var position = UpPosition - (equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Tray_Pitch * equipment.UnloaderNgTrayCount); position = double.Parse(position.ToString("F3")); return position; } } public override double TrayWaitPosition { get { if (equipment.Cur_Main_Recipe.tray_info == null) return 0; var position = UpPosition - (equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Tray_Pitch * (equipment.UnloaderNgTrayCount + 1)); position = double.Parse(position.ToString("F3")); return position; } } public override string TrayID { get { object value; equipment.sm.Get_Value(Process_Memory_Address.ULD_Tray_Ng_ID, out value); return value.ToString(); } set { equipment.sm.Set_Value(Process_Memory_Address.ULD_Tray_Ng_ID, value); } } public override bool IsWorkEnd { get { if(Step == LiftOutSteps.S0000_WAIT) { return true; } else { return false; } } } public override bool IsStayPosition { get { object value; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Tray_Ng_Z_Wait_Position, out value); var position = double.Parse($"{value}"); return MotorZ.Is_Inposition(position, equipment.Setting.Inposition_Offset); } } public LiftOutSteps Step { get { return _step; } set { _step = value; } } public TrayShuttle Shuttle { get { return _shuttle; } set { _shuttle = value; } } #endregion #region Field private LiftOutSteps _step; private LiftOutSteps _oldStep; private LiftHomeSteps _homeStep; private TrayShuttle _shuttle; private bool _isCoverTraySet; private bool _unloadBit; #endregion #region Construct public UnloaderLiftNg(Equipment equipment) : base(equipment, MotorAxis.ULD_Tray_NG_Lift_Z, "UnloaderLiftNg") { Shuttle = new TrayShuttle(equipment); Step = LiftOutSteps.S0000_WAIT; _oldStep = LiftOutSteps.S0000_WAIT; Initialize(InputData.ULD_Ng_Lift_Up_1_1_Sensor, InputData.ULD_Ng_Lift_Up_1_2_Sensor, InputData.ULD_Ng_Lift_Up_2_1_Sensor, InputData.ULD_Ng_Lift_Up_2_2_Sensor); AlignerTop.Initialize(OutputData.ULD_Ng_Out_Align_Top_Sol_Valve, InputData.ULD_Ng_Out_Align_Top_1_Fwd_Sensor, InputData.ULD_Ng_Out_Align_Top_2_Fwd_Sensor, InputData.ULD_Ng_Out_Align_Top_1_Bwd_Sensor, InputData.ULD_Ng_Out_Align_Top_2_Bwd_Sensor, En_Alarm_List.AL_0784_ULD_TRAY_NG_ALIGN_TOP_1_FWD_SENSOR_CHECK, En_Alarm_List.AL_0785_ULD_TRAY_NG_ALIGN_TOP_2_FWD_SENSOR_CHECK, En_Alarm_List.AL_0786_ULD_TRAY_NG_ALIGN_TOP_1_BWD_SENSOR_CHECK, En_Alarm_List.AL_0787_ULD_TRAY_NG_ALIGN_TOP_2_BWD_SENSOR_CHECK); Clamper.Initialize(OutputData.ULD_Ng_Out_Clamp_Sol_Valve, InputData.ULD_Ng_Out_Clamp_1_Clamp_Sensor, InputData.ULD_Ng_Out_Clamp_2_Clamp_Sensor, InputData.ULD_Ng_Out_Clamp_1_Unclamp_Sensor, InputData.ULD_Ng_Out_Clamp_2_Unclamp_Sensor, En_Alarm_List.AL_0788_ULD_TRAY_NG_CLAMP_1_SENSOR_CHECK, En_Alarm_List.AL_0789_ULD_TRAY_NG_CLAMP_2_SENSOR_CHECK, En_Alarm_List.AL_0790_ULD_TRAY_NG_UNCLAMP_1_SENSOR_CHECK, En_Alarm_List.AL_0791_ULD_TRAY_NG_UNCLAMP_2_SENSOR_CHECK); Stacker.Initialize(OutputData.ULD_Ng_Out_Stacker_Sol_Valve, InputData.ULD_Ng_Out_Stacker_1_Fwd_Sensor, InputData.ULD_Ng_Out_Stacker_2_Fwd_Sensor, InputData.ULD_Ng_Out_Stacker_3_Fwd_Sensor, InputData.ULD_Ng_Out_Stacker_4_Fwd_Sensor, InputData.ULD_Ng_Out_Stacker_1_Bwd_Sensor, InputData.ULD_Ng_Out_Stacker_2_Bwd_Sensor, InputData.ULD_Ng_Out_Stacker_3_Bwd_Sensor, InputData.ULD_Ng_Out_Stacker_4_Bwd_Sensor, En_Alarm_List.AL_0792_ULD_TRAY_NG_STACKER_1_FWD_SENSOR_CHECK, En_Alarm_List.AL_0793_ULD_TRAY_NG_STACKER_2_FWD_SENSOR_CHECK, En_Alarm_List.AL_0794_ULD_TRAY_NG_STACKER_3_FWD_SENSOR_CHECK, En_Alarm_List.AL_0795_ULD_TRAY_NG_STACKER_4_FWD_SENSOR_CHECK, En_Alarm_List.AL_0796_ULD_TRAY_NG_STACKER_1_BWD_SENSOR_CHECK, En_Alarm_List.AL_0797_ULD_TRAY_NG_STACKER_2_BWD_SENSOR_CHECK, En_Alarm_List.AL_0798_ULD_TRAY_NG_STACKER_3_BWD_SENSOR_CHECK, En_Alarm_List.AL_0799_ULD_TRAY_NG_STACKER_4_BWD_SENSOR_CHECK); Shuttle.Initialize(OutputData.ULD_Ng_Tray_Shuttle_Fwd_Sol_Valve, OutputData.ULD_Ng_Tray_Shuttle_Bwd_Sol_Valve, InputData.ULD_Ng_Out_Shuttle_Fwd_Sensor, InputData.ULD_Ng_Out_Shuttle_Bwd_Sensor, En_Alarm_List.AL_0800_ULD_NG_OUT_SHUTTLE_FWD_SENSOR_CHECK, En_Alarm_List.AL_0801_ULD_NG_OUT_SHUTTLE_BWD_SENSOR_CHECK); pauseDisableList.Add(LiftOutSteps.S1415_LIFT_PITCH_DOWN_CHECK); pauseDisableList.Add(LiftOutSteps.S1425_LIFT_PITCH_UP_CHECK); pauseDisableList.Add(LiftOutSteps.S1435_LIFT_PITCH_LAST_UP_CHECK); pauseDisableList.Add(LiftOutSteps.S2405_LIFT_DOWN_CHECK); MotorZ.Check_Jog_Interlock = Jog_Interlock; MotorZ.Check_Move_Interlock = Move_Interlock; } #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; } public void Init_Seq() { if(Step < LiftOutSteps.S2000_TRAY_UNLOADING_START || LiftOutSteps.S2999_TRAY_UNLOADING_END < Step) Step = LiftOutSteps.S0000_WAIT; _homeStep = LiftHomeSteps.S0000_WAIT; } public void ExecuteAuto() { if(IsWorkEnd) { if (_isCoverTraySet) { Step = LiftOutSteps.S2000_TRAY_UNLOADING_START; } else { if (equipment.UnloaderNgTrayCount <= equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Tray_Count) { if (IsPanelFull || _unloadBit || equipment.UnloaderNgTrayCount == 0) { Step = LiftOutSteps.S1000_LIFT_MOVE_START; } } } } } public override void MonitoringStatus() { if (equipment.User.Level != En_User_Level.Master && equipment.Door_Opened) { if (MotorZ.MotionComplete == false) { MotorZ.Move_Stop(); } } } public override void ExecuteStep() { if (_oldStep != Step) { sequenceChangedTime.Restart(); _oldStep = Step; WriteSequenceLog(Step.ToString()); } AlignerTop.ExecuteProcess(); Clamper.ExecuteProcess(); Stacker.ExecuteProcess(); Shuttle.ExecuteProcess(); //상시 Run. if (UnitMode != En_Equipment_Mode.Home) { UnloadingTray(); } 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) { ExecuteHome(); } return; } 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(); } LoadingTray(); } } public void ExecuteHome() { switch (_homeStep) { case LiftHomeSteps.S0000_WAIT: { _homeStep = LiftHomeSteps.S1000_STATUS_CHECK; break; } case LiftHomeSteps.S1000_STATUS_CHECK: { if (MotorZ.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0461_ULD_TRAY_NG_LIFT_Z_ERROR_STOP); } else if (!MotorZ.PowerOn) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0460_ULD_TRAY_NG_LIFT_Z_POWER_OFF); } else if (IsLiftInSensor1 || IsLiftInSensor2) { Interlock_Manager.Add_Interlock_Msg("Unloader Lift Ng", "Home can't run, Lift in sensor detected."); } else if (IsLiftLimitSensor1 || IsLiftLimitSensor2) { Interlock_Manager.Add_Interlock_Msg("Unloader Lift Ng", "Home can't run, Lift limit sensor detected."); } else if (Clamper.ClampSol) { Interlock_Manager.Add_Interlock_Msg("Unloader Lift Ng", "Home can't run, Clamp is clamped "); } else { _homeStep = LiftHomeSteps.S1100_CONVEYOR_HOME_CHECK; } break; } case LiftHomeSteps.S1100_CONVEYOR_HOME_CHECK: { if (Shuttle.ForwardOnSol && Shuttle.IsForwardSensor) { _homeStep = LiftHomeSteps.S1110_CONVEYOR_LIFT_SENSOR_CHECK; } else { Interlock_Manager.Add_Interlock_Msg("ULD Tray NG Can't Home.", "shuttle is not forward."); } break; } case LiftHomeSteps.S1110_CONVEYOR_LIFT_SENSOR_CHECK: { _homeStep = LiftHomeSteps.S1200_MOTOR_Z_HOME; break; } case LiftHomeSteps.S1200_MOTOR_Z_HOME: { if (MotorZ.Home()) { homeCheckedTime.Restart(); _homeStep = LiftHomeSteps.S1205_MOTOR_Z_HOME_CHECK; } break; } case LiftHomeSteps.S1205_MOTOR_Z_HOME_CHECK: { if (homeCheckedTime.Seconds < 1) return; if (!MotorZ.IsHomed) { if (MotorZ.Homing == false && MotorZ.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0461_ULD_TRAY_NG_LIFT_Z_ERROR_STOP); } } else { _homeStep = LiftHomeSteps.S1300_MOVE_STAY_POSITION; } break; } case LiftHomeSteps.S1300_MOVE_STAY_POSITION: { if (MoveStayPosition()) { homeCheckedTime.Restart(); _homeStep = LiftHomeSteps.S1305_POSITION_CHECK; } break; } case LiftHomeSteps.S1305_POSITION_CHECK: { if (homeCheckedTime.Seconds < 1) return; if (MotorZ.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0461_ULD_TRAY_NG_LIFT_Z_ERROR_STOP); } else if (MotorZ.MotionComplete) { if (IsStayPosition) { _homeStep = LiftHomeSteps.S9999_END; } else { Interlock_Manager.Add_Interlock_Msg("ULD Tray NG Lift Home can't run.", "Position is not wait."); } } break; } case LiftHomeSteps.S9999_END: { isHomeComplete = true; _homeStep = LiftHomeSteps.S0000_WAIT; break; } } } private void LoadingTray() { switch (Step) { case LiftOutSteps.S1000_LIFT_MOVE_START: { Step = LiftOutSteps.S1100_CONVEYOR_LIFT_SENSOR_CHECK; break; } case LiftOutSteps.S1100_CONVEYOR_LIFT_SENSOR_CHECK: { if (_shuttle.IsForwardSensor) { Step = LiftOutSteps.S1110_TRAY_TRANSTER_POSITION_STAY_CHECK; } else { if(sequenceChangedTime.Seconds > 30) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0800_ULD_NG_OUT_SHUTTLE_FWD_SENSOR_CHECK); } } break; } case LiftOutSteps.S1110_TRAY_TRANSTER_POSITION_STAY_CHECK: { Step = LiftOutSteps.S1200_ALIGN_TOP_BACKWARD; break; } case LiftOutSteps.S1200_ALIGN_TOP_BACKWARD: { if (AlignerTop.IsWorkEnd) { if (AlignerTop.IsBackward) { Step = LiftOutSteps.S1210_STACKER_BACKWARD; } else { AlignerTop.Backward(); } } break; } case LiftOutSteps.S1210_STACKER_BACKWARD: { if (Stacker.IsWorkEnd) { if (Stacker.IsBackward) { Step = LiftOutSteps.S1220_UNCLAMP; } else { Stacker.Backward(); } } break; } case LiftOutSteps.S1220_UNCLAMP: { if (Clamper.IsWorkEnd) { if (Clamper.IsUnclamp) { Step = LiftOutSteps.S1300_LIFT_MOVE; } else { Clamper.Unclamp(); } } break; } case LiftOutSteps.S1300_LIFT_MOVE: { if (MoveTrayInPosition(TrayWaitPosition)) { Step = LiftOutSteps.S1305_LIFT_MOVE_CHECK; } break; } case LiftOutSteps.S1305_LIFT_MOVE_CHECK: { if (sequenceChangedTime.Seconds < 0.5) return; if (IsLiftLimitSensor1 || IsLiftLimitSensor2) { if (MotorZ.Move_Stop()) { if (IsLiftLimitSensor1) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0780_ULD_TRAY_NG_LIFT_UP_1_1_SENSOR_CHECK); } if (IsLiftLimitSensor2) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0781_ULD_TRAY_NG_LIFT_UP_1_2_SENSOR_CHECK); } //Step = LiftOutSteps.S1440_TRAY_SCRAP_CHECK; return; } } if (MotorZ.MotionComplete) { if (MotorZ.Is_Inposition(TrayWaitPosition, equipment.Setting.Inposition_Offset)) { if (IsLiftInSensor1 || IsLiftInSensor2) { if (IsLiftInSensor1) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0782_ULD_TRAY_NG_LIFT_UP_2_1_SENSOR_CHECK); } if (IsLiftInSensor2) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0783_ULD_TRAY_NG_LIFT_UP_2_2_SENSOR_CHECK); } } else { Step = LiftOutSteps.S1310_ALIGN_TOP_FORWARD; } } else { Interlock_Manager.Add_Interlock_Msg("ULD Tray NG Lift Loading can't run.", $"700, Lift is not down position({MotorZ.Position}, {TrayWaitPosition})."); Step = LiftOutSteps.S1300_LIFT_MOVE; } } break; } case LiftOutSteps.S1310_ALIGN_TOP_FORWARD: { if (AlignerTop.IsWorkEnd) { if (AlignerTop.IsForward) { Step = LiftOutSteps.S1320_CLAMP; } else { AlignerTop.Forward(); } } break; } case LiftOutSteps.S1320_CLAMP: { if (Clamper.IsWorkEnd) { if (Clamper.IsClamp) { Step = LiftOutSteps.S1400_TRAY_TRANSFER_PLACE_WAIT; } else { Clamper.Clamp(); } } break; } case LiftOutSteps.S1400_TRAY_TRANSFER_PLACE_WAIT: { if (equipment.UnloaderNgTrayCount != _trayCount) { if(equipment.UnloaderNgTrayCount == 1) { IsFirstTray = true; } _pitchPosition = 0; if (IsLiftInSensor1 && IsLiftInSensor2) { Step = LiftOutSteps.S1410_LIFT_PITCH_DOWN; } else { Step = LiftOutSteps.S1420_LIFT_PITCH_UP; } } break; } case LiftOutSteps.S1410_LIFT_PITCH_DOWN: { if (Math.Abs(_pitchPosition) > equipment.Setting.Tray_Alarm_Range) { _pitchPosition = 0; Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0951_LD_TRAY_EMPTY_PITCH_RANGE_ALARM); //Step = LiftOutSteps.S1440_TRAY_SCRAP_CHECK; } else { _pitchPosition -= equipment.Setting.Tray_Move_Pitch; MoveTrayInPosition(TrayInPosition + _pitchPosition); Step = LiftOutSteps.S1415_LIFT_PITCH_DOWN_CHECK; } break; } case LiftOutSteps.S1415_LIFT_PITCH_DOWN_CHECK: { if (sequenceChangedTime.Seconds < 0.5) return; if (MotorZ.MotionComplete) { if (MotorZ.Is_Inposition(TrayInPosition + _pitchPosition, equipment.Setting.Inposition_Offset)) { if (IsLiftInSensor1 && IsLiftInSensor2) { Step = LiftOutSteps.S1410_LIFT_PITCH_DOWN; } else { Step = LiftOutSteps.S1420_LIFT_PITCH_UP; } } else { Interlock_Manager.Add_Interlock_Msg("ULD Tray NG Lift Down can't run.", $"ULD Tray NG Lift is not down position({TrayInPosition + _pitchPosition})."); Step = LiftOutSteps.S1410_LIFT_PITCH_DOWN; } } break; } case LiftOutSteps.S1420_LIFT_PITCH_UP: { if (Math.Abs(_pitchPosition) > equipment.Setting.Tray_Alarm_Range) { _pitchPosition = 0; Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0951_LD_TRAY_EMPTY_PITCH_RANGE_ALARM); //Step = LiftOutSteps.S1440_TRAY_SCRAP_CHECK; } else { _pitchPosition += equipment.Setting.Tray_Move_Pitch; MoveTrayInPosition(TrayInPosition + _pitchPosition); Step = LiftOutSteps.S1425_LIFT_PITCH_UP_CHECK; } break; } case LiftOutSteps.S1425_LIFT_PITCH_UP_CHECK: { if (sequenceChangedTime.Seconds < 0.5) return; if (IsLiftLimitSensor1 || IsLiftLimitSensor2) { if (MotorZ.Move_Stop()) { _pitchPosition = 0; if (IsLiftLimitSensor1) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0780_ULD_TRAY_NG_LIFT_UP_1_1_SENSOR_CHECK); } if (IsLiftLimitSensor2) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0781_ULD_TRAY_NG_LIFT_UP_1_2_SENSOR_CHECK); } //Step = LiftOutSteps.S1440_TRAY_SCRAP_CHECK; return; } } if (MotorZ.MotionComplete) { if (MotorZ.Is_Inposition(TrayInPosition + _pitchPosition, equipment.Setting.Inposition_Offset)) { if (IsLiftInSensor1 && IsLiftInSensor2) { Step = LiftOutSteps.S1430_LIFT_PITCH_LAST_UP; } else { Step = LiftOutSteps.S1420_LIFT_PITCH_UP; } } else { Interlock_Manager.Add_Interlock_Msg("ULD Tray NG Lift Down can't run.", $"ULD Tray NG Lift is not down position({TrayInPosition + _pitchPosition})."); Step = LiftOutSteps.S1410_LIFT_PITCH_DOWN; } } break; } case LiftOutSteps.S1430_LIFT_PITCH_LAST_UP: { _pitchPosition += equipment.Setting.ULD_Ng_Tray_Move_Last_Pitch; MoveTrayInPosition(TrayInPosition + _pitchPosition); Step = LiftOutSteps.S1435_LIFT_PITCH_LAST_UP_CHECK; break; } case LiftOutSteps.S1435_LIFT_PITCH_LAST_UP_CHECK: { if (sequenceChangedTime.Seconds < 0.5) return; if (MotorZ.MotionComplete) { if (MotorZ.Is_Inposition(TrayInPosition + _pitchPosition, equipment.Setting.Inposition_Offset)) { if (IsLiftInSensor1 && IsLiftInSensor2) { _trayCount = equipment.UnloaderNgTrayCount; Step = LiftOutSteps.S1500_CLAMP; } else { if (!IsLiftInSensor1) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0782_ULD_TRAY_NG_LIFT_UP_2_1_SENSOR_CHECK); } if (!IsLiftInSensor2) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0783_ULD_TRAY_NG_LIFT_UP_2_2_SENSOR_CHECK); } _pitchPosition = 0; //Step = LiftOutSteps.S1440_TRAY_SCRAP_CHECK; } } else { Interlock_Manager.Add_Interlock_Msg("LD Tray Out Lift Down can't run.", $"LD Tray Out Lift is not down position({TrayInPosition + _pitchPosition})."); Step = LiftOutSteps.S1430_LIFT_PITCH_LAST_UP; } } break; } case LiftOutSteps.S1440_TRAY_SCRAP_CHECK: { var scrap = true; if(scrap) { equipment.UnloaderNgTrayCount = equipment.UnloaderNgTrayCount - 1; Step = LiftOutSteps.S1400_TRAY_TRANSFER_PLACE_WAIT; } else { if (IsLiftInSensor1 && IsLiftInSensor2) { Step = LiftOutSteps.S1410_LIFT_PITCH_DOWN; } else { Step = LiftOutSteps.S1420_LIFT_PITCH_UP; } } break; } case LiftOutSteps.S1500_CLAMP: { if (Clamper.IsWorkEnd) { if (Clamper.IsClamp) { Step = LiftOutSteps.S1510_ALIGN_TOP_FORWARD; } else { Clamper.Clamp(); } } break; } case LiftOutSteps.S1510_ALIGN_TOP_FORWARD: { if (AlignerTop.IsWorkEnd) { if (AlignerTop.IsForward) { IsBcrReadBit = true; Step = LiftOutSteps.S1520_TRAY_ID_READ_WAIT; } else { AlignerTop.Forward(); } } break; } case LiftOutSteps.S1520_TRAY_ID_READ_WAIT: { if (IsBcrReadBit == false) { if (equipment.UnloaderNgTrayCount != _trayCount) { Step = LiftOutSteps.S1400_TRAY_TRANSFER_PLACE_WAIT; } else { if (SetTrayId(TrayID)) { Step = LiftOutSteps.S1600_TRAY_PANEL_DATA_SET; } } } break; } case LiftOutSteps.S1600_TRAY_PANEL_DATA_SET: { if (SetPanelInfo(true)) { if (_unloadBit || _trayCount > equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Tray_Count) { _isCoverTraySet = true; } Step = LiftOutSteps.S1605_TRAY_PANEL_DATA_SET_CHECK; } break; } case LiftOutSteps.S1605_TRAY_PANEL_DATA_SET_CHECK: { if (IsPanelEmpty) { if (equipment.cim_mode == En_Cim_Mode.Online) { //if (IsFirstTray) //{ // IsFirstTray = false; // Step = LiftOutSteps.S1610_PORT_STATUS_CIM_SEND; //} //else //{ // Step = LiftOutSteps.S1620_PANEL_IN_DATA_CIM_SEND; //} if (IsFirstTray) { IsFirstTray = false; } Step = LiftOutSteps.S1620_PANEL_IN_DATA_CIM_SEND; } else { if (IsFirstTray) { IsFirstTray = false; } Step = LiftOutSteps.S1999_LIFT_MOVE_END; } } else { Step = LiftOutSteps.S1600_TRAY_PANEL_DATA_SET; } break; } case LiftOutSteps.S1610_PORT_STATUS_CIM_SEND: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = LiftOutSteps.S1999_LIFT_MOVE_END; return; } if (equipment.cim_client.Send_Port_Status("E12345678", En_Port_ID.P04, En_Tray_Code.N, false, En_Port_Status.CMP, TrayID)) { Step = LiftOutSteps.S1615_PORT_STATUS_CIM_SEND_CHECK; } break; } case LiftOutSteps.S1615_PORT_STATUS_CIM_SEND_CHECK: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = LiftOutSteps.S1999_LIFT_MOVE_END; return; } if (equipment.cim_client.Get_Command_Ack(En_Cim_Command.PTSTR)) { if (equipment.cim_client.Get_Command_Result(En_Cim_Command.PTSTR)) { Step = LiftOutSteps.S1620_PANEL_IN_DATA_CIM_SEND; } else { Step = LiftOutSteps.S1610_PORT_STATUS_CIM_SEND; } } break; } case LiftOutSteps.S1620_PANEL_IN_DATA_CIM_SEND: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = LiftOutSteps.S1999_LIFT_MOVE_END; return; } if (equipment.cim_client.Send_Panel_Tray_In("E123456", TrayID, "", "", En_Port_ID.P04)) { Step = LiftOutSteps.S1625_PANEL_IN_DATA_CIM_SEND_CHECK; } break; } case LiftOutSteps.S1625_PANEL_IN_DATA_CIM_SEND_CHECK: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = LiftOutSteps.S1999_LIFT_MOVE_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 = LiftOutSteps.S1999_LIFT_MOVE_END; } else { Step = LiftOutSteps.S1620_PANEL_IN_DATA_CIM_SEND; } } break; } case LiftOutSteps.S1999_LIFT_MOVE_END: { Step = LiftOutSteps.S0000_WAIT; break; } } } public void UnloadingTray() { switch (Step) { case LiftOutSteps.S2000_TRAY_UNLOADING_START: { if (equipment.cim_mode == En_Cim_Mode.Online) { Step = LiftOutSteps.S2100_PANEL_REPORT_CIM_SEND; } else { Step = LiftOutSteps.S2200_UNCLAMP; } break; } case LiftOutSteps.S2100_PANEL_REPORT_CIM_SEND: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = LiftOutSteps.S2200_UNCLAMP; return; } if (equipment.cim_client.Send_Panel_Form_Report("E12345678", TrayID, En_Port_ID.P04)) { Step = LiftOutSteps.S2105_PANEL_REPORT_CIM_SEND_WAIT; } break; } case LiftOutSteps.S2105_PANEL_REPORT_CIM_SEND_WAIT: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = LiftOutSteps.S2200_UNCLAMP; return; } if (equipment.cim_client.Get_Command_Ack(En_Cim_Command.PCMRT)) { if (equipment.cim_client.Get_Command_Result(En_Cim_Command.PCMRT)) { Step = LiftOutSteps.S2110_PORT_STATUS_CIM_SEND; } else { Step = LiftOutSteps.S2100_PANEL_REPORT_CIM_SEND; } } break; } case LiftOutSteps.S2110_PORT_STATUS_CIM_SEND: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = LiftOutSteps.S2200_UNCLAMP; return; } if (equipment.cim_client.Send_Port_Status("E12345678", En_Port_ID.P04, En_Tray_Code.N, false, En_Port_Status.CMP, TrayID)) { Step = LiftOutSteps.S2115_PORT_STATUS_CIM_SEND_WAIT; } break; } case LiftOutSteps.S2115_PORT_STATUS_CIM_SEND_WAIT: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = LiftOutSteps.S2200_UNCLAMP; return; } if (equipment.cim_client.Get_Command_Ack(En_Cim_Command.PTSTR)) { if (equipment.cim_client.Get_Command_Result(En_Cim_Command.PTSTR)) { Step = LiftOutSteps.S2200_UNCLAMP; } else { Step = LiftOutSteps.S2110_PORT_STATUS_CIM_SEND; } } break; } case LiftOutSteps.S2200_UNCLAMP: { if (Clamper.IsWorkEnd) { if (Clamper.IsUnclamp) { Step = LiftOutSteps.S2210_STACKER_BACKWARD; } else { Clamper.Unclamp(); } } break; } case LiftOutSteps.S2210_STACKER_BACKWARD: { if (Stacker.IsWorkEnd) { if (Stacker.IsBackward) { Step = LiftOutSteps.S2220_ALIGN_TOP_BACKWARD; } else { Stacker.Backward(); } } break; } case LiftOutSteps.S2220_ALIGN_TOP_BACKWARD: { if (AlignerTop.IsWorkEnd) { if (AlignerTop.IsBackward) { Step = LiftOutSteps.S2300_CONVEYOR_LIFT_SENSOR_CHECK; } else { AlignerTop.Backward(); } } break; } case LiftOutSteps.S2300_CONVEYOR_LIFT_SENSOR_CHECK: { if(_shuttle.IsForwardSensor) { Step = LiftOutSteps.S2400_LIFT_DOWN; } else { if(sequenceChangedTime.Seconds > 10) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0800_ULD_NG_OUT_SHUTTLE_FWD_SENSOR_CHECK); } } break; } case LiftOutSteps.S2310_ALIGN_Y_FORWARD: { Step = LiftOutSteps.S2320_ALIGN_X_BACKWARD; break; } case LiftOutSteps.S2320_ALIGN_X_BACKWARD: { Step = LiftOutSteps.S2400_LIFT_DOWN; break; } case LiftOutSteps.S2400_LIFT_DOWN: { if (MoveStayPosition()) { Step = LiftOutSteps.S2405_LIFT_DOWN_CHECK; } break; } case LiftOutSteps.S2405_LIFT_DOWN_CHECK: { if (sequenceChangedTime.Seconds < 0.5) return; if (MotorZ.MotionComplete) { if (IsStayPosition) { Step = LiftOutSteps.S2420_CONVEYOR_UNLOAD; } else { Interlock_Manager.Add_Interlock_Msg("ULD Tray NG Lift Unloading can't run.", "Position is not wait."); } } break; } case LiftOutSteps.S2420_CONVEYOR_UNLOAD: { if (_shuttle.Backward()) { Step = LiftOutSteps.S2425_CONVEYOR_UNLOAD_CHECK; } break; } case LiftOutSteps.S2425_CONVEYOR_UNLOAD_CHECK: { if(_shuttle.IsWorkEnd) { if(_shuttle.IsBackward) { _trayCount = 0; if (equipment.cim_mode == En_Cim_Mode.Online) { Step = LiftOutSteps.S2500_PORT_STATUS_CIM_SEND; } else { Step = LiftOutSteps.S2999_TRAY_UNLOADING_END; } } else { Step = LiftOutSteps.S2420_CONVEYOR_UNLOAD; } } break; } case LiftOutSteps.S2500_PORT_STATUS_CIM_SEND: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = LiftOutSteps.S2999_TRAY_UNLOADING_END; return; } if (equipment.cim_client.Send_Port_Status("E12345678", En_Port_ID.P04, En_Tray_Code.N, false, En_Port_Status.EMP)) { Step = LiftOutSteps.S2505_PORT_STATUS_CIM_SEND_CHECK; } break; } case LiftOutSteps.S2505_PORT_STATUS_CIM_SEND_CHECK: { if (equipment.cim_mode != En_Cim_Mode.Online) { Step = LiftOutSteps.S2999_TRAY_UNLOADING_END; return; } if (equipment.cim_client.Get_Command_Ack(En_Cim_Command.PTSTR)) { if (equipment.cim_client.Get_Command_Result(En_Cim_Command.PTSTR)) { Step = LiftOutSteps.S2999_TRAY_UNLOADING_END; } else { Step = LiftOutSteps.S2500_PORT_STATUS_CIM_SEND; } } break; } case LiftOutSteps.S2999_TRAY_UNLOADING_END: { _unloadBit = false; _isCoverTraySet = false; equipment.Set_Unload_Tray_Buzzer(true); equipment.UnloaderNgTrayCount = 0; Step = LiftOutSteps.S0000_WAIT; break; } } } public bool SetPanelInfo(bool blank) { if (equipment.Cur_Main_Recipe.tray_info == null) return false; bool check = true; int row = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row; int panel_num = 0; Panel_Info panel = new Panel_Info(); panel.Blank = blank; for (int i = 0; i < row; i++) { for (int j = 1; j <= equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column; j++) { panel_num++; panel.Tray_Num = (equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Tray_Count - equipment.UnloaderNgTrayCount) + 1; panel.Panel_Num = panel_num; panel.Row_Num = i + 1; panel.Column_Num = j; check &= Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, panel); } } return check; } public bool SetTrayId(string tray_id) { if (equipment.Cur_Main_Recipe.tray_info == null) return false; bool check = true; int row = equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row; int panel_num = 0; for (int i = 0; i < row; i++) { for (int j = 1; j <= equipment.Cur_Main_Recipe.tray_info.ULD_Tray_Ng_Row_Data[i].Column; j++) { panel_num++; Panel_Info panel = Panel_Info_Manager.Instance.Get_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, panel_num); panel.Tray_ID = tray_id; check &= Panel_Info_Manager.Instance.Set_Panel_Info(Panel_Info_Names.ULD_Tray_Ng, panel); } } return check; } public bool MoveStayPosition() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Tray_Ng_Z_Wait_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.ULD_Tray_Ng_Z_Wait_Velocity, out value); velocity = double.Parse($"{value}"); return MotorZ.Move_Absolute_Pos(position, velocity); } public bool MoveTrayInPosition(double position) { object value; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.ULD_Tray_Ng_Z_Process_Velocity, out value); velocity = double.Parse($"{value}"); return MotorZ.Move_Absolute_Pos(position, velocity); } public bool Tray_Out() { if (UnitMode == En_Equipment_Mode.Stop) { Step = LiftOutSteps.S2000_TRAY_UNLOADING_START; return true; } else return false; } public void Unload_tray_set() { _unloadBit = true; SetPanelInfo(false); } #endregion } }