EfemAutoMessageProcessor.cs 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. using Aitex.Core.RT.Log;
  2. using Aitex.Core.Util;
  3. using CyberX8_Core;
  4. using CyberX8_RT.Devices.EFEM;
  5. using MECF.Framework.Common.Equipment;
  6. using MECF.Framework.Common.SubstrateTrackings;
  7. using System;
  8. using System.Collections.Concurrent;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace CyberX8_RT.Modules.EFEM
  14. {
  15. public class EfemAutoMessageProcessor
  16. {
  17. #region 内部变量
  18. /// <summary>
  19. /// EFEM对象
  20. /// </summary>
  21. private EfemBase _efem;
  22. /// <summary>
  23. /// 指令
  24. /// </summary>
  25. private ConcurrentQueue<object[]> _commands = new ConcurrentQueue<object[]>();
  26. #endregion
  27. /// <summary>
  28. /// 构造函数
  29. /// </summary>
  30. /// <param name="efem"></param>
  31. public EfemAutoMessageProcessor(EfemBase efem)
  32. {
  33. _efem = efem;
  34. }
  35. /// <summary>
  36. /// 发送指令
  37. /// </summary>
  38. /// <param name="parameters"></param>
  39. public void SendAutoCommandMessage(object[] parameters)
  40. {
  41. EfemEntity.MSG cmd = (EfemEntity.MSG)parameters[0];
  42. ModuleName moduleName = (ModuleName)parameters[1];
  43. if (!IsExistMsg(cmd,moduleName))
  44. {
  45. _commands.Enqueue(parameters);
  46. LOG.WriteLog(eEvent.EV_EFEM_COMMON_INFO, ModuleName.EFEM.ToString(), $"{cmd} command enter queue");
  47. }
  48. }
  49. /// <summary>
  50. /// 是否存在队列
  51. /// </summary>
  52. /// <param name="msg"></param>
  53. /// <returns></returns>
  54. private bool IsExistMsg(EfemEntity.MSG msg,ModuleName moduleName)
  55. {
  56. List<object[]> queues = _commands.ToList();
  57. foreach (var item in queues)
  58. {
  59. EfemEntity.MSG itemMsg = (EfemEntity.MSG)item[0];
  60. ModuleName itemModule = (ModuleName)item[1];
  61. if (itemMsg == msg&&itemModule==moduleName)
  62. {
  63. return true;
  64. }
  65. }
  66. return false;
  67. }
  68. /// <summary>
  69. /// 监控
  70. /// </summary>
  71. public void Monitor()
  72. {
  73. if (Singleton<RouteManager>.Instance.EFEM.RobotStatus != RState.Running)
  74. {
  75. if (Singleton<RouteManager>.Instance.EFEM.RobotStatus==RState.End)
  76. {
  77. if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 0))
  78. {
  79. return;
  80. }
  81. if (_commands.Count > 0 && _commands.TryDequeue(out object[] args))
  82. {
  83. EfemEntity.MSG cmd = (EfemEntity.MSG)args[0];
  84. LOG.WriteLog(eEvent.EV_EFEM_ROBOT, ModuleName.EfemRobot.ToString(), $"execute {cmd}");
  85. ProcessBackroundCommand(cmd, args);
  86. }
  87. }
  88. }
  89. }
  90. /// <summary>
  91. /// 处理指令
  92. /// </summary>
  93. /// <param name="cmd"></param>
  94. /// <param name="args"></param>
  95. private void ProcessBackroundCommand(EfemEntity.MSG cmd, object[] args)
  96. {
  97. switch (cmd)
  98. {
  99. case EfemEntity.MSG.Load:
  100. _efem.Load((ModuleName)args[1]);
  101. break;
  102. case EfemEntity.MSG.Unload:
  103. _efem.Unload((ModuleName)args[1]);
  104. break;
  105. case EfemEntity.MSG.Dock:
  106. _efem.Dock((ModuleName)args[1]);
  107. break;
  108. case EfemEntity.MSG.Undock:
  109. _efem.Undock((ModuleName)args[1]);
  110. break;
  111. case EfemEntity.MSG.Clamp:
  112. _efem.Clamp((ModuleName)args[1], (bool)args[2]);
  113. break;
  114. case EfemEntity.MSG.Unclamp:
  115. _efem.Unclamp((ModuleName)args[1]);
  116. break;
  117. case EfemEntity.MSG.GotoMap:
  118. _efem.GotoMap((ModuleName)args[1], Aitex.Sorter.Common.Hand.Blade1, args[2].ToString());
  119. break;
  120. case EfemEntity.MSG.Map:
  121. _efem.Map((ModuleName)args[1]);
  122. break;
  123. case EfemEntity.MSG.ReadCarrierId:
  124. _efem.ReadCarrierId((ModuleName)args[1]);
  125. break;
  126. case EfemEntity.MSG.WriteCarrierID:
  127. _efem.WriteCarrierId((ModuleName)args[1], (string)args[2]);
  128. break;
  129. case EfemEntity.MSG.ReadTagData:
  130. _efem.ReadCarrierId((ModuleName)args[1]);
  131. break;
  132. case EfemEntity.MSG.WriteTagData:
  133. _efem.WriteCarrierId((ModuleName)args[1], (string)args[2]);
  134. break;
  135. default:
  136. LOG.Write(eEvent.ERR_EFEM_ROBOT, ModuleName.EFEM, $"unprocessed Efem command {cmd}");
  137. break;
  138. }
  139. }
  140. }
  141. }