using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Utilities; using CyberX8_RT.Devices.AXIS; using CyberX8_RT.Devices.Loader; using CyberX8_RT.Devices.TransPorter; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Devices.PUF { public class PufRotationAxisInterLock : IAxisInterLock { #region 常量 private const string IS_DOOR_OPENED = "IsDoorOpened"; #endregion #region 内部变量 private JetAxisBase _loaderTransporterGantryAxis; private JetAxisBase _axis; #endregion #region 属性 /// /// 模块名称 /// public string Module { get { return _axis.Module; } } /// /// 子模块名称 /// public string Name { get { return _axis.Name; } } #endregion /// /// 构造函数 /// /// /// public PufRotationAxisInterLock(JetAxisBase axis) { _axis = axis; } /// /// 加载LoaderTransporter Gantry轴 /// private void GetLoaderTransporterGantryAxis() { if(_loaderTransporterGantryAxis==null) { _loaderTransporterGantryAxis = DEVICE.GetDevice($"{ModuleName.Transporter2}.Gantry"); } } /// /// GotoPosition检验条件 /// /// /// /// 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; } JetAxisBase flipAxis = DEVICE.GetDevice($"{Module}.Flip"); if (flipAxis.IsRun) { LOG.WriteLog(eEvent.ERROR_PUF_OTHERAXIS_RUNNING, $"{Module}.{Name}", "flip 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 verticalPosition = verticalAxis.MotionData.MotorPosition; bool loaderInstalled = ModuleHelper.IsInstalled(ModuleName.Loader1); JetAxisBase loaderRotationAxis = DEVICE.GetDevice($"{ModuleName.Loader1}.Rotation"); double loaderRotationPosition = loaderInstalled?loaderRotationAxis.MotionData.MotorPosition:0; bool loaderTransporterInstalled = ModuleHelper.IsInstalled(ModuleName.Transporter2); if(loaderTransporterInstalled) { GetLoaderTransporterGantryAxis(); } if (verticalAxis.CheckPositionIsInStation(verticalPosition, "Park"))//vertical轴在Park位置,Loader transporter在Loader右侧,Rotation轴可以GotoSavedPosition { if (loaderTransporterInstalled&&_loaderTransporterGantryAxis.JudgeCompareTargetStation("Loader","Right"))//LoaderTransPorter在Loader的右侧(位置不在Loader),Rotation轴可以GotoSavedPosition { return true; } else if (!loaderTransporterInstalled) { return true; } else { LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", "loader transporter axis is in loader station, Cannot execute GotoSavedPosition"); return false; } } else 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//Vertical轴在Park以外的位置 { if (!loaderInstalled) { return true; } else if (loaderRotationAxis == null || loaderRotationAxis.CheckPositionIsEmpty(loaderRotationPosition)) { LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_EMPTY, $"{Module}.{Name}", $"loader rotation axis {loaderRotationPosition} is empty, Cannot execute GotoSavedPosition"); return false; } else if (loaderRotationAxis.CheckPositionIsInStation(loaderRotationPosition, "TRNPA"))//loader1 rotation轴在TRNPA,Rotation轴只可以在Robot和Park位置 { string selectedItem = station; if (selectedItem.EndsWith("Park") || selectedItem.EndsWith("Robot")) { return true; } else { LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", "vertical can only goto Park or Robot station"); return false; } } else if (loaderRotationAxis.CheckPositionIsInStation(loaderRotationPosition,"LOADA"))//loader1 rotation轴在LOADA,同时Loader1 门已经打开,Rotation轴不可以去Park和Robot位置 { string selectedItem = station; LoaderSideDevice loaderSideDevice = LoadLoaderSideDevice(); if(loaderSideDevice==null) { return true; } if (loaderSideDevice.SideData.DoorLowerUnlocked||loaderSideDevice.SideData.DoorUpperUnlocked) { if (selectedItem.EndsWith("Park") || selectedItem.EndsWith("Robot")) { LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", "loader door open,rotation cannot goto Park or Robot station"); return false; } else { return true; } } else { return true; } } else { return true; } } } /// /// 获取Loader Side设备 /// /// private LoaderSideDevice LoadLoaderSideDevice() { if(Module==ModuleName.PUF1.ToString()) { return DEVICE.GetDevice($"{ModuleName.Loader1}.SideA"); } else { return DEVICE.GetDevice($"{ModuleName.Loader1}.SideB"); } } } }