Example #1
0
        /// <summary>
        /// 计算并获取基础的SPC信息变量
        /// </summary>
        /// <param name="source">样本源</param>
        /// <param name="normal">Spc正常值</param>
        /// <param name="toleranceSpc">Spc正常值范围</param>
        /// <param name="basicSpcInfo">传出参数,基本信息对象</param>
        /// <returns>是否获取成功</returns>
        private bool GetBasicParam(List <double> source, double normal, double toleranceSpc, out BasicSpcInfo basicSpcInfo)
        {
            if (source == null)
            {
                basicSpcInfo = null;
                return(false);
            }
            if (source.Count <= 0)
            {
                basicSpcInfo = null;
                return(false);
            }
            basicSpcInfo                   = new BasicSpcInfo();
            basicSpcInfo.SampleCount       = source.Count;
            basicSpcInfo.SampleMax         = source.Max();
            basicSpcInfo.SampleMin         = source.Min();
            basicSpcInfo.Wrange            = Math.Abs(basicSpcInfo.SampleMax - basicSpcInfo.SampleMin);
            basicSpcInfo.Average           = source.Average();
            basicSpcInfo.StandardDeviation = CalculateSD(source, basicSpcInfo.Average, basicSpcInfo.SampleCount);
            basicSpcInfo.Capability        = toleranceSpc / 6 / basicSpcInfo.StandardDeviation;
            basicSpcInfo.Centernal         = (toleranceSpc / 2 - Math.Abs(normal - basicSpcInfo.Average)) / 3 / basicSpcInfo.StandardDeviation;
            int groupQty = 0;

            groupQty = int.TryParse(Math.Round(Math.Sqrt(basicSpcInfo.SampleCount) + 1, 0, MidpointRounding.AwayFromZero).ToString(), out groupQty) ? groupQty : 0;
            basicSpcInfo.GroupQty        = groupQty;
            basicSpcInfo.GroupDistance   = (basicSpcInfo.SampleMax - basicSpcInfo.SampleMin) / groupQty * 1.0;
            basicSpcInfo.GroupStartValue = basicSpcInfo.SampleMin - basicSpcInfo.GroupDistance / 2;
            return(true);
        }
Example #2
0
        /// <summary>
        /// 计算Spc
        /// </summary>
        /// <param name="eqmNo">工站编号</param>
        /// <param name="information">要计算的项目</param>
        /// <param name="partNo">型号</param>
        /// <param name="normalValue">该项目的标准值</param>
        /// <param name="tolerance">该项目的容忍度</param>
        /// <param name="startTime">开始时间</param>
        /// <param name="endTime">结束时间</param>
        /// <returns>返回Spc统计结果</returns>
        public ModelView.DataAnalysisSpcView CalculateSpc(string eqmNo, string information, string partNo, double normalValue, double tolerance, DateTime startTime, DateTime endTime)
        {
            ModelView.DataAnalysisSpcView res = new ModelView.DataAnalysisSpcView();
            if (startTime >= endTime)
            {
                return(null);
            }
            if (string.IsNullOrEmpty(eqmNo))
            {
                return(null);
            }
            if (string.IsNullOrEmpty(information))
            {
                return(null);
            }
            //获取样本
            List <string> tmpListStr = GetInforValueFromDb(eqmNo, information, partNo, startTime, endTime);

            if (tmpListStr == null)
            {
                return(null);
            }
            if (tmpListStr.Count <= 0)
            {
                return(null);
            }
            List <double> sample = ConvertStr2Double(tmpListStr);

            //样本校验
            if (sample == null)
            {
                return(null);
            }
            if (sample.Count <= 0)
            {
                return(null);
            }
            BasicSpcInfo basicSpcInfo = new BasicSpcInfo();
            //计算基础样本数据
            bool b = GetBasicParam(sample, normalValue, tolerance, out basicSpcInfo);

            if (!b)
            {
                return(null);
            }
            res.dotTitle     = eqmNo + "-" + information + "分析";
            res.spcTitle     = eqmNo + "-" + information + "分析";
            res.avarage      = Math.Round(basicSpcInfo.Average, 2);
            res.max          = Math.Round(basicSpcInfo.SampleMax, 2);
            res.min          = Math.Round(basicSpcInfo.SampleMin, 2);
            res.normal       = Math.Round(normalValue, 2);
            res.upLimit      = Math.Round(normalValue + tolerance / 2, 2);
            res.lowerLimit   = Math.Round(normalValue - tolerance / 2, 2);
            res.yAxisMax     = Math.Max(Math.Round(res.max + Math.Abs((res.max - res.min) * 0.2), 2), Math.Round(res.upLimit + Math.Abs((res.max - res.min) * 0.2), 2));
            res.yAxisMin     = Math.Min(Math.Round(res.min - Math.Abs((res.max - res.min) * 0.2), 2), Math.Round(res.lowerLimit - Math.Abs((res.max - res.min) * 0.2), 2));
            res.dotxAxisData = CreateSampleIndex(sample);

            List <double> sampleRound = new List <double>();

            sample.ForEach(a => sampleRound.Add(Math.Round(a, 2)));
            res.dotyAxisData = sampleRound;
            res.spcxAxisData = CreateSpcBasicData(res.min, res.max, basicSpcInfo.GroupDistance);
            res.tips         = string.Format("CP:{0}\t\tCPK:{1}", (Math.Round(basicSpcInfo.Capability, 2).ToString()), (Math.Round(basicSpcInfo.Centernal, 2).ToString()));
            List <BasicSpcInfo.Boundary> sampleGroupBoundary = CalculateBoundary(basicSpcInfo.GroupStartValue, res.max, basicSpcInfo.GroupDistance);

            if (sampleGroupBoundary == null)
            {
                return(null);
            }
            if (sampleGroupBoundary.Count <= 0)
            {
                return(null);
            }
            Dictionary <BasicSpcInfo.Boundary, int> firstStatistic = StatictisSample(sample, sampleGroupBoundary);

            if (firstStatistic == null)
            {
                return(null);
            }
            if (firstStatistic.Count <= 0)
            {
                return(null);
            }
            res.spcyAxisCountData = StatisticSampleCount(firstStatistic);
            res.spcyAxisCurveData = CalculateBasicDataNormal(res.spcxAxisData, basicSpcInfo.Average, basicSpcInfo.StandardDeviation, basicSpcInfo.GroupDistance, basicSpcInfo.SampleCount);
            return(res);
        }