Process_FA.cs 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  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. });
  94. }
  95. else
  96. {
  97. EV.Notify(PMRecipeComplete[moduleName], new SerializableDictionary<string, string>()
  98. {
  99. {DVIDName.RecipeID, recipeName},
  100. {DVIDName.StationName, module},
  101. {DVIDName.SlotID, (wafer.OriginSlot+1).ToString()}
  102. });
  103. }
  104. }
  105. public void RecipeFailed(string module, string recipeName)
  106. {
  107. WaferInfo wafer = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), 0);
  108. if (wafer.IsEmpty)
  109. return;
  110. ModuleName moduleName = ModuleHelper.Converter(module);
  111. if (PortId.ContainsKey(wafer.OriginStation))
  112. {
  113. EV.Notify(PMRecipeFailed[moduleName], new SerializableDictionary<string, string>()
  114. {
  115. {DVIDName.RecipeID, recipeName},
  116. {DVIDName.StationName, module},
  117. {DVIDName.PortID, PortId[wafer.OriginStation]},
  118. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()}
  119. });
  120. }
  121. else
  122. {
  123. EV.Notify(PMRecipeFailed[moduleName], new SerializableDictionary<string, string>()
  124. {
  125. {DVIDName.RecipeID, recipeName},
  126. {DVIDName.StationName, module},
  127. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()}
  128. });
  129. }
  130. }
  131. public void RecipeStart(string module, string recipeName)
  132. {
  133. WaferInfo wafer = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), 0);
  134. if (wafer.IsEmpty)
  135. return;
  136. ModuleName moduleName = ModuleHelper.Converter(module);
  137. if (PortId.ContainsKey(wafer.OriginStation))
  138. {
  139. EV.Notify(PMRecipeStart[moduleName], new SerializableDictionary<string, string>()
  140. {
  141. {DVIDName.RecipeID, recipeName},
  142. {DVIDName.StationName, module},
  143. {DVIDName.PortID, PortId[wafer.OriginStation]},
  144. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()}
  145. });
  146. }
  147. else
  148. {
  149. EV.Notify(PMRecipeStart[moduleName], new SerializableDictionary<string, string>()
  150. {
  151. {DVIDName.RecipeID, recipeName},
  152. {DVIDName.StationName, module},
  153. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()}
  154. });
  155. }
  156. }
  157. public void RecipeStepEnd(string module, string recipeName, int stepNumber, List<FdcDataItem> fdc)
  158. {
  159. WaferInfo wafer = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), 0);
  160. if (wafer.IsEmpty)
  161. return;
  162. ModuleName moduleName = ModuleHelper.Converter(module);
  163. if (PortId.ContainsKey(wafer.OriginStation))
  164. {
  165. EV.Notify(PMRecipeStepEnd[moduleName], new SerializableDictionary<string, object>()
  166. {
  167. {DVIDName.RecipeID, recipeName},
  168. {DVIDName.StationName, module},
  169. {DVIDName.RecipeStepNumber, (stepNumber + 1).ToString()},
  170. {DVIDName.PortID, PortId[wafer.OriginStation]},
  171. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()},
  172. {DVIDName.RecipeStepEndDataSummary, fdc}
  173. });
  174. }
  175. else
  176. {
  177. EV.Notify(PMRecipeStepEnd[moduleName], new SerializableDictionary<string, object>()
  178. {
  179. {DVIDName.RecipeID, recipeName},
  180. {DVIDName.StationName, module},
  181. {DVIDName.RecipeStepNumber, (stepNumber + 1).ToString()},
  182. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()},
  183. {DVIDName.RecipeStepEndDataSummary, fdc}
  184. });
  185. }
  186. }
  187. public void RecipeStepStart(string module, string recipeName, int stepNumber)
  188. {
  189. WaferInfo wafer = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), 0);
  190. if (wafer.IsEmpty)
  191. return;
  192. ModuleName moduleName = ModuleHelper.Converter(module);
  193. if (PortId.ContainsKey(wafer.OriginStation))
  194. {
  195. EV.Notify(PMRecipeStepStart[moduleName], new SerializableDictionary<string, string>()
  196. {
  197. {DVIDName.RecipeID, recipeName},
  198. {DVIDName.StationName, module},
  199. {DVIDName.RecipeStepNumber, (stepNumber + 1).ToString()},
  200. {DVIDName.PortID, PortId[wafer.OriginStation]},
  201. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()}
  202. });
  203. }
  204. else
  205. {
  206. EV.Notify(PMRecipeStepStart[moduleName], new SerializableDictionary<string, string>()
  207. {
  208. {DVIDName.RecipeID, recipeName},
  209. {DVIDName.StationName, module},
  210. {DVIDName.RecipeStepNumber, (stepNumber + 1).ToString()},
  211. {DVIDName.SlotID, (wafer.OriginSlot + 1).ToString()}
  212. });
  213. }
  214. }
  215. }
  216. }