UcThickHeatVmUt.cs 5.98 KB
using GalaSoft.MvvmLight.Command;
using LiveCharts;
using LiveCharts.Configurations;
using Misc;
using System;
using System.ComponentModel;
using System.Linq;

namespace FLY.KSL.UI.Client
{
    public class UcThickHeatVmUt : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;


        #region 图表控制
        public Func<double, string> YFormatter { get; private set; }
        public int XMax { get; private set; }

        public double YMax => MaxHeat / 2;
        public double YMin => -MaxHeat / 2;
        #endregion

        /// <summary>
        /// 厚度%
        /// </summary>
        public ChartValues<double> ThickPercents { get; } = new ChartValues<double>();
        public ChartValues<int> Heats { get; } = new ChartValues<int>();

        public ChartValues<int> PVs { get; } = new ChartValues<int>();

        public double Kp { get; private set; } = 3;

        public int MaxHeat { get; set; } = 100;
        public object MapperHeats { get; private set; }

        [PropertyChanged.DependsOn(nameof(Kp))]
        public object MapperThickPercents { get; private set; }


        /// <summary>
        /// 记录1 or 记录2
        /// </summary>
        public string Title { get; set; }

        public long Id { get; set; }

        public long LastId { get; set; }

        public long Number { get; set; }


        /// <summary>
        /// 有效
        /// </summary>
        public bool IsVaild { get; set; }


        /// <summary>
        /// 加热起效
        /// </summary>
        public bool IsStable { get; set; }

        /// <summary>
        /// 开始测量时间!!!
        /// </summary>
        public DateTime Time { get; set; }

        /// <summary>
        /// 结束测量时间!!!
        /// </summary>
        public DateTime EndTime { get; set; }

        /// <summary>
        /// 方向
        /// </summary>
        public bool IsBackw { get; set; }

        /// <summary>
        /// 复位区号
        /// </summary>
        public int OrgBoltNo { get; set; }




        /// <summary>
        /// 膜距离
        /// </summary>
        public double FilmLength { get; set; }

        /// <summary>
        /// 旋转时间
        /// </summary>
        public TimeSpan RPeriod { get; set; }

        /// <summary>
        /// 开始改变加热时间
        /// </summary>
        public DateTime HTime { get; set; }

        public double Average { get; set; }
        public double Sigma2Percent { get; set; }

        /// <summary>
        /// 温度设置均值
        /// </summary>
        public double HSvAvg { get; set; }

        /// <summary>
        /// 温度当前均值
        /// </summary>
        public double HPvAvg { get; set; }




        public RelayCommand PreCmd { get; }
        public RelayCommand NextCmd { get; }

        public UcThickHeatVmUt()
        {
            YFormatter = (y) =>
            {
                string text = y + "℃";
                return $"{text,6}";
            };

            MapperHeats = Mappers.Xy<int>()
                .X((value, index) =>
                {
                    return index + 1;
                })
                .Y((value, index) =>
                {
                    return value;
                });

            MapperThickPercents = Mappers.Xy<double>()
                .X((value, index) =>
                {
                    return index + 1;
                })
                .Y((value) =>
                {
                    return value * Kp;
                });


            double target = 150;
            double tolerance = target * 0.02;
            int nbolts = 100;
            double[] datas = new double[nbolts];
            Random random = new Random();
            for (int i = 0; i < nbolts; i++)
            {
                datas[i] = (Math.Sin(i * Math.PI / nbolts) * 3) * tolerance + target + (random.NextDouble() - 0.5) * 1 - 6;
            }

            int kp = 3;



            int[] heats = new int[nbolts];
            for (int i = 0; i < nbolts; i++)
            {
                heats[i] = (int)((Math.Sin(i * Math.PI / nbolts)) * 20 + 100 + (random.NextDouble() - 0.5) * 5);
            }

            int[] pvs = new int[nbolts];
            for (int i = 0; i < nbolts; i++)
            {
                pvs[i] = (int)(heats[i] + (random.NextDouble() - 0.5) * 2);
            }

            XMax = nbolts + 1;

            Title = "记录1";
            Number = -1;
            Id = 12313122;
            LastId = 321211;
            Time = DateTime.Now;
            EndTime = Time - TimeSpan.FromMinutes(6.5);
            IsBackw = false;
            RPeriod = TimeSpan.FromMinutes(6.5);
            OrgBoltNo = 20;

            FilmLength = 25.4;


            Average = datas.AverageNoNull();
            Sigma2Percent = datas.Sigma() / Average * 2;

            double[] thickPercents = new double[datas.Count()];

            for (int i = 0; i < datas.Count(); i++)
            {
                var data = datas[i];
                var percent = 0.0;
                if (!double.IsNaN(data))
                {
                    percent = (data - Average) / Average * 100 * Kp;
                }
                thickPercents[i] = percent;
            }
            ThickPercents.Clear();
            ThickPercents.AddRange(thickPercents);

            

            HSvAvg = heats.Average();
            HPvAvg = pvs.Average();
            IsStable = true;
            HTime = Time - TimeSpan.FromMinutes(20);


            int[] offsets = new int[heats.Count()];
            for (int i = 0; i < heats.Count(); i++) {
                offsets[i] = (int)(heats[i] - HSvAvg);
            }

            Heats.Clear();
            Heats.AddRange(offsets);


            offsets = new int[pvs.Count()];
            for (int i = 0; i < heats.Count(); i++)
            {
                offsets[i] = (int)(pvs[i] - HPvAvg);
            }

            PVs.Clear();
            PVs.AddRange(offsets);

            IsVaild = true;
        }

    }
}