SchedulerFACallback.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  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.RT.Event;
  7. using Aitex.Core.RT.SCCore;
  8. using Aitex.Core.Util;
  9. using MECF.Framework.Common.Equipment;
  10. using MECF.Framework.Common.Jobs;
  11. using FurnaceRT.FAs;
  12. namespace FurnaceRT.Equipments.Schedulers
  13. {
  14. public class SchedulerFACallback : ISchedulerFACallback
  15. {
  16. private Dictionary<ModuleName, string> PortJobStarted;
  17. private Dictionary<ModuleName, string> PortJobStopped;
  18. private Dictionary<ModuleName, string> PortJobPaused;
  19. private Dictionary<ModuleName, string> PortJobResumed;
  20. private Dictionary<ModuleName, string> PortJobAborted;
  21. private Dictionary<ModuleName, string> PortJobFinished;
  22. private Dictionary<ModuleName, string> PortJobFailed;
  23. private Dictionary<ModuleName, string> PortSequenceSelected;
  24. private Dictionary<ModuleName, string> PortSequenceSelectFailed;
  25. private Dictionary<ModuleName, string> PortId;
  26. public SchedulerFACallback()
  27. {
  28. PortJobStarted = new Dictionary<ModuleName, string>();
  29. PortJobStopped = new Dictionary<ModuleName, string>();
  30. PortJobPaused = new Dictionary<ModuleName, string>();
  31. PortJobResumed = new Dictionary<ModuleName, string>();
  32. PortJobAborted = new Dictionary<ModuleName, string>();
  33. PortJobFinished = new Dictionary<ModuleName, string>();
  34. PortJobFailed = new Dictionary<ModuleName, string>();
  35. PortSequenceSelected = new Dictionary<ModuleName, string>();
  36. PortSequenceSelectFailed = new Dictionary<ModuleName, string>();
  37. PortId = new Dictionary<ModuleName, string>();
  38. for (int i = 1; i < 30; i++)
  39. {
  40. if (!SC.ContainsItem($"System.Stocker.Stocker{i}WaferType"))
  41. continue;
  42. var module = ModuleHelper.Converter($"Stocker{i}");
  43. EV.Subscribe(new EventItem("Event", $"{module}JobStarted", $"{module}JobStarted"));
  44. EV.Subscribe(new EventItem("Event", $"{module}JobStopped", $"{module}JobStopped"));
  45. EV.Subscribe(new EventItem("Event", $"{module}JobPaused", $"{module}JobPaused"));
  46. EV.Subscribe(new EventItem("Event", $"{module}JobResumed", $"{module}JobResumed"));
  47. EV.Subscribe(new EventItem("Event", $"{module}JobAborted", $"{module}JobAborted"));
  48. EV.Subscribe(new EventItem("Event", $"{module}JobFinished", $"{module}JobFinished"));
  49. EV.Subscribe(new EventItem("Event", $"{module}JobFailed", $"{module}JobFailed"));
  50. EV.Subscribe(new EventItem("Event", $"{module}SequenceSelected", $"{module}SequenceSelected"));
  51. EV.Subscribe(new EventItem("Event", $"{module}SequenceSelectFailed", $"{module}SequenceSelectFailed"));
  52. PortId[module] = i.ToString();
  53. PortJobStarted[module] = $"{module}JobStarted";
  54. PortJobStopped[module] = $"{module}JobStopped";
  55. PortJobPaused[module] = $"{module}JobPaused";
  56. PortJobResumed[module] = $"{module}JobResumed";
  57. PortJobAborted[module] = $"{module}JobAborted";
  58. PortJobFinished[module] = $"{module}JobFinished";
  59. PortJobFailed[module] = $"{module}JobFailed";
  60. PortSequenceSelected[module] = $"{module}SequenceSelected";
  61. PortSequenceSelectFailed[module] = $"{module}SequenceSelectFailed";
  62. }
  63. }
  64. public void JobCreated(ControlJobInfo cj, ProcessJobInfo pj)
  65. {
  66. foreach(var s in pj.Stockers)
  67. {
  68. var type = SC.GetStringValue($"System.Stocker.{s.Item1}WaferType");
  69. if(!string.IsNullOrEmpty(type) && (type.Contains("P") || type.Contains("M")))
  70. {
  71. ModuleName module = ModuleHelper.Converter(s.Item1);
  72. EV.Notify(PortSequenceSelected[module], new SerializableDictionary<string, string>()
  73. {
  74. {DVIDName.LotID, cj.LotName},
  75. {DVIDName.JobID, pj.ControlJobName},
  76. {DVIDName.PortID, PortId[module] },
  77. {DVIDName.SequenceID, pj.JobRecipe }
  78. });
  79. }
  80. }
  81. }
  82. public void JobCreateFailed(string module, string lotID, string jobID, string sequenceID)
  83. {
  84. ModuleName moduleName = ModuleHelper.Converter(module);
  85. EV.Notify(PortSequenceSelectFailed[moduleName], new SerializableDictionary<string, string>()
  86. {
  87. {DVIDName.LotID, lotID},
  88. {DVIDName.JobID, jobID},
  89. {DVIDName.PortID, PortId[moduleName] },
  90. {DVIDName.SequenceID, sequenceID }
  91. });
  92. }
  93. public void JobStarted(ControlJobInfo cj, ProcessJobInfo pj)
  94. {
  95. foreach (var s in pj.Stockers)
  96. {
  97. var type = SC.GetStringValue($"System.Stocker.{s.Item1}WaferType");
  98. if (!string.IsNullOrEmpty(type) && (type.Contains("P") || type.Contains("M")))
  99. {
  100. ModuleName module = ModuleHelper.Converter(s.Item1);
  101. EV.Notify(PortJobStarted[module], new SerializableDictionary<string, string>()
  102. {
  103. {DVIDName.LotID, cj.LotName},
  104. {DVIDName.JobID, pj.ControlJobName},
  105. {DVIDName.PortID, PortId[module] },
  106. {DVIDName.SequenceID, pj.JobRecipe }
  107. });
  108. }
  109. }
  110. }
  111. public void JobStopped(ControlJobInfo cj, ProcessJobInfo pj)
  112. {
  113. foreach (var s in pj.Stockers)
  114. {
  115. var type = SC.GetStringValue($"System.Stocker.{s.Item1}WaferType");
  116. if (!string.IsNullOrEmpty(type) && (type.Contains("P") || type.Contains("M")))
  117. {
  118. ModuleName module = ModuleHelper.Converter(s.Item1);
  119. EV.Notify(PortJobStopped[module], new SerializableDictionary<string, string>()
  120. {
  121. {DVIDName.LotID, cj.LotName},
  122. {DVIDName.JobID, pj.ControlJobName},
  123. {DVIDName.PortID, PortId[module] },
  124. {DVIDName.SequenceID, pj.JobRecipe }
  125. });
  126. }
  127. }
  128. }
  129. public void JobPaused(ControlJobInfo cj, ProcessJobInfo pj)
  130. {
  131. foreach (var s in pj.Stockers)
  132. {
  133. var type = SC.GetStringValue($"System.Stocker.{s.Item1}WaferType");
  134. if (!string.IsNullOrEmpty(type) && (type.Contains("P") || type.Contains("M")))
  135. {
  136. ModuleName module = ModuleHelper.Converter(s.Item1);
  137. EV.Notify(PortJobPaused[module], new SerializableDictionary<string, string>()
  138. {
  139. {DVIDName.LotID, cj.LotName},
  140. {DVIDName.JobID, pj.ControlJobName},
  141. {DVIDName.PortID, PortId[module] },
  142. {DVIDName.SequenceID, pj.JobRecipe }
  143. });
  144. }
  145. }
  146. }
  147. public void JobResumed(ControlJobInfo cj, ProcessJobInfo pj)
  148. {
  149. foreach (var s in pj.Stockers)
  150. {
  151. var type = SC.GetStringValue($"System.Stocker.{s.Item1}WaferType");
  152. if (!string.IsNullOrEmpty(type) && (type.Contains("P") || type.Contains("M")))
  153. {
  154. ModuleName module = ModuleHelper.Converter(s.Item1);
  155. EV.Notify(PortJobResumed[module], new SerializableDictionary<string, string>()
  156. {
  157. {DVIDName.LotID, cj.LotName},
  158. {DVIDName.JobID, pj.ControlJobName},
  159. {DVIDName.PortID, PortId[module] },
  160. {DVIDName.SequenceID, pj.JobRecipe }
  161. });
  162. }
  163. }
  164. }
  165. public void JobAborted(ControlJobInfo cj, ProcessJobInfo pj)
  166. {
  167. foreach (var s in pj.Stockers)
  168. {
  169. var type = SC.GetStringValue($"System.Stocker.{s.Item1}WaferType");
  170. if (!string.IsNullOrEmpty(type) && (type.Contains("P") || type.Contains("M")))
  171. {
  172. ModuleName module = ModuleHelper.Converter(s.Item1);
  173. EV.Notify(PortJobAborted[module], new SerializableDictionary<string, string>()
  174. {
  175. {DVIDName.LotID, cj.LotName},
  176. {DVIDName.JobID, pj.ControlJobName},
  177. {DVIDName.PortID, PortId[module] },
  178. {DVIDName.SequenceID, pj.JobRecipe }
  179. });
  180. }
  181. }
  182. }
  183. public void JobFinished(ControlJobInfo cj, ProcessJobInfo pj)
  184. {
  185. foreach (var s in pj.Stockers)
  186. {
  187. var type = SC.GetStringValue($"System.Stocker.{s.Item1}WaferType");
  188. if (!string.IsNullOrEmpty(type) && (type.Contains("P") || type.Contains("M")))
  189. {
  190. ModuleName module = ModuleHelper.Converter(s.Item1);
  191. EV.Notify(PortJobFinished[module], new SerializableDictionary<string, string>()
  192. {
  193. {DVIDName.LotID, cj.LotName},
  194. {DVIDName.JobID, pj.ControlJobName},
  195. {DVIDName.PortID, PortId[module] },
  196. {DVIDName.SequenceID, pj.JobRecipe }
  197. });
  198. }
  199. }
  200. }
  201. public void JobFailed(ControlJobInfo cj, ProcessJobInfo pj)
  202. {
  203. foreach (var s in pj.Stockers)
  204. {
  205. var type = SC.GetStringValue($"System.Stocker.{s.Item1}WaferType");
  206. if (!string.IsNullOrEmpty(type) && (type.Contains("P") || type.Contains("M")))
  207. {
  208. ModuleName module = ModuleHelper.Converter(s.Item1);
  209. EV.Notify(PortJobFailed[module], new SerializableDictionary<string, string>()
  210. {
  211. {DVIDName.LotID, cj.LotName},
  212. {DVIDName.JobID, pj.ControlJobName},
  213. {DVIDName.PortID, PortId[module] },
  214. {DVIDName.SequenceID, pj.JobRecipe }
  215. });
  216. }
  217. }
  218. }
  219. }
  220. }