using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using MECF.Framework.Common.RecipeCenter; using MECF.Framework.Common.Routine; using CyberX8_Core; using CyberX8_RT.Devices.Dryer; using System.Collections.Generic; using MECF.Framework.Common.CommonData.Dryer; using MECF.Framework.Common.CommonData; using MECF.Framework.Common.Alarm; namespace CyberX8_RT.Modules.Dryer { public class DryerRunRecipeRoutine : RoutineBase, IRoutine { #region step enum /// /// 步骤枚举 /// private enum DryerRunRecipeStep { ControlPowerOn, HighOn, Delay, CheckPressureMinimum, DelayCheckPressureWarning, CheckPressureWarning, DelayCheckPressureError, CheckPressureError, DelayRecipeTime, LowerOn, End } #endregion #region 常量 private const int PRESSURE_DELAY = 500; private const string EXHAUST_PRESSURE = "ExhaustPressure"; #endregion #region 内部变量 /// /// 设备对象 /// private DryerDevice _device; /// /// HVD Recipe /// public HvdRecipe _hvdRecipe; /// /// minimum pressure /// private double _minimumPressure = 0; /// /// Check Pressure Warning Delay Second /// private int _pressureCheckWarningHoldoffSeconds; /// /// Warning Pressure value /// private double _pressureCheckWarningMMHG; /// /// Check Pressure Error Delay Second /// private int _pressureCheckErrorHoldoffSeconds; /// /// Error Pressure value /// private double _pressureCheckErrorMMHG; /// /// recipe时长 /// private int _dryProcessTime; /// /// recipe里的DryTime时长 /// public int _recipeDrytime; #endregion #region 属性 /// /// HVD Recipe /// public HvdRecipe HvdRecipe { get { return _hvdRecipe; } } /// /// LotTrack数据 /// #endregion /// /// 构造函数 /// /// public DryerRunRecipeRoutine(string module) : base(module) { } /// /// 中止 /// public void Abort() { Runner.Stop("Manual abort dryer run recipe"); _device.BlowerLowOn(); } /// /// 监控 /// /// public RState Monitor() { Runner.Run(DryerRunRecipeStep.ControlPowerOn, () => _device.PowerControlOn(), () => { return _device.CommonData.PowerControl; }, _delay_1s) .Run(DryerRunRecipeStep.HighOn, () => _device.BlowerHighOn(),()=> { return _device.CommonData.BlowerHigh; }, _delay_1s) .DelayIf(DryerRunRecipeStep.Delay,!_device.Bypass,PRESSURE_DELAY) .RunIf(DryerRunRecipeStep.CheckPressureMinimum, !_device.Bypass, CheckPressureMinimum,_delay_1ms) .Delay(DryerRunRecipeStep.DelayCheckPressureWarning, _pressureCheckWarningHoldoffSeconds * 1000) .Run(DryerRunRecipeStep.CheckPressureWarning, CheckPressureWaring, _delay_1ms) .Delay(DryerRunRecipeStep.DelayCheckPressureError, _pressureCheckErrorHoldoffSeconds * 1000) .Run(DryerRunRecipeStep.CheckPressureError, CheckPressureError, _delay_1ms) .Delay(DryerRunRecipeStep.DelayRecipeTime, _dryProcessTime) .Run(DryerRunRecipeStep.LowerOn, () => _device.BlowerLowOn(), _delay_1ms) .End(DryerRunRecipeStep.End, NullFun, _delay_1ms); return Runner.Status; } /// /// 检验Minimum Pressure /// /// private bool CheckPressureMinimum() { double pressure = _device.CommonData.ExhaustPressure; if(pressure>=_minimumPressure) { NotifyError(eEvent.ERR_DRYER, $"{pressure} is over minimum pressure {_minimumPressure}", 0); _device.BlowerLowOn(); return false; } return true; } /// /// 检验Pressure是否低于Waring /// /// private bool CheckPressureWaring() { double pressure = _device.CommonData.ExhaustPressure; if(pressure > _pressureCheckWarningMMHG) { string str = $"{pressure} is large than waring pressure {_pressureCheckWarningMMHG}"; if (AlarmListManager.Instance.AddWarn(Module, "Exhaust Pressure",str)) { LOG.WriteLog(eEvent.WARN_DRYER, Module,str); } } return true; } /// /// 检验Pressure是否低于Error /// /// private bool CheckPressureError() { double pressure = _device.CommonData.ExhaustPressure; if (pressure > _pressureCheckErrorMMHG) { NotifyError(eEvent.ERR_DRYER, $"{pressure} is large than error pressure {_pressureCheckErrorMMHG}",0); _device.BlowerLowOn(); return false; } return true; } /// /// 启动 /// /// /// public RState Start(params object[] objects) { _hvdRecipe = objects[0] as HvdRecipe; if (_hvdRecipe == null) { NotifyError(eEvent.ERR_DRYER, "recipe is null",-1); return RState.Failed; } _device = DEVICE.GetDevice(Module); _recipeDrytime = _hvdRecipe.DryTime; _pressureCheckWarningHoldoffSeconds = SC.GetValue("Dryer.PressureCheckWarningHoldoffSeconds"); _pressureCheckWarningMMHG = SC.GetValue("Dryer.PressureCheckWarningMMHG"); _pressureCheckErrorHoldoffSeconds = SC.GetValue("Dryer.PressureCheckErrorHoldoffSeconds"); _pressureCheckErrorMMHG = SC.GetValue("Dryer.PressureCheckErrorMMHG"); _minimumPressure = SC.GetValue("Dryer.MinimumPressure"); int dryRecipeTime = _hvdRecipe.DryTime*1000; int processTime= dryRecipeTime-PRESSURE_DELAY- _pressureCheckWarningHoldoffSeconds*1000- _pressureCheckErrorHoldoffSeconds*1000; if(processTime>0) { _dryProcessTime = processTime; } else { _dryProcessTime = 1; } return Runner.Start(Module, "Start run dryer recipe"); } } }