コード例 #1
0
        //Chamber생성
        internal static void InitializeParallelChamber(AoEquipment aeqp)
        {
            var eqp = aeqp.ToFabAoEquipment();

            if (eqp.IsParallelChamber == false)
            {
                return;
            }

            FabEqp taretEqp = aeqp.Target as FabEqp;

            AoChamberProc2 proc     = eqp.FirstProcess <AoChamberProc2>();
            var            chambers = proc.Chambers;

            if (chambers != null)
            {
                int count = chambers.Length;
                eqp.SubEqps = new FabSubEqp[count];

                for (int i = 0; i < count; i++)
                {
                    var    chamberInfo = chambers[i];
                    string subEqpID    = chamberInfo.Label;

                    var subEqp = taretEqp.GetSubEqp(subEqpID) as FabSubEqp;
                    subEqp.ChamberInfo = chamberInfo;

                    eqp.SubEqps[i] = subEqp;

                    subEqp.LastPlan             = SimHelper.CreateInitLastPlan(subEqp.StatusInfo);
                    subEqp.LastIdleRunStartTime = aeqp.NowDT;
                    subEqp.LastIdleStartTime    = aeqp.NowDT;
                }
            }
        }
コード例 #2
0
        public static bool IsFilterPreventLayerChange(AoEquipment aeqp, FabLot lot)
        {
            var eqp = aeqp.ToFabAoEquipment();

            //if (eqp.EqpID == "THCVDC00" && eqp.NowDT >= LcdHelper.StringToDateTime("20200108 090229"))
            //	Console.WriteLine("B");

            WeightFactor wf = WeightHelper.GetWeightFactor(eqp.Target.Preset, Constants.WF_PREVENT_LAYER_CHANGE_FILTER);

            if (wf == null || wf.Factor == 0)
            {
                return(false);
            }

            var step = lot.CurrentFabStep;

            if (IsLastRunStep(eqp, step))
            {
                return(false);
            }

            var stepList = SimHelper.GetDspEqpSteps(eqp.DspEqpGroupID);

            if (stepList == null || stepList.Count <= 1)
            {
                return(false);
            }

            var last = eqp.GetLastPlan();

            if (last == null)
            {
                return(false);
            }

            bool isFilter = ExistRunEqpByDspEqpGroup(eqp, last.FabStep) == false;

            //if (isFilter)
            //	info.FilterReason = string.Format("");

            return(isFilter);
        }
コード例 #3
0
ファイル: WeightHelper.cs プロジェクト: yichunbong/CSOT
        public LayerStats(FabAoEquipment eqp)
        {
            var factor = WeightHelper.GetWeightFactor(eqp.Target.Preset, Constants.WF_LAYER_BALANCE_PRIORITY);

            if (factor == null)
            {
                return;
            }

            string            dspEqpGroupID = eqp.DspEqpGroupID;
            List <FabStdStep> steps         = SimHelper.GetDspEqpSteps(dspEqpGroupID);

            for (int i = 0; i < steps.Count; i++)
            {
                FabStdStep step = steps[i];

                int qty = InFlowMaster.GetStepWipQtyforLayerBalance(step.BalanceSteps);

                StepWipStat stat;
                if (dic.TryGetValue(step.StepID, out stat) == false)
                {
                    stat = new StepWipStat(this, step);
                    dic.Add(step.StepID, stat);
                }

                stat.AddQty(qty);
            }


            this.MinQty = decimal.MaxValue;
            this.MaxQty = decimal.MinValue;

            foreach (StepWipStat stat in dic.Values)
            {
                this.MinQty = Math.Min(stat.GapQty, this.MinQty);
                this.MaxQty = Math.Max(stat.GapQty, this.MaxQty);
            }
        }
コード例 #4
0
ファイル: LoadHelper.cs プロジェクト: yichunbong/CSOT
        private static bool UpdateLastLoadInfo(this FabSubEqp subEqp, DateTime now, LoadingStates state, FabAoEquipment eqp, bool isDone)
        {
            var lastInfo = subEqp.LastLoadInfo;

            if (lastInfo == null)
            {
                return(false);
            }

            if (SimHelper.IgnoreStateChange(eqp, state, isDone))
            {
                return(true);
            }

            lastInfo.EndTime = now;

            var lastPlan = lastInfo.Target as FabPlanInfo;

            if (lastPlan != null)
            {
                lastPlan.EqpInEndTime = now;
            }

            var infos = subEqp.LoadInfos;

            if (lastInfo.IsDummyState())
            {
                infos.Remove(lastInfo);
            }

            //TODO : 임시처리 BUSY 중복 제외
            if (lastInfo.IsDummyState_Busy())
            {
                infos.Remove(lastInfo);
            }

            return(false);
        }
コード例 #5
0
ファイル: FabEquipmentExt.cs プロジェクト: yichunbong/CSOT
        public static void SetInitEqpStatus(this FabEqp targetEqp, FabAoEquipment eqp)
        {
            EqpStatusInfo info = targetEqp.StatusInfo;

            if (info == null)
            {
                return;
            }

            eqp.ContinuousQty = info.LastContinuousQty;

            //down 이후 setup 필요 (2020.01.14 - by.liujian(유건))
            //if (targetEqp.State == ResourceState.Down && info.OrigineStatus != MesEqpStatus.IDLE)
            //    return;

            var status = info.MesStatus;

            if (status == MesEqpStatus.RUN || status == MesEqpStatus.Set_Up ||
                status == MesEqpStatus.E_RUN || info.OrigineStatus == MesEqpStatus.IDLE ||
                info.OrigineStatus == MesEqpStatus.DOWN)
            {
                eqp.LastPlan = SimHelper.CreateInitLastPlan(info);
            }
        }
コード例 #6
0
        private static bool IsFilterSetup(this JobFilterInfo info, AoEquipment aeqp)
        {
            WeightFactor wf = WeightHelper.GetWeightFactor(aeqp.Target.Preset, Constants.WF_SETUP_FILTERING);

            if (wf == null || wf.Factor == 0)
            {
                return(false);
            }

            FabLot lot = info.Sample;

            if (lot == null)
            {
                return(false);
            }

            FabAoEquipment eqp  = aeqp.ToFabAoEquipment();
            var            step = info.Step;

            //if (eqp.EqpID == "CHPIL300" && eqp.NowDT >= LcdHelper.StringToDateTime("20200119 105032")
            //	&& lot.CurrentProductID == "CW42512AB000")
            //	Console.WriteLine("B");

            if (eqp.IsLastPlan(lot))
            {
                return(false);
            }

            double setupTime = info.SetupTime;

            if (setupTime <= 0)
            {
                return(false);
            }

            double ratio = Convert.ToDouble(wf.Criteria[0]);

            double continuousQty = info.WaitSum;

            if (continuousQty > 0)
            {
                continuousQty += InFlowMaster.GetContinuousQty(lot, step);
            }

            if (eqp.IsParallelChamber)
            {
                continuousQty = continuousQty / eqp.GetChamberCapacity();
            }

            var st = step.GetStepTime(aeqp.EqpID, info.ProductID);

            if (st == null)
            {
                return(false);
            }

            double tactTime = st.TactTime;
            double workSec  = Math.Round(continuousQty * tactTime, 2);
            double setupSec = Math.Round(setupTime * 60 * ratio, 2);

            bool isFilter = workSec < setupSec;

            if (isFilter == false)
            {
                return(false);
            }

            //단순 Setup > Tact Time 일 경우 Inflow를 고려
            //다른 곳에서 진행중인가? Yes : 필터, No: 소량검사
            if (SimHelper.IsAnyWorking(eqp, lot) == false)
            {
                //기다려도 오지 않는 작은 Lot인가? Yes : 필터하지 않음. No : 필터
                if (IsWaitSmallSizeLot(aeqp, info, lot, continuousQty, setupTime, ratio, st))
                {
                    isFilter = false;
                }
            }

            if (isFilter)
            {
                info.FilterReason = string.Format("SetupTime:{0} > {1}(Qty:{2} * Tact:{3})", setupSec, workSec, continuousQty, st.TactTime);
            }

            return(isFilter);
        }