/// <summary> /// </summary> /// <param name="entity"/> /// <param name="now"/> /// <param name="target"/> /// <param name="factor"/> /// <param name="ctx"/> /// <returns/> public WeightValue SETUP_TIME_PRIORITY(Mozart.Simulation.Engine.ISimEntity entity, DateTime now, Mozart.Simulation.Engine.ActiveObject target, Mozart.SeePlan.DataModel.WeightFactor factor, Mozart.SeePlan.Simulation.IDispatchContext ctx) { if (factor.Factor == 0) { return(new WeightValue(0)); } float score = 1; int criteria0 = 1; if (factor.Criteria != null && factor.Criteria.Length > 0) { criteria0 = Math.Max((int)factor.Criteria[0], 1); } int cutMinutes = (int)Time.FromMinutes(criteria0).TotalMinutes; FabAoEquipment aeqp = target as FabAoEquipment; FabLot lot = entity as FabLot; //if (aeqp.EqpID == "THCVD300" && aeqp.NowDT >= LcdHelper.StringToDateTime("20200108 123433")) // Console.WriteLine("B"); float setupTime = SetupMaster.GetSetupTime(aeqp, lot); float maxSetupTime = WeightHelper.GetMaxVaule_WF(ctx, Constants.WF_SETUP_TIME_PRIORITY, 0f); if (setupTime > 0 && maxSetupTime > 0) { float s = (int)(setupTime / cutMinutes); float m = (int)(maxSetupTime / cutMinutes); float r = m == 0 ? 0 : (float)Math.Round(s / m, 3); score = 1 - r; } string desc = string.Format("[{0} = SETUP:{1}m/MAX:{2}m]", score, setupTime, maxSetupTime); return(new WeightValue(score * factor.Factor, desc)); }
/// <summary> /// </summary> /// <param name="entity"/> /// <param name="now"/> /// <param name="target"/> /// <param name="factor"/> /// <param name="ctx"/> /// <returns/> public WeightValue MAX_QTIME_PRIORITY(Mozart.Simulation.Engine.ISimEntity entity, DateTime now, Mozart.Simulation.Engine.ActiveObject target, Mozart.SeePlan.DataModel.WeightFactor factor, Mozart.SeePlan.Simulation.IDispatchContext ctx) { if (factor.Factor == 0) { return(new WeightValue(0)); } FabLot lot = entity as FabLot; var currStep = lot.CurrentFabStep; //FabAoEquipment eqp = target as FabAoEquipment; //if (lot.LotID == "TH9C1396N0X" && eqp.EqpID == "THOVN200") //&& eqp.NowDT >= LcdHelper.StringToDateTime("20191128 133538")) // Console.WriteLine("B"); //if (lot.LotID == "TH9C1472N0L" && eqp.EqpID == "THOVN200") //&& eqp.NowDT >= LcdHelper.StringToDateTime("20191128 133538")) // Console.WriteLine("B"); var info = lot.QtimeInfo; if (info == null || info.HasMaxQTime() == false) { return(new WeightValue(0)); } var find = info.FindMinimumRemainTime(now); if (find == null) { return(new WeightValue(0)); } int criteria0 = Math.Max(WeightHelper.GetCriteria(factor, 0, 1), 1); int criteria1 = Math.Max(WeightHelper.GetCriteria(factor, 1, 0), 0); int criteria2 = Math.Max(WeightHelper.GetCriteria(factor, 2, 0), 0); int cutMinutes = (int)Time.FromMinutes(criteria0).TotalMinutes; Time baseSafe = Time.FromMinutes(criteria1); Time stepSafe = Time.FromMinutes(criteria2); int remainStepCount = find.RemainStepCount(currStep); Time safeTime = baseSafe + (stepSafe * remainStepCount); Time remainTime = find.RemainTime(lot, currStep, now); Time maxRemainTime = WeightHelper.GetMaxVaule_WF(ctx, Constants.WF_MAX_QTIME_PRIORITY, Time.Zero); float score = 0; if (remainTime < safeTime) { if (remainTime > 0 && maxRemainTime > 0) { float s = (int)(remainTime.TotalMinutes / cutMinutes); float m = (int)(maxRemainTime.TotalMinutes / cutMinutes); float r = m == 0 ? 0 : (float)Math.Round(s / m, 3); score = 1 - r; } } string desc = string.Format("[{0} = SAFE:{1}min, REMAIN:{2}min, MAX:{3}min])", Math.Round(score, 2), Math.Round(safeTime.TotalMinutes, 2), Math.Round(remainTime.TotalMinutes, 2), Math.Round(maxRemainTime.TotalMinutes, 2)); return(new WeightValue(score * factor.Factor, desc)); }