using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using CyberX8_Core; using CyberX8_RT.Devices.Metal; using CyberX8_RT.Devices.Reservoir; using MECF.Framework.Common.Persistent.Reservoirs; using MECF.Framework.Common.RecipeCenter; using MECF.Framework.Common.Routine; using MECF.Framework.Common.ToolLayout; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Modules.Metal { public class StandardHotInitializeRoutine : RoutineBase, IRoutine { private enum InitializeStep { CheckPowerSupplierConnected, LinmotReset, LinmotResetWait, WHUnclampOn, FlowValveOn, Delay, ManualFlowCheck, AutoFlowCheck, End } #region 内部变量 /// /// 持久化对象 /// private MetalPersistentValue _persistentValue; /// /// 设备对象 /// private StandardHotMetalDevice _metalDevice; /// /// Reservoir Recipe /// private ResRecipe _resRecipe; /// /// Cell Flow Delay Time /// private int _cellFlowFaultHoldOffTime = 5000; /// /// Cell Flow Start Low Limit /// private double _cellFlowStartLowLimit = 3.0; #endregion /// /// 构造函数 /// /// public StandardHotInitializeRoutine(string module) : base(module) { } /// /// 中止 /// public void Abort() { Runner.Stop("Manual Abort"); } /// /// 监控 /// /// public RState Monitor() { Runner.Run(InitializeStep.CheckPowerSupplierConnected, CheckPowerSupplierStatus, _delay_1ms) .Run(InitializeStep.LinmotReset,_metalDevice.ResetLinmot,_delay_1ms) .WaitWithStopCondition(InitializeStep.LinmotResetWait, _metalDevice.CheckLinmotRoutineEnd, _metalDevice.CheckLinmotRoutineError) .Run(InitializeStep.WHUnclampOn,WaferHolderUnclampOn,_delay_1ms) .Run(InitializeStep.FlowValveOn,()=>_metalDevice.SwitchToFlow("",null),_delay_1ms) .Delay(InitializeStep.Delay,_cellFlowFaultHoldOffTime) .RunIf(InitializeStep.ManualFlowCheck,_metalDevice.IsManual,ManualFlowCheck,_delay_1ms) .RunIf(InitializeStep.AutoFlowCheck,_metalDevice.IsAuto,AutoFlowCheck,_delay_1ms) .End(InitializeStep.End, NullFun, _delay_1ms); return Runner.Status; } /// /// 检验Metal A/B 面PowerSupplier通讯状况 /// /// private bool CheckPowerSupplierStatus() { if(!_metalDevice.SideAPowerSupplier.IsConnected) { LOG.WriteLog(eEvent.ERR_METAL, Module, "side A power is not connected"); return false; } if(!_metalDevice.SideBPowerSupplier.IsConnected) { LOG.WriteLog(eEvent.ERR_METAL, Module, "side B power is not connected"); return false; } return true; } /// /// WaferHolder Unclamp on /// /// private bool WaferHolderUnclampOn() { return _metalDevice.WaferHolderClampOff("", null); } /// /// 手动检验Flow /// /// private bool ManualFlowCheck() { if(_metalDevice.MetalDeviceData.CellFlow<_cellFlowStartLowLimit) { LOG.WriteLog(eEvent.ERR_METAL,Module,$"Flow {_metalDevice.MetalDeviceData.CellFlow} is less than {_cellFlowStartLowLimit}"); _metalDevice.SwitchToBypass("", null); _metalDevice.PumpOff(); return false; } return true; } /// /// 自动检验Flow /// /// private bool AutoFlowCheck() { if (_metalDevice.MetalDeviceData.CellFlow < _resRecipe.CAFlowRateErrorLow) { LOG.WriteLog(eEvent.ERR_METAL, Module, $"Flow {_metalDevice.MetalDeviceData.CellFlow} is less than {_resRecipe.CAFlowRateErrorLow}"); return false; } return true; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _persistentValue= (MetalPersistentValue)objs[0]; _metalDevice = DEVICE.GetDevice(Module); _cellFlowFaultHoldOffTime = SC.GetValue("Metal.CellFlowFaultHoldOffTime"); _cellFlowStartLowLimit = SC.GetValue("Metal.CellFlowStartLowLimit"); string reservoir = ReservoirItemManager.Instance.GetReservoirByMetal(Module.ToString()); StandardHotReservoirDevice reservoirDevice = DEVICE.GetDevice(reservoir); if(reservoirDevice==null) { LOG.WriteLog(eEvent.ERR_METAL, Module, $"{reservoir} device is null"); return RState.Failed; } if(reservoirDevice.Recipe==null) { LOG.WriteLog(eEvent.ERR_METAL, Module, $"{reservoir} current recipe is null"); return RState.Failed; } _resRecipe = reservoirDevice.Recipe; return Runner.Start(Module, "Start S&H Initialize"); } } }