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); } }
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); } }
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); }
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); }
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); }
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); }
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); } }
public static void AddWorkInfo(this FabMask mask, FabLot lot) { if (mask.WorkInfos == null) { mask.WorkInfos = new HashSet <FabLot>(); } mask.WorkInfos.Add(lot); }
private static void AddLimitInfo(this FabMask mask, EqpArrangeInfo info) { if (info == null) { return; } mask.Limits.Add(info); }
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; }
private static bool HasLimit(this FabMask mask) { var infos = mask.Limits; if (infos == null || infos.Count == 0) { return(false); } return(true); }
private static FabMask GetCurrentMask(this FabAoEquipment eqp) { FabMask mask = eqp.InUseMask; //다른설비에 Mask가 할당된 경우 내가 사용하는거 아님. 추후 나중에 Detach 기능 구현필요 if (mask != null && mask.EqpID != eqp.EqpID) { return(null); } return(mask); }
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); } }
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); }
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); } }
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); }
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); }
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); }
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); }
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); } }
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); }
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); }