using System; using System.Collections.Generic; namespace SHARP_CLAS_UI { public class LoaderConveyorOut : Conveyor { #region Enum #endregion #region Property public ConveyorOutSteps Step { get { return _step; } private set { _step = value; } } public override bool IsWorkEnd { get { if(Step == ConveyorOutSteps.S0000_WAIT) { return true; } else { return false; } } } public override bool IsStayPosition { get { return true; } } #endregion #region Field private ConveyorOutSteps _step; private ConveyorOutSteps _oldStep; private ConveyorHomeStep _homeStep; #endregion #region Construct public LoaderConveyorOut(Equipment equipment) : base(equipment, MotorAxis.LD_Tray_Out_Port, "LoaderConveyorOut") { Initialize(InputData.LD_Tray_Out_Conveyor_In_Sensor, InputData.LD_Tray_Out_Conveyor_In_Complete_Sensor, InputData.LD_Tray_Out_Conveyor_Lift_in_Sensor, InputData.LD_Tray_Out_Conveyor_Lift_in_Complete_Sensor); pauseDisableList.Add(ConveyorOutSteps.S1310_CONVEYOR_COMPLETE_SENSOR_CHECK); pauseDisableList.Add(ConveyorOutSteps.S1320_CONVEYOR_IN_SENSOR_CHECK); pauseDisableList.Add(ConveyorOutSteps.S1400_CONVEYOR_STOP); pauseDisableList.Add(ConveyorOutSteps.S1410_CONVEYOR_STOP_CHECK); AlignerX.Initialize(OutputData.LD_Tray_Out_Align_X_Sol_Valve, InputData.LD_Tray_Out_Align_X_1_Fwd_Sensor, InputData.LD_Tray_Out_Align_X_2_Fwd_Sensor, InputData.LD_Tray_Out_Align_X_1_Bwd_Sensor, InputData.LD_Tray_Out_Align_X_2_Bwd_Sensor, En_Alarm_List.AL_0594_LD_TRAY_OUT_ALIGN_X_1_FWD_SENSOR_CHECK, En_Alarm_List.AL_0595_LD_TRAY_OUT_ALIGN_X_2_FWD_SENSOR_CHECK, En_Alarm_List.AL_0596_LD_TRAY_OUT_ALIGN_X_1_BWD_SENSOR_CHECK, En_Alarm_List.AL_0597_LD_TRAY_OUT_ALIGN_X_2_BWD_SENSOR_CHECK); AlignerY.Initialize(OutputData.LD_Tray_Out_Align_Y_Sol_Valve, InputData.LD_Tray_Out_Align_Y_1_Fwd_Sensor, InputData.LD_Tray_Out_Align_Y_2_Fwd_Sensor, InputData.LD_Tray_Out_Align_Y_1_Bwd_Sensor, InputData.LD_Tray_Out_Align_Y_2_Bwd_Sensor, En_Alarm_List.AL_0598_LD_TRAY_OUT_ALIGN_Y_1_FWD_SENSOR_CHECK, En_Alarm_List.AL_0559_LD_TRAY_IN_ALIGN_Y_2_FWD_SENSOR_CHECK, En_Alarm_List.AL_0600_LD_TRAY_OUT_ALIGN_Y_1_BWD_SENSOR_CHECK, En_Alarm_List.AL_0601_LD_TRAY_OUT_ALIGN_Y_2_BWD_SENSOR_CHECK); MotorX.Check_Jog_Interlock = Jog_Interlock; MotorX.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 < ConveyorOutSteps.S1000_TRAY_UNLOADING_START || ConveyorOutSteps.S1999_TRAY_UNLOADING_END < Step) Step = ConveyorOutSteps.S0000_WAIT; _homeStep = ConveyorHomeStep.S0000_WAIT; } private void ExecuteStepAuto() { if(IsWorkEnd) { if(equipment.Cur_Main_Recipe.tray_info.LD_Tray_Empty_Tray_Count <= equipment.LoaderOutTrayCount) { if(equipment.loader.LiftOut.IsStayPosition) { if(IsLiftInSensor && IsLiftInCompleteSensor) { if(!IsConveyorInCompleteSensor && !IsConveyorInSensor) { Step = ConveyorOutSteps.S1000_TRAY_UNLOADING_START; } } } } } } public override void MonitoringStatus() { if (ConveyorOutSteps.S0000_WAIT <= Step && Step < ConveyorOutSteps.S1300_CONVEYOR_MOVE_OUT) { if (MotorX.MotionComplete == false) Stop(); } else { if (Alarm_Manager.Instance.Occured_List.Exists(X => X.Heavy == true) || Alarm_Manager.Instance.Occured_List.Exists(X => X.Code == En_Alarm_List.AL_0052_LD_LIGHT_CURTAIN_ALARM)) { if (MotorX.MotionComplete == false) { if(Alarm_Manager.Instance.Occured_List.Exists(x => x.Code == En_Alarm_List.AL_0052_LD_LIGHT_CURTAIN_ALARM)) { equipment.Write_Exception_Log($"LD Conveyor Empty Light Curtain!, conveyor sensor : {IsConveyorInSensor}, conveyor in sensor : {IsConveyorInCompleteSensor}"); } Stop(); } } } if (equipment.User.Level != En_User_Level.Master && equipment.Door_Opened) { if (MotorX.MotionComplete == false) { Stop(); } } } public override void ExecuteStep() { if (_oldStep != Step) { sequenceChangedTime.Restart(); _oldStep = Step; WriteSequenceLog(Step.ToString()); } AlignerX.ExecuteProcess(); AlignerY.ExecuteProcess(); //상시 Run. if (UnitMode != En_Equipment_Mode.Home) { UnloadingTray(); AgvUnloading(); } 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; } 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 (equipment.equip_mode == En_Equipment_Mode.Pause) { if (pauseDisableList.Contains(Step) == false) { UnitMode = En_Equipment_Mode.Pause; } } if (UnitMode == En_Equipment_Mode.Auto) { ExecuteStepAuto(); } } } private void Test() { if (UnitMode == En_Equipment_Mode.Stop) { // 장비 Stop시 즉시 전체 스탑 진행. UnitMode = En_Equipment_Mode.Stop; } // 장비상태 home or (장비상태 pause and 유닛 Home) 일시 진행. else if ((equipment.equip_mode == En_Equipment_Mode.Pause || equipment.equip_mode == En_Equipment_Mode.Home) && UnitMode == En_Equipment_Mode.Home) { // 장비 Home시 유닛 홈 진행 완료 확인 후 홈 진행. if (!IsHomeComplete) { } } else if (UnitMode == En_Equipment_Mode.Pause) { // 유닛 Puase 일 때 동작. } else if (UnitMode == En_Equipment_Mode.Auto || UnitMode == En_Equipment_Mode.Manual || UnitMode == En_Equipment_Mode.Pause) { if(UnitMode == En_Equipment_Mode.Auto) { ExecuteStepAuto(); } else if (UnitMode == En_Equipment_Mode.Pause) { UnitMode = En_Equipment_Mode.Pause; } } } public void ExecuteHome() { switch (_homeStep) { case ConveyorHomeStep.S0000_WAIT: { _homeStep = ConveyorHomeStep.S1000_STATUS_CHECK; break; } case ConveyorHomeStep.S1000_STATUS_CHECK: { if (MotorX.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0111_LD_TRAY_OUT_PORT_ERROR_STOP); } else if (MotorX.PowerOn == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0110_LD_TRAY_OUT_PORT_POWER_OFF); } else { _homeStep = ConveyorHomeStep.S1100_CONVEYOR_SENSOR_CHECK; } break; } case ConveyorHomeStep.S1100_CONVEYOR_SENSOR_CHECK: { if (IsConveyorInSensor || IsConveyorInCompleteSensor) { if (IsConveyorInSensor) { Interlock_Manager.Add_Interlock_Msg("LD Conveyor Out Home can't run.", "Conveyor in sensor is detected."); } if (IsConveyorInCompleteSensor) { Interlock_Manager.Add_Interlock_Msg("LD Conveyor Out Home can't run.", "Conveyor in complete sensor is detected."); } } else { _homeStep = ConveyorHomeStep.S1200_LIFT_SENSOR_CHECK; } break; } case ConveyorHomeStep.S1200_LIFT_SENSOR_CHECK: { if (IsLiftInSensor || IsLiftInCompleteSensor) { if (IsLiftInSensor) { Interlock_Manager.Add_Interlock_Msg("LD Conveyor Out Home can't run.", "Lift in sensor is detected."); } if (IsLiftInCompleteSensor) { Interlock_Manager.Add_Interlock_Msg("LD Conveyor Out Home can't run.", "Lift in complete sensor is detected."); } } else { _homeStep = ConveyorHomeStep.S2000_POSITION_CLEAR; } break; } case ConveyorHomeStep.S2000_POSITION_CLEAR: { if (MotorX.Position_Clear()) { _homeStep = ConveyorHomeStep.S9999_END; } break; } case ConveyorHomeStep.S9999_END: { isHomeComplete = true; _homeStep = ConveyorHomeStep.S0000_WAIT; break; } } } public void UnloadingTray() { switch(Step) { case ConveyorOutSteps.S1000_TRAY_UNLOADING_START: { Step = ConveyorOutSteps.S1100_LIFT_POSITION_STAY_CHECK; break; } case ConveyorOutSteps.S1100_LIFT_POSITION_STAY_CHECK: { if(equipment.loader.LiftOut.IsStayPosition) { Step = ConveyorOutSteps.S1110_CONVEYOR_SENSOR_CHECK; } break; } case ConveyorOutSteps.S1110_CONVEYOR_SENSOR_CHECK: { if(IsConveyorInCompleteSensor || IsConveyorInSensor) { if (IsConveyorInSensor) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0590_LD_TRAY_OUT_CONVEYOR_IN_SENSOR_CHECK); } if (IsConveyorInCompleteSensor) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0591_LD_TRAY_OUT_CONVEYOR_IN_COMPLETE_SENSOR_CHECK); } } else { Step = ConveyorOutSteps.S1120_LIFT_SENSOR_CHECK; } break; } case ConveyorOutSteps.S1120_LIFT_SENSOR_CHECK: { if(IsLiftInCompleteSensor || IsLiftInSensor) { Step = ConveyorOutSteps.S1200_ALIGN_X_FWD; } else { Step = ConveyorOutSteps.S1400_CONVEYOR_STOP; } break; } case ConveyorOutSteps.S1200_ALIGN_X_FWD: { if (AlignerX.IsWorkEnd) { if (AlignerX.IsForward) { Step = ConveyorOutSteps.S1220_ALIGN_Y_BWD; } else { AlignerX.Forward(); } } break; } case ConveyorOutSteps.S1220_ALIGN_Y_BWD: { if (AlignerY.IsWorkEnd) { if (AlignerY.IsBackward) { Step = ConveyorOutSteps.S1240_WAIT_TIME; } else { AlignerY.Backward(); } } break; } case ConveyorOutSteps.S1240_WAIT_TIME: { if (sequenceChangedTime.Seconds > 2) { Step = ConveyorOutSteps.S1250_ALIGN_Y_FWD; } break; } case ConveyorOutSteps.S1250_ALIGN_Y_FWD: { if (AlignerY.IsWorkEnd) { if (AlignerY.IsForward) { Step = ConveyorOutSteps.S1270_ALIGN_X_BWD; } else { AlignerY.Forward(); } } break; } case ConveyorOutSteps.S1270_ALIGN_X_BWD: { if (AlignerX.IsWorkEnd) { if (AlignerX.IsBackward) { Step = ConveyorOutSteps.S1300_CONVEYOR_MOVE_OUT; } else { AlignerX.Backward(); } } break; } case ConveyorOutSteps.S1300_CONVEYOR_MOVE_OUT: { if (JogPositive()) { Step = ConveyorOutSteps.S1310_CONVEYOR_COMPLETE_SENSOR_CHECK; } break; } case ConveyorOutSteps.S1310_CONVEYOR_COMPLETE_SENSOR_CHECK: { if (MotorX.MotionComplete) { if (!(Alarm_Manager.Instance.Occured_List.Exists(X => X.Heavy == true) || Alarm_Manager.Instance.Occured_List.Exists(X => X.Code == En_Alarm_List.AL_0052_LD_LIGHT_CURTAIN_ALARM))) { JogPositive(); } } if (IsConveyorInCompleteSensor || IsConveyorInSensor) { Step = ConveyorOutSteps.S1320_CONVEYOR_IN_SENSOR_CHECK; } else if (sequenceChangedTime.Seconds > equipment.Setting.Conveyor_Timeout) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0871_LD_TRAY_OUT_CONVEYOR_TIMEOUT); Step = ConveyorOutSteps.S1400_CONVEYOR_STOP; } break; } case ConveyorOutSteps.S1320_CONVEYOR_IN_SENSOR_CHECK: { if (MotorX.MotionComplete) { if (!(Alarm_Manager.Instance.Occured_List.Exists(X => X.Heavy == true) || Alarm_Manager.Instance.Occured_List.Exists(X => X.Code == En_Alarm_List.AL_0052_LD_LIGHT_CURTAIN_ALARM))) JogPositive(); } if (IsConveyorInSensor || (IsConveyorInCompleteSensor == false && IsConveyorInSensor == false && IsLiftInSensor == false && IsLiftInCompleteSensor == false)) { Step = ConveyorOutSteps.S1400_CONVEYOR_STOP; } else if (sequenceChangedTime.Seconds > equipment.Setting.Conveyor_Timeout) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0871_LD_TRAY_OUT_CONVEYOR_TIMEOUT); Step = ConveyorOutSteps.S1400_CONVEYOR_STOP; } break; } case ConveyorOutSteps.S1400_CONVEYOR_STOP: { if (Stop()) { Step = ConveyorOutSteps.S1410_CONVEYOR_STOP_CHECK; } break; } case ConveyorOutSteps.S1410_CONVEYOR_STOP_CHECK: { if (MotorX.MotionComplete) { Step = ConveyorOutSteps.S1999_TRAY_UNLOADING_END; } else { Step = ConveyorOutSteps.S1400_CONVEYOR_STOP; } break; } case ConveyorOutSteps.S1999_TRAY_UNLOADING_END: { equipment.LoaderOutTrayCount = 0; if (equipment.Mode.Agv_Skip) { equipment.Set_Load_Tray_Buzzer(true); Step = ConveyorOutSteps.S0000_WAIT; } else { Step = ConveyorOutSteps.S2000_AGV_UNLOADING_START; } break; } } } private void AgvUnloading() { switch (Step) { case ConveyorOutSteps.S2000_AGV_UNLOADING_START: { Step = ConveyorOutSteps.S2100_EQP_UNLOAD_ENABLE_ON; break; } case ConveyorOutSteps.S2100_EQP_UNLOAD_ENABLE_ON: { equipment.Board_Control.IO_manager.Set_Output(OutputData.AGV_LD_Out_Request_For_Transfer_LD_ULD, true); Step = ConveyorOutSteps.S2110_EQP_UNLOAD_ENABLE_ON_CHECK; break; } case ConveyorOutSteps.S2110_EQP_UNLOAD_ENABLE_ON_CHECK: { if (equipment.Board_Control.IO_manager.Get_Output(OutputData.AGV_LD_Out_Request_For_Transfer_LD_ULD)) { Step = ConveyorOutSteps.S2120_AGV_UNLOAD_STATUS_ON_CHECK; } else { Step = ConveyorOutSteps.S2100_EQP_UNLOAD_ENABLE_ON; } break; } case ConveyorOutSteps.S2120_AGV_UNLOAD_STATUS_ON_CHECK: { if (equipment.Mode.Agv_Skip) { equipment.Board_Control.IO_manager.Set_Output(OutputData.AGV_LD_Out_Request_For_Transfer_LD_ULD, false); Step = ConveyorOutSteps.S0000_WAIT; } else { if (equipment.Board_Control.IO_manager.Get_Input(InputData.AGV_LD_Out_Moving_Load_Status)) { Step = ConveyorOutSteps.S2130_EQP_UNLOAD_STATUS_ON; } } break; } case ConveyorOutSteps.S2130_EQP_UNLOAD_STATUS_ON: { equipment.Board_Control.IO_manager.Set_Output(OutputData.AGV_LD_Out_Moving_Load_Status, true); Step = ConveyorOutSteps.S0000_WAIT; break; } case ConveyorOutSteps.S2140_EQP_UNLOAD_STATUS_ON_CHECK: { if (equipment.Board_Control.IO_manager.Get_Output(OutputData.AGV_LD_Out_Moving_Load_Status)) { Step = ConveyorOutSteps.S2150_AGV_UNLOAD_ENABLE_CONVEYOR_RUN_ON_CHECK; } else { Step = ConveyorOutSteps.S2130_EQP_UNLOAD_STATUS_ON; } break; } case ConveyorOutSteps.S2150_AGV_UNLOAD_ENABLE_CONVEYOR_RUN_ON_CHECK: { if (equipment.Board_Control.IO_manager.Get_Input(InputData.AGV_LD_Out_Request_For_Transfer_LD_ULD) && equipment.Board_Control.IO_manager.Get_Input(InputData.AGV_LD_Out_Conveyor_In_Operation)) { Step = ConveyorOutSteps.S2200_EQP_CONVEYOR_RUN_ON; } break; } case ConveyorOutSteps.S2200_EQP_CONVEYOR_RUN_ON: { equipment.Board_Control.IO_manager.Set_Output(OutputData.AGV_LD_Out_Conveyor_In_Operation, true); Step = ConveyorOutSteps.S2210_EQP_CONVEYOR_RUN_ON_CHECK; break; } case ConveyorOutSteps.S2210_EQP_CONVEYOR_RUN_ON_CHECK: { if (equipment.Board_Control.IO_manager.Get_Output(OutputData.AGV_LD_Out_Conveyor_In_Operation)) { Step = ConveyorOutSteps.S2220_EQP_UNLOAD_ENABLE_OFF; } else { Step = ConveyorOutSteps.S2200_EQP_CONVEYOR_RUN_ON; } break; } case ConveyorOutSteps.S2220_EQP_UNLOAD_ENABLE_OFF: { equipment.Board_Control.IO_manager.Set_Output(OutputData.AGV_LD_Out_Request_For_Transfer_LD_ULD, false); Step = ConveyorOutSteps.S2230_EQP_UNLOAD_ENABLE_OFF_CHECK; break; } case ConveyorOutSteps.S2230_EQP_UNLOAD_ENABLE_OFF_CHECK: { if (equipment.Board_Control.IO_manager.Get_Output(OutputData.AGV_LD_Out_Request_For_Transfer_LD_ULD) == false) { Step = ConveyorOutSteps.S2240_CONVEYOR_RUN; } else { Step = ConveyorOutSteps.S2220_EQP_UNLOAD_ENABLE_OFF; } break; } case ConveyorOutSteps.S2240_CONVEYOR_RUN: { JogPositive(); Step = ConveyorOutSteps.S2300_AGV_CONVEYOR_RUN_UNLOAD_STATUS_UNLOAD_ENABLE_OFF_CHECK; break; } case ConveyorOutSteps.S2300_AGV_CONVEYOR_RUN_UNLOAD_STATUS_UNLOAD_ENABLE_OFF_CHECK: { if (equipment.Board_Control.IO_manager.Get_Input(InputData.AGV_LD_Out_Moving_Load_Status) == false && equipment.Board_Control.IO_manager.Get_Input(InputData.AGV_LD_Out_Request_For_Transfer_LD_ULD) == false && equipment.Board_Control.IO_manager.Get_Input(InputData.AGV_LD_Out_Conveyor_In_Operation) == false) { Step = ConveyorOutSteps.S2310_CONVEYOR_STOP_CHECK; } break; } case ConveyorOutSteps.S2310_CONVEYOR_STOP_CHECK: { if (MotorX.MotionComplete) { Step = ConveyorOutSteps.S2320_EQP_CONVEYOR_RUN_OFF; } else { Stop(); } break; } case ConveyorOutSteps.S2320_EQP_CONVEYOR_RUN_OFF: { equipment.Board_Control.IO_manager.Set_Output(OutputData.AGV_LD_Out_Conveyor_In_Operation, false); Step = ConveyorOutSteps.S2330_EQP_CONVEYOR_RUN_OFF_CHECK; break; } case ConveyorOutSteps.S2330_EQP_CONVEYOR_RUN_OFF_CHECK: { if (equipment.Board_Control.IO_manager.Get_Output(OutputData.AGV_LD_Out_Conveyor_In_Operation) == false) { Step = ConveyorOutSteps.S2340_EQP_UNLOAD_STATUS_OFF; } else { Step = ConveyorOutSteps.S2320_EQP_CONVEYOR_RUN_OFF; } break; } case ConveyorOutSteps.S2340_EQP_UNLOAD_STATUS_OFF: { equipment.Board_Control.IO_manager.Set_Output(OutputData.AGV_LD_Out_Moving_Load_Status, false); Step = ConveyorOutSteps.S2350_EQP_UNLOAD_STATUS_OFF_CHECK; break; } case ConveyorOutSteps.S2350_EQP_UNLOAD_STATUS_OFF_CHECK: { if (equipment.Board_Control.IO_manager.Get_Output(OutputData.AGV_LD_Out_Moving_Load_Status) == false) { Step = ConveyorOutSteps.S2999_AGV_UNLOADING_END; } else { Step = ConveyorOutSteps.S2340_EQP_UNLOAD_STATUS_OFF; } break; } case ConveyorOutSteps.S2999_AGV_UNLOADING_END: { Step = ConveyorOutSteps.S0000_WAIT; break; } } } public void Unload() { Step = ConveyorOutSteps.S1000_TRAY_UNLOADING_START; } #endregion } }