/// <summary> /// </summary> /// <param name="hb"/> /// <param name="ao"/> /// <param name="now"/> /// <param name="handled"/> public void ON_START_TASK0(Mozart.SeePlan.Simulation.IHandlingBatch hb, Mozart.Simulation.Engine.ActiveObject ao, DateTime now, ref bool handled) { FabLot lot = hb.ToFabLot(); hb.Apply((x, y) => LoadHelper.OnStartTask(x as FabLot)); InFlowMaster.ChangeWipLocation(hb, EventType.TrackIn); if (ao is AoEquipment) { FabAoEquipment eqp = ao as FabAoEquipment; MaskMaster.StartTask(lot, eqp); JigMaster.StartTask(lot, eqp); //TODO : 설비의 Property로 작성필요 (LastPlan의 Plan을 보고) if (lot.CurrentFabPlan.CurrentRecipeTime != null) { eqp.IsEqpRecipeRun = true; } else { eqp.IsEqpRecipeRun = false; } } OutCollector.Write_Rtd_LotUpkTracking(lot); }
/// <summary> /// </summary> /// <param name="aoFactory"/> /// <param name="handled"/> public void ON_DONE0(Mozart.SeePlan.Simulation.AoFactory aoFactory, ref bool handled) { MaskMaster.OnDone(aoFactory); OutCollector.OnDone(aoFactory); InFlowMaster.Reset(); }
/// <summary> /// </summary> /// <param name="aoFactory"/> /// <param name="handled"/> public void ON_DAY_CHANGED0(Mozart.SeePlan.Simulation.AoFactory aoFactory, ref bool handled) { DateTime now = aoFactory.NowDT; if (InputMart.Instance.GlobalParameters.ApplyArrangeMType) { EqpArrangeMaster.OnDayChanged(now); MaskMaster.OnDayChanged(now); } ReleasePlanMaster.OnDayChanged(now); }
/// <summary> /// </summary> /// <param name="hb"/> /// <param name="ao"/> /// <param name="now"/> /// <param name="handled"/> public void ON_END_TASK0(Mozart.SeePlan.Simulation.IHandlingBatch hb, Mozart.Simulation.Engine.ActiveObject ao, DateTime now, ref bool handled) { FabLot lot = hb.ToFabLot(); hb.Apply((x, y) => LoadHelper.OnEndTask(x as FabLot)); if (ao is AoEquipment) { FabAoEquipment aeqp = ao as FabAoEquipment; MaskMaster.EndTask(lot, aeqp); JigMaster.EndTask(lot, aeqp); } }
/// <summary> /// </summary> /// <param name="factory"/> /// <param name="hb"/> /// <param name="handled"/> public void LOCATE_FOR_RUN0(Mozart.SeePlan.Simulation.AoFactory factory, Mozart.SeePlan.Simulation.IHandlingBatch hb, ref bool handled) { var wipInitiator = ServiceLocator.Resolve <WipInitiator>(); FabLot lot = hb.Sample as FabLot; string eqpID = wipInitiator.GetLoadingEquipment(hb); AoEquipment aeqp = factory.GetEquipment(eqpID); if (aeqp == null) { //If there is not Equipment, handle through Bucketing. factory.AddToBucketer(hb); Logger.Warn("Eqp {0} is invalid, so locate running wip to dummy bucket. check input data!", eqpID ?? "-"); } else { //// Checks WIP state that is Run, but processing is completed and located in Outport. //bool trackOut = wipInitiator.CheckTrackOut(factory, hb); //if (trackOut) //{ // aeqp.AddOutBuffer(hb); //} //else //{ // aeqp.AddRun(hb); //} var eqp = aeqp.Target as FabEqp; var runWips = eqp.InitRunWips; bool lastRunWip = runWips[runWips.Count - 1] == lot; if (eqp.State == ResourceState.Up && lastRunWip) { MaskMaster.InitLocate(aeqp, hb); JigMaster.InitLocate(aeqp, hb); aeqp.AddRun(hb); //※초기Run재공은 OnTrackIn 이벤트 발생안함. } else { DateTime tkInTime = lot.Wip.LastTrackInTime; var procTimeInfo = aeqp.GetProcessTime(hb); double processTime = procTimeInfo.FlowTime.TotalSeconds + (procTimeInfo.TactTime.TotalSeconds * (hb.UnitQty - 1)); DateTime tkOutTime = tkInTime.AddSeconds(processTime); Time delay = Time.Max((tkOutTime - aeqp.NowDT), Time.Zero); if (delay > Time.Zero) { object[] args = new object[2] { aeqp, hb }; aeqp.AddTimeout(delay, SimHelper.OnEqpOutBuffer, args); InFlowMaster.ChangeWipLocation(hb, EventType.TrackIn); lot.CurrentPlan.LoadedResource = eqp; } else { aeqp.AddOutBuffer(hb); } } } }
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); }