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); }
public static SetupType CheckSetup(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb) { try { MicronBEAssyBELot lot = hb as MicronBEAssyBELot; MicronBEAssyPlanInfo plan = aeqp.LastPlan as MicronBEAssyPlanInfo; if (plan == null) { return(SetupType.NONE); } if (plan.ProductID != lot.Product.ProductID) { return(SetupType.PART_CHG); } return(SetupType.NONE); } catch (Exception e) { WriteHelper.WriteErrorHistory(ErrorLevel.FATAL, string.Format("ErrorMessage : {0} MethodName : {1}", e.Message, System.Reflection.MethodInfo.GetCurrentMethod().Name)); return(SetupType.NONE); } }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="hb"/> /// <param name="state">SETUP/BUSY/IDLERUN/IDLE/WAIT_SETUP(PM/DOUWN 호출 안됨)</param> /// <param name="handled"/> public void LOADING_STATE_CHANGED0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, Mozart.SeePlan.Simulation.LoadingStates state, ref bool handled) { var eqp = aeqp.ToFabAoEquipment(); var now = eqp.NowDT; if (eqp.IsParallelChamber) { return; } if (ModelContext.Current.EndTime == now) { return; } //PM/Down 이벤트 예외사항 처리 if (SimHelper.IgnoreStateChange(eqp, state)) { return; } var lot = hb.ToFabLot(); if (state == LoadingStates.SETUP || state == LoadingStates.BUSY) { SetCurrentMask(eqp, lot); } eqp.OnStateChanged(state, lot); }
/// <summary> /// </summary> /// <param name="db"/> /// <param name="aeqp"/> /// <param name="wips"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public IHandlingBatch[] SELECT0(Mozart.SeePlan.Simulation.DispatcherBase db, Mozart.SeePlan.Simulation.AoEquipment aeqp, IList <Mozart.SeePlan.Simulation.IHandlingBatch> wips, ref bool handled, Mozart.SeePlan.Simulation.IHandlingBatch[] prevReturnValue) { var eqp = aeqp.ToFabAoEquipment(); if (wips == null || wips.Count == 0) { return(null); } var lot = wips[0].ToFabLot(); //if (eqp.EqpID == "THCVD300" && eqp.NowDT >= LcdHelper.StringToDateTime("20191107 075929")) // Console.WriteLine("B"); if (lot.IsDummy) { eqp.IsDummyWait = true; return(null); } if (eqp.IsParallelChamber) { if (ChamberMaster.IsLoadable_ParallelChamber(eqp, lot) == false) { return(null); } } eqp.IsDummyWait = false; return(new IHandlingBatch[] { lot }); }
/// <summary> /// /// </summary> /// <param name="aeqp"/> /// <param name="hb"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public bool IS_NEED_SETUP0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled, bool prevReturnValue) { FabLot lot = hb.Sample as FabLot; FabAoEquipment eqp = aeqp.ToFabAoEquipment(); bool isNeedSetup = ResHelper.IsNeedSetup(eqp, lot); return(isNeedSetup); }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="loadableChambers"/> /// <param name="hb"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public ISet <string> GET_NEED_SETUP_CHAMBERS0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.ChamberInfo[] loadableChambers, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled, ISet <string> prevReturnValue) { FabLot lot = hb.ToFabLot(); FabEqp eqp = aeqp.Target as FabEqp; List <FabSubEqp> list = ChamberMaster.GetSubEqps(eqp, loadableChambers); return(ChamberMaster.GetNeedSetupChamberIDs(list, lot)); }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="state">UP/DOWN</param> /// <param name="handled"/> public void RESOURCE_STATE_CHANGED0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.DataModel.ResourceState state, ref bool handled) { var eqp = aeqp.ToFabAoEquipment(); if (state == ResourceState.Up) { eqp.OnStateChanged(LoadingStates.IDLE); } }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="hb"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public DateTime FIX_START_TIME0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled, DateTime prevReturnValue) { FabLot lot = hb.ToFabLot(); var now = aeqp.NowDT; var trackInTime = lot.Wip.LastTrackInTime; //한개의 RunWip만 설비에 투입가능하도록 처리(LOCATE_FOR_RUN0)하여 조정 필요없음. ////RunWip 수량을 고려하여 마지막 RunWip의 TrackInTime을 기준으로 이전 RunWip의 TrackInTime 조정 //var runList = (aeqp.Target as FabEqp).InitRunWips; //if(runList != null) //{ // //해당 Lot 삭제 // if (runList.Remove(lot) == false) // Logger.MonitorInfo("[WARNING] mismatch run wip : LOT_ID={0}", lot.LotID); // int count = runList.Count; // if (runList != null && count > 0) // { // var prevlot = runList[count - 1]; // DateTime outTime = prevlot.Wip.LastTrackInTime; // for (int i = count - 2; i >= 0; i--) // { // var currLot = runList[i]; // if (currLot.UnitQty <= 0) // continue; // FabStep wipStep = currLot.Wip.InitialStep as FabStep; // float currTactTime = wipStep.GetTactTime(eqpID, currLot.CurrentProductID); // DateTime availableTime = outTime.AddSeconds(-(currTactTime * currLot.UnitQty)); // DateTime tkTime = currLot.Wip.LastTrackInTime; // outTime = LcdHelper.Min(tkTime, availableTime); // } // float tactTime = lot.CurrentFabStep.GetTactTime(eqpID, lot.CurrentProductID); // outTime = outTime.AddSeconds(-(tactTime * lot.UnitQty)); // trackInTime = LcdHelper.Min(outTime, trackInTime); // } //} //TODO : WriteErrorHist if (trackInTime == DateTime.MinValue || trackInTime == DateTime.MaxValue) { trackInTime = aeqp.NowDT; } else if (trackInTime > now) { trackInTime = now; } return(trackInTime); }
/// <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; } }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="hb"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public double GET_PROCESS_UNIT_SIZE1(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled, double prevReturnValue) { double unitSize = SeeplanConfiguration.Instance.LotUnitSize; if (aeqp.IsBatchType() == false) { unitSize = hb.UnitQty; } return(unitSize); }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="hb"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public LoadInfo SET_LAST_LOADING_INFO1(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled, Mozart.SeePlan.DataModel.LoadInfo prevReturnValue) { if (hb == null) { return(null); } var lot = hb.Sample; return(lot.CurrentPlan); }
/// <summary> /// </summary> /// <param name="eqp"/> /// <param name="wips"/> /// <param name="ctx"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public IList <Mozart.SeePlan.Simulation.IHandlingBatch> DO_FILTER1(Mozart.SeePlan.Simulation.AoEquipment eqp, IList <IHandlingBatch> wips, IDispatchContext ctx, ref bool handled, IList <IHandlingBatch> prevReturnValue) { #if DEBUG if (eqp.EqpID == "DA03") { Console.WriteLine(); } #endif return(wips); }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="hb"/> /// <param name="handled"/> public void ON_TRACK_OUT0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled) { //FabAoEquipment feqp = aeqp as FabAoEquipment; //FabLot flot = hb.Sample as FabLot; //FabStep step = flot.CurrentStep as FabStep; //PreInspector.UpdateLastEventTime(aeqp, step, flot.CurrentProductID); //※TrackOut시점에는 Step이 바껴있지 않음. //InFlowMaster.ChangeWipLocation(hb, EventType.TrackOut); //if (aeqp.EqpID == "THCVD500") // Console.WriteLine(); }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="hb"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public ProcTimeInfo GET_PROCESS_TIME0(Mozart.SeePlan.Simulation.AoEquipment aeqp, IHandlingBatch hb, ref bool handled, ProcTimeInfo prevReturnValue) { try { ProcTimeInfo info = new ProcTimeInfo(); MicronBEAssyBELot lot = hb as MicronBEAssyBELot; MicronBEAssyBEStep step = hb.CurrentStep as MicronBEAssyBEStep; foreach (StepTime time in InputMart.Instance.StepTime.DefaultView) { if (step.StepID != time.STEP_ID) { continue; } if (lot.Product.LineID != time.LINE_ID) { continue; } if (LikeUtility.Like(lot.Product.ProductID, time.PRODUCT_ID) == false) { continue; } //if (LikeUtility.Like(lot.Product.Process.ProcessID, time.PROCESS_ID) == false) // continue; if (LikeUtility.Like(aeqp.EqpID, time.EQP_ID) == false) { continue; } double tactTimeBySec = (double)time.TACT_TIME; info.TactTime = TimeSpan.FromSeconds(tactTimeBySec); break; } return(info); } catch (Exception e) { WriteHelper.WriteErrorHistory(ErrorLevel.FATAL, string.Format("ErrorMessage : {0} MethodName : {1}", e.Message, System.Reflection.MethodInfo.GetCurrentMethod().Name)); return(default(ProcTimeInfo)); } }
/// <summary> /// </summary> /// <param name="da"/> /// <param name="aeqp"/> /// <param name="wips"/> /// <param name="handled"/> public void ON_DISPATCHED0(Mozart.SeePlan.Simulation.DispatchingAgent da, Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch[] wips, ref bool handled) { var eqp = aeqp.ToFabAoEquipment(); foreach (var item in wips) { var lot = item.ToFabLot(); SetProductVersion(eqp, lot); EqpArrangeMaster.OnDispatched(eqp, lot); FilterMaster.StartEqpRecipeTime(lot, eqp); } }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="proc"/> /// <param name="handled"/> public void ON_BEGIN_PROCESSING0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.AoProcess proc, ref bool handled) { IHandlingBatch hb = proc.Entity as IHandlingBatch; FabLot lot = hb.Sample as FabLot; lot.CurrentFabPlan.EqpInStartTime = aeqp.NowDT; if (lot.IsRunWipFirstPlan()) { lot.CurrentFabPlan.EqpInStartTime = lot.Wip.LastTrackInTime; lot.CurrentFabPlan.IsInitRunWip = true; } AcidMaster.OnBegingProcessing(aeqp, lot); }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="hb"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public Time GET_SETUP_TIME0(Mozart.SeePlan.Simulation.AoEquipment aeqp, IHandlingBatch hb, ref bool handled, Time prevReturnValue) { try { MicronBEAssyEqp eqp = null; if (InputMart.Instance.MicronBEAssyEqp.ContainsKey(aeqp.EqpID)) { eqp = InputMart.Instance.MicronBEAssyEqp[aeqp.EqpID]; } if (eqp == null) { return(default(Time)); } MicronBEAssyBELot lot = hb as MicronBEAssyBELot; BEStep step = lot.CurrentStep; StepMaster sm = InputMart.Instance.StepMasterView.FindRows(step.StepID).FirstOrDefault(); foreach (var info in InputMart.Instance.SetupInfo.DefaultView) { if (info.LINE_ID != sm.LINE_ID) { continue; } //if (UtilityHelper.StringToEnum(info.STEP_GROUP, StepGroup.NONE) != eqp.StepGroup) // continue; //if (LikeUtility.Like(eqp.EqpModel, info.EQP_MODEL) == false) // continue; double setupTimeBySec = (double)info.SETUP_TIME; return(Time.FromSeconds(setupTimeBySec)); } return(default(Time)); } catch (Exception e) { WriteHelper.WriteErrorHistory(ErrorLevel.FATAL, string.Format("ErrorMessage : {0} MethodName : {1}", e.Message, System.Reflection.MethodInfo.GetCurrentMethod().Name)); return(default(Time)); } }
/// <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="fs"/> /// <param name="det"/> /// <param name="handled"/> public void ON_FAILURE_EVENT1(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.DataModel.FailureSchedule fs, Mozart.SeePlan.Simulation.DownEventType det, ref bool handled) { FabAoEquipment eqp = aeqp.ToFabAoEquipment(); if (det == DownEventType.End) { aeqp.Loader.Unblock(); aeqp.WriteHistoryAfterBreak(); } else { ResHelper.SetLastLoadingInfo(aeqp, null); aeqp.WriteHistory(LoadingStates.DOWN); aeqp.Loader.Block(); //eqp.AddLoadPlan(LoadStates.DOWN, aeqp.NowDT); eqp.OnStateChanged(LoadingStates.DOWN); } }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="hb"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public bool USE_CUSTOM_LOAD0(Mozart.SeePlan.Simulation.AoEquipment aeqp, IHandlingBatch hb, ref bool handled, bool prevReturnValue) { try { foreach (var item in InputMart.Instance.StdLotSize.DefaultView) { if (item.CHG_TYPE == Constants.ChgType) { return(true); } } return(false); } catch (Exception e) { WriteHelper.WriteErrorHistory(ErrorLevel.FATAL, string.Format("ErrorMessage : {0} MethodName : {1}", e.Message, System.Reflection.MethodInfo.GetCurrentMethod().Name)); return(false); } }
/// <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="eqp"/> /// <param name="wips"/> /// <param name="ctx"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public IList <IHandlingBatch> DO_FILTER1(Mozart.SeePlan.Simulation.AoEquipment eqp, IList <Mozart.SeePlan.Simulation.IHandlingBatch> wips, Mozart.SeePlan.Simulation.IDispatchContext ctx, ref bool handled, IList <Mozart.SeePlan.Simulation.IHandlingBatch> prevReturnValue) { //if (eqp.EqpID == "THCVDC00" && eqp.NowDT >= LcdHelper.StringToDateTime("20200108 090229")) // Console.WriteLine("B"); if (wips == null) { return(wips); } eqp.StartDispatch_ParallelChamber(); List <IHandlingBatch> revaluation = new List <IHandlingBatch>(); //▶▶ 1차 필터 FilterMaster.DoFilter(eqp, wips, ctx); //▶▶ 2차 Group별 필터(다시 살릴 수 있음) FilterMaster.DoGroupFilter(eqp, wips, ctx, revaluation); //▶▶ Group에서 제외된 Lot 재평가 if (wips.Count == 0 && revaluation.Count > 0) { FilterMaster.Revaluate(eqp, revaluation); if (revaluation.Count > 0) { return(revaluation); } } else { foreach (var item in revaluation) { FilterMaster.WriteFilterInfo(item, eqp); } } return(wips); }
/// <summary> /// 설비 초기화를 합니다. GetEqpList 직후 호출됨 /// </summary> /// <param name="aeqp"/> /// <param name="handled"/> public void INITIALIZE_EQUIPMENT0(Mozart.SeePlan.Simulation.AoEquipment aeqp, ref bool handled) { //※ Inline 설비의 경우 설정확인 (true : ProessTime 사용, False : FlowTime 사용) aeqp.UseProcessingTime = false; //AoEqp 초기화 FabAoEquipment eqp = aeqp.ToFabAoEquipment(); var now = eqp.NowDT; eqp.LoadInfos = new List <FabLoadInfo>(); eqp.LastIdleStartTime = now; eqp.LastIdleRunStartTime = now; eqp.AvailablePMTime = DateTime.MaxValue; eqp.InitAcidDensity(); ResHelper.AddEqpByGroup(eqp); //FabEqp 초기화 FabEqp targetEqp = eqp.TargetEqp; targetEqp.InitPM(); targetEqp.SetInitEqpStatus(eqp); //패럴러챔버 초기화 if (aeqp.IsParallelChamber) { ChamberMaster.InitializeParallelChamber(eqp); } //설비상태가 Down 설정 if (targetEqp.StatusInfo.Status == ResourceState.Down) { targetEqp.State = ResourceState.Down; } }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="proc"/> /// <param name="handled"/> public void ON_END_SETUP0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.AoProcess proc, ref bool handled) { }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="hb"/> /// <param name="handled"/> public void ON_TRACK_IN0(Mozart.SeePlan.Simulation.AoEquipment aeqp, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled) { ResHelper.CheckContinueousQty(aeqp, hb); }
/// <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="aeqp"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public bool IS_WRITE_DISPATCH_LOG0(Mozart.SeePlan.Simulation.AoEquipment aeqp, ref bool handled, bool prevReturnValue) { return(true); }
/// <summary> /// </summary> /// <param name="aeqp"/> /// <param name="handled"/> /// <param name="prevReturnValue"/> /// <returns/> public int GET_CHAMBER_CAPACITY0(Mozart.SeePlan.Simulation.AoEquipment aeqp, ref bool handled, int prevReturnValue) { return(aeqp.Target.ChildCount); }