namespace SHARP_CLAS_UI { public class PickerUnit : StageUnit { #region Enum private enum PickerUnitWork { Wait, PickerDownSolOn, PickerDownSolOnCheck, PickerDownSensorCheck, PickerDownSolOff, PickerDownSolOffCheck, PickerUpSensorCheck, } #endregion #region Property public bool PickerDownSol { get { return _equip.Board_Control.IO_manager.Get_Output(_pickerDownSol); } set { _equip.Board_Control.IO_manager.Set_Output(_pickerDownSol, value); } } public bool IsPickerUp { get { return _equip.Board_Control.IO_manager.Get_Input(_isPickerUp); } } public bool IsPickerDown { get { return _equip.Board_Control.IO_manager.Get_Input(_isPickerDown); } } public bool IsUnitWorkEnd { get { if (_pickerUnitWorking == PickerUnitWork.Wait) { return true; } else { return false; } } } #endregion #region Field Equipment _equip; private OutputData _pickerDownSol; private InputData _isPickerUp; private InputData _isPickerDown; private En_Alarm_List _pickerUpSensorAlarm; private En_Alarm_List _pickerDownSensorAlarm; private PickerUnitWork _pickerUnitWorking; private Time_Checker _sequenceTimer; private readonly int _retryLimitCount = 3; private int _retryCount; #endregion #region Construct public PickerUnit(Equipment equip) : base (equip) { _equip = equip; _retryCount = 0; _sequenceTimer = new Time_Checker(); _pickerUnitWorking = PickerUnitWork.Wait; } #endregion #region Function public void PickerUnitInitialize(OutputData pickerDownSol, InputData isPickerUp, InputData isPickerDown) { _pickerDownSol = pickerDownSol; _isPickerUp = isPickerUp; _isPickerDown = isPickerDown; } public void PickerUnitAlarmInitialize(En_Alarm_List pickerUpSensorAlarm, En_Alarm_List pickerDownSensorAlarm) { _pickerUpSensorAlarm = pickerUpSensorAlarm; _pickerDownSensorAlarm = pickerDownSensorAlarm; } public void PickerUnitLogicWorking() { switch (_pickerUnitWorking) { case PickerUnitWork.Wait: { break; } case PickerUnitWork.PickerDownSolOn: { PickerDownSol = true; _sequenceTimer.Start(); _pickerUnitWorking = PickerUnitWork.PickerDownSolOnCheck; break; } case PickerUnitWork.PickerDownSolOnCheck: { if (PickerDownSol == true) { _retryCount = 0; _sequenceTimer.Start(); _pickerUnitWorking = PickerUnitWork.PickerDownSensorCheck; } else { if (_sequenceTimer.Seconds > 1) { if (_retryCount < _retryLimitCount) { _retryCount++; _pickerUnitWorking = PickerUnitWork.PickerDownSolOn; } else { _retryCount = 0; Interlock_Manager.Add_Interlock_Msg($"{_pickerDownSol} on fail.", $"{_pickerDownSol} on is fail (retry 3)."); _pickerUnitWorking = PickerUnitWork.Wait; } } } break; } case PickerUnitWork.PickerDownSensorCheck: { if (IsPickerDown == true) { _sequenceTimer.Stop(); _pickerUnitWorking = PickerUnitWork.Wait; } else { if (_sequenceTimer.Seconds > _equip.Setting.Cylinder_Timeout) { Alarm_Manager.Instance.Occurred(_pickerDownSensorAlarm); _pickerUnitWorking = PickerUnitWork.Wait; } } break; } case PickerUnitWork.PickerDownSolOff: { PickerDownSol = false; _sequenceTimer.Start(); _pickerUnitWorking = PickerUnitWork.PickerDownSolOffCheck; break; } case PickerUnitWork.PickerDownSolOffCheck: { if (PickerDownSol == false) { _retryCount = 0; _sequenceTimer.Start(); _pickerUnitWorking = PickerUnitWork.PickerUpSensorCheck; } else { if (_sequenceTimer.Seconds > 1) { if (_retryCount < _retryLimitCount) { _retryCount++; _pickerUnitWorking = PickerUnitWork.PickerDownSolOff; } else { _retryCount = 0; Interlock_Manager.Add_Interlock_Msg($"{_pickerDownSol} off fail.", $"{_pickerDownSol} off is fail (retry 3)."); _pickerUnitWorking = PickerUnitWork.Wait; } } } break; } case PickerUnitWork.PickerUpSensorCheck: { if (IsPickerUp == true) { _sequenceTimer.Stop(); _pickerUnitWorking = PickerUnitWork.Wait; } else { if (_sequenceTimer.Seconds > _equip.Setting.Cylinder_Timeout) { Alarm_Manager.Instance.Occurred(_pickerUpSensorAlarm); _pickerUnitWorking = PickerUnitWork.Wait; } } break; } } } /// /// Picker Up 상태 확인, Up 안되어 있을 시 up sequence 동작. /// /// public bool Up() { if (IsUnitWorkEnd) { if (IsPickerUp && PickerDownSol == false) { if(IsPickerDown) { Alarm_Manager.Instance.Occurred(_pickerDownSensorAlarm); return false; } else { return true; } } else { _pickerUnitWorking = PickerUnitWork.PickerDownSolOff; return false; } } else { return false; } } public bool Down() { if (IsUnitWorkEnd) { if(IsPickerDown && PickerDownSol) { if (IsPickerUp) { Alarm_Manager.Instance.Occurred(_pickerUpSensorAlarm); return false; } else { return true; } } else { _pickerUnitWorking = PickerUnitWork.PickerDownSolOn; return false; } } else { return false; } } #endregion } }