Autotransfer_LP_FA.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  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 CyberX8_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. using MECF.Framework.Common.WaferHolder;
  16. namespace CyberX8_RT.Modules
  17. {
  18. public interface ISchedulerFACallback
  19. {
  20. void JobCreated(ControlJobInfo cj);
  21. void JobCreateFailed(string module, string lotID, string jobID,string reason);
  22. void JobStarted(ControlJobInfo cj);
  23. void JobStopped(ControlJobInfo cj);
  24. void JobPaused(ControlJobInfo cj);
  25. void JobResumed(ControlJobInfo cj);
  26. void JobFinished(ControlJobInfo cj);
  27. void JobWaferStart(ControlJobInfo cj, string sequenceId, int slotID);
  28. void JobWaferEnd(ControlJobInfo cj, string sequenceId,int slotID);
  29. void WaferShuttleJobStart(ControlJobInfo cj, string sequenceId, WaferHolderInfo waferHolderInfo);
  30. void WaferShuttleJobEnd(ControlJobInfo cj, string sequenceId, WaferHolderInfo waferHolderInfo);
  31. void WaferShuttleRecipeStart(ControlJobInfo cj, string sequenceId, WaferHolderInfo waferHolderInfo, string recipeId);
  32. void WaferShuttleRecipeEnd(ControlJobInfo cj, string sequenceId, WaferHolderInfo waferHolderInfo, string recipeId, int processTimeLength);
  33. void WaferShuttleRecipeFailed(ControlJobInfo cj, string sequenceId, WaferHolderInfo waferHolderInfo, string recipeId);
  34. void SrdRecipeStart(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID);
  35. void SrdRecipeEnd(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID);
  36. void SrdRecipeFailed(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID);
  37. }
  38. public class SchedulerFACallback : ISchedulerFACallback
  39. {
  40. private const string EventPortJobStarted = "PortJobStarted";
  41. private const string EventPortJobStopped = "PortJobStopped";
  42. private const string EventPortJobPaused = "PortJobPaused";
  43. private const string EventPortJobResumed = "PortJobResumed";
  44. private const string EventPortJobFinished = "PortJobFinished";
  45. private const string EventPortJobFailed = "PortJobFailed";
  46. private const string EventPortSequenceSelected = "PortPPSelected";
  47. private const string EventPortSequenceSelectFailed = "PortPPSelectFailed";
  48. private const string EventPortJobWaferStart = "PortJobWaferStart";
  49. private const string EventPortJobWaferEnd = "PortJobWaferEnd";
  50. private const string EventWaferShuttleJobStart = "WaferShuttleJobStart";
  51. private const string EventWaferShuttleJobEnd = "WaferShuttleJobEnd";
  52. private const string EventWaferShuttleRecipeStart = "WaferShuttleRecipeStart";
  53. private const string EventWaferShuttleRecipeEnd = "WaferShuttleRecipeEnd";
  54. private const string EventWaferShuttleRecipeFailed = "WaferShuttleRecipeFailed";
  55. private const string EventSRDRecipeStart = "SRDRecipeStart";
  56. private const string EventSRDRecipeEnd = "SRDRecipeEnd";
  57. private const string EventSRDRecipeFailed = "SRDRecipeFailed";
  58. public SchedulerFACallback()
  59. {
  60. EV.Subscribe(new EventItem("Event", EventPortJobStarted, EventPortJobStarted));
  61. EV.Subscribe(new EventItem("Event", EventPortJobStopped, EventPortJobStopped));
  62. EV.Subscribe(new EventItem("Event", EventPortJobPaused, EventPortJobPaused));
  63. EV.Subscribe(new EventItem("Event", EventPortJobResumed, EventPortJobResumed));
  64. EV.Subscribe(new EventItem("Event", EventPortJobFinished, EventPortJobFinished));
  65. EV.Subscribe(new EventItem("Event", EventPortJobFailed, EventPortJobFailed));
  66. EV.Subscribe(new EventItem("Event", EventPortSequenceSelected, EventPortSequenceSelected));
  67. EV.Subscribe(new EventItem("Event", EventPortSequenceSelectFailed, EventPortSequenceSelectFailed));
  68. EV.Subscribe(new EventItem("Event", EventPortJobWaferStart, EventPortJobWaferStart));
  69. EV.Subscribe(new EventItem("Event", EventPortJobWaferEnd, EventPortJobWaferEnd));
  70. EV.Subscribe(new EventItem("Event", EventWaferShuttleJobStart, EventWaferShuttleJobStart));
  71. EV.Subscribe(new EventItem("Event", EventWaferShuttleJobEnd, EventWaferShuttleJobEnd));
  72. EV.Subscribe(new EventItem("Event", EventWaferShuttleRecipeStart, EventWaferShuttleRecipeStart));
  73. EV.Subscribe(new EventItem("Event", EventWaferShuttleRecipeEnd, EventWaferShuttleRecipeEnd));
  74. EV.Subscribe(new EventItem("Event", EventWaferShuttleRecipeFailed, EventWaferShuttleRecipeFailed));
  75. EV.Subscribe(new EventItem("Event", EventSRDRecipeStart, EventSRDRecipeStart));
  76. EV.Subscribe(new EventItem("Event", EventSRDRecipeEnd, EventSRDRecipeEnd));
  77. EV.Subscribe(new EventItem("Event", EventSRDRecipeFailed, EventSRDRecipeFailed));
  78. }
  79. public void JobCreated(ControlJobInfo cj)
  80. {
  81. ModuleName module = ModuleHelper.Converter(cj.Module);
  82. EV.Notify(EventPortSequenceSelected, new SerializableDictionary<string, string>()
  83. {
  84. {DVIDName.LotID, cj.LotName},
  85. {DVIDName.JobID, cj.Name},
  86. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }
  87. });
  88. }
  89. public void JobCreateFailed(string module, string lotID, string jobID,string reason)
  90. {
  91. ModuleName moduleName = ModuleHelper.Converter(module);
  92. EV.Notify(EventPortSequenceSelectFailed, new SerializableDictionary<string, string>()
  93. {
  94. {DVIDName.LotID, lotID},
  95. {DVIDName.JobID, jobID},
  96. {DVIDName.PortID, ((int)moduleName-ModuleName.LP1+1).ToString() },
  97. {DVIDName.Reason,reason}
  98. });
  99. }
  100. public void JobStarted(ControlJobInfo cj)
  101. {
  102. if (FaJobManager.Instance.Contains(cj.Name))
  103. {
  104. ModuleName module = ModuleHelper.Converter(cj.Module);
  105. EV.Notify(EventPortJobStarted, new SerializableDictionary<string, string>()
  106. {
  107. {DVIDName.LotID, cj.LotName},
  108. {DVIDName.JobID, cj.Name},
  109. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }
  110. });
  111. }
  112. }
  113. public void JobStopped(ControlJobInfo cj)
  114. {
  115. if (FaJobManager.Instance.Contains(cj.Name))
  116. {
  117. ModuleName module = ModuleHelper.Converter(cj.Module);
  118. EV.Notify(EventPortJobStopped, new SerializableDictionary<string, string>()
  119. {
  120. {DVIDName.LotID, cj.LotName},
  121. {DVIDName.JobID, cj.Name},
  122. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }
  123. });
  124. }
  125. }
  126. public void JobPaused(ControlJobInfo cj)
  127. {
  128. if (FaJobManager.Instance.Contains(cj.Name))
  129. {
  130. ModuleName module = ModuleHelper.Converter(cj.Module);
  131. EV.Notify(EventPortJobPaused, new SerializableDictionary<string, string>()
  132. {
  133. {DVIDName.LotID, cj.LotName},
  134. {DVIDName.JobID, cj.Name},
  135. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }
  136. });
  137. }
  138. }
  139. public void JobResumed(ControlJobInfo cj)
  140. {
  141. if (FaJobManager.Instance.Contains(cj.Name))
  142. {
  143. ModuleName module = ModuleHelper.Converter(cj.Module);
  144. EV.Notify(EventPortJobResumed, new SerializableDictionary<string, string>()
  145. {
  146. {DVIDName.LotID, cj.LotName},
  147. {DVIDName.JobID, cj.Name},
  148. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }
  149. });
  150. }
  151. }
  152. public void JobFinished(ControlJobInfo cj)
  153. {
  154. if (FaJobManager.Instance.Contains(cj.Name))
  155. {
  156. ModuleName module = ModuleHelper.Converter(cj.Module);
  157. int count = cj.LotWafers.Count;
  158. EV.Notify(EventPortJobFinished, new SerializableDictionary<string, string>()
  159. {
  160. {DVIDName.LotID, cj.LotName},
  161. {DVIDName.JobID, cj.Name},
  162. {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() },
  163. {DVIDName.ProcessedWaferCount, count.ToString() },
  164. });
  165. }
  166. }
  167. public void JobWaferStart(ControlJobInfo cj,string sequenceId, int slotID)
  168. {
  169. if (FaJobManager.Instance.Contains(cj.Name))
  170. {
  171. ModuleName moduleName = ModuleHelper.Converter(cj.Module);
  172. EV.Notify(EventPortJobWaferStart, new SerializableDictionary<string, string>()
  173. {
  174. {DVIDName.LotID, cj.LotName},
  175. {DVIDName.JobID, cj.Name},
  176. {DVIDName.PortID, ((int)moduleName-ModuleName.LP1+1).ToString() },
  177. {DVIDName.SlotID, (slotID+1).ToString() },
  178. {DVIDName.SequenceID, sequenceId},
  179. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  180. });
  181. }
  182. }
  183. public void JobWaferEnd(ControlJobInfo cj,string sequenceId, int slotID)
  184. {
  185. if (FaJobManager.Instance.Contains(cj.Name))
  186. {
  187. ModuleName moduleName = ModuleHelper.Converter(cj.Module);
  188. WaferInfo wafer = WaferManager.Instance.GetWafer(moduleName, slotID);
  189. EV.Notify(EventPortJobWaferEnd, new SerializableDictionary<string, string>()
  190. {
  191. {DVIDName.LotID, cj.LotName},
  192. {DVIDName.JobID, cj.Name},
  193. {DVIDName.PortID, ((int)moduleName-ModuleName.LP1+1).ToString() },
  194. {DVIDName.SlotID, (slotID+1).ToString() },
  195. {DVIDName.CarrierID, cj.CarrierID?.ToString()},
  196. {DVIDName.SequenceID, sequenceId},
  197. {DVIDName.WaferProcessResult, (wafer.ProcessState == EnumWaferProcessStatus.Failed ? 0:1).ToString()}
  198. });
  199. }
  200. }
  201. /// <summary>
  202. /// WaferShuttle job启动
  203. /// </summary>
  204. /// <param name="cj"></param>
  205. /// <param name="sequenceId"></param>
  206. /// <param name="waferShuttleId"></param>
  207. /// <param name="location"></param>
  208. public void WaferShuttleJobStart(ControlJobInfo cj, string sequenceId, WaferHolderInfo waferHolderInfo)
  209. {
  210. if (FaJobManager.Instance.Contains(cj.Name))
  211. {
  212. EV.Notify(EventWaferShuttleJobStart, new SerializableDictionary<string, string>()
  213. {
  214. {DVIDName.LotID, cj.LotName},
  215. {DVIDName.JobID, cj.Name},
  216. {DVIDName.WaferShuttleId, waferHolderInfo.Id},
  217. {DVIDName.WaferShuttleWaferAId, waferHolderInfo.WaferAId},
  218. {DVIDName.WaferShuttleWaferBId, waferHolderInfo.WaferBId},
  219. {DVIDName.WaferShuttleLsAId, waferHolderInfo.CrsAId},
  220. {DVIDName.WaferShuttleLsBId, waferHolderInfo.CrsBId},
  221. {DVIDName.StationName, waferHolderInfo.CurrentLocation },
  222. {DVIDName.SequenceID, sequenceId},
  223. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  224. });
  225. }
  226. }
  227. /// <summary>
  228. /// WaferShuttle job启动
  229. /// </summary>
  230. /// <param name="cj"></param>
  231. /// <param name="sequenceId"></param>
  232. /// <param name="waferShuttleId"></param>
  233. /// <param name="location"></param>
  234. public void WaferShuttleJobEnd(ControlJobInfo cj, string sequenceId, WaferHolderInfo waferHolderInfo)
  235. {
  236. if (FaJobManager.Instance.Contains(cj.Name))
  237. {
  238. EV.Notify(EventWaferShuttleJobEnd, new SerializableDictionary<string, string>()
  239. {
  240. {DVIDName.LotID, cj.LotName},
  241. {DVIDName.JobID, cj.Name},
  242. {DVIDName.WaferShuttleId, waferHolderInfo.Id},
  243. {DVIDName.WaferShuttleWaferAId, waferHolderInfo.WaferAId},
  244. {DVIDName.WaferShuttleWaferBId, waferHolderInfo.WaferBId},
  245. {DVIDName.WaferShuttleLsAId, waferHolderInfo.CrsAId},
  246. {DVIDName.WaferShuttleLsBId, waferHolderInfo.CrsBId},
  247. {DVIDName.StationName, waferHolderInfo.CurrentLocation },
  248. {DVIDName.SequenceID, sequenceId},
  249. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  250. });
  251. }
  252. }
  253. /// <summary>
  254. /// WaferShuttle recipe启动
  255. /// </summary>
  256. /// <param name="cj"></param>
  257. /// <param name="sequenceId"></param>
  258. /// <param name="waferShuttleId"></param>
  259. /// <param name="location"></param>
  260. public void WaferShuttleRecipeStart(ControlJobInfo cj, string sequenceId, WaferHolderInfo waferHolderInfo, string recipeId)
  261. {
  262. if (FaJobManager.Instance.Contains(cj.Name))
  263. {
  264. EV.Notify(EventWaferShuttleRecipeStart, new SerializableDictionary<string, string>()
  265. {
  266. {DVIDName.LotID, cj.LotName},
  267. {DVIDName.JobID, cj.Name},
  268. {DVIDName.WaferShuttleId, waferHolderInfo.Id},
  269. {DVIDName.WaferShuttleWaferAId, waferHolderInfo.WaferAId},
  270. {DVIDName.WaferShuttleWaferBId, waferHolderInfo.WaferBId},
  271. {DVIDName.WaferShuttleLsAId, waferHolderInfo.CrsAId},
  272. {DVIDName.WaferShuttleLsBId, waferHolderInfo.CrsBId},
  273. {DVIDName.StationName, waferHolderInfo.CurrentLocation },
  274. {DVIDName.SequenceID, sequenceId},
  275. {DVIDName.RecipeID, recipeId},
  276. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  277. });
  278. }
  279. }
  280. /// <summary>
  281. /// WaferShuttle recipe结束
  282. /// </summary>
  283. /// <param name="cj"></param>
  284. /// <param name="sequenceId"></param>
  285. /// <param name="waferShuttleId"></param>
  286. /// <param name="location"></param>
  287. public void WaferShuttleRecipeEnd(ControlJobInfo cj, string sequenceId, WaferHolderInfo waferHolderInfo, string recipeId,int processTimeLength)
  288. {
  289. if (FaJobManager.Instance.Contains(cj.Name))
  290. {
  291. EV.Notify(EventWaferShuttleRecipeEnd, new SerializableDictionary<string, string>()
  292. {
  293. {DVIDName.LotID, cj.LotName},
  294. {DVIDName.JobID, cj.Name},
  295. {DVIDName.WaferShuttleId, waferHolderInfo.Id},
  296. {DVIDName.WaferShuttleWaferAId, waferHolderInfo.WaferAId},
  297. {DVIDName.WaferShuttleWaferBId, waferHolderInfo.WaferBId},
  298. {DVIDName.WaferShuttleLsAId, waferHolderInfo.CrsAId},
  299. {DVIDName.WaferShuttleLsBId, waferHolderInfo.CrsBId},
  300. {DVIDName.StationName, waferHolderInfo.CurrentLocation },
  301. {DVIDName.SequenceID, sequenceId},
  302. {DVIDName.RecipeID, recipeId},
  303. {DVIDName.CarrierID, cj.CarrierID?.ToString()},
  304. {DVIDName.ProcessTimeLength,processTimeLength.ToString()}
  305. });
  306. }
  307. }
  308. /// <summary>
  309. /// WaferShuttle recipe启动
  310. /// </summary>
  311. /// <param name="cj"></param>
  312. /// <param name="sequenceId"></param>
  313. /// <param name="waferShuttleId"></param>
  314. /// <param name="location"></param>
  315. public void WaferShuttleRecipeFailed(ControlJobInfo cj, string sequenceId, WaferHolderInfo waferHolderInfo, string recipeId)
  316. {
  317. if (FaJobManager.Instance.Contains(cj.Name))
  318. {
  319. EV.Notify(EventWaferShuttleRecipeFailed, new SerializableDictionary<string, string>()
  320. {
  321. {DVIDName.LotID, cj.LotName},
  322. {DVIDName.JobID, cj.Name},
  323. {DVIDName.WaferShuttleId, waferHolderInfo.Id },
  324. {DVIDName.WaferShuttleId, waferHolderInfo.Id},
  325. {DVIDName.WaferShuttleWaferAId, waferHolderInfo.WaferAId},
  326. {DVIDName.WaferShuttleWaferBId, waferHolderInfo.WaferBId},
  327. {DVIDName.WaferShuttleLsAId, waferHolderInfo.CrsAId},
  328. {DVIDName.WaferShuttleLsBId, waferHolderInfo.CrsBId},
  329. {DVIDName.StationName, waferHolderInfo.CurrentLocation},
  330. {DVIDName.SequenceID, sequenceId},
  331. {DVIDName.RecipeID, recipeId},
  332. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  333. });
  334. }
  335. }
  336. /// <summary>
  337. /// SRD Recipe启动
  338. /// </summary>
  339. /// <param name="cj"></param>
  340. /// <param name="sequenceId"></param>
  341. /// <param name="waferInfo"></param>
  342. /// <param name="recipeId"></param>
  343. public void SrdRecipeStart(ControlJobInfo cj,string sequenceId,string recipeId,string module, int slotID)
  344. {
  345. if (FaJobManager.Instance.Contains(cj.Name))
  346. {
  347. EV.Notify(EventSRDRecipeStart, new SerializableDictionary<string, string>()
  348. {
  349. {DVIDName.LotID, cj.LotName},
  350. {DVIDName.JobID, cj.Name},
  351. {DVIDName.StationName,module},
  352. {DVIDName.SlotID,slotID.ToString()},
  353. {DVIDName.SequenceID, sequenceId},
  354. {DVIDName.RecipeID, recipeId},
  355. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  356. });
  357. }
  358. }
  359. /// <summary>
  360. /// SRD Recipe结束
  361. /// </summary>
  362. /// <param name="cj"></param>
  363. /// <param name="sequenceId"></param>
  364. /// <param name="waferInfo"></param>
  365. /// <param name="recipeId"></param>
  366. public void SrdRecipeEnd(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID)
  367. {
  368. if (FaJobManager.Instance.Contains(cj.Name))
  369. {
  370. EV.Notify(EventSRDRecipeEnd, new SerializableDictionary<string, string>()
  371. {
  372. {DVIDName.LotID, cj.LotName},
  373. {DVIDName.JobID, cj.Name},
  374. {DVIDName.StationName,module},
  375. {DVIDName.SlotID,slotID.ToString()},
  376. {DVIDName.SequenceID, sequenceId},
  377. {DVIDName.RecipeID, recipeId},
  378. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  379. });
  380. }
  381. }
  382. /// <summary>
  383. /// SRD Recipe启动
  384. /// </summary>
  385. /// <param name="cj"></param>
  386. /// <param name="sequenceId"></param>
  387. /// <param name="waferInfo"></param>
  388. /// <param name="recipeId"></param>
  389. public void SrdRecipeFailed(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID)
  390. {
  391. if (FaJobManager.Instance.Contains(cj.Name))
  392. {
  393. EV.Notify(EventSRDRecipeFailed, new SerializableDictionary<string, string>()
  394. {
  395. {DVIDName.LotID, cj.LotName},
  396. {DVIDName.JobID, cj.Name},
  397. {DVIDName.StationName,module},
  398. {DVIDName.SlotID,slotID.ToString()},
  399. {DVIDName.SequenceID, sequenceId},
  400. {DVIDName.RecipeID, recipeId},
  401. {DVIDName.CarrierID, cj.CarrierID?.ToString()}
  402. });
  403. }
  404. }
  405. }
  406. }