using System; using System.Collections.Generic; using System.Diagnostics; using System.Text; using System.Threading.Tasks; using MECF.Framework.Common.Equipment; using VirgoRT.Scheduler; using MECF.Framework.Common.Schedulers; using MECF.Framework.Common.SubstrateTrackings; using Aitex.Core.RT.SCCore; namespace VirgoRT.Modules.Schedulers { public class SchedulerBuffer : SchedulerModule { private readonly int _MAX_SLOT = SC.GetValue("EFEM.Buffer.SlotNumber"); public override bool IsAvailable { get { return true; } } public SchedulerBuffer(ModuleName buffer) : base(buffer.ToString()) { EventWaferArrived += WaferArrived; } private void WaferArrived(object sender, EventArgs e) { var eArgs = e as WaferMoveArgs; WaferArriveTicks[eArgs.DstSlot] = DateTime.Now.Ticks; } public override SlotItem GetReadyOutSlot() { double maxDelay = 0; SlotItem item = new SlotItem(ModuleName.System, -1); if (AutoTransfer_T.GetSystemInnerWaferCount() >= AutoTransfer_T.SystemInternalWaferCount) return item; for (int i = 0; i < _MAX_SLOT; i++) { var wafer = WaferManager.Instance.GetWafer(Module, i); if (wafer.IsEmpty || wafer.NextSequenceStep > wafer.ProcessJob.Sequence.Steps.Count) // wafer.NextSequenceStep already increased after wafer arrive continue; if (!wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep - 1].StepParameter.ContainsKey("CoolingTime")) // parameter name may change continue; float stayTime; if (!float.TryParse((string)wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep - 1].StepParameter["CoolingTime"], out stayTime)) continue; long elapsedTicks = DateTime.Now.Ticks - WaferArriveTicks[i]; TimeSpan elapsedSpan = new TimeSpan(elapsedTicks); double delay = elapsedSpan.TotalSeconds - stayTime; if (delay > maxDelay) { maxDelay = delay; item.Module = Module; item.Slot = i; } } return item; } } }