namespace SHARP_CLAS_UI { public class Picker : VacuumStageCh1 { #region Enum private enum ProcessSteps { Wait, PickerDownSolOn, PickerDownSolOnCheck, PickerDownSensorCheck, PickerDownSolOff, PickerDownSolOffCheck, PickerUpSensorCheck, } #endregion #region Property public bool DownSol { get { return _equip.Board_Control.IO_manager.Get_Output(_pickerDownSol); } set { _equip.Board_Control.IO_manager.Set_Output(_pickerDownSol, value); } } public bool IsUpSensor { get { return _equip.Board_Control.IO_manager.Get_Input(_isUpSensor); } } public bool IsDownSensor { get { return _equip.Board_Control.IO_manager.Get_Input(_isDownSensor); } } public bool IsDown { get { return DownSol && IsDownSensor; } } public bool IsUp { get { return DownSol == false && IsUpSensor; } } public new bool IsWorkEnd { get { if (_step == ProcessSteps.Wait && base.IsWorkEnd) { return true; } else { return false; } } } #endregion #region Field Equipment _equip; private OutputData _pickerDownSol; private InputData _isUpSensor; private InputData _isDownSensor; private En_Alarm_List _pickerUpSensorAlarm; private En_Alarm_List _pickerDownSensorAlarm; private ProcessSteps _step; private SequenceTimer _sequenceTimer; private readonly int _retryLimitCount = 3; private int _retryCount; #endregion #region Construct public Picker(Equipment equip) : base (equip) { _equip = equip; _retryCount = 0; _sequenceTimer = new SequenceTimer(); _step = ProcessSteps.Wait; } #endregion #region Function public void Initialize(OutputData pickerDownSol, InputData isPickerUp, InputData isPickerDown, En_Alarm_List pickerUpSensorAlarm, En_Alarm_List pickerDownSensorAlarm , OutputData vacuumSolOn, OutputData blowSolOn, InputData isVacuumOn, En_Alarm_List vacuumSensorAlarm) { base.Initialize(vacuumSolOn, blowSolOn, isVacuumOn, vacuumSensorAlarm); _pickerDownSol = pickerDownSol; _isUpSensor = isPickerUp; _isDownSensor = isPickerDown; _pickerUpSensorAlarm = pickerUpSensorAlarm; _pickerDownSensorAlarm = pickerDownSensorAlarm; } public new void ExecuteProcess() { base.ExecuteProcess(); switch (_step) { case ProcessSteps.Wait: { break; } case ProcessSteps.PickerDownSolOn: { DownSol = true; _sequenceTimer.Restart(); _step = ProcessSteps.PickerDownSolOnCheck; break; } case ProcessSteps.PickerDownSolOnCheck: { if (DownSol == true) { _retryCount = 0; _sequenceTimer.Restart(); _step = ProcessSteps.PickerDownSensorCheck; } else { if (_sequenceTimer.Seconds > 1) { if (_retryCount < _retryLimitCount) { _retryCount++; _step = ProcessSteps.PickerDownSolOn; } else { _retryCount = 0; Interlock_Manager.Add_Interlock_Msg($"{_pickerDownSol} on fail.", $"{_pickerDownSol} on is fail (retry 3)."); _step = ProcessSteps.Wait; } } } break; } case ProcessSteps.PickerDownSensorCheck: { if (IsDownSensor == true) { _sequenceTimer.Reset(); _step = ProcessSteps.Wait; } else { if (_sequenceTimer.Seconds > _equip.Setting.Cylinder_Timeout) { Alarm_Manager.Instance.Occurred(_pickerDownSensorAlarm); _step = ProcessSteps.Wait; } } break; } case ProcessSteps.PickerDownSolOff: { DownSol = false; _sequenceTimer.Restart(); _step = ProcessSteps.PickerDownSolOffCheck; break; } case ProcessSteps.PickerDownSolOffCheck: { if (DownSol == false) { _retryCount = 0; _sequenceTimer.Restart(); _step = ProcessSteps.PickerUpSensorCheck; } else { if (_sequenceTimer.Seconds > 1) { if (_retryCount < _retryLimitCount) { _retryCount++; _step = ProcessSteps.PickerDownSolOff; } else { _retryCount = 0; Interlock_Manager.Add_Interlock_Msg($"{_pickerDownSol} off fail.", $"{_pickerDownSol} off is fail (retry 3)."); _step = ProcessSteps.Wait; } } } break; } case ProcessSteps.PickerUpSensorCheck: { if (IsUpSensor == true) { _sequenceTimer.Reset(); _step = ProcessSteps.Wait; } else { if (_sequenceTimer.Seconds > _equip.Setting.Cylinder_Timeout) { Alarm_Manager.Instance.Occurred(_pickerUpSensorAlarm); _step = ProcessSteps.Wait; } } break; } } } public bool Up() { if (IsWorkEnd) { if (DownSol == false && IsUpSensor) { if (IsDownSensor) { Alarm_Manager.Instance.Occurred(_pickerDownSensorAlarm); return false; } else { return true; } } else { _step = ProcessSteps.PickerDownSolOff; return true; } } else { return false; } } public bool Down() { if (IsWorkEnd) { if (DownSol && IsDownSensor) { if (IsUpSensor) { Alarm_Manager.Instance.Occurred(_pickerUpSensorAlarm); return false; } else { return true; } } else { _step = ProcessSteps.PickerDownSolOn; return true; } } else { return false; } } #endregion } }