using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.CommonData.Loader; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Routine; using CyberX8_Core; using CyberX8_RT.Devices.AXIS.CANOpen; using CyberX8_RT.Devices.Loader; using CyberX8_RT.Modules.Loader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Devices.Loader { public class LoaderLeakFirstFlowTestRoutine : RoutineBase, IRoutine { private enum LeakFlowTestStep { FlowClampOn, VacuumOn, Delay, CheckFlow, ReadFlow, FlowClampOff, VacuumOff, End } #region 内部变量 private LoaderCommonDevice _loaderCommon; private LoaderSideDevice _loaderSideA; private LoaderSideDevice _loaderSideB; private int _checkFlowTime = 10000; private int _delayms = 100; private double _major = 400; private double _minor = 50; private DateTime _dt = DateTime.Now; private List _flowDatas = new List(); #endregion #region 属性 /// /// Flow LotTrackData /// public List FlowLotTrackDatas { get { return _flowDatas; } } #endregion public LoaderLeakFirstFlowTestRoutine(string module) : base(module) { } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(LeakFlowTestStep.FlowClampOn, FlowClampOn, _delay_1ms) .Run(LeakFlowTestStep.VacuumOn, VacuumOn, _delay_1ms) .Delay(LeakFlowTestStep.Delay,_delayms) .Run(LeakFlowTestStep.CheckFlow,CheckFirstFlow,100) .Run(LeakFlowTestStep.ReadFlow,NullFun,CheckComplete,_checkFlowTime,false) .Run(LeakFlowTestStep.FlowClampOff, FlowClampOff, _delay_1ms) .Run(LeakFlowTestStep.VacuumOff, VacuumOff, _delay_1ms) .End(LeakFlowTestStep.End,NullFun); return Runner.Status; } /// /// Flow Clamp off /// /// private bool FlowClampOff() { return _loaderCommon.LeakFlowClampOffAction(); } /// /// Flow Clamp On /// /// private bool FlowClampOn() { return _loaderCommon.LeakFlowClampOnAction(); } /// /// Vacuum On /// /// private bool VacuumOn() { return _loaderCommon.LeakVacuumOnAction(); } /// /// Vacuum Off /// /// private bool VacuumOff() { return _loaderCommon.LeakVacuumOffAction(); } /// /// 确认结束状态 /// /// private bool CheckEndState() { return _loaderCommon.Status == RState.End; } /// /// 确认第一条数据 /// /// private bool CheckFirstFlow() { if (_loaderCommon.CommonData.LeakFlow < _major) { LOG.WriteLog(eEvent.ERR_LOADER, Module.ToString(), $"Flow {_loaderCommon.CommonData.LeakFlow} is less limit {_major}"); return false; } else { _dt = DateTime.Now; _flowDatas.Clear(); AddLotTrackData(); return true; } } /// /// 获取Lot Track数据 /// /// private void AddLotTrackData() { LoaderFlowLotTrackData data = new LoaderFlowLotTrackData(); data.TimeStamp = DateTime.Now; data.Time = data.TimeStamp.ToString("mm:ss"); data.LoaderWHClamped = _loaderCommon.CommonData.WaferHolderClamp; data.LoaderACRSVacuum=_loaderSideA.SideData.CRSVacuum; data.LoaderACRSVacuumAnlg = _loaderSideA.SideData.CRSVacuumValue; data.LoaderBCRSVacuum = _loaderSideB.SideData.CRSVacuum; data.LoaderBCRSVacuumAnlg = _loaderSideB.SideData.CRSVacuumValue; data.EnableFlowClamp = _loaderCommon.CommonData.LeakFlowClamp; data.EnableVacuum = _loaderCommon.CommonData.LeakVacuum; data.FlowValue = _loaderCommon.CommonData.LeakFlow; _flowDatas.Add(data); } /// /// /// /// private bool CheckComplete() { if (DateTime.Now.Subtract(_dt).TotalMilliseconds >= 1000) { double flow = _loaderCommon.CommonData.LeakFlow; _dt = DateTime.Now; AddLotTrackData(); if (flow < _minor) { _loaderCommon.CommonData.FlowValues.AddRange(_flowDatas); _loaderCommon.ExportFlowLotTrackDatas(_flowDatas); return true; } else { return false; } } return false; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _loaderCommon = DEVICE.GetDevice($"{Module}.Common"); _loaderSideA = DEVICE.GetDevice($"{Module}.SideA"); _loaderSideB = DEVICE.GetDevice($"{Module}.SideB"); _loaderCommon.CommonData.FlowValues = new List(); if (SC.ContainsItem($"{Module}.LeakTestCutOffTime")) { _checkFlowTime = SC.GetValue($"{Module}.LeakTestCutOffTime"); } if (SC.ContainsItem($"{Module}.LeakTestLSOKLimit")) { _major = SC.GetValue($"{Module}.LeakTestLSOKLimit"); } if (SC.ContainsItem($"{Module}.LeakTestCutOffValue")) { _minor = SC.GetValue($"{Module}.LeakTestCutOffValue"); } Runner.Start(Module, "LeakFirstFlowTest"); return RState.Running; } } }