Autotransfer_LP_FA.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.Event;
  3. using Aitex.Core.UI.Control;
  4. using Aitex.Core.Util;
  5. using MECF.Framework.Common.Equipment;
  6. using MECF.Framework.Common.Jobs;
  7. using MECF.Framework.Common.SubstrateTrackings;
  8. using PunkHPX8_RT.Dispatch;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using System.Windows.Controls;
  15. namespace PunkHPX8_RT.Modules
  16. {
  17. public interface ISchedulerFACallback
  18. {
  19. void JobCreated(ControlJobInfo cj);
  20. void JobCreateFailed(string module, string lotID, string jobID,string reason);
  21. void JobStarted(ControlJobInfo cj);
  22. void JobStopped(ControlJobInfo cj);
  23. void JobPaused(ControlJobInfo cj);
  24. void JobResumed(ControlJobInfo cj);
  25. void JobFinished(ControlJobInfo cj);
  26. void JobWaferStart(ControlJobInfo cj, string sequenceId, int slotID);
  27. void JobWaferEnd(ControlJobInfo cj, string sequenceId,int slotID);
  28. void SrdRecipeStart(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID);
  29. void SrdRecipeEnd(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID);
  30. void SrdRecipeFailed(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID);
  31. }
  32. public class SchedulerFACallback : ISchedulerFACallback
  33. {
  34. private const string EventPortJobStarted = "PortJobStarted";
  35. private const string EventPortJobStopped = "PortJobStopped";
  36. private const string EventPortJobPaused = "PortJobPaused";
  37. private const string EventPortJobResumed = "PortJobResumed";
  38. private const string EventPortJobFinished = "PortJobFinished";
  39. private const string EventPortJobFailed = "PortJobFailed";
  40. private const string EventPortSequenceSelected = "PortPPSelected";
  41. private const string EventPortSequenceSelectFailed = "PortPPSelectFailed";
  42. private const string EventPortJobWaferStart = "PortJobWaferStart";
  43. private const string EventPortJobWaferEnd = "PortJobWaferEnd";
  44. private const string EventWaferShuttleJobStart = "WaferShuttleJobStart";
  45. private const string EventWaferShuttleJobEnd = "WaferShuttleJobEnd";
  46. private const string EventWaferShuttleRecipeStart = "WaferShuttleRecipeStart";
  47. private const string EventWaferShuttleRecipeEnd = "WaferShuttleRecipeEnd";
  48. private const string EventWaferShuttleRecipeFailed = "WaferShuttleRecipeFailed";
  49. private const string EventSRDRecipeStart = "SRDRecipeStart";
  50. private const string EventSRDRecipeEnd = "SRDRecipeEnd";
  51. private const string EventSRDRecipeFailed = "SRDRecipeFailed";
  52. public SchedulerFACallback()
  53. {
  54. EV.Subscribe(new EventItem("Event", EventPortJobStarted, EventPortJobStarted));
  55. EV.Subscribe(new EventItem("Event", EventPortJobStopped, EventPortJobStopped));
  56. EV.Subscribe(new EventItem("Event", EventPortJobPaused, EventPortJobPaused));
  57. EV.Subscribe(new EventItem("Event", EventPortJobResumed, EventPortJobResumed));
  58. EV.Subscribe(new EventItem("Event", EventPortJobFinished, EventPortJobFinished));
  59. EV.Subscribe(new EventItem("Event", EventPortJobFailed, EventPortJobFailed));
  60. EV.Subscribe(new EventItem("Event", EventPortSequenceSelected, EventPortSequenceSelected));
  61. EV.Subscribe(new EventItem("Event", EventPortSequenceSelectFailed, EventPortSequenceSelectFailed));
  62. EV.Subscribe(new EventItem("Event", EventPortJobWaferStart, EventPortJobWaferStart));
  63. EV.Subscribe(new EventItem("Event", EventPortJobWaferEnd, EventPortJobWaferEnd));
  64. EV.Subscribe(new EventItem("Event", EventWaferShuttleJobStart, EventWaferShuttleJobStart));
  65. EV.Subscribe(new EventItem("Event", EventWaferShuttleJobEnd, EventWaferShuttleJobEnd));
  66. EV.Subscribe(new EventItem("Event", EventWaferShuttleRecipeStart, EventWaferShuttleRecipeStart));
  67. EV.Subscribe(new EventItem("Event", EventWaferShuttleRecipeEnd, EventWaferShuttleRecipeEnd));
  68. EV.Subscribe(new EventItem("Event", EventWaferShuttleRecipeFailed, EventWaferShuttleRecipeFailed));
  69. EV.Subscribe(new EventItem("Event", EventSRDRecipeStart, EventSRDRecipeStart));
  70. EV.Subscribe(new EventItem("Event", EventSRDRecipeEnd, EventSRDRecipeEnd));
  71. EV.Subscribe(new EventItem("Event", EventSRDRecipeFailed, EventSRDRecipeFailed));
  72. }
  73. public void JobCreated(ControlJobInfo cj)
  74. {
  75. ModuleName module = ModuleHelper.Converter(cj.Module);
  76. EV.Notify(EventPortSequenceSelected, new SerializableDictionary<string, string>()
  77. {
  78. {DVIDName.LotID, cj.LotName},
  79. {DVIDName.JobID, cj.Name},
  80. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }
  81. });
  82. }
  83. public void JobCreateFailed(string module, string lotID, string jobID,string reason)
  84. {
  85. ModuleName moduleName = ModuleHelper.Converter(module);
  86. EV.Notify(EventPortSequenceSelectFailed, new SerializableDictionary<string, string>()
  87. {
  88. {DVIDName.LotID, lotID},
  89. {DVIDName.JobID, jobID},
  90. {DVIDName.PortID, ((int)moduleName-ModuleName.LP1+1).ToString() },
  91. {DVIDName.Reason,reason}
  92. });
  93. }
  94. public void JobStarted(ControlJobInfo cj)
  95. {
  96. if (FaJobManager.Instance.Contains(cj.Name))
  97. {
  98. ModuleName module = ModuleHelper.Converter(cj.Module);
  99. EV.Notify(EventPortJobStarted, new SerializableDictionary<string, string>()
  100. {
  101. {DVIDName.LotID, cj.LotName},
  102. {DVIDName.JobID, cj.Name},
  103. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }
  104. });
  105. }
  106. }
  107. public void JobStopped(ControlJobInfo cj)
  108. {
  109. if (FaJobManager.Instance.Contains(cj.Name))
  110. {
  111. ModuleName module = ModuleHelper.Converter(cj.Module);
  112. EV.Notify(EventPortJobStopped, new SerializableDictionary<string, string>()
  113. {
  114. {DVIDName.LotID, cj.LotName},
  115. {DVIDName.JobID, cj.Name},
  116. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }
  117. });
  118. }
  119. }
  120. public void JobPaused(ControlJobInfo cj)
  121. {
  122. if (FaJobManager.Instance.Contains(cj.Name))
  123. {
  124. ModuleName module = ModuleHelper.Converter(cj.Module);
  125. EV.Notify(EventPortJobPaused, new SerializableDictionary<string, string>()
  126. {
  127. {DVIDName.LotID, cj.LotName},
  128. {DVIDName.JobID, cj.Name},
  129. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }
  130. });
  131. }
  132. }
  133. public void JobResumed(ControlJobInfo cj)
  134. {
  135. if (FaJobManager.Instance.Contains(cj.Name))
  136. {
  137. ModuleName module = ModuleHelper.Converter(cj.Module);
  138. EV.Notify(EventPortJobResumed, new SerializableDictionary<string, string>()
  139. {
  140. {DVIDName.LotID, cj.LotName},
  141. {DVIDName.JobID, cj.Name},
  142. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }
  143. });
  144. }
  145. }
  146. public void JobFinished(ControlJobInfo cj)
  147. {
  148. if (FaJobManager.Instance.Contains(cj.Name))
  149. {
  150. ModuleName module = ModuleHelper.Converter(cj.Module);
  151. int count = cj.LotWafers.Count;
  152. EV.Notify(EventPortJobFinished, new SerializableDictionary<string, string>()
  153. {
  154. {DVIDName.LotID, cj.LotName},
  155. {DVIDName.JobID, cj.Name},
  156. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() },
  157. {DVIDName.ProcessedWaferCount, count.ToString() },
  158. });
  159. }
  160. }
  161. public void JobWaferStart(ControlJobInfo cj,string sequenceId, int slotID)
  162. {
  163. if (FaJobManager.Instance.Contains(cj.Name))
  164. {
  165. ModuleName moduleName = ModuleHelper.Converter(cj.Module);
  166. EV.Notify(EventPortJobWaferStart, new SerializableDictionary<string, string>()
  167. {
  168. {DVIDName.LotID, cj.LotName},
  169. {DVIDName.JobID, cj.Name},
  170. {DVIDName.PortID, ((int)moduleName-ModuleName.LP1+1).ToString() },
  171. {DVIDName.SlotID, (slotID+1).ToString() },
  172. {DVIDName.SequenceID, sequenceId},
  173. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  174. });
  175. }
  176. }
  177. public void JobWaferEnd(ControlJobInfo cj,string sequenceId, int slotID)
  178. {
  179. if (FaJobManager.Instance.Contains(cj.Name))
  180. {
  181. ModuleName moduleName = ModuleHelper.Converter(cj.Module);
  182. WaferInfo wafer = WaferManager.Instance.GetWafer(moduleName, slotID);
  183. EV.Notify(EventPortJobWaferEnd, new SerializableDictionary<string, string>()
  184. {
  185. {DVIDName.LotID, cj.LotName},
  186. {DVIDName.JobID, cj.Name},
  187. {DVIDName.PortID, ((int)moduleName-ModuleName.LP1+1).ToString() },
  188. {DVIDName.SlotID, (slotID+1).ToString() },
  189. {DVIDName.CarrierID, cj.CarrierID?.ToString()},
  190. {DVIDName.SequenceID, sequenceId},
  191. {DVIDName.WaferProcessResult, (wafer.ProcessState == EnumWaferProcessStatus.Failed ? 0:1).ToString()}
  192. });
  193. }
  194. }
  195. /// <summary>
  196. /// SRD Recipe启动
  197. /// </summary>
  198. /// <param name="cj"></param>
  199. /// <param name="sequenceId"></param>
  200. /// <param name="waferInfo"></param>
  201. /// <param name="recipeId"></param>
  202. public void SrdRecipeStart(ControlJobInfo cj,string sequenceId,string recipeId,string module, int slotID)
  203. {
  204. if (FaJobManager.Instance.Contains(cj.Name))
  205. {
  206. EV.Notify(EventSRDRecipeStart, new SerializableDictionary<string, string>()
  207. {
  208. {DVIDName.LotID, cj.LotName},
  209. {DVIDName.JobID, cj.Name},
  210. {DVIDName.StationName,module},
  211. {DVIDName.SlotID,slotID.ToString()},
  212. {DVIDName.SequenceID, sequenceId},
  213. {DVIDName.RecipeID, recipeId},
  214. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  215. });
  216. }
  217. }
  218. /// <summary>
  219. /// SRD Recipe结束
  220. /// </summary>
  221. /// <param name="cj"></param>
  222. /// <param name="sequenceId"></param>
  223. /// <param name="waferInfo"></param>
  224. /// <param name="recipeId"></param>
  225. public void SrdRecipeEnd(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID)
  226. {
  227. if (FaJobManager.Instance.Contains(cj.Name))
  228. {
  229. EV.Notify(EventSRDRecipeEnd, new SerializableDictionary<string, string>()
  230. {
  231. {DVIDName.LotID, cj.LotName},
  232. {DVIDName.JobID, cj.Name},
  233. {DVIDName.StationName,module},
  234. {DVIDName.SlotID,slotID.ToString()},
  235. {DVIDName.SequenceID, sequenceId},
  236. {DVIDName.RecipeID, recipeId},
  237. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  238. });
  239. }
  240. }
  241. /// <summary>
  242. /// SRD Recipe启动
  243. /// </summary>
  244. /// <param name="cj"></param>
  245. /// <param name="sequenceId"></param>
  246. /// <param name="waferInfo"></param>
  247. /// <param name="recipeId"></param>
  248. public void SrdRecipeFailed(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID)
  249. {
  250. if (FaJobManager.Instance.Contains(cj.Name))
  251. {
  252. EV.Notify(EventSRDRecipeFailed, new SerializableDictionary<string, string>()
  253. {
  254. {DVIDName.LotID, cj.LotName},
  255. {DVIDName.JobID, cj.Name},
  256. {DVIDName.StationName,module},
  257. {DVIDName.SlotID,slotID.ToString()},
  258. {DVIDName.SequenceID, sequenceId},
  259. {DVIDName.RecipeID, recipeId},
  260. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  261. });
  262. }
  263. }
  264. }
  265. }