IoSmif.cs 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. using Aitex.Core.RT.DataCenter;
  2. using Aitex.Core.RT.Device;
  3. using Aitex.Core.RT.Event;
  4. using Aitex.Core.RT.IOCore;
  5. using Aitex.Core.RT.SCCore;
  6. using MECF.Framework.Common.Device.Bases;
  7. using MECF.Framework.Common.Equipment;
  8. using MECF.Framework.Common.SubstrateTrackings;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using System.Xml;
  15. namespace FurnaceRT.Equipments.Systems
  16. {
  17. public class IoSmif: SMIFBase
  18. {
  19. public IoSmif(string module, XmlElement node, string ioModule = "")
  20. {
  21. base.Module = string.IsNullOrEmpty(node.GetAttribute("module")) ? module : node.GetAttribute("module");
  22. base.Name = node.GetAttribute("id");
  23. base.Display = node.GetAttribute("display");
  24. base.DeviceID = node.GetAttribute("schematicId");
  25. _diPodLockPosition = ParseDiNode("diPodLockPosition", node, ioModule);
  26. _diPodUnlockPosition = ParseDiNode("diPodUnlockPosition", node, ioModule);
  27. _diPodOpenPosition = ParseDiNode("diPodOpenPosition", node, ioModule);
  28. _diPodClosePosition = ParseDiNode("diPodClosePosition", node, ioModule);
  29. _diPodPresence = ParseDiNode("diPodPresence", node, ioModule);
  30. _diZAxisUnloadPosition = ParseDiNode("diZAxisUnloadPosition", node, ioModule);
  31. _diZAxisLoadPosition = ParseDiNode("diZAxisLoadPosition", node, ioModule);
  32. _diZAxisPosition1 = ParseDiNode("diZAxisPosition1", node, ioModule);
  33. _diZAxisPosition2 = ParseDiNode("diZAxisPosition2", node, ioModule);
  34. _diRotateAxisCheck1 = ParseDiNode("diRotateAxisCheck1", node, ioModule);
  35. _diRotateAxisCheck2 = ParseDiNode("diRotateAxisCheck2", node, ioModule);
  36. _diSlideAxisExtend = ParseDiNode("diSlideAxisExtend", node, ioModule);
  37. _diSlideAxisRetract = ParseDiNode("diSlideAxisRetract", node, ioModule);
  38. _diProtrudedWafer = ParseDiNode("diProtrudedWafer", node, ioModule);
  39. _diMapping = ParseDiNode("diMapping", node, ioModule);
  40. _diFfuOK = ParseDiNode("diFfuOK", node, ioModule);
  41. _diPodLockValveFB = ParseDiNode("diPodLockValveFB", node, ioModule);
  42. _diPodUnlockValveFB = ParseDiNode("diPodUnlockValveFB", node, ioModule);
  43. _diPodOpenVavleFB = ParseDiNode("diPodOpenVavleFB", node, ioModule);
  44. _diPodCloseVavleFB = ParseDiNode("diPodCloseVavleFB", node, ioModule);
  45. _diRotateArmValve1FB = ParseDiNode("diRotateArmValve1FB", node, ioModule);
  46. _diRotateArmValve2FB = ParseDiNode("diRotateArmValve2FB", node, ioModule);
  47. _diSlideArmValve1FB = ParseDiNode("diSlideArmValve1FB", node, ioModule);
  48. _diSlideArmValve2FB = ParseDiNode("diSlideArmValve2FB", node, ioModule);
  49. _diSmifCassettePresence = ParseDiNode("diSmifCassettePresence", node, ioModule);
  50. _diSmifReady = ParseDiNode("diSmifReady", node, ioModule);
  51. _diSmifHomed = ParseDiNode("diSmifHomed", node, ioModule);
  52. _diRobotNotExtendToSmif = ParseDiNode("diRobotNotExtendToSmif", node, ioModule);
  53. _doPodLockValve = ParseDoNode("doPodLockValve", node, ioModule);
  54. _doPodUnlockValve = ParseDoNode("doPodUnlockValve", node, ioModule);
  55. _doPodOpenVavle = ParseDoNode("doPodOpenVavle", node, ioModule);
  56. _doPodCloseVavle = ParseDoNode("doPodCloseVavle", node, ioModule);
  57. _doRotateArmValve1 = ParseDoNode("doRotateArmValve1", node, ioModule);
  58. _doRotateArmValve2 = ParseDoNode("doRotateArmValve2", node, ioModule);
  59. _doSlideArmValve1 = ParseDoNode("doSlideArmValve1", node, ioModule);
  60. _doSlideArmValve2 = ParseDoNode("doSlideArmValve2", node, ioModule);
  61. _doZAxisBK = ParseDoNode("doZAxisBK", node, ioModule);
  62. _doLoadSmif = ParseDoNode("doLoadSmif", node, ioModule);
  63. _doUnloadSmif = ParseDoNode("doUnloadSmif", node, ioModule);
  64. _doInitSmif = ParseDoNode("doInitSmif", node, ioModule);
  65. _doStopSmif = ParseDoNode("doStopSmif", node, ioModule);
  66. }
  67. #region fields
  68. private DIAccessor _diPodLockPosition;
  69. private DIAccessor _diPodUnlockPosition;
  70. private DIAccessor _diPodOpenPosition;
  71. private DIAccessor _diPodClosePosition;
  72. private DIAccessor _diPodPresence;
  73. private DIAccessor _diZAxisUnloadPosition;
  74. private DIAccessor _diZAxisLoadPosition;
  75. private DIAccessor _diZAxisPosition1;
  76. private DIAccessor _diZAxisPosition2;
  77. private DIAccessor _diRotateAxisCheck1;
  78. private DIAccessor _diRotateAxisCheck2;
  79. private DIAccessor _diSlideAxisExtend;
  80. private DIAccessor _diSlideAxisRetract;
  81. private DIAccessor _diProtrudedWafer;
  82. private DIAccessor _diMapping;
  83. private DIAccessor _diFfuOK;
  84. private DIAccessor _diPodLockValveFB;
  85. private DIAccessor _diPodUnlockValveFB;
  86. private DIAccessor _diPodOpenVavleFB;
  87. private DIAccessor _diPodCloseVavleFB;
  88. private DIAccessor _diRotateArmValve1FB;
  89. private DIAccessor _diRotateArmValve2FB;
  90. private DIAccessor _diSlideArmValve1FB;
  91. private DIAccessor _diSlideArmValve2FB;
  92. private DIAccessor _diSmifCassettePresence;
  93. private DIAccessor _diSmifReady;
  94. private DIAccessor _diSmifHomed;
  95. private DIAccessor _diRobotNotExtendToSmif;
  96. private DOAccessor _doPodLockValve;
  97. private DOAccessor _doPodUnlockValve;
  98. private DOAccessor _doPodOpenVavle;
  99. private DOAccessor _doPodCloseVavle;
  100. private DOAccessor _doRotateArmValve1;
  101. private DOAccessor _doRotateArmValve2;
  102. private DOAccessor _doSlideArmValve1;
  103. private DOAccessor _doSlideArmValve2;
  104. private DOAccessor _doZAxisBK;
  105. private DOAccessor _doLoadSmif;
  106. private DOAccessor _doUnloadSmif;
  107. private DOAccessor _doInitSmif;
  108. private DOAccessor _doStopSmif;
  109. #endregion
  110. #region properties
  111. //public override bool IsPodPresent => _diPodPresence.Value && _diSmifCassettePresence.Value && !_diProtrudedWafer.Value;
  112. public override bool IsPodPresent => _diPodPresence.Value;
  113. public override bool IsIdle => _diSmifReady.Value;
  114. public override bool IsHomed => _diSmifHomed.Value;
  115. public string CurrentLotId { get; set; }
  116. public List<string> WaitLotId { get; set; }
  117. public bool IsRobotNotExtendTo => _diRobotNotExtendToSmif.Value;
  118. public override bool IsLoaded => _diZAxisLoadPosition.Value && _diSlideAxisExtend.Value;
  119. public override bool IsUnloaded => _diZAxisUnloadPosition.Value && _diSlideAxisRetract.Value;
  120. public override bool IsExtend => _diSlideAxisExtend.Value;
  121. public override bool IsRetract => _diSlideAxisRetract.Value;
  122. #endregion
  123. public override bool Initialize()
  124. {
  125. CarrierManager.Instance.SubscribeLocation(Name, 1, SC.GetValue<int>("System.CassetteSlotCount"));
  126. WaferManager.Instance.SubscribeLocation(Name, SC.GetValue<int>("System.CassetteSlotCount"));
  127. //CarrierManager.Instance.CreateCarrier(Name);
  128. //DATA.Subscribe($"{Name}.CurrentLotId", () => CurrentLotId);
  129. //DATA.Subscribe($"{Name}.WaitLotId", () => WaitLotId);
  130. MappingResult = new List<string>();
  131. return true;
  132. }
  133. public override void Monitor()
  134. {
  135. base.Monitor();
  136. }
  137. public override void Reset()
  138. {
  139. base.Reset();
  140. }
  141. public override void Terminate()
  142. {
  143. base.Terminate();
  144. }
  145. public override bool HomeSmif(out string reason)
  146. {
  147. reason = string.Empty;
  148. if(!IsIdle)
  149. {
  150. reason = $"{Name} is busy";
  151. return false;
  152. }
  153. _doInitSmif.SetPulseValue(true, 2000);
  154. return true;
  155. }
  156. public override bool LoadCassette(out string reason)
  157. {
  158. reason = string.Empty;
  159. //if (!IsIdle)
  160. //{
  161. // reason = $"{Name} is busy";
  162. // return false;
  163. //}
  164. _doLoadSmif.SetPulseValue(true, 2000);
  165. return true;
  166. }
  167. public override bool UnloadCassette(out string reason)
  168. {
  169. reason = string.Empty;
  170. //if (!IsIdle)
  171. //{
  172. // reason = $"{Name} is busy";
  173. // return false;
  174. //}
  175. _doUnloadSmif.SetPulseValue(true, 2000);
  176. return true;
  177. }
  178. public override void Stop()
  179. {
  180. _doUnloadSmif.SetValue(false, out _);
  181. _doInitSmif.SetValue(false, out _);
  182. _doLoadSmif.SetValue(false, out _);
  183. _doStopSmif.SetPulseValue(true, 2000);
  184. return;
  185. }
  186. public void DeleteCarrier()
  187. {
  188. ModuleName chamber = ModuleHelper.Converter(Name);
  189. if (CarrierManager.Instance.HasCarrier(chamber.ToString()))
  190. {
  191. CarrierManager.Instance.DeleteCarrier(chamber.ToString());
  192. EV.PostInfoLog(Name, $"Carrier deleted from {chamber}");
  193. var wafers = WaferManager.Instance.GetWafers(chamber);
  194. for (int i = 0; i < wafers.Length; i++)
  195. {
  196. if (!wafers[i].IsEmpty)
  197. WaferManager.Instance.DeleteWafer(chamber, i);
  198. }
  199. }
  200. else
  201. {
  202. EV.PostInfoLog(Name, string.Format("No carrier at {0}, delete not valid", chamber.ToString()));
  203. }
  204. }
  205. }
  206. }