| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 | 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<int>("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;        }    }}
 |