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");
}
}
}
}