using Aitex.Core.RT.DataCenter;
using Aitex.Core.RT.Device;
using Aitex.Core.RT.Event;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.OperationCenter;
using Aitex.Core.RT.Routine;
using Aitex.Core.RT.SCCore;
using Aitex.Core.Util;
using MECF.Framework.Common.Beckhoff.ModuleIO;
using MECF.Framework.Common.CommonData.Loader;
using MECF.Framework.Common.TwinCat;
using CyberX8_Core;
using CyberX8_RT.Devices.AXIS.CANOpen;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using MECF.Framework.Common.IOCore;
namespace CyberX8_RT.Devices.Loader
{
public class LoaderCommonDevice : BaseDevice, IDevice
{
private enum LoaderCommonOperation
{
None,
WaferHolderClampOn,
WaferHolderClampOff,
WaferHolderSideABClampOn,
WaferHolderSideABClampOff,
LeakFlowClampOn,
LeakFlowClampOff,
LeakVacuumOn,
LeakVacuumOff,
FlowTest,
StopFlowTest
}
#region 常量
private const string WAFER_HOLDER_PRESENT = "WaferHolderPresent";
private const string WAFER_HOLDER_CLAMP = "WaferHolderClamp";
private const string DRIP_TRAY_FLUID="DripTrayFluid";
private const string WS_SIDE_CLAMP = "WSSideABClamp";
private const string SIDEA_WAFER_HOLDER_CLAMP="SideAWaferHolderClamp";
private const string SIDEB_WAFER_HOLDER_CLAMP = "SideBWaferHolderClamp";
private const string LEAK_FLOW = "LeakFlow";
private const string LEAK_FLOW_CLAMP = "LeakFlowClamp";
private const string LEAK_VACUUM = "LeakVacuum";
private const string LEAK_VACUUM_VALUE = "LeakVacuumValue";
private const string COMMON_DATA = "CommonData";
#endregion
#region 内部变量
///
/// 数据
///
private LoaderCommonData _commonData = new LoaderCommonData();
///
/// 状态
///
private RState _status;
///
/// 当前操作
///
private LoaderCommonOperation _currentOperation;
///
/// Flow LotTrackDatas
///
private List _flowDatas = new List();
#region Routine
///
/// Wafer Holder Side Clamp Routine
///
private LoaderCommonWaferHolderSideClampRoutine _sideClampRoutine;
///
/// Flow Test Routine
///
private LoaderFlowTestRoutine _flowTestRoutine;
#endregion
#endregion
#region 属性
///
/// Flow LotTrackData
///
public List FlowLotTrackDatas { get { return _flowDatas; } }
///
/// 数据
///
public LoaderCommonData CommonData { get { return _commonData; } set { _commonData = value; } }
///
/// 状态
///
public RState Status { get { return _status; } }
#endregion
///
/// 构造函数
///
///
///
public LoaderCommonDevice(string moduleName) : base(moduleName, "Common", "Common", "Common")
{
}
///
/// 初始化
///
///
public bool Initialize()
{
InitializeRoutine();
SubscribeData();
SubscribeValueAction();
InitializeOpertation();
return true;
}
///
/// 初始化Routine
///
private void InitializeRoutine()
{
_sideClampRoutine = new LoaderCommonWaferHolderSideClampRoutine(Module);
_flowTestRoutine = new LoaderFlowTestRoutine(Module);
}
///
/// 订阅数据
///
private void SubscribeData()
{
if(SC.ContainsItem($"{Module}.LeakTestLSOKLimit"))
{
_commonData.LeakMajor = SC.GetValue($"{Module}.LeakTestLSOKLimit");
}
if(SC.ContainsItem($"{Module}.LeakTestCutOffValue"))
{
_commonData.LeakMinor = SC.GetValue($"{Module}.LeakTestCutOffValue");
}
DATA.Subscribe($"{Module}.{COMMON_DATA}", () => _commonData);
DATA.Subscribe($"{Module}.DripTrayFluid", () => _commonData.DripTrayFluid, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.SideAWaferShuttleClamp", () => _commonData.SideAWaferHolderClamp, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.SideBWaferShuttleClamp", () => _commonData.SideBWaferHolderClamp, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.WaferShuttleClamp", () => _commonData.WaferHolderClamp, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.WaferShuttlePresent", () => _commonData.WaferHolderPresent, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.LeakFlow", () => _commonData.LeakFlow, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.LeakFlowClamp", () => _commonData.LeakFlowClamp, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.LeakMinor", () => _commonData.LeakMinor, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.LeakMajor", () => _commonData.LeakMajor, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.LeakVacuum", () => _commonData.LeakVacuum, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.LeakVacuumValue", () => _commonData.LeakVacuumValue, SubscriptionAttribute.FLAG.IgnoreSaveDB);
DATA.Subscribe($"{Module}.LeakStatus", () => _commonData.LeakStatus, SubscriptionAttribute.FLAG.IgnoreSaveDB);
}
///
/// 订阅变量数值发生变化
///
private void SubscribeValueAction()
{
IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", WAFER_HOLDER_PRESENT, UpdateVariableValue);
IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", WAFER_HOLDER_CLAMP, UpdateVariableValue);
IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", DRIP_TRAY_FLUID, UpdateVariableValue);
IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", WS_SIDE_CLAMP, UpdateVariableValue);
IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", SIDEA_WAFER_HOLDER_CLAMP, UpdateVariableValue);
IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", SIDEB_WAFER_HOLDER_CLAMP, UpdateVariableValue);
IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", LEAK_FLOW, UpdateVariableValue);
IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", LEAK_FLOW_CLAMP, UpdateVariableValue);
IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", LEAK_VACUUM, UpdateVariableValue);
IOModuleManager.Instance.SubscribeModuleVariable($"{Module}", LEAK_VACUUM_VALUE, UpdateVariableValue);
}
///
/// 初始化操作
///
private void InitializeOpertation()
{
OP.Subscribe($"{Module}.{Name}.WaferHolderClampOn",(cmd,args)=> { return WaferHolderClampOnAction(); });
OP.Subscribe($"{Module}.{Name}.WaferHolderClampOff",(cmd,args)=> { return WaferHolderClampOffAction(); });
OP.Subscribe($"{Module}.{Name}.WaferHolderSideClampOn", WaferHolderSideClampOnAction);
OP.Subscribe($"{Module}.{Name}.WaferHolderSideClampOff", WaferHolderSideClampOffAction);
OP.Subscribe($"{Module}.{Name}.LeakFlowClampOn", (cmd,args)=> { return LeakFlowClampOnAction(); });
OP.Subscribe($"{Module}.{Name}.LeakFlowClampOff", (cmd, args) => { return LeakFlowClampOffAction(); });
OP.Subscribe($"{Module}.{Name}.LeakVacuumOn", (cmd, args) => { return LeakVacuumOnAction(); });
OP.Subscribe($"{Module}.{Name}.LeakVacuumOff", (cmd, args) => { return LeakVacuumOffAction(); });
OP.Subscribe($"{Module}.Common.StartFlowTest", (cmd, args) => { return StartFlowTestAction(); });
OP.Subscribe($"{Module}.Common.StopFlowTest", (cmd, args) => { return StopFlowTestAction(); });
}
#region Operation
///
/// Wafer Holder Clamp On操作
///
public bool WaferHolderClampOnAction()
{
string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WAFER_HOLDER_CLAMP}");
return IOModuleManager.Instance.WriteIoValue(ioName, true);
}
///
/// Wafer Holder Clamp Off操作
///
public bool WaferHolderClampOffAction()
{
string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{WAFER_HOLDER_CLAMP}");
return IOModuleManager.Instance.WriteIoValue(ioName, false);
}
///
/// Wafer Holder Side Clamp On操作
///
private bool WaferHolderSideClampOnAction(string cmd, object[] args)
{
if (!JudgeRunningState(LoaderCommonOperation.WaferHolderSideABClampOn))
{
_currentOperation = LoaderCommonOperation.WaferHolderSideABClampOn;
_status = _sideClampRoutine.Start(true);
return true;
}
else
{
return false;
}
}
///
/// Wafer Holder Side Clamp Off操作
///
private bool WaferHolderSideClampOffAction(string cmd, object[] args)
{
if (!JudgeRunningState(LoaderCommonOperation.WaferHolderSideABClampOff))
{
_currentOperation = LoaderCommonOperation.WaferHolderSideABClampOff;
_status = _sideClampRoutine.Start(false);
return true;
}
else
{
return false;
}
}
///
/// Leak Flow Clamp On操作
///
public bool LeakFlowClampOnAction()
{
string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{LEAK_FLOW_CLAMP}");
return IOModuleManager.Instance.WriteIoValue(ioName, true);
}
///
/// Leak Flow Clamp Off操作
///
public bool LeakFlowClampOffAction()
{
string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{LEAK_FLOW_CLAMP}");
return IOModuleManager.Instance.WriteIoValue(ioName, false);
}
///
/// Leak Vacuum On操作
///
public bool LeakVacuumOnAction()
{
string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{LEAK_VACUUM}");
return IOModuleManager.Instance.WriteIoValue(ioName, true);
}
///
/// Leak Vacuum Off操作
///
public bool LeakVacuumOffAction()
{
string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{LEAK_VACUUM}");
return IOModuleManager.Instance.WriteIoValue(ioName, false);
}
///
/// FlowTest操作
///
public bool StartFlowTestAction()
{
if (!JudgeRunningState(LoaderCommonOperation.FlowTest))
{
_currentOperation = LoaderCommonOperation.FlowTest;
_status = _flowTestRoutine.Start(false);
return true;
}
else
{
return false;
}
}
///
/// 停止 FlowTest操作
///
public bool StopFlowTestAction()
{
if (_currentOperation==LoaderCommonOperation.FlowTest)
{
_flowTestRoutine.Abort();
_currentOperation = LoaderCommonOperation.None;
_status = RState.End;
return true;
}
else
{
return true;
}
}
///
/// 判定运行状态
///
///
private bool JudgeRunningState(LoaderCommonOperation operation)
{
if (_status == RState.Running)
{
EV.PostAlarmLog($"{Module}.{Name}", eEvent.ERR_LOADER, $"{Module}.{Name} current execute {_currentOperation},cannot {operation}");
return true;
}
return false;
}
#endregion
/// 更新变量数值
///
///
///
private void UpdateVariableValue(string variable, object value)
{
PropertyInfo property = CommonData.GetType().GetProperty(variable);
if (property != null)
{
property.SetValue(CommonData, value);
}
}
///
/// 定时器
///
///
public bool OnTimer()
{
if (_status == RState.Running)
{
if (_currentOperation != LoaderCommonOperation.None)
{
IRoutine routine = GetCurrentRoutine(_currentOperation);
if (routine != null)
{
CheckRoutineState(routine, _currentOperation);
}
else
{
EndOperation(RState.End);
}
}
}
return true;
}
///
/// 获取当前操作对应的Routine
///
///
///
private IRoutine GetCurrentRoutine(LoaderCommonOperation currentOperation)
{
switch (currentOperation)
{
case LoaderCommonOperation.WaferHolderSideABClampOn:
case LoaderCommonOperation.WaferHolderSideABClampOff:
return _sideClampRoutine;
case LoaderCommonOperation.FlowTest:
return _flowTestRoutine;
default:
return null;
}
}
///
/// 检验Routine状态
///
///
///
private void CheckRoutineState(IRoutine routine, LoaderCommonOperation currentOperation)
{
RState state = routine.Monitor();
if (state == RState.End)
{
EndOperation(RState.End);
}
else if (state == RState.Failed || state == RState.Timeout)
{
LOG.WriteLog(eEvent.ERR_LOADER, $"{Module}.{Name}", $"{currentOperation} error");
EndOperation(RState.Failed);
}
}
///
/// 结束操作
///
private void EndOperation(RState state)
{
_status = state;
_currentOperation = LoaderCommonOperation.None;
}
public void ExportFlowLotTrackDatas(List flowDatas)
{
_flowDatas.Clear();
_flowDatas = flowDatas;
}
#region 设备接口
///
/// 监控
///
public void Monitor()
{
}
public void Reset()
{
}
public void Terminate()
{
}
#endregion
}
}