SchedulerBuffer.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  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. namespace VirgoRT.Modules.Schedulers
  12. {
  13. public class SchedulerBuffer : SchedulerModule
  14. {
  15. private readonly int _MAX_SLOT = SC.GetValue<int>("EFEM.Buffer.SlotNumber");
  16. public override bool IsAvailable
  17. {
  18. get
  19. {
  20. return true;
  21. }
  22. }
  23. public SchedulerBuffer(ModuleName buffer) : base(buffer.ToString())
  24. {
  25. EventWaferArrived += WaferArrived;
  26. }
  27. private void WaferArrived(object sender, EventArgs e)
  28. {
  29. var eArgs = e as WaferMoveArgs;
  30. WaferArriveTicks[eArgs.DstSlot] = DateTime.Now.Ticks;
  31. }
  32. public override SlotItem GetReadyOutSlot()
  33. {
  34. double maxDelay = 0;
  35. SlotItem item = new SlotItem(ModuleName.System, -1);
  36. if (AutoTransfer_T.GetSystemInnerWaferCount() >= AutoTransfer_T.SystemInternalWaferCount)
  37. return item;
  38. for (int i = 0; i < _MAX_SLOT; i++)
  39. {
  40. var wafer = WaferManager.Instance.GetWafer(Module, i);
  41. if (wafer.IsEmpty || wafer.NextSequenceStep > wafer.ProcessJob.Sequence.Steps.Count) // wafer.NextSequenceStep already increased after wafer arrive
  42. continue;
  43. if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep - 1].StepParameter.ContainsKey("CoolingTime")) // parameter name may change
  44. continue;
  45. float stayTime;
  46. if (!float.TryParse((string)wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep - 1].StepParameter["CoolingTime"], out stayTime))
  47. continue;
  48. long elapsedTicks = DateTime.Now.Ticks - WaferArriveTicks[i];
  49. TimeSpan elapsedSpan = new TimeSpan(elapsedTicks);
  50. double delay = elapsedSpan.TotalSeconds - stayTime;
  51. if (delay > maxDelay)
  52. {
  53. maxDelay = delay;
  54. item.Module = Module;
  55. item.Slot = i;
  56. }
  57. }
  58. return item;
  59. }
  60. }
  61. }