namespace SHARP_CLAS_UI { public class VacuumStageCh2 { #region Enum private enum ProcessSteps { Wait, BeforeBlowSolOn, BeforeBlowSolOnCheck, BeforeBlowSolOff, BeforeBlowSolOffCheck, VacuumSolOn, VacuumSolOnCheck, IsVacuumSensorCheck, VacuumSolOff, VacuumSolOffCheck, AfterBlowSolOn, AfterBlowSolOnCheck, AfterBlowSolOff, AfterBlowSolOffCheck, IsVacuumOffCheck, } #endregion #region Property public bool VacuumSol1On { get { return _equip.Board_Control.IO_manager.Get_Output(_vacuumSol1On); } set { _equip.Board_Control.IO_manager.Set_Output(_vacuumSol1On, value); } } public bool VacuumSol2On { get { return _equip.Board_Control.IO_manager.Get_Output(_vacuumSol2On); } set { _equip.Board_Control.IO_manager.Set_Output(_vacuumSol2On, value); } } public bool BlowSol1On { get { return _equip.Board_Control.IO_manager.Get_Output(_blowSol1On); } set { _equip.Board_Control.IO_manager.Set_Output(_blowSol1On, value); } } public bool BlowSol2On { get { return _equip.Board_Control.IO_manager.Get_Output(_blowSol2On); } set { _equip.Board_Control.IO_manager.Set_Output(_blowSol2On, value); } } public bool IsVacuum1Sensor { get { return _equip.Board_Control.IO_manager.Get_Input(_isVacuum1On); } } public bool IsVacuum2Sensor { get { return _equip.Board_Control.IO_manager.Get_Input(_isVacuum2On); } } public bool IsVacuumSolOn { get { return VacuumSol1On && VacuumSol2On; } } public bool IsBlowSolOn { get { return BlowSol1On && BlowSol2On; } } public bool IsExist { get { return VacuumSol1On && VacuumSol2On && IsVacuum1Sensor && IsVacuum2Sensor; } } public bool IsWorkEnd { get { if (_step == ProcessSteps.Wait) { return true; } else { return false; } } } #endregion #region Field Equipment _equip; private OutputData _vacuumSol1On; private OutputData _vacuumSol2On; private OutputData _blowSol1On; private OutputData _blowSol2On; private InputData _isVacuum1On; private InputData _isVacuum2On; private En_Alarm_List _vacuumSensor1Alarm; private En_Alarm_List _vacuumSensor2Alarm; private ProcessSteps _step; private SequenceTimer _sequenceTimer; private readonly int _retryLimitCount = 3; private int _retryCount; #endregion #region Construct public VacuumStageCh2(Equipment equip) { _equip = equip; _retryCount = 0; _sequenceTimer = new SequenceTimer(); _step = ProcessSteps.Wait; } #endregion #region Function public void Initialize(OutputData vacuumSol1On, OutputData vacuumSol2On, OutputData blowSol1On, OutputData blowSol2On, InputData isVacuum1On, InputData isVacuum2On, En_Alarm_List vacuumSensor1Alarm, En_Alarm_List vacuumSensor2Alarm) { _vacuumSol1On = vacuumSol1On; _vacuumSol2On = vacuumSol2On; _blowSol1On = blowSol1On; _blowSol2On = blowSol2On; _isVacuum1On = isVacuum1On; _isVacuum2On = isVacuum2On; _vacuumSensor1Alarm = vacuumSensor1Alarm; _vacuumSensor2Alarm = vacuumSensor2Alarm; } public void ExecuteProcess() { switch (_step) { case ProcessSteps.Wait: { break; } case ProcessSteps.BeforeBlowSolOn: { BlowSol1On = true; BlowSol2On = true; _sequenceTimer.Restart(); _step = ProcessSteps.BeforeBlowSolOnCheck; break; } case ProcessSteps.BeforeBlowSolOnCheck: { if (BlowSol1On == true && BlowSol2On == true) { _retryCount = 0; _sequenceTimer.Reset(); _step = ProcessSteps.BeforeBlowSolOff; } else { if (_sequenceTimer.Seconds > 3) { if (_retryCount < _retryLimitCount) { _retryCount++; _step = ProcessSteps.BeforeBlowSolOn; } else { _retryCount = 0; if (BlowSol1On == false) { Interlock_Manager.Add_Interlock_Msg($"{_blowSol1On} on fail.", $"{_blowSol1On} on is fail (retry 3)."); } if (BlowSol2On == false) { Interlock_Manager.Add_Interlock_Msg($"{_blowSol2On} on fail.", $"{_blowSol2On} on is fail (retry 3)."); } _step = ProcessSteps.Wait; } } } break; } case ProcessSteps.BeforeBlowSolOff: { BlowSol1On = false; BlowSol2On = false; _sequenceTimer.Restart(); _step = ProcessSteps.BeforeBlowSolOffCheck; break; } case ProcessSteps.BeforeBlowSolOffCheck: { if (BlowSol1On == false && BlowSol2On == false) { _retryCount = 0; _sequenceTimer.Reset(); _step = ProcessSteps.VacuumSolOn; } else { if (_sequenceTimer.Seconds > 3) { if (_retryCount < _retryLimitCount) { _retryCount++; _step = ProcessSteps.BeforeBlowSolOff; } else { _retryCount = 0; if (BlowSol1On == true) { Interlock_Manager.Add_Interlock_Msg($"{_blowSol1On} off fail.", $"{_blowSol1On} off is fail (retry 3)."); } if (BlowSol2On == false) { Interlock_Manager.Add_Interlock_Msg($"{_blowSol2On} off fail.", $"{_blowSol2On} off is fail (retry 3)."); } _step = ProcessSteps.Wait; } } } break; } case ProcessSteps.VacuumSolOn: { VacuumSol1On = true; VacuumSol2On = true; _sequenceTimer.Restart(); _step = ProcessSteps.VacuumSolOnCheck; break; } case ProcessSteps.VacuumSolOnCheck: { if (VacuumSol1On == true && VacuumSol2On == true) { _retryCount = 0; _sequenceTimer.Restart(); _step = ProcessSteps.IsVacuumSensorCheck; } else { if (_sequenceTimer.Seconds > 3) { if (_retryCount < _retryLimitCount) { _retryCount++; _step = ProcessSteps.VacuumSolOn; } else { _retryCount = 0; if(VacuumSol1On == false) { Interlock_Manager.Add_Interlock_Msg($"{_vacuumSol1On} on fail.", $"{_vacuumSol1On} on is fail (retry 3)."); } if (VacuumSol1On == false) { Interlock_Manager.Add_Interlock_Msg($"{_vacuumSol2On} on fail.", $"{_vacuumSol2On} on is fail (retry 3)."); } _step = ProcessSteps.Wait; } } } break; } case ProcessSteps.IsVacuumSensorCheck: { if (IsVacuum1Sensor == true && IsVacuum2Sensor == true) { _sequenceTimer.Reset(); _step = ProcessSteps.Wait; } else { if (_sequenceTimer.Seconds > _equip.Setting.Vacuum_Timeout) { if(IsVacuum1Sensor == false) { Alarm_Manager.Instance.Occurred(_vacuumSensor1Alarm); } if (IsVacuum2Sensor == false) { Alarm_Manager.Instance.Occurred(_vacuumSensor2Alarm); } _step = ProcessSteps.Wait; } } break; } case ProcessSteps.VacuumSolOff: { VacuumSol1On = false; VacuumSol2On = false; _sequenceTimer.Restart(); _step = ProcessSteps.VacuumSolOffCheck; break; } case ProcessSteps.VacuumSolOffCheck: { if (VacuumSol1On == false && VacuumSol2On == false) { _retryCount = 0; _sequenceTimer.Restart(); _step = ProcessSteps.AfterBlowSolOn; } else { if (_sequenceTimer.Seconds > 3) { if (_retryCount < _retryLimitCount) { _retryCount++; _step = ProcessSteps.VacuumSolOff; } else { _retryCount = 0; if (VacuumSol1On == false) { Interlock_Manager.Add_Interlock_Msg($"{_vacuumSol1On} off fail.", $"{_vacuumSol1On} off is fail (retry 3)."); } if (VacuumSol1On == false) { Interlock_Manager.Add_Interlock_Msg($"{_vacuumSol2On} off fail.", $"{_vacuumSol2On} off is fail (retry 3)."); } _step = ProcessSteps.Wait; } } } break; } case ProcessSteps.AfterBlowSolOn: { BlowSol1On = true; BlowSol2On = true; _sequenceTimer.Restart(); _step = ProcessSteps.AfterBlowSolOnCheck; break; } case ProcessSteps.AfterBlowSolOnCheck: { if (BlowSol1On == true && BlowSol2On == true) { _retryCount = 0; _sequenceTimer.Reset(); _step = ProcessSteps.AfterBlowSolOff; } else { if (_sequenceTimer.Seconds > 3) { if (_retryCount < _retryLimitCount) { _retryCount++; _step = ProcessSteps.AfterBlowSolOn; } else { _retryCount = 0; if (BlowSol1On == false) { Interlock_Manager.Add_Interlock_Msg($"{_blowSol1On} on fail.", $"{_blowSol1On} on is fail (retry 3)."); } if (BlowSol2On == false) { Interlock_Manager.Add_Interlock_Msg($"{_blowSol2On} on fail.", $"{_blowSol2On} on is fail (retry 3)."); } _step = ProcessSteps.Wait; } } } break; } case ProcessSteps.AfterBlowSolOff: { BlowSol1On = false; BlowSol2On = false; _sequenceTimer.Restart(); _step = ProcessSteps.AfterBlowSolOffCheck; break; } case ProcessSteps.AfterBlowSolOffCheck: { if (BlowSol1On == false && BlowSol2On == false) { _retryCount = 0; _sequenceTimer.Reset(); _step = ProcessSteps.IsVacuumOffCheck; } else { if (_sequenceTimer.Seconds > 3) { if (_retryCount < _retryLimitCount) { _retryCount++; _step = ProcessSteps.AfterBlowSolOff; } else { _retryCount = 0; if (BlowSol1On == true) { Interlock_Manager.Add_Interlock_Msg($"{_blowSol1On} off fail.", $"{_blowSol1On} off is fail (retry 3)."); } if (BlowSol2On == false) { Interlock_Manager.Add_Interlock_Msg($"{_blowSol2On} off fail.", $"{_blowSol2On} off is fail (retry 3)."); } _step = ProcessSteps.Wait; } } } break; } case ProcessSteps.IsVacuumOffCheck: { if (IsVacuum1Sensor == false && IsVacuum2Sensor == false) { _sequenceTimer.Reset(); _step = ProcessSteps.Wait; } else { if (_sequenceTimer.Seconds > _equip.Setting.Vacuum_Timeout) { if (IsVacuum1Sensor == true) { Alarm_Manager.Instance.Occurred(_vacuumSensor1Alarm); } if (IsVacuum2Sensor == true) { Alarm_Manager.Instance.Occurred(_vacuumSensor2Alarm); } _step = ProcessSteps.Wait; } } break; } } } public bool VacuumOn() { if (IsWorkEnd) { if (VacuumSol1On && VacuumSol2On && IsVacuum1Sensor && IsVacuum2Sensor) { return true; } else { _step = ProcessSteps.BeforeBlowSolOn; return true; } } else { return false; } } public bool VacuumOff() { if (IsWorkEnd) { if (VacuumSol1On == false && VacuumSol2On == false && IsVacuum1Sensor == false && IsVacuum2Sensor == false) { return true; } else { _step = ProcessSteps.VacuumSolOff; return true; } } else { return false; } } #endregion } }