//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; } } }
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); }
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); } }
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); }
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); } }
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); }