Process_FA.cs 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Aitex.Core.Common;
  7. using Aitex.Core.RT.Event;
  8. using Aitex.Core.Util;
  9. using MECF.Framework.Common.CommonData;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.Jobs;
  12. using MECF.Framework.Common.SubstrateTrackings;
  13. using VirgoRT.HostWrapper;
  14. namespace VirgoRT.Modules.PMs
  15. {
  16. public interface IRecipeFACallback
  17. {
  18. void RecipeStart(string module, string recipeName);
  19. void RecipeComplete(string module, string recipeName);
  20. void RecipeStepStart(string module, string recipeName, int stepNumber);
  21. void RecipeStepEnd(string module, string recipeName, int stepNumber, List<FdcDataItem> fdc);
  22. void RecipeFailed(string module, string recipeName);
  23. }
  24. public class RecipeFACallback : IRecipeFACallback
  25. {
  26. private const string PM1RecipeStart = "PM1RecipeStart";
  27. private const string PM1RecipeComplete = "PM1RecipeComplete";
  28. private const string PM1RecipeStepStart = "PM1RecipeStepStart";
  29. private const string PM1RecipeStepEnd = "PM1RecipeStepEnd";
  30. private const string PM1RecipeFailed = "PM1RecipeFailed";
  31. private const string PM2RecipeStart = "PM2RecipeStart";
  32. private const string PM2RecipeComplete = "PM2RecipeComplete";
  33. private const string PM2RecipeStepStart = "PM2RecipeStepStart";
  34. private const string PM2RecipeStepEnd = "PM2RecipeStepEnd";
  35. private const string PM2RecipeFailed = "PM2RecipeFailed";
  36. private Dictionary<ModuleName, string> PMRecipeStart = new Dictionary<ModuleName, string>()
  37. {
  38. {ModuleName.PMA, PM1RecipeStart},
  39. {ModuleName.PMB, PM2RecipeStart},
  40. };
  41. private Dictionary<ModuleName, string> PMRecipeComplete = new Dictionary<ModuleName, string>()
  42. {
  43. {ModuleName.PMA, PM1RecipeComplete},
  44. {ModuleName.PMB, PM2RecipeComplete},
  45. };
  46. private Dictionary<ModuleName, string> PMRecipeStepStart = new Dictionary<ModuleName, string>()
  47. {
  48. {ModuleName.PMA, PM1RecipeStepStart},
  49. {ModuleName.PMB, PM2RecipeStepStart},
  50. };
  51. private Dictionary<ModuleName, string> PMRecipeStepEnd = new Dictionary<ModuleName, string>()
  52. {
  53. {ModuleName.PMA, PM1RecipeStepEnd},
  54. {ModuleName.PMB, PM2RecipeStepEnd},
  55. };
  56. private Dictionary<ModuleName, string> PMRecipeFailed = new Dictionary<ModuleName, string>()
  57. {
  58. {ModuleName.PMA, PM1RecipeFailed},
  59. {ModuleName.PMB, PM2RecipeFailed},
  60. };
  61. private Dictionary<int, string> PortId = new Dictionary<int, string>()
  62. {
  63. {(int)ModuleName.LP1, "1"},
  64. {(int)ModuleName.LP2, "2"},
  65. };
  66. public RecipeFACallback()
  67. {
  68. EV.Subscribe(new EventItem("Event", PM1RecipeStart, PM1RecipeStart));
  69. EV.Subscribe(new EventItem("Event", PM1RecipeComplete, PM1RecipeComplete));
  70. EV.Subscribe(new EventItem("Event", PM1RecipeStepStart, PM1RecipeStepStart));
  71. EV.Subscribe(new EventItem("Event", PM1RecipeStepEnd, PM1RecipeStepEnd));
  72. EV.Subscribe(new EventItem("Event", PM1RecipeFailed, PM1RecipeFailed));
  73. EV.Subscribe(new EventItem("Event", PM2RecipeStart, PM2RecipeStart));
  74. EV.Subscribe(new EventItem("Event", PM2RecipeComplete, PM2RecipeComplete));
  75. EV.Subscribe(new EventItem("Event", PM2RecipeStepStart, PM2RecipeStepStart));
  76. EV.Subscribe(new EventItem("Event", PM2RecipeStepEnd, PM2RecipeStepEnd));
  77. EV.Subscribe(new EventItem("Event", PM2RecipeFailed, PM2RecipeFailed));
  78. }
  79. public void RecipeComplete(string module, string recipeName)
  80. {
  81. WaferInfo wafer = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), 0);
  82. if (wafer.IsEmpty)
  83. return;
  84. ModuleName moduleName = ModuleHelper.Converter(module);
  85. if (PortId.ContainsKey(wafer.OriginStation))
  86. {
  87. EV.Notify(PMRecipeComplete[moduleName], new SerializableDictionary<string, string>()
  88. {
  89. {DVIDName.RecipeID, recipeName},
  90. {DVIDName.StationName, module},
  91. {DVIDName.PortID, PortId[wafer.OriginStation]},
  92. {DVIDName.SlotID, (wafer.OriginSlot+1).ToString()},
  93. {DVIDName.LotID, wafer.LotId}
  94. });
  95. }
  96. else
  97. {
  98. EV.Notify(PMRecipeComplete[moduleName], new SerializableDictionary<string, string>()
  99. {
  100. {DVIDName.RecipeID, recipeName},
  101. {DVIDName.StationName, module},
  102. {DVIDName.SlotID, (wafer.OriginSlot+1).ToString()},
  103. {DVIDName.LotID, wafer.LotId}
  104. });
  105. }
  106. }
  107. public void RecipeFailed(string module, string recipeName)
  108. {
  109. WaferInfo wafer = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), 0);
  110. if (wafer.IsEmpty)
  111. return;
  112. ModuleName moduleName = ModuleHelper.Converter(module);
  113. if (PortId.ContainsKey(wafer.OriginStation))
  114. {
  115. EV.Notify(PMRecipeFailed[moduleName], new SerializableDictionary<string, string>()
  116. {
  117. {DVIDName.RecipeID, recipeName},
  118. {DVIDName.StationName, module},
  119. {DVIDName.PortID, PortId[wafer.OriginStation]},
  120. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()},
  121. {DVIDName.LotID, wafer.LotId}
  122. });
  123. }
  124. else
  125. {
  126. EV.Notify(PMRecipeFailed[moduleName], new SerializableDictionary<string, string>()
  127. {
  128. {DVIDName.RecipeID, recipeName},
  129. {DVIDName.StationName, module},
  130. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()},
  131. {DVIDName.LotID, wafer.LotId}
  132. });
  133. }
  134. }
  135. public void RecipeStart(string module, string recipeName)
  136. {
  137. WaferInfo wafer = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), 0);
  138. if (wafer.IsEmpty)
  139. return;
  140. ModuleName moduleName = ModuleHelper.Converter(module);
  141. if (PortId.ContainsKey(wafer.OriginStation))
  142. {
  143. EV.Notify(PMRecipeStart[moduleName], new SerializableDictionary<string, string>()
  144. {
  145. {DVIDName.RecipeID, recipeName},
  146. {DVIDName.StationName, module},
  147. {DVIDName.PortID, PortId[wafer.OriginStation]},
  148. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()},
  149. {DVIDName.LotID, wafer.LotId}
  150. });
  151. }
  152. else
  153. {
  154. EV.Notify(PMRecipeStart[moduleName], new SerializableDictionary<string, string>()
  155. {
  156. {DVIDName.RecipeID, recipeName},
  157. {DVIDName.StationName, module},
  158. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()},
  159. {DVIDName.LotID, wafer.LotId}
  160. });
  161. }
  162. }
  163. public void RecipeStepEnd(string module, string recipeName, int stepNumber, List<FdcDataItem> fdc)
  164. {
  165. WaferInfo wafer = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), 0);
  166. if (wafer.IsEmpty)
  167. return;
  168. ModuleName moduleName = ModuleHelper.Converter(module);
  169. if (PortId.ContainsKey(wafer.OriginStation))
  170. {
  171. EV.Notify(PMRecipeStepEnd[moduleName], new SerializableDictionary<string, object>()
  172. {
  173. {DVIDName.RecipeID, recipeName},
  174. {DVIDName.StationName, module},
  175. {DVIDName.RecipeStepNumber, (stepNumber + 1).ToString()},
  176. {DVIDName.PortID, PortId[wafer.OriginStation]},
  177. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()},
  178. {DVIDName.RecipeStepEndDataSummary, fdc},
  179. {DVIDName.LotID, wafer.LotId}
  180. });
  181. }
  182. else
  183. {
  184. EV.Notify(PMRecipeStepEnd[moduleName], new SerializableDictionary<string, object>()
  185. {
  186. {DVIDName.RecipeID, recipeName},
  187. {DVIDName.StationName, module},
  188. {DVIDName.RecipeStepNumber, (stepNumber + 1).ToString()},
  189. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()},
  190. {DVIDName.RecipeStepEndDataSummary, fdc},
  191. {DVIDName.LotID, wafer.LotId}
  192. });
  193. }
  194. }
  195. public void RecipeStepStart(string module, string recipeName, int stepNumber)
  196. {
  197. WaferInfo wafer = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), 0);
  198. if (wafer.IsEmpty)
  199. return;
  200. ModuleName moduleName = ModuleHelper.Converter(module);
  201. if (PortId.ContainsKey(wafer.OriginStation))
  202. {
  203. EV.Notify(PMRecipeStepStart[moduleName], new SerializableDictionary<string, string>()
  204. {
  205. {DVIDName.RecipeID, recipeName},
  206. {DVIDName.StationName, module},
  207. {DVIDName.RecipeStepNumber, (stepNumber + 1).ToString()},
  208. {DVIDName.PortID, PortId[wafer.OriginStation]},
  209. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()},
  210. {DVIDName.LotID, wafer.LotId}
  211. });
  212. }
  213. else
  214. {
  215. EV.Notify(PMRecipeStepStart[moduleName], new SerializableDictionary<string, string>()
  216. {
  217. {DVIDName.RecipeID, recipeName},
  218. {DVIDName.StationName, module},
  219. {DVIDName.RecipeStepNumber, (stepNumber + 1).ToString()},
  220. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()},
  221. {DVIDName.LotID, wafer.LotId}
  222. });
  223. }
  224. }
  225. }
  226. }