Ejemplo n.º 1
0
        //private static void OnChamberStateChangedTemp(FabAoEquipment eqp, FabLot lot, LoadingStates state, DateTime now, bool isDone)
        //{
        //	if (eqp.IsParallelChamber == false)
        //		return;

        //	int count = eqp.SubEqps.Length;
        //	for (int i = 0; i < count; i++)
        //	{
        //		var subEqp = eqp.SubEqps[i];

        //		if (isDone)
        //		{
        //			subEqp.OnStateChanged(eqp, state, lot, isDone);
        //			continue;
        //		}

        //		ChamberInfo chamberInfo;
        //		if (eqp.CheckParallelChamberState(i, state, lot, out chamberInfo))
        //		{
        //			subEqp.OnStateChanged(eqp, state, lot, isDone);

        //			//TODO : 임시처리로직 ParallelChamber 설비의 BUSY 이벤트 누락 발생으로 임시 처리함. (이슈 확인 후 삭제 필요함.)
        //			if (state == LoadingStates.SETUP)
        //			{
        //				Time delay = Time.Max((subEqp.ChamberInfo.SetupEndTime - now), Time.Zero);
        //				if (delay > Time.Zero)
        //				{
        //					object[] args = new object[3] { subEqp, LoadingStates.BUSY.ToString(), lot };
        //					eqp.AddTimeout(delay, SimHelper.OnEqpLoadingStateChanged, args);
        //				}
        //			}
        //		}
        //		else
        //		{
        //			if (state == LoadingStates.BUSY && subEqp.ChamberInfo.Next != null)
        //			{
        //				FabLot itsMe = subEqp.ChamberInfo.Next as FabLot;
        //				if (lot.CurrentPlan == itsMe.CurrentPlan)
        //				{
        //					if (subEqp.ChamberInfo.OutTime > subEqp.SetupEndTime)
        //					{
        //						Time delay = Time.Max((subEqp.ChamberInfo.OutTime - now), Time.Zero);
        //						if (delay > Time.Zero)
        //						{
        //							object[] args = new object[3] { subEqp, LoadingStates.BUSY.ToString(), lot };
        //							eqp.AddTimeout(delay, SimHelper.OnEqpLoadingStateChanged, args);
        //						}
        //					}
        //				}
        //			}
        //			else if (state == LoadingStates.IDLERUN)
        //			{
        //				if (subEqp.ChamberInfo.Current != null)
        //				{
        //					Time delay = Time.Max((subEqp.ChamberInfo.OutTime - now), Time.Zero);
        //					if (delay > Time.Zero)
        //					{
        //						object[] args = new object[3] { subEqp, LoadingStates.IDLERUN.ToString(), lot };
        //						eqp.AddTimeout(delay, SimHelper.OnEqpLoadingStateChanged, args);
        //					}
        //				}
        //			}
        //			else if (state == LoadingStates.SETUP)
        //			{

        //				if (subEqp.ChamberInfo.Current != null)
        //				{
        //					var workInfo = subEqp.ChamberInfo.List.Find(p => (p.Entity as FabLot).CurrentPlan == lot.CurrentPlan);
        //					if (workInfo != null)
        //					{
        //						Time delay = Time.Max((workInfo.SetupStartTime - now), Time.Zero);
        //						if (delay > Time.Zero)
        //						{
        //							object[] args = new object[3] { subEqp, LoadingStates.SETUP.ToString(), lot };
        //							eqp.AddTimeout(delay, SimHelper.OnEqpLoadingStateChanged, args);

        //							subEqp.SetupStartTime = workInfo.SetupStartTime;
        //						}

        //						delay = Time.Max((workInfo.SetupEndTime - now), Time.Zero);
        //						if (delay > Time.Zero)
        //						{
        //							object[] args = new object[3] { subEqp, LoadingStates.BUSY.ToString(), lot };
        //							eqp.AddTimeout(delay, SimHelper.OnEqpLoadingStateChanged, args);

        //							subEqp.SetupEndTime = workInfo.SetupEndTime;
        //						}
        //					}
        //				}
        //			}
        //		}

        //		//if (eqp.EqpID == "THCVD500")
        //		//{
        //		//    string lotID = "-";
        //		//    if (subEqp.ChamberInfo.Current != null)
        //		//        lotID = (subEqp.ChamberInfo.Current as FabLot).LotID;

        //		//    Logger.MonitorInfo("{0};{1};{2};{3};{4};{5};{6};{7};{8}\t", eqp.NowDT.ToString("HH:mm:ss"), state, lot == null ? "-" : lot.LotID, subEqp.SubEqpID, lotID, subEqp.ChamberInfo.OutTime == Time.Zero ? "-" : subEqp.ChamberInfo.OutTime.ToString(), subEqp.ChamberInfo.Next == null ? "-" : (subEqp.ChamberInfo.Next as FabLot).LotID, subEqp.ChamberInfo.Next == null ? "-" : subEqp.ChamberInfo.NextOutTime.ToString(), subEqp.ChamberInfo.LastUnits);
        //		//}
        //	}
        //}

        private static void OnChamberStateChanged(FabAoEquipment eqp, FabLot lot, LoadingStates state, DateTime now, bool isDone)
        {
            var findSubEqps = isDone ? eqp.GetSubEqpList() : eqp.FindSubEqpsByState(state, lot);

            if (findSubEqps != null && findSubEqps.Count > 0)
            {
                foreach (var subEqp in findSubEqps)
                {
                    subEqp.OnStateChanged(eqp, state, lot, isDone);

                    //TODO : 임시처리로직 ParallelChamber 설비의 BUSY 이벤트 누락 발생으로 임시 처리함. (이슈 확인 후 삭제 필요함.)
                    if (state == LoadingStates.SETUP)
                    {
                        Time delay = Time.Max((subEqp.ChamberInfo.SetupEndTime - now), Time.Zero);
                        if (delay > Time.Zero)
                        {
                            object[] args = new object[3] {
                                subEqp, LoadingStates.BUSY.ToString(), lot
                            };
                            eqp.AddTimeout(delay, SimHelper.OnEqpLoadingStateChanged, args);
                        }
                    }
                }
            }
        }
Ejemplo n.º 2
0
        private static List <FabSubEqp> FindSubEqpsByState(this FabAoEquipment eqp, LoadingStates state, FabLot lot)
        {
            List <FabSubEqp> list = new List <FabSubEqp>();

            var subEqpList = eqp.SubEqps;

            if (subEqpList == null || subEqpList.Length == 0)
            {
                return(list);
            }

            int count = eqp.SubEqps.Length;

            for (int i = 0; i < count; i++)
            {
                var subEqp = eqp.SubEqps[i];

                ChamberInfo chamberInfo;
                if (eqp.CheckParallelChamberState(i, state, lot, out chamberInfo))
                {
                    list.Add(subEqp);
                }
            }

            return(list);
        }
Ejemplo n.º 3
0
        private static bool IsIgnoreStateForPM(LoadingStates state)
        {
            if (state == LoadingStates.IDLE || state == LoadingStates.IDLERUN)
            {
                return(true);
            }

            return(false);
        }
Ejemplo n.º 4
0
 public void StartLoading()
 {
     if (_loadingState != LoadingStates.NOT_STARTED)
     {
         return;
     }
     _loadingState = LoadingStates.PREPARATION_IN_PROCESS;
     _toStartLoading.RaiseEvent();
 }
Ejemplo n.º 5
0
 public void EndLoading()
 {
     if (_loadingState != LoadingStates.PREPARED)
     {
         return;
     }
     _loadingState = LoadingStates.FINISHING;
     _toFinishLoading.RaiseEvent();
 }
Ejemplo n.º 6
0
        private static void SetLastFabLoadInfo(this FabAoEquipment eqp, LoadingStates state,
                                               DateTime now, FabLot lot = null, bool isDone = false, bool isAheadSetup = false)
        {
            var infos = eqp.LoadInfos;

            var newInfo = SetLastFabLoadInfo(infos, state, now, lot, isDone, isAheadSetup);

            newInfo.RunMode = eqp.GetCurrentRunMode();
        }
Ejemplo n.º 7
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;
            }
        }
Ejemplo n.º 8
0
 public void UpdateLoadingStartingStatus()
 {
     if (_loadingState != LoadingStates.PREPARATION_IN_PROCESS)
     {
         return;
     }
     _componentsFinishedPreparation++;
     if (_componentsFinishedPreparation == _componentsStartCount)
     {
         _loadingState = LoadingStates.PREPARED;
         OnLoadingPrepared();
     }
 }
Ejemplo n.º 9
0
 public void UpdateLoadingFinishingStatus()
 {
     if (_loadingState != LoadingStates.FINISHING)
     {
         return;
     }
     _componentsFinishedLoading++;
     if (_componentsFinishedLoading == _componentsFinishCount)
     {
         _loadingState = LoadingStates.FINISHED;
         OnLoadingFinished();
     }
 }
Ejemplo n.º 10
0
        internal static bool IgnoreStateChange(FabLoadInfo lastInfo, LoadingStates state)
        {
            if (lastInfo.State != LoadingStates.PM)
            {
                return(false);
            }

            if (IsIgnoreStateForPM(state))
            {
                return(true);
            }

            return(false);
        }
Ejemplo n.º 11
0
        private static void SetLastFabLoadInfo(this FabSubEqp subEqp, LoadingStates state,
                                               DateTime now, FabLot lot = null, bool isDone = false)
        {
            var infos = subEqp.LoadInfos;

            var newInfo = SetLastFabLoadInfo(infos, state, now, lot, isDone);

            newInfo.SubEqpID = subEqp.SubEqpID;

            if (state == LoadingStates.BUSY)
            {
                newInfo.UnitQty = subEqp.ChamberInfo.CurrentUnits;
                newInfo.RunMode = subEqp.SubEqpGroup.CurrentRunMode;
            }
        }
Ejemplo n.º 12
0
        public async void LoadData()
        {
            try
            {
                _allNamedays = await NamedayRepository.GetAllNamedaysAsync();
                PerformFiltering();
                LoadingState = LoadingStates.Loaded;
            }
            catch
            {
                LoadingState = LoadingStates.Error;
            }

            var now = DateTime.Now;
            SelectedNameday = _allNamedays.FirstOrDefault(
                d => d.Day == now.Day && d.Month == now.Month);
        }
Ejemplo n.º 13
0
        private static void UpdateAheadSetupInfo(FabAoEquipment eqp, LoadingStates state, DateTime now)
        {
            eqp.AvailableSetupTime = DateTime.MaxValue;
            eqp.AvailablePMTime    = DateTime.MaxValue;

            //TODO : ParallelChamber는 제외 처리 함
            if (eqp.IsParallelChamber)
            {
                return;
            }

            //AheadSetup - Setup가능시간 설정 (Idle시작시간 기록)
            if (state == LoadingStates.IDLE || state == LoadingStates.IDLERUN)
            {
                eqp.AvailableSetupTime = now;
            }
        }
Ejemplo n.º 14
0
        /// <summary>
        /// PM/Down 발생시 동일시간에 이벤트가 PM -> IDLE or IDLERun 순서로 발생하여
        /// Eqp Load 이력이 제대로 기록되지 않음.
        /// PM 발생 직후 IDLE/IDELRUN을 무시하는 코드임.
        /// PM이 종료 될 경우 Loader는 블럭이 해제되며 동일 시간에 PM-> IDLE 순서로 이벤트 발생함.
        /// 이때는 IDLE을 Eqp Load 이력을 기록하므로서 PM이 종료이력이 기록됨.
        /// </summary>
        internal static bool IgnoreStateChange(AoEquipment aeqp, LoadingStates state, bool isDone = false)
        {
            if (isDone)
            {
                return(false);
            }

            //PM/Down 발생시 Loader가 블럭됨.
            if (aeqp.Loader.IsBlocked())
            {
                if (IsIgnoreStateForPM(state))
                {
                    return(true);
                }
            }

            return(false);
        }
        private async void LoadData()
        {
            try
            {
                _allNamedays = await NamedayRepository.GetAllNamedaysAsync();

                PerformFiltering();
                LoadingState = LoadingStates.Loaded;
            }
            catch
            {
                LoadingState = LoadingStates.Error;
            }

            // get current nameday
            var now = DateTime.Now;

            SelectedNameday = _allNamedays.FirstOrDefault(n => n.Day == now.Day && n.Month == now.Month);
        }
Ejemplo n.º 16
0
        public async void LoadData()
        {
            try
            {
                _allNamedays = await NamedayRepository.GetAllNamedaysAsync();

                PerformFiltering();
                LoadingState = LoadingStates.Loaded;
            }
            catch
            {
                LoadingState = LoadingStates.Error;
            }

            var now = DateTime.Now;

            SelectedNameday = _allNamedays.FirstOrDefault(
                d => d.Day == now.Day && d.Month == now.Month);
        }
Ejemplo n.º 17
0
        private static bool IsAhead(FabAoEquipment eqp, LoadingStates state, DateTime now)
        {
            if (state == LoadingStates.SETUP)
            {
                if (eqp.AvailableSetupTime < now)
                {
                    return(true);
                }
            }

            if (state == LoadingStates.PM)
            {
                if (eqp.AvailablePMTime < now)
                {
                    return(true);
                }
            }

            return(false);
        }
Ejemplo n.º 18
0
        public static void OnStateChanged(this FabSubEqp subEqp, FabAoEquipment parent,
                                          LoadingStates state, FabLot lot = null, bool isDone = false)
        {
            var      eqp = parent;
            DateTime now = eqp.NowDT;

            //PM 발생시 IDLE 무시
            bool isIngore = subEqp.UpdateLastLoadInfo(now, state, eqp, isDone);

            if (isIngore && isDone == false)
            {
                return;
            }

            subEqp.SetLastFabLoadInfo(state, now, lot, isDone);

            UpdateAheadSetupInfo(eqp, state, now);

            if (state == LoadingStates.BUSY)
            {
                subEqp.LastPlan = lot.CurrentFabPlan;

                subEqp.LastIdleRunStartTime = DateTime.MinValue;
                subEqp.LastIdleStartTime    = DateTime.MinValue;
            }

            if (state == LoadingStates.IDLE)
            {
                subEqp.LastIdleStartTime = now;
            }

            if (state == LoadingStates.IDLERUN)
            {
                subEqp.LastIdleRunStartTime = now;
            }


            subEqp.ChangeCurrentRunMode(lot);
        }
Ejemplo n.º 19
0
        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);
        }
Ejemplo n.º 20
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);
        }
Ejemplo n.º 21
0
        public static void OnChamberStateChanged(this FabSubEqp subEqp, FabAoEquipment eqp, LoadingStates state,
                                                 FabLot lot = null, bool isDone = false)
        {
            if (subEqp == null)
            {
                return;
            }

            subEqp.OnStateChanged(eqp, state, lot, isDone);
        }
Ejemplo n.º 22
0
        private static void UpdateLastLoadInfo(this FabAoEquipment eqp, DateTime now, LoadingStates state)
        {
            var lastInfo = eqp.LastLoadInfo;

            if (lastInfo == null)
            {
                return;
            }

            lastInfo.EndTime = now;

            var lastPlan = lastInfo.Target as FabPlanInfo;

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

            var infos = eqp.LoadInfos;

            if (lastInfo.IsDummyState())
            {
                infos.Remove(lastInfo);
            }
        }
Ejemplo n.º 23
0
        private static FabLoadInfo SetLastFabLoadInfo(List <FabLoadInfo> infos, LoadingStates state,
                                                      DateTime now, FabLot lot = null, bool isDone = false, bool isAheadSetup = false)
        {
            FabLoadInfo newInfo = new FabLoadInfo();

            newInfo.State     = state;
            newInfo.StartTime = now;

            if (lot != null && state == LoadingStates.BUSY)
            {
                lot.CurrentFabPlan.EqpLoadInfo = newInfo;
            }

            //PlanEndTime 마감처리
            if (isDone)
            {
                newInfo.EndTime = now;
            }

            FabPlanInfo target = null;

            if (lot != null && IsRunState(state))             //true = BUSY or SETUP
            {
                target         = lot.CurrentFabPlan;
                newInfo.Target = target;

                if (state == LoadingStates.BUSY)
                {
                    newInfo.UnitQty = target.UnitQty;
                }

                if (state == LoadingStates.SETUP)
                {
                    if (isAheadSetup)
                    {
                        newInfo.StateInfo = "AHEAD";
                    }

                    if (target.IsIdleSetup)
                    {
                        newInfo.StateInfo = "IDLE_SETUP";
                    }

                    if (isAheadSetup && target.IsIdleSetup)
                    {
                        newInfo.StateInfo = "AHEAD_IDLE_SETUP";
                    }

                    var eqp = ResHelper.GetFabAoEquipment(lot.CurrentPlan.LoadedResource.ResID);
                    if (eqp != null && eqp.IsAcidConst && eqp.AcidDensity.IsSetupMark)
                    {
                        if (isAheadSetup)
                        {
                            newInfo.StateInfo = "AHEAD_ACID";
                        }
                        else
                        {
                            newInfo.StateInfo = "ACID";
                        }

                        //용액교체 마크 해제
                        AcidMaster.SetSetupMark(eqp, false);
                    }
                }
            }

            if (state == LoadingStates.PM)
            {
                if (isAheadSetup)
                {
                    newInfo.StateInfo = "AHEAD";
                }
            }

            infos.Add(newInfo);

            return(newInfo);
        }
Ejemplo n.º 24
0
 public static bool IsIgnorableState(LoadingStates state)
 {
     return(state == LoadingStates.IDLE || state == LoadingStates.IDLERUN);
 }
Ejemplo n.º 25
0
 void Awake()
 {
     _componentsFinishedPreparation = 0;
     _componentsFinishedLoading     = 0;
     _loadingState = LoadingStates.NOT_STARTED;
 }
Ejemplo n.º 26
0
 private static bool IsRunState(LoadingStates state)
 {
     return(state == LoadingStates.BUSY || state == LoadingStates.SETUP);
 }
Ejemplo n.º 27
0
 /// <summary>
 /// </summary>
 /// <param name="aeqp"/>
 /// <param name="hb"/>
 /// <param name="state"/>
 /// <param name="handled"/>
 public void LOADING_STATE_CHANGED0(AoEquipment aeqp, IHandlingBatch hb, LoadingStates state, ref bool handled)
 {
 }
Ejemplo n.º 28
0
        public static void OnStateChanged(this FabAoEquipment eqp, LoadingStates state,
                                          FabLot lot = null, bool isDone = false)
        {
            //if (eqp.EqpID == "FHUPH100" && lot != null && lot.LotID == "TH011010N0F")
            //	Console.WriteLine("B");

            DateTime now = eqp.NowDT;

            bool isAheadSetup = false;

            if (IsAhead(eqp, state, now))
            {
                if (state == LoadingStates.SETUP)
                {
                    now = eqp.AvailableSetupTime;
                }

                if (state == LoadingStates.PM)
                {
                    now = eqp.AvailablePMTime;
                }

                isAheadSetup = true;
            }

            eqp.UpdateLastLoadInfo(now, state);
            eqp.SetLastFabLoadInfo(state, now, lot, isDone, isAheadSetup);

            UpdateAheadSetupInfo(eqp, state, now);

            if (eqp.IsParallelChamber)
            {
                if (state == LoadingStates.BUSY && lot != null)
                {
                    FabPlanInfo plan = lot.CurrentFabPlan;
                    if (plan.IsInitRunWip == false)
                    {
                        plan.TrackInTime = now;
                        plan.InQty       = lot.UnitQty;
                    }
                }
            }
            else
            {
                if (state == LoadingStates.BUSY && lot != null)
                {
                    lot.CurrentFabPlan.TrackInTime = now;
                }
            }

            OnChamberStateChanged(eqp, lot, state, now, isDone);

            if (state == LoadingStates.IDLERUN || state == LoadingStates.IDLE)
            {
                if (state == LoadingStates.IDLERUN)
                {
                    if (eqp.LastIdleRunStartTime == DateTime.MinValue)
                    {
                        eqp.LastIdleRunStartTime = now;
                    }
                }

                if (eqp.LastIdleStartTime == DateTime.MinValue)
                {
                    eqp.LastIdleStartTime = now;
                }
            }
            else
            {
                //reset (not idle state)
                eqp.LastIdleRunStartTime = DateTime.MinValue;
                eqp.LastIdleStartTime    = DateTime.MinValue;
            }
        }