Beispiel #1
0
        private static void MoveQty(this FabMask mask, FabAoEquipment eqp, FabLot lot)
        {
            if (mask.HasLimit() == false)
            {
                return;
            }

            int qty = lot.UnitQty;

            if (qty <= 0)
            {
                return;
            }

            foreach (var item in mask.Limits)
            {
                if (item.ActivateType != ActivateType.M)
                {
                    continue;
                }

                item.MoveQty += qty;
                item.Seq++;

                OutCollector.WriteLimitMLog(item, eqp, lot, eqp.NowDT);
            }
        }
Beispiel #2
0
        private static void SeizeMaskTool(this FabAoEquipment eqp, FabMask mask, FabLot lot)
        {
            if (eqp.InUseMask != null)
            {
                if (mask == null || mask != eqp.InUseMask)
                {
                    eqp.ReleaseMask();
                }
            }

            eqp.InUseMask = mask;

            if (mask != null)
            {
                mask.StateChangeTime = eqp.NowDT;
                mask.StateCode       = ToolStatus.INUSE;

                if (mask.EqpID != eqp.EqpID)
                {
                    ChangeLocation(mask, mask.EqpID, eqp.EqpID);
                }

                mask.EqpID    = eqp.EqpID;
                mask.Location = mask.EqpID;

                mask.AvailableTime = GetNextAvailableTime(eqp, lot);
                mask.AddWorkInfo(lot);
            }
        }
Beispiel #3
0
            private int GetLocationEval(FabMask mask)
            {
                //현재 설비 위치
                if (mask.EqpID == this.EqpID)
                {
                    //사용 중
                    if (mask.StateCode == ToolStatus.INUSE)
                    {
                        return(0);
                    }

                    return(1);
                }

                //대기 상태
                if (mask.StateCode == ToolStatus.WAIT)
                {
                    //설비 밖에 위치
                    if (string.IsNullOrEmpty(mask.EqpID))
                    {
                        return(2);
                    }

                    //타 설비에 위치
                    return(3);
                }

                return(99);
            }
Beispiel #4
0
        private static bool IsLoadable_Limit(this FabMask mask, FabLot lot)
        {
            if (mask.HasLimit() == false)
            {
                return(true);
            }

            bool checkQty = true;

            if (InputMart.Instance.GlobalParameters.ApplyArrangeMType == false)
            {
                checkQty = false;
            }

            int lotSize = SeeplanConfiguration.Instance.LotUnitSize;
            int unitQty = lot.IsDummy ? lotSize : lot.UnitQty;

            int qty = checkQty ? Math.Max(unitQty, 1) : 0;

            var infos = mask.Limits;

            foreach (var item in infos)
            {
                if (item.IsLoadable(qty) == false)
                {
                    return(false);
                }
            }

            return(true);
        }
Beispiel #5
0
        public static FabMask SelectBestMask(AoEquipment aeqp, FabLot lot)
        {
            var eqp = aeqp.ToFabAoEquipment();

            string productVersion = lot.CurrentProductVersion;

            FabMask selectMask = null;

            //연속진행 중인 경우
            if (eqp.IsLastPlan(lot))
            {
                var currMask = eqp.GetCurrentMask();
                if (currMask != null && currMask.IsLoadable_Limit(lot))
                {
                    var currEA = lot.CurrentEqpArrange;
                    if (currEA != null)
                    {
                        var last = eqp.GetLastPlan();                         //eqp.LastPlan as FabPlanInfo;
                        if (currEA.IsLoableByProductVersion(last.ProductVersion))
                        {
                            selectMask     = currMask;
                            productVersion = last.ProductVersion;
                        }
                    }
                }
            }

            if (selectMask == null)
            {
                var loadableList = GetLoadableMaskArrangeList(aeqp, lot, ToolType.MASK);

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

                if (loadableList.Count > 1)
                {
                    loadableList.Sort(new CompareHelper.MaskArrangeComparer(eqp.EqpID));
                }

                var best = loadableList[0];

                selectMask     = best.Mask;
                productVersion = best.ProductVersion;
            }

            //2차 선택 (1차 : Mask 미고려 선택, 2차 : Mask 고려 후 선택)
            lot.CurrentEqpArrange.SetUsedArrange(productVersion);

            //if (eqp.NowDT >= LcdHelper.StringToDateTime("20190820153409"))
            //{
            //    if (lot.LotID == "LARRAYI0075" && lot.CurrentStepID == "1300")
            //        Console.WriteLine("B");
            //}

            return(selectMask);
        }
Beispiel #6
0
        public static MaskLoadInfo FindLoadInfo(this FabMask mask, FabLot lot, AoEquipment eqp)
        {
            var key = GetMaskLoadInfoKey(eqp.EqpID, lot.LotID, lot.CurrentStepID);

            MaskLoadInfo info;

            mask.LoadInfosView.TryGetValue(key, out info);
            return(info);
        }
Beispiel #7
0
        public static void RemoveWorkInfo(this FabMask mask, FabLot lot)
        {
            var isRemove = mask.WorkInfos.Remove(lot);

            if (isRemove == false)
            {
                Logger.Warn("Invalid Mask WorkInfo : MaskID={0}, LotID={1}", mask.ToolID, lot.LotID);
            }
        }
Beispiel #8
0
        public static void AddWorkInfo(this FabMask mask, FabLot lot)
        {
            if (mask.WorkInfos == null)
            {
                mask.WorkInfos = new HashSet <FabLot>();
            }

            mask.WorkInfos.Add(lot);
        }
Beispiel #9
0
        private static void AddLimitInfo(this FabMask mask, EqpArrangeInfo info)
        {
            if (info == null)
            {
                return;
            }

            mask.Limits.Add(info);
        }
Beispiel #10
0
        private static void ReleaseMask(this FabAoEquipment eqp)
        {
            FabMask oldMask = eqp.InUseMask;

            oldMask.LastReleaseTime = eqp.NowDT;
            oldMask.StateChangeTime = eqp.NowDT;
            oldMask.StateCode       = ToolStatus.MOUNT;

            eqp.InUseMask = null;
        }
Beispiel #11
0
        private static bool HasLimit(this FabMask mask)
        {
            var infos = mask.Limits;

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

            return(true);
        }
Beispiel #12
0
        private static FabMask GetCurrentMask(this FabAoEquipment eqp)
        {
            FabMask mask = eqp.InUseMask;

            //다른설비에 Mask가 할당된 경우 내가 사용하는거 아님. 추후 나중에 Detach 기능 구현필요
            if (mask != null && mask.EqpID != eqp.EqpID)
            {
                return(null);
            }

            return(mask);
        }
Beispiel #13
0
        private void BuildFabJig(Tool item)
        {
            int qty = item.QTY;

            for (int i = 1; i <= qty; i++)
            {
                string jigID = string.Format("{0}_{1}", item.TOOL_ID, i);

                FabMask mask = CreateHelper.CreateFabMask(item, jigID);

                JigMaster.AddTool(mask);
            }
        }
Beispiel #14
0
        internal static void AddTool(FabMask mask)
        {
            InputMart.Instance.FabMask.Add(mask.ToolID, mask);

            List <FabMask> list;

            if (_locationInfo.TryGetValue(mask.InitLoacation, out list) == false)
            {
                _locationInfo.Add(mask.InitLoacation, list = new List <FabMask>());
            }

            list.Add(mask);

            mask.AddLoadInfo(mask.InitEqpID, null, true);
        }
Beispiel #15
0
        public static void StartTask(FabLot lot, AoEquipment aeqp)
        {
            //if (IsUseTool(lot) == false)
            //	return;

            FabAoEquipment eqp  = aeqp.ToFabAoEquipment();
            FabMask        mask = lot.CurrentMask;

            eqp.SeizeMaskTool(mask, lot);

            if (mask != null)
            {
                mask.AddLoadInfo(eqp.EqpID, lot);
                mask.MoveQty(eqp, lot);
            }
        }
Beispiel #16
0
        private static bool IsMatchedByMask(this EqpArrangeInfo item, FabMask mask)
        {
            if (item.HasLimitType(LimitType.M))
            {
                if (mask == null)
                {
                    return(false);
                }

                if (IsMatched(item.MaskID, mask.ToolID) == false)
                {
                    return(false);
                }
            }

            return(true);
        }
Beispiel #17
0
        internal static void AddTool(FabMask mask)
        {
            if (_jigs.ContainsKey(mask.JigID) == false)
            {
                _jigs.Add(mask.JigID, mask);
            }

            List <FabMask> jigList;

            if (_jigSets.TryGetValue(mask.ToolID, out jigList) == false)
            {
                _jigSets.Add(mask.ToolID, jigList = new List <FabMask>());
            }

            jigList.Add(mask);

            mask.AddLoadInfo(mask.InitEqpID, null, true);
        }
Beispiel #18
0
        private static void ChangeLocation(FabMask mask, string fromEqpID, string toEqpID)
        {
            List <FabMask> list;

            if (_locationInfo.TryGetValue(fromEqpID, out list))
            {
                list.Remove(mask);
            }

            List <FabMask> toList;

            if (_locationInfo.TryGetValue(toEqpID, out toList) == false)
            {
                _locationInfo.Add(toEqpID, toList = new List <FabMask>());
            }

            if (toList.Contains(mask) == false)
            {
                toList.Add(mask);
            }

            AddLoadInfo(mask, toEqpID, null);
        }
Beispiel #19
0
        public static void AddLoadInfo(this FabMask mask, string eqpID, FabLot lot, bool isInit = false)
        {
            MaskLoadInfo info = new MaskLoadInfo();

            if (lot != null)
            {
                info.EqpID         = eqpID;
                info.AvailableTime = mask.AvailableTime;
                info.PlanInfo      = lot.CurrentFabPlan;
                info.StartTime     = AoFactory.Current.NowDT;

                info.LotID          = lot.LotID;
                info.StepID         = lot.CurrentStepID;
                info.ProductID      = lot.CurrentProductID;
                info.ProductVersion = lot.CurrentProductVersion;

                string key = GetMaskLoadInfoKey(info.EqpID, info.LotID, info.StepID);

                if (mask.LoadInfosView.ContainsKey(key) == false)
                {
                    mask.LoadInfosView.Add(key, info);
                }
            }
            else
            {
                info.StartTime = (DateTime)mask.AvailableTime;
                info.EndTime   = isInit ? info.StartTime : info.StartTime.AddMinutes(GetMaskTransferTime(mask.EqpID, eqpID).TotalMinutes);

                info.EqpID          = eqpID;
                info.LotID          = isInit ? "INIT" : "MOVE";
                info.StepID         = Constants.NULL_ID;
                info.ProductID      = Constants.NULL_ID;
                info.ProductVersion = Constants.NULL_ID;
            }

            mask.LoadInfos.Add(info);
        }
Beispiel #20
0
        internal static void AddToolArrange(FabMask mask, MaskArrange arr)
        {
            if (mask.AllSteps.Contains(arr.StepID) == false)
            {
                mask.AllSteps.Add(arr.StepID);
            }

            if (mask.AllEqps.Contains(arr.EqpID))
            {
                mask.AllEqps.Add(arr.EqpID);
            }

            List <string> list;

            if (mask.AllProduct.TryGetValue(arr.ProductID, out list) == false)
            {
                mask.AllProduct.Add(arr.ProductID, list = new List <string>());
            }

            if (list.Contains(arr.ProductVersion) == false)
            {
                list.Add(arr.ProductVersion);
            }
        }
Beispiel #21
0
        internal static List <EqpRecipeInfo> GetRecipeMatchList(FabAoEquipment eqp, FabLot lot)
        {
            FabStep step      = lot.CurrentFabStep;
            FabMask mask      = lot.CurrentMask;
            string  productID = lot.CurrentProductID;

            string stepID  = step.StdStep.RecipeLPOBM.Contains("O") ? lot.CurrentFabStep.StepID : Constants.NULL_ID;
            string prodVer = step.StdStep.RecipeLPOBM.Contains("B") ? lot.CurrentProductVersion : Constants.NULL_ID;;
            string toolID  = step.StdStep.RecipeLPOBM.Contains("M") ? mask != null ? mask.ToolID : Constants.NULL_ID : Constants.NULL_ID;

            string key = LcdHelper.CreateKey(eqp.EqpID, step.StepID, productID, prodVer, toolID);

            List <EqpRecipeInfo> list;

            if (_cacheRecipeInfo.TryGetValue(key, out list))
            {
                return(list);
            }

            FabEqp targetEqp = eqp.TargetEqp;

            if (targetEqp.RecipeTime.TryGetValue(productID, out list) == false)
            {
                return(new List <EqpRecipeInfo>());
            }

            List <EqpRecipeInfo> result = new List <EqpRecipeInfo>();

            foreach (var item in list)
            {
                if (item.Flag == RecipeFlag.N || item.Flag == RecipeFlag.None)
                {
                    continue;
                }

                if (item.Flag == RecipeFlag.M && item.IsVaildMFlag == false)
                {
                    continue;
                }

                string runMode = eqp.GetCurrentRunMode();

                //RunMode
                if (LcdHelper.IsEmptyID(runMode) == false)
                {
                    if (runMode != item.RunMode)
                    {
                        continue;
                    }
                }

                //Shop
                if (step.ShopID != item.ShopID)
                {
                    continue;
                }

                //O - Step
                if (LcdHelper.IsEmptyID(stepID) == false && stepID != item.StepID)
                {
                    continue;
                }

                //B - Version
                if (LcdHelper.IsEmptyID(prodVer) == false)
                {
                    if (item.ProductVersion != prodVer)
                    {
                        continue;
                    }
                }

                //M - Mask
                if (LcdHelper.IsEmptyID(toolID) == false)
                {
                    if (toolID != item.ToolID)
                    {
                        continue;
                    }
                }

                result.Add(item);
            }

            result.Sort(new CompareHelper.EqpRecipeTimeComparer());

            _cacheRecipeInfo.Add(key, result);

            return(result);
        }
Beispiel #22
0
        private void BuildFabMask(Tool item, Dictionary <string, FabEqp> dic)
        {
            FabMask mask = CreateHelper.CreateFabMask(item);

            #region 중복체크
            if (InputMart.Instance.FabMask.ContainsKey(mask.ToolID))
            {
                ErrHist.WriteIf(string.Format("LoadTool{0}", mask.ToolID),
                                ErrCategory.PERSIST,
                                ErrLevel.INFO,
                                item.FACTORY_ID,
                                item.SHOP_ID,
                                Constants.NULL_ID,
                                Constants.NULL_ID,
                                Constants.NULL_ID,
                                Constants.NULL_ID,
                                item.EQP_ID,
                                Constants.NULL_ID,
                                "DUPLICATE TOOL_ID",
                                string.Format("Table:Tool → TOOL_ID:{0}", item.TOOL_ID)
                                );

                return;
            }
            #endregion

            if (mask.StateCode == ToolStatus.INUSE)
            {
                bool   hasError = false;
                FabEqp eqp      = CheckEqp(item.FACTORY_ID, item.SHOP_ID, item.EQP_ID, "Tool", ref hasError);

                if (hasError)
                {
                    #region Write ErrorHist
                    ErrHist.WriteIf(string.Format("LoadTool{0}", mask.ToolID),
                                    ErrCategory.PERSIST,
                                    ErrLevel.INFO,
                                    item.FACTORY_ID,
                                    item.SHOP_ID,
                                    Constants.NULL_ID,
                                    Constants.NULL_ID,
                                    Constants.NULL_ID,
                                    Constants.NULL_ID,
                                    item.EQP_ID,
                                    Constants.NULL_ID,
                                    "NOT FOUND EQP",
                                    string.Format("Table:Tool → TOOL_ID:{0} Change STATE_CODE {1} → {2} ", item.TOOL_ID, item.STATE_CODE, ToolStatus.WAIT.ToString())
                                    );
                    #endregion

                    mask.StateCode = ToolStatus.WAIT;
                }
                else
                {
                    //설비중복체크
                    FabEqp target;
                    if (dic.TryGetValue(mask.ToolID, out target))
                    {
                        #region Write ErrorHist
                        ErrHist.WriteIf(string.Format("LoadTool_EqpCheck{0}", mask.ToolID),
                                        ErrCategory.PERSIST,
                                        ErrLevel.INFO,
                                        item.FACTORY_ID,
                                        item.SHOP_ID,
                                        Constants.NULL_ID,
                                        Constants.NULL_ID,
                                        Constants.NULL_ID,
                                        Constants.NULL_ID,
                                        item.EQP_ID,
                                        Constants.NULL_ID,
                                        "ALREADY USED TOOL",
                                        string.Format("Table:Tool → TOOL_ID:{0} was uesd to EQP_ID:{1}", item.TOOL_ID, target.EqpID)
                                        );
                        #endregion

                        mask.EqpID     = Constants.NULL_ID;
                        mask.StateCode = ToolStatus.WAIT;
                    }
                    else
                    {
                        dic.Add(mask.ToolID, target);

                        if (eqp.InitMask == null)
                        {
                            eqp.InitMask = mask;
                        }
                        else
                        {
                            if (eqp.InitMask.StateChangeTime < mask.StateChangeTime)
                            {
                                eqp.InitMask.StateCode = ToolStatus.MOUNT;
                                eqp.InitMask           = mask;
                            }
                        }
                    }
                }
            }

            MaskMaster.AddTool(mask);
        }