void m_DailySaveTimer_Elapsed(object sender, ElapsedEventArgs e) { m_DailySaveTimer.Stop(); //rohm date have to -8 hour DateTime tmp = DateTime.Now.AddHours(-8); if (m_UpdateTimeStamp.Date != tmp.Date) { DateTime captureDateTime = new DateTime(tmp.Year, tmp.Month, tmp.Day, 8, 0, 0); //update UpdateActivityRecord(captureDateTime); //save to database SaveEmsMachine(); SaveActivityRecord(); //clear alarm count //https://stackoverflow.com/questions/604831/collection-was-modified-enumeration-operation-may-not-execute foreach (EmsMachineRow mc in m_MachineList.Values.ToArray()) { mc.AlarmCount = 0; mc.BMCount = 0; } //clear ActivityHistory RohmDate currentRohmDate = RohmDate.FromDateTime(captureDateTime); m_ActivityRecorder.ClearDataBefore(currentRohmDate.Date); m_UpdateTimeStamp = captureDateTime; } m_DailySaveTimer.Start(); }
public void RecordActivityBeforeChange(EmsMachineRow mc, DateTime timeStamp) { if (string.IsNullOrEmpty(mc.CurrentActivityName)) { return; } //วันเวลาที่เคยบันทึกก่อนหน้า DateTime lastActivityChangedTimeStamp = mc.ActivityChangeTime; //Rohm date ของเวลาที่มีการบันทึก RohmDate timeStampRohmDate = RohmDate.FromDateTime(timeStamp); //Rohm date ของเวลาที่เคยบันทึกก่อนหน้า RohmDate lastActivityStampRohmDate = RohmDate.FromDateTime(lastActivityChangedTimeStamp); //ถ้าเป็นคนละวันกัน ให้ทำการบันทึกแยก if (timeStampRohmDate.Date != lastActivityStampRohmDate.Date) { //ทำการหา Duraition เพื่อปิดท้ายให้กับวันนั้น TimeSpan d1 = mc.ActivityChangeTime.Subtract(lastActivityStampRohmDate.EndDate).Duration(); PrivateRecordActivity(mc.ProcessName, mc.MCNo, mc.CurrentActivityName, mc.CurrentActivityCategoryName, lastActivityStampRohmDate, d1); //กรณีเป็นคนละวันกันให้เปลี่ยน เวลาที่เคยบันทึกล่าสุดเป็น เวลาเริ่มต้นของวัน lastActivityChangedTimeStamp = timeStampRohmDate.StartDate; } TimeSpan d2 = lastActivityChangedTimeStamp.Subtract(timeStamp).Duration(); PrivateRecordActivity(mc.ProcessName, mc.MCNo, mc.CurrentActivityName, mc.CurrentActivityCategoryName, timeStampRohmDate, d2); }
private void DoCalculateJob() { RohmDate yesterDay = RohmDate.FromNow(); yesterDay.AddDays(-1); //RohmDate yesterDay = RohmDate.FromDateTime(new DateTime(2013, 9, 27, 8,0,0)); Calculate(yesterDay.Date); }
public static RohmDate FromDate(DateTime date) { RohmDate rd = new RohmDate(); rd.m_Date = date.Date; rd.m_StartDate = rd.m_Date.AddHours(8); rd.m_EndDate = rd.m_StartDate.AddHours(24); return(rd); }
public EmsActivityRecordRow[] LoadEmsActivityRecordOfCurrentDate() { List <EmsActivityRecordRow> ret = new List <EmsActivityRecordRow>(); RohmDate r = RohmDate.FromNow(); string strSQL = "SELECT * FROM EMS.ActivityRecord WHERE RohmDate = @RohmDate"; using (SqlCommand cmd = new SqlCommand()) { cmd.CommandText = strSQL; cmd.Parameters.Add("@RohmDate", SqlDbType.DateTime).Value = r.Date; using (DataTable dt = ExecuteDataTable(cmd)) { foreach (DataRow row in dt.Rows) { ret.Add(new EmsActivityRecordRow(row)); } } } return(ret.ToArray()); }
private void PrivateRecordActivity(string processName, string mcNo, string activityName, string activityCategoryName, RohmDate rohmDate, TimeSpan duration) { string key = GetActivityRecordUniqueKey(processName, mcNo, activityName, rohmDate.Date); EmsActivityRecordRow act = null; if (m_RecordList.ContainsKey(key)) { act = m_RecordList[key]; } else { act = new EmsActivityRecordRow(); act.ProcessName = processName; act.MCNo = mcNo; act.ActivityName = activityName; act.ActivityCategoryName = activityCategoryName; act.Duration = 0; act.RohmDate = rohmDate.Date; m_RecordList.Add(key, act); } act.Duration += duration.TotalMinutes; }
public TotalEfficiencyRateRow Calculate(string processName, string mcNo, DateTime rohmDate, EmsOutputRecordRow[] outputRecords, EmsActivityRecordRow[] activityRecords, int alarmCount) { TotalEfficiencyRateRow ter = new TotalEfficiencyRateRow(); ter.ProcessName = processName; ter.MCNo = mcNo; ter.RohmDate = rohmDate; RohmDate r = RohmDate.FromDate(rohmDate); //int alarmCount = 0;// m_DB.CountChokotieLoss(processName, mcNo, r); int breakdownCount = 0;// m_DB.CountBreakdown(processName, mcNo, r); foreach (EmsActivityRecordRow a in activityRecords) { switch (a.ActivityCategoryName) { case "PlanStopLoss": ter.PlanStopLoss += a.Duration; break; case "StopLoss": ter.StopLoss += a.Duration; if (a.ActivityName == "Breakdown") { ter.BreakdownTime += a.Duration; breakdownCount += 1; } break; case "ChokotieLoss": ter.ChokotieLoss += a.Duration; break; case "FreeRunningLoss": //I had made a mistake on client side case "RealOperation": //I had made a mistake on client side case "NetOperationTime": ter.NetOperationTime += a.Duration; break; default: break; } }// foreach (EmsActivityRecordBLL a in m_ActivityRecords) ter.AlarmCount = alarmCount; ter.BreakdownCount = breakdownCount; ter.OperationTime = ter.NetOperationTime + ter.ChokotieLoss; ter.LoadTime = ter.OperationTime + ter.StopLoss; ter.TotalWorkingTime = ter.LoadTime + ter.PlanStopLoss; double sumOutput = 0; //ห้ามใช้ int double sumNG = 0; //ห้ามใช้ int double sumGood = 0; //ห้ามใช้ int double lotCount = 0; //ห้ามใช้ int double sumRealOperationTime = 0; //เนื่องจากตอนคำนวณ ผลลัพจะถูกปัดให้เป็น int ทำให้จาก 0.94 กลายเป็น 0 foreach (EmsOutputRecordRow o in outputRecords) { if (o.StandardRPM > 0) //some time selfcon sent 0 { sumRealOperationTime += ((double)(o.TotalGood + o.TotalNG)) / (o.StandardRPM); } sumNG += o.TotalNG; sumGood += o.TotalGood; lotCount += 1; } ter.RealOperationTime = sumRealOperationTime; ter.FreeRunningLoss = ter.NetOperationTime - ter.RealOperationTime; ter.TotalGood = (int)sumGood; ter.TotalNG = (int)sumNG; sumOutput = sumGood + sumNG; if (sumOutput != 0) { //calculate Value Operation Time ter.ValueOperationTime = (sumGood / sumOutput) * ter.RealOperationTime; //calculate NG Loss ter.NGLoss = (sumNG / sumOutput) * ter.RealOperationTime; } //calculate performance rate by average if (lotCount != 0 && ter.OperationTime != 0) { ter.PerformanceRate = (ter.RealOperationTime / ter.OperationTime) * 100; } //calculate good rate if (sumGood != 0) { ter.GoodRate = ((sumGood - sumNG) / sumGood) * 100; } //calculate Time Operation Rate if (ter.LoadTime != 0) { ter.TimeOperationRate = (ter.OperationTime / ter.LoadTime) * 100; } //calculate PD MTTR if (alarmCount != 0) { ter.PDMTTR = ter.ChokotieLoss / alarmCount; } //calculate PM MTTR if (breakdownCount != 0) { ter.PMMTTR = ter.BreakdownTime / breakdownCount; } //calculate MTBF ter.MTBF = ter.NetOperationTime / (alarmCount + 1); //calculate TME rate //reference to PM [2016-10-19] // Operation rate = 93 % // Performance rate = 50.6 % // Good Rate = 99.15 % // *** TME = 46 % [from 93 * 50.6 * 99.15 / 10000] ter.TMERate = ter.TimeOperationRate * ter.PerformanceRate * ter.GoodRate / 10000; return(ter); }
public TotalEfficiencyRateRow GetTotalEfficiencyRateRow(string processName, string mcNo, DateTime rohmDate) { EmsOutputRecordRow[] outputRecords = m_DB.LoadOutputRecord(processName, mcNo, rohmDate); Dictionary <string, EmsActivityRecordRow> activityRecordDic = new Dictionary <string, EmsActivityRecordRow>(); EmsActivityHistoryRow preHist = null; EmsActivityHistoryRow curHist = null; EmsActivityRecordRow activityRecord = null; EmsActivityRecordRow prevActivityRecord = null; RohmDate targetRohmDate = RohmDate.FromDateTime(rohmDate); RohmDate nowRohmDate = RohmDate.FromNow(); RohmDate tmp; using (DataTable tbl = m_DB.GetActivityHistory(processName, mcNo, rohmDate)) { foreach (DataRow row in tbl.Rows) { curHist = new EmsActivityHistoryRow(row); if (activityRecordDic.ContainsKey(curHist.ActivityName)) { activityRecord = activityRecordDic[curHist.ActivityName]; } else { activityRecord = new EmsActivityRecordRow(); activityRecord.ActivityName = curHist.ActivityName; activityRecord.ActivityCategoryName = curHist.ActivityCategoryName; activityRecord.Duration = 0; activityRecord.ProcessName = processName; activityRecord.MCNo = mcNo; activityRecord.RohmDate = rohmDate; activityRecordDic.Add(activityRecord.ActivityName, activityRecord); } if (preHist != null) { prevActivityRecord = activityRecordDic[preHist.ActivityName]; tmp = RohmDate.FromDateTime(preHist.RecordTime); if (tmp.Date != targetRohmDate.Date) { prevActivityRecord.Duration += curHist.RecordTime.Subtract(targetRohmDate.StartDate).Duration().TotalMinutes; } else { prevActivityRecord.Duration += curHist.RecordTime.Subtract(preHist.RecordTime).Duration().TotalMinutes; } } preHist = curHist; } } if (preHist != null) { prevActivityRecord = activityRecordDic[preHist.ActivityName]; if (nowRohmDate.Date == targetRohmDate.Date) { prevActivityRecord.Duration = preHist.RecordTime.Subtract(DateTime.Now).Duration().TotalMinutes; } else { prevActivityRecord.Duration = preHist.RecordTime.Subtract(targetRohmDate.EndDate).Duration().TotalMinutes; } } TotalEfficiencyRateRow ter = new TotalEfficiencyRateRow(); ter.ProcessName = processName; ter.MCNo = mcNo; ter.RohmDate = rohmDate; RohmDate r = RohmDate.FromDate(rohmDate); int alarmCount = 0; // m_DB.CountChokotieLoss(processName, mcNo, r); int breakdownCount = 0; // m_DB.CountBreakdown(processName, mcNo, r); foreach (EmsActivityRecordRow a in activityRecordDic.Values.ToArray()) { switch (a.ActivityCategoryName) { case "PlanStopLoss": ter.PlanStopLoss += a.Duration; break; case "StopLoss": ter.StopLoss += a.Duration; if (a.ActivityName == "Breakdown") { ter.BreakdownTime += a.Duration; } break; case "ChokotieLoss": ter.ChokotieLoss += a.Duration; alarmCount += 1; break; case "FreeRunningLoss": //I had made a mistake on client side case "RealOperation": //I had made a mistake on client side case "NetOperationTime": ter.NetOperationTime += a.Duration; break; case "Breakdown": breakdownCount += 1; break; default: break; } }// foreach (EmsActivityRecordBLL a in m_ActivityRecords) ter.AlarmCount = alarmCount; ter.BreakdownCount = breakdownCount; ter.OperationTime = ter.NetOperationTime + ter.ChokotieLoss; ter.LoadTime = ter.OperationTime + ter.StopLoss; //ter.LoadTime + ter.PlanStopLoss; ter.TotalWorkingTime = targetRohmDate.StartDate.Subtract(targetRohmDate.EndDate).Duration().TotalMinutes; double sumOutput = 0; //ห้ามใช้ int double sumNG = 0; //ห้ามใช้ int double sumGood = 0; //ห้ามใช้ int double lotCount = 0; //ห้ามใช้ int double sumRealOperationTime = 0; //เนื่องจากตอนคำนวณ ผลลัพจะถูกปัดให้เป็น int ทำให้จาก 0.94 กลายเป็น 0 foreach (EmsOutputRecordRow o in outputRecords) { if (o.StandardRPM > 0) //some time selfcon sent 0 { sumRealOperationTime += ((double)(o.TotalGood + o.TotalNG)) / (o.StandardRPM); } sumNG += o.TotalNG; sumGood += o.TotalGood; lotCount += 1; } ter.RealOperationTime = sumRealOperationTime; ter.FreeRunningLoss = ter.NetOperationTime - ter.RealOperationTime; ter.TotalGood = (int)sumGood; ter.TotalNG = (int)sumNG; sumOutput = sumGood + sumNG; if (sumOutput != 0) { //calculate Value Operation Time ter.ValueOperationTime = (sumGood / sumOutput) * ter.RealOperationTime; //calculate NG Loss ter.NGLoss = (sumNG / sumOutput) * ter.RealOperationTime; } //calculate performance rate by average if (lotCount != 0 && ter.OperationTime != 0) { ter.PerformanceRate = (ter.RealOperationTime / ter.OperationTime) * 100; } //calculate good rate if (sumGood != 0) { ter.GoodRate = ((sumGood - sumNG) / sumGood) * 100; } //calculate Time Operation Rate if (ter.LoadTime != 0) { ter.TimeOperationRate = (ter.OperationTime / ter.LoadTime) * 100; } //calculate PD MTTR if (alarmCount != 0) { ter.PDMTTR = ter.ChokotieLoss / alarmCount; } //calculate PM MTTR if (breakdownCount != 0) { ter.PMMTTR = ter.BreakdownTime / breakdownCount; } //calculate MTBF ter.MTBF = ter.NetOperationTime / (alarmCount + 1); //calculate TME rate //reference to PM [2016-10-19] // Operation rate = 93 % // Performance rate = 50.6 % // Good Rate = 99.15 % // *** TME = 46 % [from 93 * 50.6 * 99.15 / 10000] ter.TMERate = ter.TimeOperationRate * ter.PerformanceRate * ter.GoodRate / 10000; return(ter); }