using Aitex.Core.RT.Fsm; using Aitex.Core.RT.Routine; using Aitex.Core.Util; using MECF.Framework.Common.Routine; using MECF.Framework.Common.ToolLayout; using PunkHPX8_Core; using PunkHPX8_RT.Modules.PlatingCell; using PunkHPX8_RT.Modules.Reservoir; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Markup; namespace PunkHPX8_RT.Modules { public class ReservoirCellHomeRoutine : RoutineBase, IRoutine { private enum ReservoirStep { ReservoirHome, ReservoirHomeWait, WaitMatcherIdle, CellHome, End, } #region 内部变量 private ReservoirEntity _reservoirEntity; private PlatingCellEntity _platingCellEntity; private string _matcher = ""; #endregion /// /// 构造函数 /// /// public ReservoirCellHomeRoutine(string module) : base(module) { } /// /// 中止 /// public void Abort() { Runner.Stop("Manual abort"); } /// /// 监控 /// /// public RState Monitor() { Runner.RunIf(ReservoirStep.ReservoirHome, _reservoirEntity.IsAuto, ReservoirHome, _delay_1ms) .WaitWithStopConditionIf(ReservoirStep.ReservoirHomeWait,_reservoirEntity.IsAuto,() => { return _reservoirEntity.IsIdle; }, () => { return _reservoirEntity.State != ReservoirState.Initializing && !_reservoirEntity.IsIdle; }) .Wait(ReservoirStep.WaitMatcherIdle,ChechMatcherIdle,_delay_2m) .Run(ReservoirStep.CellHome, MetalsHome, _delay_1ms) .End(ReservoirStep.End, NullFun, _delay_1ms); return Runner.Status; } /// /// Reservoir Home /// /// private bool ReservoirHome() { int reservoirInvoke = _reservoirEntity.Invoke("HomeAll"); return reservoirInvoke==(int)ReservoirMsg.Initialize; } /// /// 检验匹配另一个是否完成Idle /// /// private bool ChechMatcherIdle() { ReservoirItem reservoirItem = ReservoirItemManager.Instance.GetReservoirItem(Module.ToString()); if (reservoirItem == null) { return false; } List platingCellItems = reservoirItem.PlatingCells; if (platingCellItems == null || platingCellItems.Count == 0) { return false; } foreach (PlatingCellItem item in platingCellItems) { if (!item.Installed) { continue; } _platingCellEntity= Singleton.Instance.GetModule(item.ModuleName); _matcher=ModuleMatcherManager.Instance.GetMatcherByModule(item.ModuleName); break; } if (string.IsNullOrEmpty(_matcher)) { return false; } if (ModuleMatcherManager.Instance.IsMatcherFirst(_platingCellEntity.Module.ToString())) { return true; } PlatingCellEntity matherEntity = Singleton.Instance.GetModule(_matcher); if(matherEntity == null) { return true; } if (matherEntity.IsDisable) { return true; } if (!matherEntity.IsAuto) { return true; } if (matherEntity.IsError) { return true; } return matherEntity.IsIdle; } /// /// Metal Home /// /// private bool MetalsHome() { if (_platingCellEntity.IsAuto) { _platingCellEntity.Invoke("HomeAll"); } return true; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _reservoirEntity = Singleton.Instance.GetModule(Module); return Runner.Start(Module.ToString(), "Reservoir PlatingCell Home"); } } }