AutoTransfer_FA.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  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.Equipment;
  10. using MECF.Framework.Common.Jobs;
  11. using MECF.Framework.Common.SubstrateTrackings;
  12. using VirgoRT.HostWrapper;
  13. namespace VirgoRT.Modules
  14. {
  15. public interface ISchedulerFACallback
  16. {
  17. void JobCreated(ControlJobInfo cj, ProcessJobInfo pj);
  18. void JobCreateFailed(string module, string lotID, string jobID, string sequenceID);
  19. void JobStarted(ControlJobInfo cj, ProcessJobInfo pj);
  20. void JobStopped(ControlJobInfo cj, ProcessJobInfo pj);
  21. void JobPaused(ControlJobInfo cj, ProcessJobInfo pj);
  22. void JobResumed(ControlJobInfo cj, ProcessJobInfo pj);
  23. void JobAborted(ControlJobInfo cj, ProcessJobInfo pj);
  24. void JobFinished(ControlJobInfo cj, ProcessJobInfo pj);
  25. void JobFailed(ControlJobInfo cj, ProcessJobInfo pj);
  26. void JobWaferStart(ControlJobInfo cj, ProcessJobInfo pj, string module, int slotID);
  27. void JobWaferEnd(ControlJobInfo cj, ProcessJobInfo pj, string module, int slotID);
  28. }
  29. public class SchedulerFACallback : ISchedulerFACallback
  30. {
  31. private const string Port1JobStarted = "Port1JobStarted";
  32. private const string Port1JobStopped = "Port1JobStopped";
  33. private const string Port1JobPaused = "Port1JobPaused";
  34. private const string Port1JobResumed = "Port1JobResumed";
  35. private const string Port1JobAborted = "Port1JobAborted";
  36. private const string Port1JobFinished = "Port1JobFinished";
  37. private const string Port1JobFailed = "Port1JobFailed";
  38. private const string Port1SequenceSelected = "Port1SequenceSelected";
  39. private const string Port1SequenceSelectFailed = "Port1SequenceSelectFailed";
  40. private const string Port1JobWaferStart = "Port1JobWaferStart";
  41. private const string Port1JobWaferEnd = "Port1JobWaferEnd";
  42. private const string Port2JobStarted = "Port2JobStarted";
  43. private const string Port2JobStopped = "Port2JobStopped";
  44. private const string Port2JobPaused = "Port2JobPaused";
  45. private const string Port2JobResumed = "Port2JobResumed";
  46. private const string Port2JobAborted = "Port2JobAborted";
  47. private const string Port2JobFinished = "Port2JobFinished";
  48. private const string Port2JobFailed = "Port2JobFailed";
  49. private const string Port2SequenceSelected = "Port2SequenceSelected";
  50. private const string Port2SequenceSelectFailed = "Port2SequenceSelectFailed";
  51. private const string Port2JobWaferStart = "Port2JobWaferStart";
  52. private const string Port2JobWaferEnd = "Port2JobWaferEnd";
  53. private Dictionary<ModuleName, string> PortJobWaferStart = new Dictionary<ModuleName, string>()
  54. {
  55. {ModuleName.LP1, Port1JobWaferStart},
  56. {ModuleName.LP2, Port2JobWaferStart},
  57. };
  58. private Dictionary<ModuleName, string> PortJobWaferEnd = new Dictionary<ModuleName, string>()
  59. {
  60. {ModuleName.LP1, Port1JobWaferEnd},
  61. {ModuleName.LP2, Port2JobWaferEnd},
  62. };
  63. private Dictionary<ModuleName, string> PortJobStarted = new Dictionary<ModuleName, string>()
  64. {
  65. {ModuleName.LP1, Port1JobStarted},
  66. {ModuleName.LP2, Port2JobStarted},
  67. };
  68. private Dictionary<ModuleName, string> PortJobStopped = new Dictionary<ModuleName, string>()
  69. {
  70. {ModuleName.LP1, Port1JobStopped},
  71. {ModuleName.LP2, Port2JobStopped},
  72. };
  73. private Dictionary<ModuleName, string> PortJobPaused = new Dictionary<ModuleName, string>()
  74. {
  75. {ModuleName.LP1, Port1JobPaused},
  76. {ModuleName.LP2, Port2JobPaused},
  77. };
  78. private Dictionary<ModuleName, string> PortJobResumed = new Dictionary<ModuleName, string>()
  79. {
  80. {ModuleName.LP1, Port1JobResumed},
  81. {ModuleName.LP2, Port2JobResumed},
  82. };
  83. private Dictionary<ModuleName, string> PortJobAborted = new Dictionary<ModuleName, string>()
  84. {
  85. {ModuleName.LP1, Port1JobAborted},
  86. {ModuleName.LP2, Port2JobAborted},
  87. };
  88. private Dictionary<ModuleName, string> PortJobFinished = new Dictionary<ModuleName, string>()
  89. {
  90. {ModuleName.LP1, Port1JobFinished},
  91. {ModuleName.LP2, Port2JobFinished},
  92. };
  93. private Dictionary<ModuleName, string> PortJobFailed = new Dictionary<ModuleName, string>()
  94. {
  95. {ModuleName.LP1, Port1JobFailed},
  96. {ModuleName.LP2, Port2JobFailed},
  97. };
  98. private Dictionary<ModuleName, string> PortSequenceSelected = new Dictionary<ModuleName, string>()
  99. {
  100. {ModuleName.LP1, Port1SequenceSelected},
  101. {ModuleName.LP2, Port2SequenceSelected},
  102. };
  103. private Dictionary<ModuleName, string> PortSequenceSelectFailed = new Dictionary<ModuleName, string>()
  104. {
  105. {ModuleName.LP1, Port1SequenceSelectFailed},
  106. {ModuleName.LP2, Port2SequenceSelectFailed},
  107. };
  108. private Dictionary<ModuleName, string> PortId = new Dictionary<ModuleName, string>()
  109. {
  110. {ModuleName.LP1, "1"},
  111. {ModuleName.LP2, "2"},
  112. };
  113. public SchedulerFACallback()
  114. {
  115. EV.Subscribe(new EventItem("Event", Port1JobStarted, Port1JobStarted));
  116. EV.Subscribe(new EventItem("Event", Port1JobStopped, Port1JobStopped));
  117. EV.Subscribe(new EventItem("Event", Port1JobPaused, Port1JobPaused));
  118. EV.Subscribe(new EventItem("Event", Port1JobResumed, Port1JobResumed));
  119. EV.Subscribe(new EventItem("Event", Port1JobAborted, Port1JobAborted));
  120. EV.Subscribe(new EventItem("Event", Port1JobFinished, Port1JobFinished));
  121. EV.Subscribe(new EventItem("Event", Port1JobFailed, Port1JobFailed));
  122. EV.Subscribe(new EventItem("Event", Port1SequenceSelected, Port1SequenceSelected));
  123. EV.Subscribe(new EventItem("Event", Port1SequenceSelectFailed, Port1SequenceSelectFailed));
  124. EV.Subscribe(new EventItem("Event", Port1JobWaferStart, Port1JobWaferStart));
  125. EV.Subscribe(new EventItem("Event", Port1JobWaferEnd, Port1JobWaferEnd));
  126. EV.Subscribe(new EventItem("Event", Port2JobStarted, Port2JobStarted));
  127. EV.Subscribe(new EventItem("Event", Port2JobStopped, Port2JobStopped));
  128. EV.Subscribe(new EventItem("Event", Port2JobPaused, Port2JobPaused));
  129. EV.Subscribe(new EventItem("Event", Port2JobResumed, Port2JobResumed));
  130. EV.Subscribe(new EventItem("Event", Port2JobAborted, Port2JobAborted));
  131. EV.Subscribe(new EventItem("Event", Port2JobFinished, Port2JobFinished));
  132. EV.Subscribe(new EventItem("Event", Port2JobFailed, Port2JobFailed));
  133. EV.Subscribe(new EventItem("Event", Port2SequenceSelected, Port2SequenceSelected));
  134. EV.Subscribe(new EventItem("Event", Port2SequenceSelectFailed, Port2SequenceSelectFailed));
  135. EV.Subscribe(new EventItem("Event", Port2JobWaferStart, Port2JobWaferStart));
  136. EV.Subscribe(new EventItem("Event", Port2JobWaferEnd, Port2JobWaferEnd));
  137. }
  138. public void JobCreated(ControlJobInfo cj, ProcessJobInfo pj)
  139. {
  140. ModuleName module = ModuleHelper.Converter(cj.Module);
  141. EV.Notify(PortSequenceSelected[module], new SerializableDictionary<string, string>()
  142. {
  143. {DVIDName.LotID, pj.LotName},
  144. {DVIDName.JobID, pj.ControlJobName},
  145. {DVIDName.PortID, PortId[module] },
  146. {DVIDName.SequenceID, pj.Sequence.Name }
  147. });
  148. }
  149. public void JobCreateFailed(string module, string lotID, string jobID, string sequenceID)
  150. {
  151. ModuleName moduleName = ModuleHelper.Converter(module);
  152. EV.Notify(PortSequenceSelectFailed[moduleName], new SerializableDictionary<string, string>()
  153. {
  154. {DVIDName.LotID, lotID},
  155. {DVIDName.JobID, jobID},
  156. {DVIDName.PortID, PortId[moduleName] },
  157. {DVIDName.SequenceID, sequenceID }
  158. });
  159. }
  160. public void JobStarted(ControlJobInfo cj, ProcessJobInfo pj)
  161. {
  162. ModuleName module = ModuleHelper.Converter(cj.Module);
  163. EV.Notify(PortJobStarted[module], new SerializableDictionary<string, string>()
  164. {
  165. {DVIDName.LotID, pj.LotName},
  166. {DVIDName.JobID, pj.ControlJobName},
  167. {DVIDName.PortID, PortId[module] },
  168. {DVIDName.SequenceID, pj.Sequence.Name }
  169. });
  170. }
  171. public void JobStopped(ControlJobInfo cj, ProcessJobInfo pj)
  172. {
  173. ModuleName module = ModuleHelper.Converter(cj.Module);
  174. EV.Notify(PortJobStopped[module], new SerializableDictionary<string, string>()
  175. {
  176. {DVIDName.LotID, pj.LotName},
  177. {DVIDName.JobID, pj.ControlJobName},
  178. {DVIDName.PortID, PortId[module] },
  179. {DVIDName.SequenceID, pj.Sequence.Name }
  180. });
  181. }
  182. public void JobPaused(ControlJobInfo cj, ProcessJobInfo pj)
  183. {
  184. ModuleName module = ModuleHelper.Converter(cj.Module);
  185. EV.Notify(PortJobPaused[module], new SerializableDictionary<string, string>()
  186. {
  187. {DVIDName.LotID, pj.LotName},
  188. {DVIDName.JobID, pj.ControlJobName},
  189. {DVIDName.PortID, PortId[module] },
  190. {DVIDName.SequenceID, pj.Sequence.Name }
  191. });
  192. }
  193. public void JobResumed(ControlJobInfo cj, ProcessJobInfo pj)
  194. {
  195. ModuleName module = ModuleHelper.Converter(cj.Module);
  196. EV.Notify(PortJobResumed[module], new SerializableDictionary<string, string>()
  197. {
  198. {DVIDName.LotID, pj.LotName},
  199. {DVIDName.JobID, pj.ControlJobName},
  200. {DVIDName.PortID, PortId[module] },
  201. {DVIDName.SequenceID, pj.Sequence.Name }
  202. });
  203. }
  204. public void JobAborted(ControlJobInfo cj, ProcessJobInfo pj)
  205. {
  206. ModuleName module = ModuleHelper.Converter(cj.Module);
  207. EV.Notify(PortJobAborted[module], new SerializableDictionary<string, string>()
  208. {
  209. {DVIDName.LotID, cj.LotName},
  210. {DVIDName.JobID, cj.Name},
  211. {DVIDName.PortID, PortId[module] },
  212. {DVIDName.SequenceID, "" }
  213. });
  214. }
  215. public void JobFinished(ControlJobInfo cj, ProcessJobInfo pj)
  216. {
  217. ModuleName module = ModuleHelper.Converter(cj.Module);
  218. int count = pj.SlotWafers.Count;
  219. EV.Notify(PortJobFinished[module], new SerializableDictionary<string, string>()
  220. {
  221. {DVIDName.LotID, pj.LotName},
  222. {DVIDName.JobID, pj.ControlJobName},
  223. {DVIDName.PortID, PortId[module] },
  224. {DVIDName.SequenceID, pj.Sequence.Name },
  225. {DVIDName.ProcessedWaferCount, count.ToString() },
  226. });
  227. }
  228. public void JobFailed(ControlJobInfo cj, ProcessJobInfo pj)
  229. {
  230. ModuleName module = ModuleHelper.Converter(cj.Module);
  231. EV.Notify(PortJobFailed[module], new SerializableDictionary<string, string>()
  232. {
  233. {DVIDName.LotID, pj.LotName},
  234. {DVIDName.JobID, pj.ControlJobName},
  235. {DVIDName.PortID, PortId[module] },
  236. {DVIDName.SequenceID, pj.Sequence.Name }
  237. });
  238. }
  239. public void JobWaferStart(ControlJobInfo cj, ProcessJobInfo pj, string module1, int slotID)
  240. {
  241. ModuleName module = ModuleHelper.Converter(cj.Module);
  242. EV.Notify(PortJobWaferStart[module], new SerializableDictionary<string, string>()
  243. {
  244. {DVIDName.LotID, pj.LotName},
  245. {DVIDName.JobID, pj.ControlJobName},
  246. {DVIDName.PortID, PortId[module] },
  247. {DVIDName.SlotID, (slotID+1).ToString() }
  248. });
  249. }
  250. public void JobWaferEnd(ControlJobInfo cj, ProcessJobInfo pj, string module1, int slotID)
  251. {
  252. ModuleName module = ModuleHelper.Converter(cj.Module);
  253. WaferInfo wafer = WaferManager.Instance.GetWafer(ModuleHelper.Converter(module1), slotID);
  254. EV.Notify(PortJobWaferEnd[module], new SerializableDictionary<string, string>()
  255. {
  256. {DVIDName.LotID, pj.LotName},
  257. {DVIDName.JobID, pj.ControlJobName},
  258. {DVIDName.PortID, PortId[module] },
  259. {DVIDName.SlotID, (slotID+1).ToString() },
  260. {DVIDName.WaferProcessResult, (wafer.ProcessState==EnumWaferProcessStatus.Failed ? 0:1).ToString()}
  261. });
  262. }
  263. }
  264. }