SchedulerWaferHolderTimeManager.cs 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. using Aitex.Core.RT.Log;
  2. using Aitex.Core.RT.SCCore;
  3. using Aitex.Core.Util;
  4. using PunkHPX8_RT.Dispatch;
  5. using MECF.Framework.Common.CommonData;
  6. using MECF.Framework.Common.Equipment;
  7. using MECF.Framework.Common.RecipeCenter;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Linq;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. namespace PunkHPX8_RT.Schedulers
  14. {
  15. public class SchedulerWaferHolderTimeManager : Singleton<SchedulerWaferHolderTimeManager>
  16. {
  17. #region
  18. /// <summary>
  19. /// WaferHolder 模块时间轴字点
  20. /// </summary>
  21. private Dictionary<string, SchedulerWaferHolderTime> _waferHolderTimeDic = new Dictionary<string, SchedulerWaferHolderTime>();
  22. #endregion
  23. /// <summary>
  24. /// 返回调度字典
  25. /// </summary>
  26. /// <returns></returns>
  27. public Dictionary<string, SchedulerWaferHolderTime> GetWaferHolderTimeDic()
  28. {
  29. return _waferHolderTimeDic;
  30. }
  31. /// <summary>
  32. /// 增加
  33. /// </summary>
  34. /// <param name="waferHolderId"></param>
  35. /// <param name="module"></param>
  36. /// <param name="schedulerIndex"></param>
  37. /// <param name="schedulerStartTime"></param>
  38. /// <param name="processTimeLength"></param>
  39. public void AddWaferHolderTime(string waferHolderId, string module,ModuleType moduleType, int schedulerIndex, DateTime schedulerStartTime, int processTimeLength)
  40. {
  41. SchedulerWaferHolderTime schedulerWaferHolderTime = null;
  42. if (_waferHolderTimeDic.ContainsKey(waferHolderId))
  43. {
  44. schedulerWaferHolderTime = _waferHolderTimeDic[waferHolderId];
  45. }
  46. else
  47. {
  48. schedulerWaferHolderTime = new SchedulerWaferHolderTime();
  49. schedulerWaferHolderTime.WaferHolderId = waferHolderId;
  50. schedulerWaferHolderTime.ModuleTimes = new List<SchedulerWaferHolderModuleTime>();
  51. _waferHolderTimeDic[waferHolderId] = schedulerWaferHolderTime;
  52. }
  53. SchedulerWaferHolderModuleTime moduleTime = schedulerWaferHolderTime.ModuleTimes.Find(O => O.Module == module && O.SchedulerIndex == schedulerIndex);
  54. if (moduleTime == null)
  55. {
  56. moduleTime = new SchedulerWaferHolderModuleTime();
  57. moduleTime.Module = module;
  58. moduleTime.SchedulerIndex = schedulerIndex;
  59. moduleTime.ScheduleStartTime = schedulerStartTime;
  60. moduleTime.ProcessTimeLength = processTimeLength;
  61. moduleTime.ModuleType = moduleType;
  62. schedulerWaferHolderTime.ModuleTimes.Add(moduleTime);
  63. }
  64. }
  65. /// <summary>
  66. /// 是否包含
  67. /// </summary>
  68. /// <param name="waferHolder"></param>
  69. /// <returns></returns>
  70. public bool Contained(string waferHolder)
  71. {
  72. return _waferHolderTimeDic.ContainsKey(waferHolder);
  73. }
  74. /// <summary>
  75. /// 移除
  76. /// </summary>
  77. /// <param name="waferHolderId"></param>
  78. public void RemoveWaferHolderTime(string waferHolderId)
  79. {
  80. if (_waferHolderTimeDic.ContainsKey(waferHolderId))
  81. {
  82. _waferHolderTimeDic.Remove(waferHolderId);
  83. }
  84. }
  85. /// <summary>
  86. /// 写Dryer调度时间轴日志
  87. /// </summary>
  88. public void WriteSchedulerTimeLog(string waferHolderId)
  89. {
  90. if (!_waferHolderTimeDic.ContainsKey(waferHolderId))
  91. {
  92. return;
  93. }
  94. SchedulerWaferHolderTime waferHolderTime = _waferHolderTimeDic[waferHolderId];
  95. List<SchedulerWaferHolderModuleTime> schedulerWaferHolderModuleTimes= waferHolderTime.ModuleTimes.OrderBy(O => O.SchedulerIndex).ToList();
  96. foreach (var item in schedulerWaferHolderModuleTimes)
  97. {
  98. DateTime startTime = item.ScheduleStartTime;
  99. if (item.StartTime != DateTime.MinValue)
  100. {
  101. startTime = item.StartTime;
  102. }
  103. DateTime endTime = startTime.AddSeconds(item.ProcessTimeLength);
  104. LOG.WriteLog(eEvent.EV_SCHEDULER, "System", $"wafer shuttle {waferHolderId} scheduler {item.SchedulerIndex} module {item.Module} start time {startTime} end time {endTime} processLength {item.ProcessTimeLength} s");
  105. }
  106. }
  107. /// <summary>
  108. /// 移除所有WaferHolder dryer时间轴
  109. /// </summary>
  110. public void RemoveAllWaferHolderDryerCell(string waferHolderId)
  111. {
  112. List<string> waferHolderIds = _waferHolderTimeDic.Keys.ToList();
  113. }
  114. /// <summary>
  115. /// 移除其他WaferHolder后续的cell时间轴
  116. /// </summary>
  117. /// <param name="waferHolderId"></param>
  118. public void RemoveOtherWaferHolderAfterCell(string waferHolderId,bool isRemoveCurrentSequence)
  119. {
  120. }
  121. /// <summary>
  122. /// 计算调度Sequence时长
  123. /// </summary>
  124. /// <param name="sequence"></param>
  125. /// <returns></returns>
  126. private int CalculateSequenceProcessTime(SchedulerSequence sequence)
  127. {
  128. int transporterTransferSeconds = SC.GetValue<int>("Transporter.TransporterTransferSeconds");
  129. if (sequence.ModuleType == ModuleType.Transporter)
  130. {
  131. return transporterTransferSeconds;
  132. }
  133. else if (sequence.ModuleType == ModuleType.Metal)
  134. {
  135. if(sequence.Recipe is DepRecipe)
  136. {
  137. DepRecipe depRecipe = (DepRecipe)sequence.Recipe;
  138. return depRecipe.CalculateRecipeTotalTime();
  139. }
  140. }
  141. else if (sequence.ModuleType == ModuleType.Rinse)
  142. {
  143. if(sequence.Recipe is QdrRecipe)
  144. {
  145. QdrRecipe qdrRecipe = (QdrRecipe)sequence.Recipe;
  146. return qdrRecipe.CalculateRunRecipeTime();
  147. }
  148. }
  149. else if (sequence.ModuleType == ModuleType.Dryer)
  150. {
  151. if(sequence.Recipe is HvdRecipe)
  152. {
  153. HvdRecipe hvdRecipe = (HvdRecipe)sequence.Recipe;
  154. return hvdRecipe.DryTime;
  155. }
  156. }
  157. return 0;
  158. }
  159. /// <summary>
  160. /// 移除模块时间轴
  161. /// </summary>
  162. /// <param name="moduleType"></param>
  163. /// <param name="module"></param>
  164. /// <param name="waferHolderId"></param>
  165. /// <param name="sequenceIndex"></param>
  166. private void RemoveModuleTime(ModuleType moduleType,string module,string waferHolderId,int sequenceIndex)
  167. {
  168. switch (moduleType)
  169. {
  170. case ModuleType.Metal:
  171. SchedulerMetalTimeManager.Instance.RemoveMetalStartTime(module, waferHolderId, sequenceIndex);
  172. break;
  173. case ModuleType.Rinse:
  174. SchedulerQdrTimeManager.Instance.RemoveQdrStartTime(module, waferHolderId, sequenceIndex);
  175. break;
  176. case ModuleType.Dryer:
  177. SchedulerDryerTimeManager.Instance.RemoveDryerStartTime(module, waferHolderId, sequenceIndex);
  178. break;
  179. case ModuleType.Transporter:
  180. if (module == ModuleName.Transporter1.ToString())
  181. {
  182. SchedulerTransporterTimeManager.Instance.RemoveTransporterStartTime(module, waferHolderId, sequenceIndex);
  183. }
  184. break;
  185. default:
  186. break;
  187. }
  188. }
  189. /// <summary>
  190. /// 所有WaferHolder重新调度
  191. /// </summary>
  192. public void ResetScheduler(string waferHolderId,DateTime startTime)
  193. {
  194. List<string> waferHolderIds = _waferHolderTimeDic.Keys.ToList();
  195. List<SchedulerWaferHolderTime> schedulerWaferHolderTimes = new List<SchedulerWaferHolderTime>();
  196. foreach(var key in waferHolderIds)
  197. {
  198. //过滤已经到了Dryer的WaferShuttle
  199. if (key != waferHolderId)
  200. {
  201. }
  202. SchedulerWaferHolderTime schedulerWaferHolderTime = _waferHolderTimeDic[key];
  203. schedulerWaferHolderTimes.Add(schedulerWaferHolderTime);
  204. }
  205. List<SchedulerWaferHolderTime> resetWaferHolderTimeLst= schedulerWaferHolderTimes.OrderBy(O => O.ResProcessLength).ToList();
  206. foreach(SchedulerWaferHolderTime item in resetWaferHolderTimeLst)
  207. {
  208. SchedulerWaferHolderModuleTime moduleTime= item.ModuleTimes.Find(O => O.SchedulerIndex == item.LastSequenceIndex);
  209. if (moduleTime == null)
  210. {
  211. continue;
  212. }
  213. DateTime dateTime = DateTime.MinValue;
  214. if (waferHolderId == item.WaferHolderId)
  215. {
  216. dateTime = startTime;
  217. }
  218. else
  219. {
  220. dateTime=moduleTime.ScheduleStartTime.AddSeconds(moduleTime.ProcessTimeLength);
  221. }
  222. ResetSchedulerWaferHolder(item.WaferHolderId,dateTime,item.LastSequenceIndex+1);
  223. }
  224. }
  225. /// <summary>
  226. /// 重新调度
  227. /// </summary>
  228. /// <param name="waferHolderId"></param>
  229. private void ResetSchedulerWaferHolder(string waferHolderId,DateTime startTime,int sequenceIndex)
  230. {
  231. }
  232. /// <summary>
  233. /// 清除所有数据
  234. /// </summary>
  235. public void RemoveAllWaferHolder()
  236. {
  237. List<string> keys = _waferHolderTimeDic.Keys.ToList();
  238. foreach (string item in keys)
  239. {
  240. SchedulerWaferHolderTime moduleTime = _waferHolderTimeDic[item];
  241. moduleTime.Dispose();
  242. }
  243. _waferHolderTimeDic.Clear();
  244. }
  245. /// <summary>
  246. /// 延后metal后续时间
  247. /// </summary>
  248. /// <param name="waferHolderId"></param>
  249. /// <param name="schedulerIndex"></param>
  250. /// <param name="seconds"></param>
  251. public void DelayWaferHolderSchedulerStartTime(string waferHolderId, int schedulerIndex, double seconds)
  252. {
  253. if (_waferHolderTimeDic.ContainsKey(waferHolderId))
  254. {
  255. SchedulerWaferHolderTime waferHolderTime = _waferHolderTimeDic[waferHolderId];
  256. List<SchedulerWaferHolderModuleTime> moduleTimes = waferHolderTime.ModuleTimes.FindAll(O => O.SchedulerIndex >= schedulerIndex);
  257. foreach (var item in moduleTimes)
  258. {
  259. item.ScheduleStartTime = item.ScheduleStartTime.AddSeconds(seconds);
  260. }
  261. WriteSchedulerTimeLog(waferHolderId);
  262. }
  263. }
  264. /// <summary>
  265. /// 获取WaferHolder模块调度起始时间
  266. /// </summary>
  267. /// <param name="waferHolderId"></param>
  268. /// <param name="module"></param>
  269. /// <param name="schedulerIndex"></param>
  270. /// <returns></returns>
  271. public DateTime GetWaferHolderModuleSchedulerStartTime(string waferHolderId,string module,int schedulerIndex)
  272. {
  273. if (!_waferHolderTimeDic.ContainsKey(waferHolderId))
  274. {
  275. return DateTime.MinValue;
  276. }
  277. SchedulerWaferHolderTime waferHolderTime = _waferHolderTimeDic[waferHolderId];
  278. SchedulerWaferHolderModuleTime waferHolderModuleTime= waferHolderTime.ModuleTimes.Find(O => O.SchedulerIndex == schedulerIndex && O.Module == module);
  279. if (waferHolderModuleTime == null)
  280. {
  281. return DateTime.MinValue;
  282. }
  283. return waferHolderModuleTime.ScheduleStartTime;
  284. }
  285. }
  286. }