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;
- }
- }
- }
- }
|