SchedulerBuffer.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using MECF.Framework.Common.Equipment;
  7. using VirgoRT.Scheduler;
  8. using MECF.Framework.Common.Schedulers;
  9. using MECF.Framework.Common.SubstrateTrackings;
  10. using Aitex.Core.RT.SCCore;
  11. using Aitex.Core.Util;
  12. namespace VirgoRT.Modules.Schedulers
  13. {
  14. public class SchedulerBuffer : SchedulerModule
  15. {
  16. private readonly int _MAX_SLOT = SC.GetValue<int>("EFEM.Buffer.SlotNumber");
  17. public override bool IsAvailable
  18. {
  19. get
  20. {
  21. return CheckTaskDone();
  22. }
  23. }
  24. public SchedulerBuffer(ModuleName buffer) : base(buffer.ToString())
  25. {
  26. EventWaferArrived += WaferArrived;
  27. }
  28. private void WaferArrived(object sender, EventArgs e)
  29. {
  30. var eArgs = e as WaferMoveArgs;
  31. WaferArriveTicks[eArgs.DstSlot] = DateTime.Now.Ticks;
  32. }
  33. private DeviceTimer _timerCooling = new DeviceTimer();
  34. private float _paramCoolingTime = 0;
  35. public override bool Cooling(int coolingTime)
  36. {
  37. _task = TaskType.Cooling;
  38. LogTaskStart(_task, $"Cooling {coolingTime} seconds");
  39. _paramCoolingTime = coolingTime;
  40. _timerCooling.Start(_paramCoolingTime * 1000);
  41. return true;
  42. }
  43. public bool CheckTaskDone()
  44. {
  45. bool ret = false;
  46. switch (_task)
  47. {
  48. case TaskType.None:
  49. ret = true;
  50. break;
  51. case TaskType.Cooling:
  52. ret = _timerCooling.IsTimeout();
  53. break;
  54. }
  55. if (ret && _task != TaskType.None)
  56. {
  57. LogTaskDone(_task, "");
  58. _task = TaskType.None;
  59. }
  60. return ret;
  61. }
  62. public override SlotItem GetReadyOutSlot()
  63. {
  64. double maxDelay = 0;
  65. SlotItem item = new SlotItem(ModuleName.System, -1);
  66. if (AutoTransfer_T.GetSystemInnerWaferCount() >= AutoTransfer_T.SystemInternalWaferCount)
  67. return item;
  68. for (int i = 0; i < _MAX_SLOT; i++)
  69. {
  70. var wafer = WaferManager.Instance.GetWafer(Module, i);
  71. if (wafer.IsEmpty || wafer.NextSequenceStep > wafer.ProcessJob.Sequence.Steps.Count) // wafer.NextSequenceStep already increased after wafer arrive
  72. continue;
  73. if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep - 1].StepParameter.ContainsKey("CoolingTime")) // parameter name may change
  74. continue;
  75. float stayTime;
  76. if (!float.TryParse((string)wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep - 1].StepParameter["CoolingTime"], out stayTime))
  77. continue;
  78. long elapsedTicks = DateTime.Now.Ticks - WaferArriveTicks[i];
  79. TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);
  80. double delay = elapsedSpan.TotalSeconds - stayTime;
  81. if (delay > maxDelay)
  82. {
  83. maxDelay = delay;
  84. item.Module = Module;
  85. item.Slot = i;
  86. }
  87. }
  88. return item;
  89. }
  90. }
  91. }