示例#1
0
        public void CHAMBER_LOADING_STATE_CHANGED0(Mozart.SeePlan.Simulation.AoEquipment aeqp, ChamberInfo chamber, IHandlingBatch hb, LoadingStates state, ref bool handled)
        {
            var eqp = aeqp.ToFabAoEquipment();
            var now = eqp.NowDT;

            if (ModelContext.Current.EndTime == now)
            {
                return;
            }

            var subEqp = eqp.FindSubEqp(chamber);

            if (subEqp == null)
            {
                return;
            }

            var lot = hb.ToFabLot();

            //if (eqp.EqpID == "THCVD300" && lot != null && lot.LotID == "TH011661N0H")
            //    Console.WriteLine("B");

            //PM/Down 이벤트 예외사항 처리
            if (SimHelper.IgnoreStateChange(eqp, state))
            {
                return;
            }

            if (state == LoadingStates.SETUP || state == LoadingStates.BUSY)
            {
                SetCurrentMask(eqp, lot);
            }

            subEqp.OnStateChanged(eqp, state, lot);
        }
示例#2
0
        public static SetupType CheckSetup(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb)
        {
            try
            {
                MicronBEAssyBELot lot = hb as MicronBEAssyBELot;

                MicronBEAssyPlanInfo plan = aeqp.LastPlan as MicronBEAssyPlanInfo;

                if (plan == null)
                {
                    return(SetupType.NONE);
                }

                if (plan.ProductID != lot.Product.ProductID)
                {
                    return(SetupType.PART_CHG);
                }

                return(SetupType.NONE);
            }
            catch (Exception e)
            {
                WriteHelper.WriteErrorHistory(ErrorLevel.FATAL, string.Format("ErrorMessage : {0}   MethodName : {1}", e.Message, System.Reflection.MethodInfo.GetCurrentMethod().Name));
                return(SetupType.NONE);
            }
        }
示例#3
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="hb"/>
        /// <param name="state">SETUP/BUSY/IDLERUN/IDLE/WAIT_SETUP(PM/DOUWN 호출 안됨)</param>
        /// <param name="handled"/>
        public void LOADING_STATE_CHANGED0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, Mozart.SeePlan.Simulation.LoadingStates state, ref bool handled)
        {
            var eqp = aeqp.ToFabAoEquipment();
            var now = eqp.NowDT;

            if (eqp.IsParallelChamber)
            {
                return;
            }

            if (ModelContext.Current.EndTime == now)
            {
                return;
            }

            //PM/Down 이벤트 예외사항 처리
            if (SimHelper.IgnoreStateChange(eqp, state))
            {
                return;
            }

            var lot = hb.ToFabLot();

            if (state == LoadingStates.SETUP || state == LoadingStates.BUSY)
            {
                SetCurrentMask(eqp, lot);
            }

            eqp.OnStateChanged(state, lot);
        }
示例#4
0
        /// <summary>
        /// </summary>
        /// <param name="db"/>
        /// <param name="aeqp"/>
        /// <param name="wips"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public IHandlingBatch[] SELECT0(Mozart.SeePlan.Simulation.DispatcherBase db, Mozart.SeePlan.Simulation.AoEquipment aeqp, IList <Mozart.SeePlan.Simulation.IHandlingBatch> wips, ref bool handled, Mozart.SeePlan.Simulation.IHandlingBatch[] prevReturnValue)
        {
            var eqp = aeqp.ToFabAoEquipment();

            if (wips == null || wips.Count == 0)
            {
                return(null);
            }

            var lot = wips[0].ToFabLot();

            //if (eqp.EqpID == "THCVD300" && eqp.NowDT >= LcdHelper.StringToDateTime("20191107 075929"))
            //	Console.WriteLine("B");

            if (lot.IsDummy)
            {
                eqp.IsDummyWait = true;
                return(null);
            }

            if (eqp.IsParallelChamber)
            {
                if (ChamberMaster.IsLoadable_ParallelChamber(eqp, lot) == false)
                {
                    return(null);
                }
            }

            eqp.IsDummyWait = false;

            return(new IHandlingBatch[] { lot });
        }
示例#5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="hb"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public bool IS_NEED_SETUP0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled, bool prevReturnValue)
        {
            FabLot         lot = hb.Sample as FabLot;
            FabAoEquipment eqp = aeqp.ToFabAoEquipment();

            bool isNeedSetup = ResHelper.IsNeedSetup(eqp, lot);

            return(isNeedSetup);
        }
示例#6
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="loadableChambers"/>
        /// <param name="hb"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public ISet <string> GET_NEED_SETUP_CHAMBERS0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.ChamberInfo[] loadableChambers, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled, ISet <string> prevReturnValue)
        {
            FabLot lot = hb.ToFabLot();
            FabEqp eqp = aeqp.Target as FabEqp;

            List <FabSubEqp> list = ChamberMaster.GetSubEqps(eqp, loadableChambers);

            return(ChamberMaster.GetNeedSetupChamberIDs(list, lot));
        }
示例#7
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="state">UP/DOWN</param>
        /// <param name="handled"/>
        public void RESOURCE_STATE_CHANGED0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.DataModel.ResourceState state, ref bool handled)
        {
            var eqp = aeqp.ToFabAoEquipment();

            if (state == ResourceState.Up)
            {
                eqp.OnStateChanged(LoadingStates.IDLE);
            }
        }
示例#8
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="hb"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public DateTime FIX_START_TIME0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled, DateTime prevReturnValue)
        {
            FabLot lot = hb.ToFabLot();

            var now         = aeqp.NowDT;
            var trackInTime = lot.Wip.LastTrackInTime;

            //한개의 RunWip만 설비에 투입가능하도록 처리(LOCATE_FOR_RUN0)하여 조정 필요없음.
            ////RunWip 수량을 고려하여 마지막 RunWip의 TrackInTime을 기준으로 이전 RunWip의 TrackInTime 조정
            //var runList = (aeqp.Target as FabEqp).InitRunWips;
            //if(runList != null)
            //{
            //    //해당 Lot 삭제
            //    if (runList.Remove(lot) == false)
            //        Logger.MonitorInfo("[WARNING] mismatch run wip : LOT_ID={0}", lot.LotID);

            //    int count = runList.Count;
            //    if (runList != null && count > 0)
            //    {
            //        var prevlot = runList[count - 1];
            //        DateTime outTime = prevlot.Wip.LastTrackInTime;

            //        for (int i = count - 2; i >= 0; i--)
            //        {
            //            var currLot = runList[i];

            //            if (currLot.UnitQty <= 0)
            //                continue;

            //            FabStep wipStep = currLot.Wip.InitialStep as FabStep;
            //            float currTactTime = wipStep.GetTactTime(eqpID, currLot.CurrentProductID);

            //            DateTime availableTime = outTime.AddSeconds(-(currTactTime * currLot.UnitQty));

            //            DateTime tkTime = currLot.Wip.LastTrackInTime;
            //            outTime = LcdHelper.Min(tkTime, availableTime);
            //        }

            //        float tactTime = lot.CurrentFabStep.GetTactTime(eqpID, lot.CurrentProductID);
            //        outTime = outTime.AddSeconds(-(tactTime * lot.UnitQty));

            //        trackInTime = LcdHelper.Min(outTime, trackInTime);
            //    }
            //}

            //TODO : WriteErrorHist
            if (trackInTime == DateTime.MinValue || trackInTime == DateTime.MaxValue)
            {
                trackInTime = aeqp.NowDT;
            }
            else if (trackInTime > now)
            {
                trackInTime = now;
            }

            return(trackInTime);
        }
示例#9
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="fs"/>
        /// <param name="det"/>
        /// <param name="handled"/>
        public void ON_PMEVENT3(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.DataModel.PMSchedule fs, Mozart.SeePlan.Simulation.DownEventType det, ref bool handled)
        {
            FabAoEquipment eqp = aeqp.ToFabAoEquipment();

            if (eqp.SetParallelChamberPM(fs, det))
            {
                if (det == DownEventType.Start)
                {
                    eqp.OnStateChanged(LoadingStates.PM);
                }

                return;
            }

            if (det == DownEventType.Start)
            {
                ResHelper.SetLastLoadingInfo(aeqp, null);

                aeqp.Loader.Block();
                aeqp.WriteHistory(LoadingStates.PM);

                FabPMSchedule pm = fs as FabPMSchedule;

                DownMaster.AdjustAheadPMProcessing(eqp, pm);

                //PM의 경우 OnStateChange 함수를 별도로 호출 필요함.
                LoadingStates state = GetPMLoadingState(pm.Type);
                eqp.OnStateChanged(state);

                FabLoadInfo loadInfo = eqp.LoadInfos.Last();

                if (loadInfo.State == LoadingStates.PM)
                {
                    if (pm.Type == ScheduleType.RENT)
                    {
                        loadInfo.StateInfo = "RENT";
                    }

                    if (loadInfo.StateInfo != "AHEAD" && LcdHelper.IsEmptyID(pm.Description) == false)
                    {
                        loadInfo.StateInfo = pm.Description;
                    }
                }
            }
            else
            {
                aeqp.Loader.Unblock();
                aeqp.WriteHistoryAfterBreak();
                aeqp.SetModified();
                eqp.OnStateChanged(LoadingStates.IDLE);

                eqp.AvailablePMTime = DateTime.MaxValue;
            }
        }
示例#10
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="hb"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public double GET_PROCESS_UNIT_SIZE1(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled, double prevReturnValue)
        {
            double unitSize = SeeplanConfiguration.Instance.LotUnitSize;

            if (aeqp.IsBatchType() == false)
            {
                unitSize = hb.UnitQty;
            }

            return(unitSize);
        }
示例#11
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="hb"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public LoadInfo SET_LAST_LOADING_INFO1(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled, Mozart.SeePlan.DataModel.LoadInfo prevReturnValue)
        {
            if (hb == null)
            {
                return(null);
            }

            var lot = hb.Sample;

            return(lot.CurrentPlan);
        }
示例#12
0
        /// <summary>
        /// </summary>
        /// <param name="eqp"/>
        /// <param name="wips"/>
        /// <param name="ctx"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public IList <Mozart.SeePlan.Simulation.IHandlingBatch> DO_FILTER1(Mozart.SeePlan.Simulation.AoEquipment eqp, IList <IHandlingBatch> wips, IDispatchContext ctx, ref bool handled, IList <IHandlingBatch> prevReturnValue)
        {
#if DEBUG
            if (eqp.EqpID == "DA03")
            {
                Console.WriteLine();
            }
#endif

            return(wips);
        }
示例#13
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="hb"/>
        /// <param name="handled"/>
        public void ON_TRACK_OUT0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled)
        {
            //FabAoEquipment feqp = aeqp as FabAoEquipment;
            //FabLot flot = hb.Sample as FabLot;
            //FabStep step = flot.CurrentStep as FabStep;

            //PreInspector.UpdateLastEventTime(aeqp, step, flot.CurrentProductID);

            //※TrackOut시점에는 Step이 바껴있지 않음.
            //InFlowMaster.ChangeWipLocation(hb, EventType.TrackOut);

            //if (aeqp.EqpID == "THCVD500")
            //    Console.WriteLine();
        }
示例#14
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="hb"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public ProcTimeInfo GET_PROCESS_TIME0(Mozart.SeePlan.Simulation.AoEquipment aeqp, IHandlingBatch hb, ref bool handled, ProcTimeInfo prevReturnValue)
        {
            try
            {
                ProcTimeInfo info = new ProcTimeInfo();

                MicronBEAssyBELot lot = hb as MicronBEAssyBELot;

                MicronBEAssyBEStep step = hb.CurrentStep as MicronBEAssyBEStep;

                foreach (StepTime time in InputMart.Instance.StepTime.DefaultView)
                {
                    if (step.StepID != time.STEP_ID)
                    {
                        continue;
                    }

                    if (lot.Product.LineID != time.LINE_ID)
                    {
                        continue;
                    }

                    if (LikeUtility.Like(lot.Product.ProductID, time.PRODUCT_ID) == false)
                    {
                        continue;
                    }

                    //if (LikeUtility.Like(lot.Product.Process.ProcessID, time.PROCESS_ID) == false)
                    //    continue;

                    if (LikeUtility.Like(aeqp.EqpID, time.EQP_ID) == false)
                    {
                        continue;
                    }

                    double tactTimeBySec = (double)time.TACT_TIME;

                    info.TactTime = TimeSpan.FromSeconds(tactTimeBySec);

                    break;
                }

                return(info);
            }
            catch (Exception e)
            {
                WriteHelper.WriteErrorHistory(ErrorLevel.FATAL, string.Format("ErrorMessage : {0}   MethodName : {1}", e.Message, System.Reflection.MethodInfo.GetCurrentMethod().Name));
                return(default(ProcTimeInfo));
            }
        }
示例#15
0
        /// <summary>
        /// </summary>
        /// <param name="da"/>
        /// <param name="aeqp"/>
        /// <param name="wips"/>
        /// <param name="handled"/>
        public void ON_DISPATCHED0(Mozart.SeePlan.Simulation.DispatchingAgent da, Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch[] wips, ref bool handled)
        {
            var eqp = aeqp.ToFabAoEquipment();

            foreach (var item in wips)
            {
                var lot = item.ToFabLot();

                SetProductVersion(eqp, lot);
                EqpArrangeMaster.OnDispatched(eqp, lot);

                FilterMaster.StartEqpRecipeTime(lot, eqp);
            }
        }
示例#16
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="proc"/>
        /// <param name="handled"/>
        public void ON_BEGIN_PROCESSING0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.AoProcess proc, ref bool handled)
        {
            IHandlingBatch hb  = proc.Entity as IHandlingBatch;
            FabLot         lot = hb.Sample as FabLot;

            lot.CurrentFabPlan.EqpInStartTime = aeqp.NowDT;

            if (lot.IsRunWipFirstPlan())
            {
                lot.CurrentFabPlan.EqpInStartTime = lot.Wip.LastTrackInTime;
                lot.CurrentFabPlan.IsInitRunWip   = true;
            }

            AcidMaster.OnBegingProcessing(aeqp, lot);
        }
示例#17
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="hb"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public Time GET_SETUP_TIME0(Mozart.SeePlan.Simulation.AoEquipment aeqp, IHandlingBatch hb, ref bool handled, Time prevReturnValue)
        {
            try
            {
                MicronBEAssyEqp eqp = null;
                if (InputMart.Instance.MicronBEAssyEqp.ContainsKey(aeqp.EqpID))
                {
                    eqp = InputMart.Instance.MicronBEAssyEqp[aeqp.EqpID];
                }

                if (eqp == null)
                {
                    return(default(Time));
                }

                MicronBEAssyBELot lot = hb as MicronBEAssyBELot;

                BEStep     step = lot.CurrentStep;
                StepMaster sm   = InputMart.Instance.StepMasterView.FindRows(step.StepID).FirstOrDefault();

                foreach (var info in InputMart.Instance.SetupInfo.DefaultView)
                {
                    if (info.LINE_ID != sm.LINE_ID)
                    {
                        continue;
                    }

                    //if (UtilityHelper.StringToEnum(info.STEP_GROUP, StepGroup.NONE) != eqp.StepGroup)
                    //    continue;

                    //if (LikeUtility.Like(eqp.EqpModel, info.EQP_MODEL) == false)
                    //    continue;

                    double setupTimeBySec = (double)info.SETUP_TIME;
                    return(Time.FromSeconds(setupTimeBySec));
                }

                return(default(Time));
            }
            catch (Exception e)
            {
                WriteHelper.WriteErrorHistory(ErrorLevel.FATAL, string.Format("ErrorMessage : {0}   MethodName : {1}", e.Message, System.Reflection.MethodInfo.GetCurrentMethod().Name));
                return(default(Time));
            }
        }
示例#18
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="hb"/>
        /// <param name="state">WaitSetup/StartSetup/EndSetup/FirstLoading/LastLoading/FirstUnloading/LastUnloading</param>
        /// <param name="handled"/>
        public void PROCESS_STATE_CHANGED0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, Mozart.SeePlan.Simulation.ProcessStates state, ref bool handled)
        {
            FabAoEquipment eqp = aeqp.ToFabAoEquipment();
            FabLot         lot = hb.ToFabLot();
            var            now = aeqp.NowDT;

            if (eqp.EqpID == "THCVD300")
            {
                Console.WriteLine();
            }

            //Setup이 있을 경우 FirstLoading이 없음.
            if (state == ProcessStates.FirstLoading)
            {
                DispatchLogHelper.WriteDispatchLog_ParallelChamber(eqp, lot);

                eqp.LastLoadingTime = now;
                //if (eqp.LastLoadingTime >= eqp.LastIdleStartTime)
                //    eqp.LastIdleStartTime = DateTime.MinValue;

                //eqp.LastIdleRunStartTime = DateTime.MinValue;

                eqp.LoadCount++;
            }
            //else if (state == ProcessStates.LastLoading)
            //{
            //    eqp.LastIdleRunStartTime = now;
            //}
            //else if (state == ProcessStates.LastUnloading)
            //{
            //    eqp.LastIdleStartTime = now;
            //}
            else if (state == ProcessStates.StartSetup)
            {
                DispatchLogHelper.WriteDispatchLog_ParallelChamber(eqp, lot);
            }
            else if (state == ProcessStates.EndSetup)
            {
                eqp.LoadCount = 1;
                eqp.SetupCount++;
                //eqp.LastIdleStartTime = DateTime.MinValue;
                //eqp.LastIdleRunStartTime = DateTime.MinValue;
            }
        }
示例#19
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="fs"/>
        /// <param name="det"/>
        /// <param name="handled"/>
        public void ON_FAILURE_EVENT1(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.DataModel.FailureSchedule fs, Mozart.SeePlan.Simulation.DownEventType det, ref bool handled)
        {
            FabAoEquipment eqp = aeqp.ToFabAoEquipment();

            if (det == DownEventType.End)
            {
                aeqp.Loader.Unblock();
                aeqp.WriteHistoryAfterBreak();
            }
            else
            {
                ResHelper.SetLastLoadingInfo(aeqp, null);

                aeqp.WriteHistory(LoadingStates.DOWN);
                aeqp.Loader.Block();

                //eqp.AddLoadPlan(LoadStates.DOWN, aeqp.NowDT);
                eqp.OnStateChanged(LoadingStates.DOWN);
            }
        }
示例#20
0
文件: Misc.cs 项目: parkheenam/test
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="hb"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public bool USE_CUSTOM_LOAD0(Mozart.SeePlan.Simulation.AoEquipment aeqp, IHandlingBatch hb, ref bool handled, bool prevReturnValue)
        {
            try
            {
                foreach (var item in InputMart.Instance.StdLotSize.DefaultView)
                {
                    if (item.CHG_TYPE == Constants.ChgType)
                    {
                        return(true);
                    }
                }

                return(false);
            }
            catch (Exception e)
            {
                WriteHelper.WriteErrorHistory(ErrorLevel.FATAL, string.Format("ErrorMessage : {0}   MethodName : {1}", e.Message, System.Reflection.MethodInfo.GetCurrentMethod().Name));
                return(false);
            }
        }
示例#21
0
        /// <summary>
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="proc"/>
        /// <param name="handled"/>
        public void ON_BEGIN_SETUP0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.AoProcess proc, ref bool handled)
        {
            FabAoEquipment  eqp  = aeqp.ToFabAoEquipment();
            EqpDispatchInfo info = aeqp.EqpDispatchInfo;
            FabLot          lot  = proc.Entity as FabLot;

            bool isAheadSetup = eqp.AvailableSetupTime < aeqp.NowDT;

            if (isAheadSetup)
            {
                DispatchLogHelper.UpdateDispatchLogByAheadSetup(eqp, info);
            }


            if (eqp.IsAcidConst && eqp.AcidDensity.IsSetupMark)
            {
                DateTime inTime = isAheadSetup ? eqp.AvailableSetupTime : eqp.NowDT;

                AcidMaster.ResetAcidDensity(eqp, lot, inTime);
            }
        }
示例#22
0
        /// <summary>
        /// </summary>
        /// <param name="eqp"/>
        /// <param name="wips"/>
        /// <param name="ctx"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public IList <IHandlingBatch> DO_FILTER1(Mozart.SeePlan.Simulation.AoEquipment eqp, IList <Mozart.SeePlan.Simulation.IHandlingBatch> wips, Mozart.SeePlan.Simulation.IDispatchContext ctx, ref bool handled, IList <Mozart.SeePlan.Simulation.IHandlingBatch> prevReturnValue)
        {
            //if (eqp.EqpID == "THCVDC00" && eqp.NowDT >= LcdHelper.StringToDateTime("20200108 090229"))
            //    Console.WriteLine("B");

            if (wips == null)
            {
                return(wips);
            }

            eqp.StartDispatch_ParallelChamber();

            List <IHandlingBatch> revaluation = new List <IHandlingBatch>();

            //▶▶ 1차 필터
            FilterMaster.DoFilter(eqp, wips, ctx);

            //▶▶ 2차 Group별 필터(다시 살릴 수 있음)
            FilterMaster.DoGroupFilter(eqp, wips, ctx, revaluation);

            //▶▶ Group에서 제외된 Lot 재평가
            if (wips.Count == 0 && revaluation.Count > 0)
            {
                FilterMaster.Revaluate(eqp, revaluation);

                if (revaluation.Count > 0)
                {
                    return(revaluation);
                }
            }
            else
            {
                foreach (var item in revaluation)
                {
                    FilterMaster.WriteFilterInfo(item, eqp);
                }
            }

            return(wips);
        }
示例#23
0
        /// <summary>
        /// 설비 초기화를 합니다. GetEqpList 직후 호출됨
        /// </summary>
        /// <param name="aeqp"/>
        /// <param name="handled"/>
        public void INITIALIZE_EQUIPMENT0(Mozart.SeePlan.Simulation.AoEquipment aeqp, ref bool handled)
        {
            //※ Inline 설비의 경우 설정확인 (true : ProessTime 사용, False : FlowTime 사용)
            aeqp.UseProcessingTime = false;

            //AoEqp 초기화
            FabAoEquipment eqp = aeqp.ToFabAoEquipment();

            var now = eqp.NowDT;

            eqp.LoadInfos            = new List <FabLoadInfo>();
            eqp.LastIdleStartTime    = now;
            eqp.LastIdleRunStartTime = now;
            eqp.AvailablePMTime      = DateTime.MaxValue;

            eqp.InitAcidDensity();

            ResHelper.AddEqpByGroup(eqp);

            //FabEqp 초기화
            FabEqp targetEqp = eqp.TargetEqp;

            targetEqp.InitPM();
            targetEqp.SetInitEqpStatus(eqp);

            //패럴러챔버 초기화
            if (aeqp.IsParallelChamber)
            {
                ChamberMaster.InitializeParallelChamber(eqp);
            }

            //설비상태가 Down 설정
            if (targetEqp.StatusInfo.Status == ResourceState.Down)
            {
                targetEqp.State = ResourceState.Down;
            }
        }
示例#24
0
 /// <summary>
 /// </summary>
 /// <param name="aeqp"/>
 /// <param name="proc"/>
 /// <param name="handled"/>
 public void ON_END_SETUP0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.AoProcess proc, ref bool handled)
 {
 }
示例#25
0
 /// <summary>
 /// </summary>
 /// <param name="aeqp"/>
 /// <param name="hb"/>
 /// <param name="handled"/>
 public void ON_TRACK_IN0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled)
 {
     ResHelper.CheckContinueousQty(aeqp, hb);
 }
示例#26
0
        /// <summary>
        /// </summary>
        /// <param name="db"/>
        /// <param name="aeqp"/>
        /// <param name="wips"/>
        /// <param name="ctx"/>
        /// <param name="handled"/>
        /// <param name="prevReturnValue"/>
        /// <returns/>
        public IHandlingBatch[] DO_SELECT0(Mozart.SeePlan.Simulation.DispatcherBase db, Mozart.SeePlan.Simulation.AoEquipment aeqp, IList <Mozart.SeePlan.Simulation.IHandlingBatch> wips, Mozart.SeePlan.Simulation.IDispatchContext ctx, ref bool handled, Mozart.SeePlan.Simulation.IHandlingBatch[] prevReturnValue)
        {
            WeightPreset   preset = aeqp.Target.Preset;
            FabAoEquipment eqp    = aeqp as FabAoEquipment;

            //InPort Wip 처리
            if (eqp.HasInPortWip)
            {
                //여러 Lot을 넘길 경우 첫번째 투입, 나머지는 설비의 Buffer에 넣음.
                IHandlingBatch[] list = eqp.InitInPortWips.ToArray();

                eqp.InitInPortWips.Clear();

                return(list);
            }

            IHandlingBatch[] selected = null;

            if (wips.Count > 0)
            {
                List <IHandlingBatch> newlist = new List <IHandlingBatch>(wips);
                var control = DispatchControl.Instance;

                //if (eqp.EqpID == "FHRPH100" && eqp.NowDT >= LcdHelper.StringToDateTime("20200113 073000"))
                //	Console.WriteLine("B");

                var dummy = WeightHelper.NeedAllowRunDown_Dummy(eqp, wips);
                if (dummy != null)
                {
                    newlist.Add(dummy);
                    dummy.DispatchFilterInfo = eqp.LastPlanFilterInfo;
                }

                var dummyList = FilterMaster.WaitForPrevStepWip_Dummy(ctx, eqp);
                if (dummyList != null && dummyList.Count > 0)
                {
                    newlist.AddRange(dummyList);
                }

                var lotList = control.Evaluate(db, newlist, ctx);
                selected = control.Select(db, eqp, lotList);

                if (control.IsWriteDispatchLog(eqp))
                {
                    DispatchLogHelper.AddDispatchInfo(eqp, lotList, selected, preset);
                    //eqp.EqpDispatchInfo.AddDispatchInfo(lotList, selected, preset);
                }
            }

            if (selected == null)
            {
                eqp.CheckAvailableSubEqps();
            }

            return(selected);
        }
示例#27
0
 /// <summary>
 /// </summary>
 /// <param name="aeqp"/>
 /// <param name="handled"/>
 /// <param name="prevReturnValue"/>
 /// <returns/>
 public bool IS_WRITE_DISPATCH_LOG0(Mozart.SeePlan.Simulation.AoEquipment aeqp, ref bool handled, bool prevReturnValue)
 {
     return(true);
 }
示例#28
0
文件: Misc.cs 项目: yichunbong/CSOT
 /// <summary>
 /// </summary>
 /// <param name="aeqp"/>
 /// <param name="handled"/>
 /// <param name="prevReturnValue"/>
 /// <returns/>
 public int GET_CHAMBER_CAPACITY0(Mozart.SeePlan.Simulation.AoEquipment aeqp, ref bool handled, int prevReturnValue)
 {
     return(aeqp.Target.ChildCount);
 }