CoolBuffer.cs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.DataCenter;
  3. using Aitex.Core.RT.Device;
  4. using Aitex.Core.RT.Device.Unit;
  5. using Aitex.Core.RT.Event;
  6. using Aitex.Core.RT.OperationCenter;
  7. using Aitex.Core.RT.SCCore;
  8. using MECF.Framework.Common.Equipment;
  9. using MECF.Framework.Common.SubstrateTrackings;
  10. using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.BufferStations;
  11. using System;
  12. using System.Collections.Generic;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Threading.Tasks;
  16. namespace EFEM.RT.Devices
  17. {
  18. public class Buffer : BufferStation
  19. {
  20. //public override int InfoPadCarrierIndex
  21. //{
  22. // get => base.InfoPadCarrierIndex;
  23. // set => base.InfoPadCarrierIndex = value;
  24. //}
  25. private int slotNumber = 25;
  26. public IoSensor BufferInrerlock=null;
  27. //public bool MapError { get; set; }
  28. public string SlotMap
  29. {
  30. get
  31. {
  32. WaferInfo[] wafers = WaferManager.Instance.GetWafers(ModuleHelper.Converter(Name));
  33. string slot = "";
  34. for (int i = 0; i < ValidSlotsNumber; i++)
  35. {
  36. slot += wafers[i].IsEmpty ? "0" : "1";
  37. }
  38. return slot;
  39. }
  40. }
  41. public Buffer(string module, string name,int slotNumber,IoSensor bufferInrerlock ) : base(module, name, slotNumber)
  42. {
  43. this.slotNumber = slotNumber;
  44. if (bufferInrerlock!=null)
  45. BufferInrerlock = bufferInrerlock;
  46. }
  47. private bool _isMapped;
  48. private bool EnableMap { get; set; }
  49. public bool IsNeedMap
  50. { get
  51. {
  52. if (SC.ContainsItem($"System.IsEnableBufferMap"))
  53. return SC.GetValue<bool>($"System.IsEnableBufferMap");
  54. return true;
  55. }
  56. }
  57. public override bool IsMapped
  58. {
  59. get
  60. {
  61. return _isMapped;
  62. }
  63. }
  64. public int ValidSlotsNumber
  65. {
  66. get
  67. {
  68. if (SC.ContainsItem($"System.{Name}SlotCount"))
  69. return SC.GetValue<int>($"System.{Name}SlotCount");
  70. return 25;
  71. }
  72. }
  73. public int waferSize
  74. {
  75. get
  76. {
  77. if (SC.ContainsItem($"System.{Name}WaferSize"))
  78. return SC.GetValue<int>($"System.{Name}WaferSize");
  79. return 8;
  80. }
  81. }
  82. public WaferSize Size
  83. {
  84. get
  85. {
  86. switch (waferSize)
  87. {
  88. case 0:
  89. return WaferSize.WS0;
  90. case 1:
  91. return WaferSize.WS0;
  92. case 2:
  93. return WaferSize.WS2;
  94. case 3:
  95. return WaferSize.WS3;
  96. case 4:
  97. return WaferSize.WS4;
  98. case 5:
  99. return WaferSize.WS5;
  100. case 6:
  101. return WaferSize.WS6;
  102. case 7:
  103. case 8:
  104. return WaferSize.WS8;
  105. case 12:
  106. return WaferSize.WS12;
  107. default:
  108. return WaferSize.WS0;
  109. }
  110. }
  111. }
  112. public override bool Initialize()
  113. {
  114. //DATA.Subscribe($"{Name}.WaferSize", () =>
  115. //{
  116. // CurrentWaferSize = WaferManager.Instance.GetWaferSize(ModuleHelper.Converter(Name), 0);
  117. // return WaferManager.Instance.GetWaferSize(ModuleHelper.Converter(Name), 0).ToString();
  118. //});
  119. //OP.Subscribe($"{Name}.SetWaferSize6", (string cmd, object[] args) =>
  120. //{
  121. // CurrentWaferSize = WaferSize.WS6;
  122. // InfoPadCarrierIndex = 1;
  123. // return true;
  124. //});
  125. //OP.Subscribe($"{Name}.SetWaferSize8", (string cmd, object[] args) =>
  126. //{
  127. // CurrentWaferSize = WaferSize.WS8;
  128. // InfoPadCarrierIndex = 2;
  129. // return true;
  130. //});
  131. //DATA.Subscribe($"System.Enable{Name}Map", () => EnableMap);
  132. DATA.Subscribe($"{Name}.ValidSlotsNumber", () => ValidSlotsNumber);
  133. DATA.Subscribe($"{Name}.WaferSizeByWafer", () => WaferManager.Instance.GetWaferSize(ModuleHelper.Converter(Name), 0));
  134. IsMapped = false; //SC.GetValue<bool>("System.EnableBufferMap");
  135. // IsNeedMap = SC.GetValue<bool>($"System.IsEnableBufferMap");
  136. DATA.Subscribe($"{Name}.BufferQuantity", () => DeviceDefineManager.Instance.GetValue<int>("BufferQuantity") ?? 0);
  137. DATA.Subscribe($"{Name}.BufferSlot", () => DeviceDefineManager.Instance.GetValue<int>("BufferSlot") ?? 0);
  138. return base.Initialize();
  139. }
  140. public override bool IsEnableTransferWafer(out string reason)
  141. {
  142. if (IsNeedMap&& !_isMapped )
  143. {
  144. reason = "not mapped";
  145. EV.PostAlarmLog(Name,$"{Name} not mapped");
  146. return false;
  147. }
  148. if (IsNeedMap && MapError)
  149. {
  150. reason = "MapError";
  151. EV.PostAlarmLog(Name, $"{Name} MapError");
  152. return false;
  153. }
  154. if (BufferInrerlock != null && !BufferInrerlock.Value)
  155. {
  156. reason = $"TM Robot Is Extending to {Name}";
  157. EV.PostAlarmLog(Name, $"TM Robot Is Extending to {Name}");
  158. return false;
  159. }
  160. return base.IsEnableTransferWafer(out reason);
  161. }
  162. public override bool IsEnableMapWafer(out string reason)
  163. {
  164. reason = "Not supported";
  165. if (BufferInrerlock != null && !BufferInrerlock.Value)
  166. {
  167. reason = $"TM Robot Is Extending to {Name}";
  168. EV.PostAlarmLog(Name, $"TM Robot Is Extending to {Name}");
  169. return false;
  170. }
  171. //return false;
  172. return true;
  173. }
  174. public override void OnSlotMapRead(string slotMap)
  175. {
  176. ModuleName module = ModuleHelper.Converter(Name);
  177. for (int i = 0; i <ValidSlotsNumber; i++)
  178. {
  179. // No wafer: "0", Wafer: "1", Crossed:"2", Undefined: "?", Overlapping wafers: "W"
  180. WaferInfo wafer = null;
  181. switch (slotMap[i])
  182. {
  183. case '0':
  184. WaferManager.Instance.DeleteWafer(module, i);
  185. break;
  186. case '1':
  187. wafer = WaferManager.Instance.CreateWafer(module, i, WaferStatus.Normal);
  188. WaferManager.Instance.UpdateWaferSize(module, i, Size);
  189. break;
  190. case '2':
  191. wafer = WaferManager.Instance.CreateWafer(module, i, WaferStatus.Crossed);
  192. WaferManager.Instance.UpdateWaferSize(module, i, Size);
  193. EV.PostAlarmLog("Buffer", $"{module} map crossed wafer on slot:{i + 1}.");
  194. break;
  195. case 'W':
  196. wafer = WaferManager.Instance.CreateWafer(module, i, WaferStatus.Double);
  197. WaferManager.Instance.UpdateWaferSize(module, i, Size);
  198. EV.PostAlarmLog("Buffer", $"{module} map double wafer on slot:{i + 1}.");
  199. break;
  200. case '?':
  201. wafer = WaferManager.Instance.CreateWafer(module, i, WaferStatus.Unknown);
  202. WaferManager.Instance.UpdateWaferSize(module, i, Size);
  203. EV.PostAlarmLog("Buffer", $"{module} map unknown wafer on slot:{i + 1}.");
  204. break;
  205. }
  206. }
  207. if (slotMap.Contains('2') || slotMap.Contains('W') || slotMap.Contains('?'))
  208. MapError = true;
  209. else MapError = false;
  210. _isMapped = true;
  211. }
  212. }
  213. }