SchedulerWaferHolderTimeManager.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  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.PlatingCell)
  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. /// 所有WaferHolder重新调度
  161. /// </summary>
  162. public void ResetScheduler(string waferHolderId,DateTime startTime)
  163. {
  164. List<string> waferHolderIds = _waferHolderTimeDic.Keys.ToList();
  165. List<SchedulerWaferHolderTime> schedulerWaferHolderTimes = new List<SchedulerWaferHolderTime>();
  166. foreach(var key in waferHolderIds)
  167. {
  168. //过滤已经到了Dryer的WaferShuttle
  169. if (key != waferHolderId)
  170. {
  171. }
  172. SchedulerWaferHolderTime schedulerWaferHolderTime = _waferHolderTimeDic[key];
  173. schedulerWaferHolderTimes.Add(schedulerWaferHolderTime);
  174. }
  175. List<SchedulerWaferHolderTime> resetWaferHolderTimeLst= schedulerWaferHolderTimes.OrderBy(O => O.ResProcessLength).ToList();
  176. foreach(SchedulerWaferHolderTime item in resetWaferHolderTimeLst)
  177. {
  178. SchedulerWaferHolderModuleTime moduleTime= item.ModuleTimes.Find(O => O.SchedulerIndex == item.LastSequenceIndex);
  179. if (moduleTime == null)
  180. {
  181. continue;
  182. }
  183. DateTime dateTime = DateTime.MinValue;
  184. if (waferHolderId == item.WaferHolderId)
  185. {
  186. dateTime = startTime;
  187. }
  188. else
  189. {
  190. dateTime=moduleTime.ScheduleStartTime.AddSeconds(moduleTime.ProcessTimeLength);
  191. }
  192. ResetSchedulerWaferHolder(item.WaferHolderId,dateTime,item.LastSequenceIndex+1);
  193. }
  194. }
  195. /// <summary>
  196. /// 重新调度
  197. /// </summary>
  198. /// <param name="waferHolderId"></param>
  199. private void ResetSchedulerWaferHolder(string waferHolderId,DateTime startTime,int sequenceIndex)
  200. {
  201. }
  202. /// <summary>
  203. /// 清除所有数据
  204. /// </summary>
  205. public void RemoveAllWaferHolder()
  206. {
  207. List<string> keys = _waferHolderTimeDic.Keys.ToList();
  208. foreach (string item in keys)
  209. {
  210. SchedulerWaferHolderTime moduleTime = _waferHolderTimeDic[item];
  211. moduleTime.Dispose();
  212. }
  213. _waferHolderTimeDic.Clear();
  214. }
  215. /// <summary>
  216. /// 延后metal后续时间
  217. /// </summary>
  218. /// <param name="waferHolderId"></param>
  219. /// <param name="schedulerIndex"></param>
  220. /// <param name="seconds"></param>
  221. public void DelayWaferHolderSchedulerStartTime(string waferHolderId, int schedulerIndex, double seconds)
  222. {
  223. if (_waferHolderTimeDic.ContainsKey(waferHolderId))
  224. {
  225. SchedulerWaferHolderTime waferHolderTime = _waferHolderTimeDic[waferHolderId];
  226. List<SchedulerWaferHolderModuleTime> moduleTimes = waferHolderTime.ModuleTimes.FindAll(O => O.SchedulerIndex >= schedulerIndex);
  227. foreach (var item in moduleTimes)
  228. {
  229. item.ScheduleStartTime = item.ScheduleStartTime.AddSeconds(seconds);
  230. }
  231. WriteSchedulerTimeLog(waferHolderId);
  232. }
  233. }
  234. /// <summary>
  235. /// 获取WaferHolder模块调度起始时间
  236. /// </summary>
  237. /// <param name="waferHolderId"></param>
  238. /// <param name="module"></param>
  239. /// <param name="schedulerIndex"></param>
  240. /// <returns></returns>
  241. public DateTime GetWaferHolderModuleSchedulerStartTime(string waferHolderId,string module,int schedulerIndex)
  242. {
  243. if (!_waferHolderTimeDic.ContainsKey(waferHolderId))
  244. {
  245. return DateTime.MinValue;
  246. }
  247. SchedulerWaferHolderTime waferHolderTime = _waferHolderTimeDic[waferHolderId];
  248. SchedulerWaferHolderModuleTime waferHolderModuleTime= waferHolderTime.ModuleTimes.Find(O => O.SchedulerIndex == schedulerIndex && O.Module == module);
  249. if (waferHolderModuleTime == null)
  250. {
  251. return DateTime.MinValue;
  252. }
  253. return waferHolderModuleTime.ScheduleStartTime;
  254. }
  255. }
  256. }