CoolBuffer.cs 7.9 KB

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