/// <summary> /// 计算Oee的开机率,Or /// </summary> /// <returns></returns> public float?CalcOeeTimeEff(string machineCode, IList <MachineState> machineStates) { float?timeEff = null; float stateSpeed = 0; stateSpeed = App.Store.GetState().CpmState.StateSpeedDict[machineCode]; //删除上一班的机台状态数据 var workTime = YUtil.GetKeystoneWorkTime(); removeBeforeWorkTime(machineStates, workTime); var runTimeSec = getMachineRunTimeSec(machineStates, stateSpeed); var debugTimeSec = getMachineDebugTimeSec(); //计算时间效率 if (runTimeSec < 0) { Logger.Error($"计算时间效率失败,有效时间 {runTimeSec} < 0 "); } else { var cpms = App.Store.GetState().CpmState.OnlineCpmsDict[machineCode]; cpms[DefinedParamCode.RunTime].Value = TimeSpan.FromSeconds(runTimeSec - debugTimeSec).TotalHours; cpms[DefinedParamCode.DutyTime].Value = (DateTime.Now - workTime).TotalHours; cpms[DefinedParamCode.StopTime].Value = (double)cpms[DefinedParamCode.DutyTime].Value - (double)cpms[DefinedParamCode.RunTime].Value; timeEff = (float)((runTimeSec - debugTimeSec) / (DateTime.Now - workTime).TotalSeconds); Logger.Debug($"当班时间:{(DateTime.Now - workTime).TotalHours.ToString("0.00")} 小时,机台运行时间 {cpms[DefinedParamCode.RunTime].GetFloatVal().ToString("0.00")} 小时"); } return(timeEff); }
/// <summary> /// 获取机台开机运行时间 /// </summary> /// <returns></returns> private double getMachineRunTimeSec(IList <MachineState> machineStates, float stateSpeed) { double runTimeSec = 0; //开工时间 var workTime = YUtil.GetKeystoneWorkTime(); //只有一个状态的情况 if (machineStates.Count == 1) { //一个开机点,则认为之前都是关机状态 if (machineStates[0].StatePoint == MachineState.State.Start) { runTimeSec = (DateTime.Now - machineStates[0].Time).TotalSeconds; //一个关机点,则认为之前都是开机状态 } else if (machineStates[0].StatePoint == MachineState.State.Stop) { runTimeSec = (machineStates[0].Time - workTime).TotalSeconds; //一个维修点 } else if (machineStates[0].StatePoint == MachineState.State.Repair) { runTimeSec = 0; } //多个状态的情况 } else if (machineStates.Count > 1) { for (var i = 0; i < machineStates.Count - 1; i += 1) { var preeState = machineStates[i]; var nextState = machineStates[i + 1]; if (preeState.StatePoint == MachineState.State.Start && nextState.StatePoint != MachineState.State.Start) { var diffSec = (nextState.Time - preeState.Time).TotalSeconds; runTimeSec += diffSec; } } //第一个点为关机,则开机时间在上班时间之前 //加上当班时间点-->第一个关机时间点 if (machineStates[0].StatePoint == MachineState.State.Stop) { runTimeSec += (machineStates[0].Time - workTime).TotalSeconds; } //最后一个点为开机,则机台还在正常运转 //加上最后一个开机时间点--->当前时间 if (machineStates.Last().StatePoint == MachineState.State.Start) { runTimeSec += (DateTime.Now - machineStates.Last().Time).TotalSeconds; } //没有保留的历史状态 } else if (machineStates.Count == 0) { //机台当前正在运转,则认为从上班时间到现在未停过机 if (stateSpeed > 0) { runTimeSec = (DateTime.Now - workTime).TotalSeconds; //机台未运转,则认为从上班时间到现在未开过机 } else { runTimeSec = 0; } } return(runTimeSec); }