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.AXIS.Yaskawa;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Devices.PUF
{
public class PufVerticalAxisInterLock : IAxisInterLock
{
#region 内部变量
private JetAxisBase _axis;
#endregion
#region 属性
///
/// 模块名称
///
public string Module { get { return _axis.Module; } }
///
/// 子模块名称
///
public string Name { get { return _axis.Name; } }
#endregion
///
/// 构造函数
///
///
///
public PufVerticalAxisInterLock(JetAxisBase axis)
{
_axis = axis;
}
///
/// GotoPosition条件检验
///
///
///
public bool CheckGotoPosition(string station)
{
if (!_axis.IsHomed)
{
LOG.WriteLog(eEvent.ERROR_PUF_NOT_HOME, $"{Module}.{Name}", "vertical is not home, Cannot execute GotoSavedPosition");
return false;
}
if (!AxisManager.Instance.CheckModuleAxisSwitchOn(Module,Name))
{
return false;
}
JetAxisBase rotationAxis = DEVICE.GetDevice($"{Module}.Rotation");
double rotationCurrentPosition = rotationAxis.MotionData.MotorPosition;
bool loaderInstalled = ModuleHelper.IsInstalled(ModuleName.Loader1);
double loaderRotationCurrentPosition = 0;
JetAxisBase loaderRotationAxis = DEVICE.GetDevice($"{ModuleName.Loader1}.Rotation");
if(loaderInstalled)
{
loaderRotationCurrentPosition=loaderRotationAxis.MotionData.MotorPosition;
}
if (rotationAxis.CheckPositionIsInStation(rotationCurrentPosition, "Park"))//rotation轴在Park位置,Loader1 Rotation轴在TRNPA,Verical轴可以去Park和Robot位置
{
if (!loaderInstalled)
{
return true;
}
else if (loaderRotationAxis.CheckPositionIsEmpty(loaderRotationCurrentPosition))
{
//LOG.WriteLog(eEvent.ERR_PUF, Module, "loader rotation axis is empty, Cannot execute GotoSavedPosition");
//return false;
return true;
}
else if (loaderInstalled&&loaderRotationAxis.CheckPositionIsInStation(loaderRotationCurrentPosition, "TRNPA"))
{
if (station.EndsWith("Park") || station.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 (loaderInstalled && loaderRotationAxis.CheckPositionIsInStation(loaderRotationCurrentPosition, "LOADA"))//rotation轴在Park位置,Loader1 Rotation轴在LOADA,Verical轴不可以去
{
//PUF2 vertical可运动至Park
if((station.EndsWith("Park")||station.EndsWith("Robot"))&&Module==ModuleName.PUF2.ToString())
{
return true;
}
LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", "Loader rotation in LOADA station,Cannot execute GotoSavedPosition");
return false;
}
else
{
LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", $"Loader rotation in {loaderRotationAxis.CurrentStation} station,Cannot execute GotoSavedPosition");
return false;
}
}
else if (rotationAxis.CheckPositionIsInStation(rotationCurrentPosition, "Robot"))//rotation轴在Robot位置,Loader1 Rotation轴在LOADA,Verical轴不可以去
{
if (!loaderInstalled)
{
return true;
}
else if (loaderRotationAxis.CheckPositionIsEmpty(loaderRotationCurrentPosition))
{
//LOG.WriteLog(eEvent.ERR_PUF, Module, "loader rotation axis is empty, Cannot execute GotoSavedPosition");
//return false;
return true;
}
if (loaderInstalled&&loaderRotationAxis.CheckPositionIsInStation(loaderRotationCurrentPosition, "TRNPA"))
{
return true;
}
else
{
LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", "loader rotation axis is not in TRNPA, Cannot execute GotoSavedPosition");
return false;
}
}
else if (rotationAxis.CheckPositionIsEmpty(rotationCurrentPosition))
{
//LOG.WriteLog(eEvent.ERR_PUF, Module, "rotation axis is empty, Cannot execute GotoSavedPosition");
//return false;
return true;
}
else//除Park位置以外,Loader1 Rotation轴在LOADA且Loader Tilt轴在HORIZ,Vertical可以GotoSavedPosition
{
if (!loaderInstalled)
{
return true;
}
else if (loaderInstalled&&loaderRotationAxis.CheckPositionIsInStation(loaderRotationCurrentPosition, "LOADA"))
{
JetAxisBase loaderTiltAAxis = DEVICE.GetDevice($"{ModuleName.Loader1}.TiltA");
JetAxisBase loaderTiltBAxis = DEVICE.GetDevice($"{ModuleName.Loader1}.TiltB");
double loaderTiltAPosition = loaderTiltAAxis.MotionData.MotorPosition;
double loaderTiltBPosition=loaderTiltBAxis.MotionData.MotorPosition;
if (Module == ModuleName.PUF1.ToString())
{
if (loaderTiltAAxis.CheckPositionIsInStation(loaderTiltAPosition, "HORI"))
{
return true;
}
else
{
LOG.WriteLog(eEvent.ERR_AXIS, $"{Module}.{Name}", $"Loader TiltA {loaderTiltAPosition} is not in HORI,Cannot execute GotoSavedPosition");
return false;
}
}
else
{
if (loaderTiltBAxis.CheckPositionIsInStation(loaderTiltBPosition, "HORI"))
{
return true;
}
else
{
LOG.WriteLog(eEvent.ERR_AXIS, $"{Module}.{Name}", $"Loader TiltB {loaderTiltBPosition} is not in HORI,Cannot execute GotoSavedPosition");
return false;
}
}
}
else
{
LOG.WriteLog(eEvent.ERROR_PUF_OTHER_AXIS_STATION, $"{Module}.{Name}", $"Loader Rotation {loaderRotationCurrentPosition} is not in LOADA,Cannot execute GotoSavedPosition");
return false;
}
}
}
}
}