Process_FA.cs 11 KB

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