using System; using System.Collections.Generic; namespace SHARP_CLAS_UI { public class LoaderTrayTransfer : TrayTransfer { #region Property public override bool IsWorkEnd { get { if (Step == TrayTransferSteps.S0000_WAIT) { return true; } else { return false; } } } public override bool IsStayPosition { get { object value; equipment.sm.Get_Value(Position_Parameter_Address.LD_Tray_Tr_X_Empty_Position, out value); var position = double.Parse($"{value}"); return MotorX.Is_Inposition(position, equipment.Setting.Inposition_Offset); } } public bool IsLiftInPosition { get { object value; equipment.sm.Get_Value(Position_Parameter_Address.LD_Tray_Tr_X_In_Position, out value); var position = double.Parse($"{value}"); return MotorX.Is_Inposition(position, equipment.Setting.Inposition_Offset); } } public TrayTransferSteps Step { get { return _step; } set { _step = value; } } #endregion #region Field private TrayTransferSteps _step; private TrayTransferSteps _oldStep; private TrayTransferHomeSteps _homeStep; private SequenceTimer _tactTime = new SequenceTimer(); private string _coverTrayId; #endregion #region Construct public LoaderTrayTransfer(Equipment equipment) : base(equipment, MotorAxis.LD_Tray_TR_X, "LoaderTrayTransfer") { Step = TrayTransferSteps.S0000_WAIT; _oldStep = TrayTransferSteps.S0000_WAIT; Picker.Initialize(OutputData.LD_Tray_TR_Down, InputData.LD_Tray_Transfer_Up_Sensor, InputData.LD_Tray_Transfer_Down_Sensor, En_Alarm_List.AL_0630_LD_TRAY_TR_UP_SENSOR_CHECK, En_Alarm_List.AL_0631_LD_TRAY_TR_DOWN_SENSOR_CHECK, OutputData.LD_Tray_Transfer_Vaccum_On_Sol_Valve, OutputData.LD_Tray_Transfer_Blow_On_Sol_Valve, InputData.LD_Tray_Transfer_Vaccum_On_Check, En_Alarm_List.AL_0632_LD_TRAY_TR_VACUUM_ON_CHECK); MotorX.Check_Jog_Interlock = Jog_Interlock; MotorX.Check_Move_Interlock = Move_Interlock; MotorX.Check_Home_Interlock = Home_Interlock; pauseDisableList.Add(TrayTransferSteps.S1205_MOVE_STAY_POSITION_CHECK); pauseDisableList.Add(TrayTransferSteps.S2205_MOVE_PICK_POSITION_CHECK); pauseDisableList.Add(TrayTransferSteps.S3205_MOVE_PLACE_POSITION_CHECK); _tactTime.Reset(); } #endregion #region Function private bool Home_Interlock() { if (Picker.IsDownSensor) { Interlock_Manager.Add_Interlock_Msg("LD Tray Tr", "Picker is Down, Can't Move."); return true; } return false; } private bool Move_Interlock() { if (Picker.IsDownSensor) { Interlock_Manager.Add_Interlock_Msg("LD Tray Tr", "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 (Picker.IsDownSensor) { Interlock_Manager.Add_Interlock_Msg("LD Tray Tr", "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 = TrayTransferSteps.S0000_WAIT; _homeStep = TrayTransferHomeSteps.S0000_WAIT; _tactTime.Reset(); } public void ExecuteAuto() { if(Step == TrayTransferSteps.S0000_WAIT) { if (IsStayPosition == false) { Step = TrayTransferSteps.S1000_MOVE_STAY_POSITION_START; } else { if (Picker.IsVacuumSensor) { if (equipment.loader.LiftOut.Step == LiftOutSteps.S1400_TRAY_TRANSFER_PLACE_WAIT) { Step = TrayTransferSteps.S3000_PLACE_TRAY_START; } } else { if (equipment.LoaderInTrayCount > 0) { if(equipment.loader.LiftIn.IsWorkEnd) { if (equipment.loader.LiftIn.MotorZ.Is_Inposition(equipment.loader.LiftIn.TrayInPosition, equipment.Setting.Inposition_Offset + equipment.Setting.Tray_Alarm_Range)) { if (equipment.loader.LiftIn.IsFirstTray || equipment.loader.LiftIn.IsPanelEmpty) { Step = TrayTransferSteps.S2000_PICK_TRAY_START; } } } } } } } } public override void MonitoringStatus() { if (UnitMode == En_Equipment_Mode.Auto || UnitMode == En_Equipment_Mode.Manual) { if (IsWorkEnd) { if (Picker.VacuumSolOn) { if (Picker.IsVacuumSensor == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0632_LD_TRAY_TR_VACUUM_ON_CHECK); } } } } if (equipment.User.Level != En_User_Level.Master && equipment.Door_Opened) { if (MotorX.MotionComplete == false) { MotorX.Move_Stop(); } } } public override void ExecuteStep() { if (_oldStep != Step) { sequenceChangedTime.Restart(); _oldStep = Step; WriteSequenceLog(Step.ToString()); } Picker.ExecuteProcess(); 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; } 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(); } MoveStay(); PickTray(); PlaceTray(); } } private void ExecuteHome() { switch(_homeStep) { case TrayTransferHomeSteps.S0000_WAIT: { _homeStep = TrayTransferHomeSteps.S1000_STATUS_CHECK; break; } case TrayTransferHomeSteps.S1000_STATUS_CHECK: { if (MotorX.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0141_LD_TRAY_TR_X_ERROR_STOP); } else if (MotorX.PowerOn == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0140_LD_TRAY_TR_X_POWER_OFF); } else if(Picker.IsUp == false) { Interlock_Manager.Add_Interlock_Msg("LD Tray TR Home can't run.", "Picker is Down."); } else { _homeStep = TrayTransferHomeSteps.S1100_LIFT_LIMIT_SENSOR_CHECK; } break; } case TrayTransferHomeSteps.S1100_LIFT_LIMIT_SENSOR_CHECK: { if(equipment.loader.LiftIn.IsLiftLimitSensor1 || equipment.loader.LiftIn.IsLiftLimitSensor2 || equipment.loader.LiftOut.IsLiftLimitSensor1 || equipment.loader.LiftOut.IsLiftLimitSensor2) { if (equipment.loader.LiftIn.IsLiftLimitSensor1) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0563_LD_TRAY_IN_LIFT_UP_1_1_SENSOR_CHECK); } if (equipment.loader.LiftIn.IsLiftLimitSensor2) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0564_LD_TRAY_IN_LIFT_UP_1_2_SENSOR_CHECK); } if (equipment.loader.LiftOut.IsLiftLimitSensor1) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0603_LD_TRAY_OUT_LIFT_UP_1_1_SENSOR_CHECK); } if (equipment.loader.LiftOut.IsLiftLimitSensor2) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0604_LD_TRAY_OUT_LIFT_UP_1_2_SENSOR_CHECK); } } else { _homeStep = TrayTransferHomeSteps.S2000_X_HOME_START; } break; } case TrayTransferHomeSteps.S2000_X_HOME_START: { if(MotorX.Home()) { homeCheckedTime.Restart(); _homeStep = TrayTransferHomeSteps.S2100_X_HOME_CHECK; } break; } case TrayTransferHomeSteps.S2100_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_0141_LD_TRAY_TR_X_ERROR_STOP); _homeStep = TrayTransferHomeSteps.S0000_WAIT; } } else { _homeStep = TrayTransferHomeSteps.S3000_MOVE_STAY_POSITION; } break; } case TrayTransferHomeSteps.S3000_MOVE_STAY_POSITION: { if(MoveLiftOutPosition()) { homeCheckedTime.Restart(); _homeStep = TrayTransferHomeSteps.S3100_POSITION_CHECK; } break; } case TrayTransferHomeSteps.S3100_POSITION_CHECK: { if (homeCheckedTime.Seconds < 1) return; if (MotorX.ErrorStop) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0141_LD_TRAY_TR_X_ERROR_STOP); _homeStep = TrayTransferHomeSteps.S0000_WAIT; } else if(MotorX.MotionComplete) { if(IsStayPosition) { _homeStep = TrayTransferHomeSteps.S9999_END; } else { Interlock_Manager.Add_Interlock_Msg("LD Tray TR Home can't run.", "Position is not empty."); _homeStep = TrayTransferHomeSteps.S0000_WAIT; } } break; } case TrayTransferHomeSteps.S9999_END: { isHomeComplete = true; _homeStep = TrayTransferHomeSteps.S0000_WAIT; break; } } } private void MoveStay() { switch (Step) { case TrayTransferSteps.S1000_MOVE_STAY_POSITION_START: { Step = TrayTransferSteps.S1100_PICKER_UP; break; } case TrayTransferSteps.S1100_PICKER_UP: { if (Picker.IsWorkEnd) { if (Picker.IsUp) { Step = TrayTransferSteps.S1110_LIFT_LIMIT_SENSOR_CHECK; } else { Picker.Up(); } } break; } case TrayTransferSteps.S1110_LIFT_LIMIT_SENSOR_CHECK: { if (equipment.loader.LiftOut.IsLiftLimitSensor1 || equipment.loader.LiftOut.IsLiftLimitSensor2) { if (equipment.loader.LiftOut.IsLiftLimitSensor1) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0603_LD_TRAY_OUT_LIFT_UP_1_1_SENSOR_CHECK); } if (equipment.loader.LiftOut.IsLiftLimitSensor2) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0604_LD_TRAY_OUT_LIFT_UP_1_2_SENSOR_CHECK); } } else { Step = TrayTransferSteps.S1200_MOVE_STAY_POSITION; } break; } case TrayTransferSteps.S1200_MOVE_STAY_POSITION: { if (MoveLiftOutPosition()) { Step = TrayTransferSteps.S1205_MOVE_STAY_POSITION_CHECK; } break; } case TrayTransferSteps.S1205_MOVE_STAY_POSITION_CHECK: { if(MotorX.MotionComplete) { if (IsStayPosition) { Step = TrayTransferSteps.S1999_MOVE_STAY_POSITION_END; } else { Step = TrayTransferSteps.S1200_MOVE_STAY_POSITION; } } break; } case TrayTransferSteps.S1999_MOVE_STAY_POSITION_END: { Step = TrayTransferSteps.S0000_WAIT; break; } } } private void PickTray() { switch(Step) { case TrayTransferSteps.S2000_PICK_TRAY_START: { _tactTime.Restart(); Step = TrayTransferSteps.S2100_PICKER_UP; break; } case TrayTransferSteps.S2100_PICKER_UP: { if (Picker.IsWorkEnd) { if (Picker.IsUp) { Step = TrayTransferSteps.S2110_LIFT_LIMIT_SENSOR_CHECK; } else { Picker.Up(); } } break; } case TrayTransferSteps.S2110_LIFT_LIMIT_SENSOR_CHECK: { if (equipment.loader.LiftIn.IsLiftLimitSensor1 || equipment.loader.LiftIn.IsLiftLimitSensor2) { if (equipment.loader.LiftIn.IsLiftLimitSensor1) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0563_LD_TRAY_IN_LIFT_UP_1_1_SENSOR_CHECK); } if (equipment.loader.LiftIn.IsLiftLimitSensor2) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0564_LD_TRAY_IN_LIFT_UP_1_2_SENSOR_CHECK); } } else { Step = TrayTransferSteps.S2120_HANDLER_POSITION_CHECK; } break; } case TrayTransferSteps.S2120_HANDLER_POSITION_CHECK: { if (equipment.loader.Handler1.IsMotorXStayPosition && equipment.loader.Handler1.IsMotorYStayPosition) { Step = TrayTransferSteps.S2130_LIFT_IN_SENSOR_CHECK; } break; } case TrayTransferSteps.S2130_LIFT_IN_SENSOR_CHECK: { if (equipment.loader.LiftIn.IsLiftInSensor1 && equipment.loader.LiftIn.IsLiftInSensor2) { Step = TrayTransferSteps.S2200_MOVE_PICK_POSITION; } else { if (equipment.loader.LiftIn.IsLiftInSensor1 == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0565_LD_TRAY_IN_LIFT_UP_2_1_SENSOR_CHECK); } if (equipment.loader.LiftIn.IsLiftInSensor2 == false) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0566_LD_TRAY_IN_LIFT_UP_2_2_SENSOR_CHECK); } } break; } case TrayTransferSteps.S2200_MOVE_PICK_POSITION: { if(MoveLiftInPosition()) { Step = TrayTransferSteps.S2205_MOVE_PICK_POSITION_CHECK; } break; } case TrayTransferSteps.S2205_MOVE_PICK_POSITION_CHECK: { if(MotorX.MotionComplete) { if (IsLiftInPosition) { Step = TrayTransferSteps.S2300_PICKER_DOWN; } else { Step = TrayTransferSteps.S2200_MOVE_PICK_POSITION; } } break; } case TrayTransferSteps.S2300_PICKER_DOWN: { if (Picker.IsWorkEnd) { if (Picker.IsDown) { Step = TrayTransferSteps.S2310_VACUUM_ON; } else { Picker.Down(); } } break; } case TrayTransferSteps.S2310_VACUUM_ON: { if (Picker.IsWorkEnd) { if (Picker.IsVacuumSensor) { Step = TrayTransferSteps.S2320_ALIGN_TOP_BACKWARD; } else { Picker.VacuumOn(); } } break; } case TrayTransferSteps.S2320_ALIGN_TOP_BACKWARD: { if (equipment.loader.LiftIn.AlignerTop.IsWorkEnd) { if (equipment.loader.LiftIn.AlignerTop.IsBackward) { Step = TrayTransferSteps.S2330_STACKER_BACKWARD; } else { equipment.loader.LiftIn.AlignerTop.Backward(); } } break; } case TrayTransferSteps.S2330_STACKER_BACKWARD: { if (equipment.loader.LiftIn.Stacker.IsWorkEnd) { if (equipment.loader.LiftIn.Stacker.IsBackward) { Step = TrayTransferSteps.S2340_UNCLAMP; } else { equipment.loader.LiftIn.Stacker.Backward(); } } break; } case TrayTransferSteps.S2340_UNCLAMP: { if (equipment.loader.LiftIn.Clamper.IsWorkEnd) { if (equipment.loader.LiftIn.Clamper.IsUnclamp) { Step = TrayTransferSteps.S2350_PICKER_UP; } else { equipment.loader.LiftIn.Clamper.Unclamp(); } } break; } case TrayTransferSteps.S2350_PICKER_UP: { if (Picker.IsWorkEnd) { if (Picker.IsUp) { Step = TrayTransferSteps.S2360_VACUUM_CHECK; } else { Picker.Up(); } } break; } case TrayTransferSteps.S2360_VACUUM_CHECK: { if(Picker.IsVacuumSensor) { Step = TrayTransferSteps.S2370_TRAY_COUNT_SET; } else { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0632_LD_TRAY_TR_VACUUM_ON_CHECK); } break; } case TrayTransferSteps.S2370_TRAY_COUNT_SET: { if(equipment.loader.LiftIn.IsFirstTray) { equipment.loader.LiftIn.IsFirstTray = false; } equipment.LoaderInTrayCount = equipment.LoaderInTrayCount - 1; _coverTrayId = equipment.loader.LiftIn.TrayID; Step = TrayTransferSteps.S2999_PICK_TRAY_END; break; } case TrayTransferSteps.S2999_PICK_TRAY_END: { _tactTime.Stop(); Step = TrayTransferSteps.S1000_MOVE_STAY_POSITION_START; break; } } } private void PlaceTray() { switch (Step) { case TrayTransferSteps.S3000_PLACE_TRAY_START: { _tactTime.Restart(); Step = TrayTransferSteps.S3100_PICKER_UP; break; } case TrayTransferSteps.S3100_PICKER_UP: { if (Picker.IsWorkEnd) { if (Picker.IsUp) { Step = TrayTransferSteps.S3110_LIFT_LIMIT_SENSOR_CHECK; } else { Picker.Up(); } } break; } case TrayTransferSteps.S3110_LIFT_LIMIT_SENSOR_CHECK: { if (equipment.loader.LiftOut.IsLiftLimitSensor1 || equipment.loader.LiftOut.IsLiftLimitSensor2) { if (equipment.loader.LiftOut.IsLiftLimitSensor1) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0603_LD_TRAY_OUT_LIFT_UP_1_1_SENSOR_CHECK); } if (equipment.loader.LiftOut.IsLiftLimitSensor2) { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0604_LD_TRAY_OUT_LIFT_UP_1_2_SENSOR_CHECK); } } else { Step = TrayTransferSteps.S3120_HANDLER_POSITION_CHECK; } break; } case TrayTransferSteps.S3120_HANDLER_POSITION_CHECK: { //굳이 ..? 220523 //double position = equipment.loader.Handler1.Get_Position_Y_Stay(); //if (position <= equipment.loader.Handler1.MotorY.Position || equipment.loader.Handler1.MotorY.Is_Inposition(position, equipment.Setting.Inposition_Offset)) //{ // Step = TrayTransferSteps.S3200_MOVE_PLACE_POSITION; //} Step = TrayTransferSteps.S3200_MOVE_PLACE_POSITION; break; } case TrayTransferSteps.S3200_MOVE_PLACE_POSITION: { if (MoveLiftOutPosition()) { Step = TrayTransferSteps.S3205_MOVE_PLACE_POSITION_CHECK; } break; } case TrayTransferSteps.S3205_MOVE_PLACE_POSITION_CHECK: { if (MotorX.MotionComplete) { if (IsStayPosition) { Step = TrayTransferSteps.s3300_ALIGN_TOP_BACKWARD; } else { Step = TrayTransferSteps.S3200_MOVE_PLACE_POSITION; } } break; } case TrayTransferSteps.s3300_ALIGN_TOP_BACKWARD: { if (equipment.loader.LiftOut.AlignerTop.IsWorkEnd) { if (equipment.loader.LiftOut.AlignerTop.IsBackward) { Step = TrayTransferSteps.s3310_STACKER_BACKWARD; } else { equipment.loader.LiftOut.AlignerTop.Backward(); } } break; } case TrayTransferSteps.s3310_STACKER_BACKWARD: { if (equipment.loader.LiftOut.Stacker.IsWorkEnd) { if (equipment.loader.LiftOut.Stacker.IsBackward) { Step = TrayTransferSteps.s3320_UNCLAMP; } else { equipment.loader.LiftOut.Stacker.Backward(); } } break; } case TrayTransferSteps.s3320_UNCLAMP: { if (equipment.loader.LiftOut.Clamper.IsWorkEnd) { if (equipment.loader.LiftOut.Clamper.IsUnclamp) { Step = TrayTransferSteps.S3330_PICKER_DOWN; } else { equipment.loader.LiftOut.Clamper.Unclamp(); } } break; } case TrayTransferSteps.S3330_PICKER_DOWN: { if (Picker.IsWorkEnd) { if (Picker.IsDown) { Step = TrayTransferSteps.S3340_VACUUM_OFF; } else { Picker.Down(); } } break; } case TrayTransferSteps.S3340_VACUUM_OFF: { if (Picker.IsWorkEnd) { if (Picker.VacuumSolOn == false) { Step = TrayTransferSteps.S3350_PICKER_UP; } else { Picker.VacuumOff(); } } break; } case TrayTransferSteps.S3350_PICKER_UP: { if (Picker.IsWorkEnd) { if (Picker.IsUp) { Step = TrayTransferSteps.S3360_VACUUM_CHECK; } else { Picker.Up(); } } break; } case TrayTransferSteps.S3360_VACUUM_CHECK: { if (Picker.IsVacuumSensor == false) { Step = TrayTransferSteps.S3370_TRAY_COUNT_SET; } else { Alarm_Manager.Instance.Occurred(En_Alarm_List.AL_0632_LD_TRAY_TR_VACUUM_ON_CHECK); } break; } case TrayTransferSteps.S3370_TRAY_COUNT_SET: { equipment.LoaderOutTrayCount = equipment.LoaderOutTrayCount + 1; equipment.loader.LiftOut.TrayID = _coverTrayId; Step = TrayTransferSteps.S3999_PLACE_TRAY_END; break; } case TrayTransferSteps.S3999_PLACE_TRAY_END: { _tactTime.Stop(); Step = TrayTransferSteps.S0000_WAIT; break; } } } public bool MoveLiftInPosition() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.LD_Tray_Tr_X_In_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.LD_Tray_Tr_X_In_Velocity, out value); velocity = double.Parse($"{value}"); return MotorX.Move_Absolute_Pos(position, velocity); } public bool MoveLiftOutPosition() { object value; double position; double velocity; equipment.sm.Get_Value(Position_Parameter_Address.LD_Tray_Tr_X_Empty_Position, out value); position = double.Parse($"{value}"); equipment.sm.Get_Value(Position_Parameter_Address.LD_Tray_Tr_X_Empty_Velocity, out value); velocity = double.Parse($"{value}"); return MotorX.Move_Absolute_Pos(position, velocity); } #endregion } }