using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.RecipeCenter; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using CyberX8_Core; using CyberX8_RT.Devices.LinMot; using CyberX8_RT.Devices.Prewet; using MECF.Framework.Common.Alarm; using MECF.Framework.Common.CommonData; using MECF.Framework.Common.CommonData.Prewet; using MECF.Framework.Common.Persistent.Dryer; using MECF.Framework.Common.Persistent.Prewet; using MECF.Framework.Common.Persistent.Temperature; using MECF.Framework.Common.RecipeCenter; using MECF.Framework.Common.Routine; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using static CyberX8_RT.Modules.Prewet.PrewetKeepWetStateMachine; namespace CyberX8_RT.Modules.Prewet { public class PrewetProcessRoutine : RoutineBase, IRoutine { private enum ProcessStep { Process_Start, Process_StartScanning, Process_WaitPumpOnEnd, Process_WaitFirstScanComplete, Process_WaitScanComplete, Process_Complete, End } #region 内部变量 /// /// prewet设备 /// private PrewetDevice _prewetDevice; /// /// linmot axis /// private LinMotAxis _linMotAxis; /// /// Prewet recipe /// private PwtRecipe _recipe; #endregion /// /// 构造函数 /// /// public PrewetProcessRoutine(string module, LinMotAxis linMotAxis) : base(module) { this._linMotAxis = linMotAxis; } /// /// 中止 /// public void Abort() { _linMotAxis.StopOperation("", null); _prewetDevice.PumpDisableOperation("pump disable", null); Runner.Stop("Manual Abort"); } /// /// 监控 /// /// public RState Monitor() { Runner.Run(ProcessStep.Process_Start, NullFun, _delay_1ms) .Run(ProcessStep.Process_StartScanning, ProcessStartScan, _delay_1ms) .WaitWithStopCondition(ProcessStep.Process_WaitPumpOnEnd, WaitProcessEndStatus, CheckProcessFailedStatus, _delay_60s) .Run(ProcessStep.Process_WaitFirstScanComplete, StartScan, _delay_1ms) .WaitWithStopCondition(ProcessStep.Process_WaitScanComplete, WaitScanComplete, CheckScanStopEnd) .Run(ProcessStep.Process_Complete, ProcessComplete, CheckPumpValveClose,_delay_3s) .End(ProcessStep.End, NullFun, _delay_1ms); return Runner.Status; } /// /// Process Start Scan /// /// private bool ProcessStartScan() { bool result = _linMotAxis.ResetOperation("", false); if (!result) { LOG.WriteLog(eEvent.ERR_PREWET, Module, "reset linmot error"); return false; } _prewetDevice.PrewetPumpData.PumpSpeedAuto = true; //更新Pump status状态 string statusContent = _prewetDevice.PrewetPumpData.PumpStatus ? "On" : "Off"; _prewetDevice.PrewetPumpData.PumpModel = "Auto"; _prewetDevice.PrewetPumpData.PumpStatusContent = $"{_prewetDevice.PrewetPumpData.PumpModel}: {statusContent}"; result = _prewetDevice.PumpSpeed(); if (!result) { LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump speed error"); return false; } bool pumpEnableResult = _prewetDevice.PumpEnableOperation("", null); if (!pumpEnableResult) { LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump enable error"); return false; } return true; } /// /// 等待结束状态 /// /// private bool WaitProcessEndStatus() { if (_prewetDevice.Status == RState.End && _linMotAxis.Status == RState.End) { return true; } return false; } /// /// 检验错误状态 /// /// private bool CheckProcessFailedStatus() { if (_prewetDevice.Status == RState.Failed) { LOG.WriteLog(eEvent.ERR_PREWET, Module, "prewet device status is error"); return true; } if (_linMotAxis.Status == RState.Failed) { LOG.WriteLog(eEvent.ERR_PREWET, Module, "linmot status is error"); return true; } return false; } /// /// 自动调速 /// private bool StartAdjustSpeed() { _prewetDevice.IsStartAutoSpeed = true; return true; } /// /// 开始Scan /// /// /// private bool StartScan() { if (!_linMotAxis.IsHomed) { LOG.WriteLog(eEvent.ERR_PREWET, Module, "limot is not ready"); return false; } if (!_prewetDevice.PrewetPumpData.PumpStatus) { LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump status if off"); return false; } bool result = _linMotAxis.StartPosition("", new object[] { _recipe.NumberOfScans }); if (!result) { _prewetDevice.PumpDisableOperation("pump disable", null); LOG.WriteLog(eEvent.ERR_PREWET, Module, "linmot start scan error"); return false; } return result; } /// /// 等待Scan结束 /// /// /// private bool WaitScanComplete() { //linmot完成一次scan if (_linMotAxis.Status == RState.End) { return true; } return false; } /// /// 检验Prewet停止状态 /// /// private bool CheckScanStopEnd() { if (_linMotAxis.Status == RState.Failed||_linMotAxis.Status==RState.Timeout) { _prewetDevice.PumpDisable(); return true; } if (_prewetDevice.PrewetPumpData.PumpPressureData.IsError) { _linMotAxis.StopOperation("",null); _prewetDevice.PumpDisableOperation("pump disable", null); LOG.WriteLog(eEvent.ERR_PREWET, Module, $"pump pressure status {_prewetDevice.PrewetPumpData.PumpPressureData.Value} is in error"); return true; } if (_prewetDevice.PrewetPumpData.PumpFlowData.IsWarning) { string str = $"pump flow status {_prewetDevice.PrewetPumpData.PumpFlowData.Value} is in warning"; if (AlarmListManager.Instance.AddWarn(Module, "PumpFlow", str)) { LOG.WriteLog(eEvent.WARN_PREWET, Module, str); } } if (_prewetDevice.PrewetPumpData.PumpFlowData.IsError) { LOG.WriteLog(eEvent.ERR_PREWET, Module, $"pump flow status {_prewetDevice.PrewetPumpData.PumpFlowData.Value} is in error"); _linMotAxis.StopOperation("", null); _prewetDevice.PumpDisableOperation("pump disable", null); return true; } if (_prewetDevice.PrewetPumpData.PumpPressureData.IsWarning) { string str = $"pump pressure status is { _prewetDevice.PrewetPumpData.PumpPressureData.Value } in warning"; if (AlarmListManager.Instance.AddWarn(Module, "Pump Pressure", str)) { LOG.WriteLog(eEvent.WARN_PREWET, Module, str); } } return false; } /// /// Process scan完成 /// /// /// private bool ProcessComplete() { //bool result = _prewetDevice.PumpValveClose(); //if (!result) //{ // LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump valve close"); // return false; //} //result = _prewetDevice.PumpDisable(); //if (!result) //{ // LOG.WriteLog(eEvent.ERR_PREWET, Module, "pump enable close"); // return false; //} bool result = _prewetDevice.PumpDisableOperation("pump disable",null); return result; } private bool CheckPumpValveClose() { bool result = !_prewetDevice.PrewetPumpData.PumpValve; return result; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { //清除lotTrack数据 _prewetDevice = DEVICE.GetDevice(Module); _recipe = objs[0] as PwtRecipe; if (_recipe == null) { LOG.WriteLog(eEvent.ERR_PREWET, Module, "recipe is null"); return RState.Failed; } return Runner.Start(Module, "Start Process Recipe"); } } }