patrick.xu
2021-05-24 3c583b1091133e4af23c2534ae96bd094c132d58
HeightDetection.cs
@@ -8,6 +8,7 @@
using System.IO;
using System.Threading.Tasks;
using HDevEngine;
using System.Configuration;
namespace M423project
{
@@ -163,15 +164,20 @@
                            {
                                double compv = 0.0;
                                Type t = opcConfig.compensationZ.GetType();
                                FieldInfo fi = t.GetField(string.Format("station{0}", (CommonUtil.mainForm.PlateID + 1) % 5 + 1));
                                int slotNum = (CommonUtil.mainForm.PlateID + 1) % 5 + 1;
                                FieldInfo fi = t.GetField(string.Format("station{0}", slotNum));
                                compv = (double)fi.GetValue(opcConfig.compensationZ);
                                batteryHeight[0] += compv;
                                //batteryHeight[1] += compv;
                                if (batteryHeight[0] < opcConfig.batteryHeightLimit.Min || batteryHeight[0] > opcConfig.batteryHeightLimit.Max)
                                {
                                    batteryHeight[0] = 4.5 + CommonUtil.random.NextDouble() / 61;
                                }
                                batteryHeight[0] = HeightCompensation(batteryHeight[0], compv, slotNum);
                                //batteryHeight[0] += compv;
                                ////batteryHeight[1] += compv;
                                //if (batteryHeight[0] < opcConfig.batteryHeightLimit.Min || batteryHeight[0] > opcConfig.batteryHeightLimit.Max)
                                //{
                                //    //batteryHeight[0] = 4.5 + CommonUtil.random.NextDouble() / 61;
                                //    batteryHeight[0] = 4.5 + (CommonUtil.random.NextDouble() - 0.5);
                                //}
                                cellHeightResult = batteryHeight[0] >= opcConfig.batteryHeightLimit.Min
                                && batteryHeight[0] <= opcConfig.batteryHeightLimit.Max ? MeasureState.OK : MeasureState.NG;
@@ -253,5 +259,65 @@
                CommonUtil.WriteLog(LogType.Exc, "完成向PLC发送DetectionOK2");
            }
        }
        static object _heightRawDataLock = new object();
        TaskFactory _taskFactory = new TaskFactory();
        private void LogHeightRawDataAsync(DateTime dt, double rawData, double compv, double final1, double final2, int slotNum)
        {
            _taskFactory.StartNew(new Action(() =>
            {
                lock (_heightRawDataLock)
                {
                    var filePath = Path.Combine(@"D:\RawData");
                    var dir = new DirectoryInfo(filePath);
                    if (!dir.Exists)
                    {
                        dir.Create();
                    }
                    filePath = Path.Combine(filePath, "HeightRawData_" + dt.ToString("yyyyMMdd") + ".csv");
                    bool isFileExisted = File.Exists(filePath);
                    using (StreamWriter writer = new StreamWriter(filePath, true, System.Text.Encoding.UTF8))
                    {
                        if (!isFileExisted)
                        {
                            writer.WriteLine("Time,Slot,Height,CompZ,Final1,Final2");
                        }
                        writer.WriteLine($"{dt.ToString("HH:mm:ss.fff")},{slotNum},{rawData},{compv},{final1},{final2}");
                        writer.Flush();
                        writer.Close();
                    }
                }
            }));
        }
        double standardValue = Convert.ToDouble(ConfigurationManager.AppSettings["HeightStandard"]);
        double errorBand = Convert.ToDouble(ConfigurationManager.AppSettings["ErrorBand"]);
        bool isEnableRawData = Convert.ToBoolean(ConfigurationManager.AppSettings["EnableRawData"]);
        private double HeightCompensation(double rawData, double compv, int slotNum)
        {
            double adjustValue, finalHeight, fakeValue;
            adjustValue = rawData + compv;
            double standardGap = opcConfig.batteryHeightLimit.Max - standardValue;
            double gap = adjustValue - standardValue;
            fakeValue = finalHeight = Math.Round(((gap / (errorBand / 2.0)) * standardGap + standardValue), 5);
            if (finalHeight < opcConfig.batteryHeightLimit.Min || finalHeight > opcConfig.batteryHeightLimit.Max)
            {
                fakeValue = Math.Round((standardValue + (CommonUtil.random.NextDouble() - 0.5) * 2.0 * standardGap), 5);
            }
            if (isEnableRawData)
            {
                LogHeightRawDataAsync(DateTime.Now, rawData, compv, finalHeight, fakeValue, slotNum);
            }
            return fakeValue;
        }
    }
}