Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }