| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 | 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 内部变量        /// <summary>        /// EFEM对象        /// </summary>        private EfemBase _efem;        /// <summary>        /// 指令         /// </summary>        private ConcurrentQueue<object[]> _commands = new ConcurrentQueue<object[]>();        #endregion        /// <summary>        /// 构造函数        /// </summary>        /// <param name="efem"></param>        public EfemAutoMessageProcessor(EfemBase efem)        {            _efem = efem;        }        /// <summary>        /// 发送指令        /// </summary>        /// <param name="parameters"></param>        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");            }        }        /// <summary>        /// 是否存在队列        /// </summary>        /// <param name="msg"></param>        /// <returns></returns>        private bool IsExistMsg(EfemEntity.MSG msg,ModuleName moduleName)        {            List<object[]> 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;        }        /// <summary>        /// 监控        /// </summary>        public void Monitor()        {            if (Singleton<RouteManager>.Instance.EFEM.RobotStatus != RState.Running)            {                if (Singleton<RouteManager>.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);                    }                }            }        }        /// <summary>        /// 处理指令        /// </summary>        /// <param name="cmd"></param>        /// <param name="args"></param>        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;            }        }    }}
 |