/// <summary> /// </summary> /// <param name="da"/> /// <param name="info"/> /// <param name="handled"/> public void WRITE_DISPATCH_LOG0(Mozart.SeePlan.Simulation.DispatchingAgent da, Mozart.SeePlan.Simulation.EqpDispatchInfo info, ref bool handled) { var targetEqp = info.TargetEqp as FabEqp; string eqpID = targetEqp.EqpID; if (eqpID == "THCVD200") { Console.WriteLine(); } var eqp = da.GetEquipment(eqpID) as FabAoEquipment; //ParallelChamber는 SubEqp별로 별도로 기록 (더미Lot선택은 기록) if (eqp.IsParallelChamber && info.DispatchWipLog.StartsWith("DUMMY")) { foreach (var subEqp in targetEqp.SubEqps.Values) { if (subEqp.Current != null) { continue; } DispatchLogHelper.WriteDispatchLog(eqp, info, subEqp); } } //ParallelChamber도 ParentEqpID 기준으로 추가 기록함(2019.11.08) ////ParallelChamber는 SubEqp별로 별도로 기록 //if (eqp.IsParallelChamber) // return; DispatchLogHelper.WriteDispatchLog(eqp, info); }
/// <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); }
/// <summary> /// </summary> /// <param name="eqp"/> /// <param name="info"/> /// <param name="lot"/> /// <param name="wp"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public string ADD_DISPATCH_WIP_LOG0(Mozart.SeePlan.DataModel.Resource eqp, Mozart.SeePlan.Simulation.EntityDispatchInfo info, Mozart.SeePlan.Simulation.ILot lot, Mozart.SeePlan.DataModel.WeightPreset wp, ref bool handled, string prevReturnValue) { string log = string.Empty; var flot = lot as FabLot; var targetEqp = eqp as FabEqp; log = DispatchLogHelper.GetDispatchWipLog(targetEqp, info, flot, wp); return(log); }
/// <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; } }
/// <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); } }
/// <summary> /// </summary> /// <param name="dc"/> /// <param name="aeqp"/> /// <param name="wips"/> /// <param name="handled"/> public void UPDATE_CONTEXT0(IDispatchContext dc, AoEquipment aeqp, IList <IHandlingBatch> wips, ref bool handled) { //////20161122075408 //if (aeqp.EqpID == "8APPH02" && aeqp.NowDT == new DateTime(2016, 12, 12, 8, 42, 14)) // Console.WriteLine("T"); List <JobFilterInfo> joblist = dc.Get <List <JobFilterInfo> >(Constants.JobGroup, null); if (aeqp.Preset == null) { return; } double maxRequireEqp; if (WeightHelper.TryGetMaxRequiredEqp(aeqp, joblist, out maxRequireEqp)) { dc.Set(Constants.WF_MAX_REQUIRED_EQP_COUNT, maxRequireEqp); } LayerStats sts = WeightHelper.CalcLayerBalance(aeqp); dc.Set(Constants.WF_LAYER_BALANCE_PRIORITY, sts); //투입을 위한 waiting wip infomation(unpack 설비 ) Dictionary <string, WaitingWipInfo> waitingInfos = WeightHelper.SetWatingWipInfo(aeqp, joblist); dc.Set(Constants.WF_WAITING_WIP_INFO, waitingInfos); dc.Set(Constants.WF_MINMAX_VALUE_INFOS, WeightHelper.SetMinMaxVaule_WF(aeqp, joblist)); if (wips.Count > 0) { dc.Set(Constants.WF_LOT_PRIORITY, wips.Max(x => x.ToFabLot().Priority)); } DispatchLogHelper.InitLotLogDetail(wips); }
/// <summary> /// </summary> /// <param name="eqp"/> /// <param name="sels"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public string GET_SELECTED_WIP_LOG0(Mozart.SeePlan.DataModel.Resource eqp, Mozart.SeePlan.Simulation.IHandlingBatch[] sels, ref bool handled, string prevReturnValue) { string log = DispatchLogHelper.GetSelectedWipLog(eqp as FabEqp, sels); return(log); }