using Aitex.Core.RT.Log; using Aitex.Core.Util; using CyberX8_Core; using CyberX8_RT.Devices.EFEM; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.SubstrateTrackings; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Modules.EFEM { public class EfemAutoMessageProcessor { #region 内部变量 /// /// EFEM对象 /// private EfemBase _efem; /// /// 指令 /// private ConcurrentQueue _commands = new ConcurrentQueue(); #endregion /// /// 构造函数 /// /// public EfemAutoMessageProcessor(EfemBase efem) { _efem = efem; } /// /// 发送指令 /// /// public void SendAutoCommandMessage(object[] parameters) { EfemEntity.MSG cmd = (EfemEntity.MSG)parameters[0]; ModuleName moduleName = (ModuleName)parameters[1]; if (!IsExistMsg(cmd,moduleName)) { _commands.Enqueue(parameters); LOG.WriteLog(eEvent.EV_EFEM_COMMON_INFO, ModuleName.EFEM.ToString(), $"{cmd} command enter queue"); } } /// /// 是否存在队列 /// /// /// private bool IsExistMsg(EfemEntity.MSG msg,ModuleName moduleName) { List queues = _commands.ToList(); foreach (var item in queues) { EfemEntity.MSG itemMsg = (EfemEntity.MSG)item[0]; ModuleName itemModule = (ModuleName)item[1]; if (itemMsg == msg&&itemModule==moduleName) { return true; } } return false; } /// /// 监控 /// public void Monitor() { if (Singleton.Instance.EFEM.RobotStatus != RState.Running) { if (Singleton.Instance.EFEM.RobotStatus==RState.End) { if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 0)) { return; } if (_commands.Count > 0 && _commands.TryDequeue(out object[] args)) { EfemEntity.MSG cmd = (EfemEntity.MSG)args[0]; LOG.WriteLog(eEvent.EV_EFEM_ROBOT, ModuleName.EfemRobot.ToString(), $"execute {cmd}"); ProcessBackroundCommand(cmd, args); } } } } /// /// 处理指令 /// /// /// private void ProcessBackroundCommand(EfemEntity.MSG cmd, object[] args) { switch (cmd) { case EfemEntity.MSG.Load: _efem.Load((ModuleName)args[1]); break; case EfemEntity.MSG.Unload: _efem.Unload((ModuleName)args[1]); break; case EfemEntity.MSG.Dock: _efem.Dock((ModuleName)args[1]); break; case EfemEntity.MSG.Undock: _efem.Undock((ModuleName)args[1]); break; case EfemEntity.MSG.Clamp: _efem.Clamp((ModuleName)args[1], (bool)args[2]); break; case EfemEntity.MSG.Unclamp: _efem.Unclamp((ModuleName)args[1]); break; case EfemEntity.MSG.GotoMap: _efem.GotoMap((ModuleName)args[1], Aitex.Sorter.Common.Hand.Blade1, args[2].ToString()); break; case EfemEntity.MSG.Map: _efem.Map((ModuleName)args[1]); break; case EfemEntity.MSG.ReadCarrierId: _efem.ReadCarrierId((ModuleName)args[1]); break; case EfemEntity.MSG.WriteCarrierID: _efem.WriteCarrierId((ModuleName)args[1], (string)args[2]); break; case EfemEntity.MSG.ReadTagData: _efem.ReadCarrierId((ModuleName)args[1]); break; case EfemEntity.MSG.WriteTagData: _efem.WriteCarrierId((ModuleName)args[1], (string)args[2]); break; default: LOG.Write(eEvent.ERR_EFEM_ROBOT, ModuleName.EFEM, $"unprocessed Efem command {cmd}"); break; } } } }