using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using MECF.Framework.Common.Utilities; using CyberX8_RT.Devices.AXIS; using CyberX8_RT.Devices.AXIS.CANOpen; using CyberX8_RT.Devices.YASKAWA; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using MECF.Framework.Common.SubstrateTrackings; namespace CyberX8_RT.Devices.PUF { public class PufFlipAxisInterLock : IAxisInterLock { #region 内部变量 private JetAxisBase _axis; #endregion #region 属性 /// /// 模块名称 /// public string Module { get { return _axis.Module; } } /// /// 子模块名称 /// public string Name { get { return _axis.Name; } } #endregion /// /// 构造函数 /// /// /// public PufFlipAxisInterLock(JetAxisBase axis) { _axis=axis; } /// /// Positon前校验inter lock /// /// /// public bool CheckGotoPosition(string station) { if (!_axis.IsHomed) { LOG.WriteLog(eEvent.ERROR_PUF_NOT_HOME, $"{Module}.{Name}", "axis is not homed, Cannot execute GotoSavedPosition"); return false; } if (!AxisManager.Instance.CheckModuleAxisSwitchOn(Module,Name)) { return false; } PufVacuum _pufVacuum = DEVICE.GetDevice($"{Module}.Vacuum"); bool chuckAWaferPresent = _pufVacuum.ChuckAWaferPresent; bool chuckBWaferPresent = _pufVacuum.ChuckBWaferPresent; JetAxisBase rotationAxis = DEVICE.GetDevice($"{Module}.Rotation"); if(rotationAxis.IsRun) { LOG.WriteLog(eEvent.ERROR_PUF_OTHERAXIS_RUNNING, $"{Module}.{Name}", "rotation is running, Cannot execute GotoSavedPosition"); return false; } JetAxisBase verticalAxis = DEVICE.GetDevice($"{Module}.Vertical"); if (verticalAxis.IsRun) { LOG.WriteLog(eEvent.ERROR_PUF_OTHERAXIS_RUNNING, $"{Module}.{Name}", "vertical is running, Cannot execute GotoSavedPosition"); return false; } double rotationPosition = rotationAxis.MotionData.MotorPosition; double verticalPosition= verticalAxis.MotionData.MotorPosition; //A面存在Wafer同时A面Vacuum is released if(WaferManager.Instance.CheckHasWafer(Module,0)&&_pufVacuum.IsChuckAReleased) { LOG.WriteLog(eEvent.ERROR_PUF_HAS_WAFER, $"{Module}.{Name}", "Side A Has Wafer,Vacuum is Off"); return false; } //B面存在Wafer同时B面Vacuum is released if (WaferManager.Instance.CheckHasWafer(Module, 1) && _pufVacuum.ISChuckBReleased) { LOG.WriteLog(eEvent.ERROR_PUF_HAS_WAFER, $"{Module}.{Name}", "Side B Has Wafer,Vacuum is Off"); return false; } if (chuckAWaferPresent || chuckBWaferPresent)//Wafer Present, { if (verticalAxis.CheckPositionIsEmpty(verticalPosition)) { LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"vertical axis {verticalPosition} is empty, Cannot execute GotoSavedPosition"); return false; } else if (rotationAxis.CheckPositionIsEmpty(rotationPosition)) { LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"rotation axis {rotationPosition} is empty, Cannot execute GotoSavedPosition"); return false; } else if (rotationAxis.CheckPositionIsInStation(rotationPosition, "Flip") && verticalAxis.CheckPositionIsInStation(verticalPosition, "Flip"))//rotation轴和vertical轴同时在Flip,可以使用GotoSavedPosition { return true; } else { LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", $"rotation station {rotationPosition} and vertical station {verticalPosition} not both in Flip Station,Cannot execute GotoSavedPosition"); return false; } } else//Wafer Absent { if (verticalAxis.CheckPositionIsEmpty(verticalPosition)) { LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"vertical {verticalPosition} is empty, Cannot execute GotoSavedPosition"); return false; } else if (verticalAxis.CheckPositionIsInStation(verticalPosition, "Park") || verticalAxis.CheckPositionIsInStation(verticalPosition, "Flip")) //vertical轴在Flip或Park,可以使用GotoSavedPosition { return true; } else { LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", $"wafer absent,vertical station {verticalPosition} not in Park or Flip, Cannot execute GotoSavedPosition"); return false; } } } } }