alielie
2026-04-16 1afe548ac40cc7f975917ef9bf2e156595cf81f3
Plugin.TestResult/DataTable.xaml.cs
@@ -1,22 +1,24 @@
using HMI.Core.Util;
using HMI.Base;
using HMI.Core.Setting;
using HMI.Core.Util;
using HMI.LogUtil;
using HMI.UI.Util;
using HMI.Util;
using Plugin.TestResult;
using Plugin.TestResult.Util;
using Plugin.TestResult_WPF.Model;
using Plugin.TestResult_WPF.Util;
using Plugin.TsSupport;
using SuperSocket.SocketBase.Config;
using SuperSocket.SocketBase.Protocol;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.Net.WebSockets;
using System.Runtime.CompilerServices;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Markup;
namespace Plugin.TestResult_WPF
{
@@ -64,6 +66,16 @@
            set => RaiseAndSetIfchanged(ref _isTesting, value);
        }
        private ushort coolerStatus;
        public ushort CoolerStatus
        {
            get => coolerStatus;
            set
            {
                RaiseAndSetIfchanged(ref coolerStatus, value);
            }
        }
        private string tcpServerStatus;
        public string TcpServerStatus
@@ -79,17 +91,15 @@
            get { return tcpServerInfo; }
            set { RaiseAndSetIfchanged(ref tcpServerInfo, value); }
        }
        private static ICodeParser codeParser;
        private readonly int index;
        public int index { get; private set; }
        private readonly int cellCount;
        private readonly string chartTitle;
        private readonly TestResultView parent;
        public readonly TestResultView parent;
        private BaseConfig config;
        private Chart chart;
        private Chart multiChart;
        private SingleCell[] cells;
        private LiveChart chart;
        private LiveChart multiChart;
        public SingleCell[] cells { get; private set; }
        private TcpServer tcpServer;
        private string CountIniPath;
@@ -114,12 +124,12 @@
            this.title = title;
            this.cellCount = config.PositionCount;
            this.cells = new SingleCell[cellCount];
            this.chartTitle = config.MainChartTitle;
            this.chartTitle = this.lang("Tr.AvgTemp");
            DataContext = this;
            InitializeComponent();
            mainGrid.Columns = config.PositionColumn;
            this.chart = new Chart(this.chartTitle, false, config.MaxSize, config.RefreshInterval);
            this.multiChart = new Chart(config.DetailChartTitle, true, config.MaxSize, config.RefreshInterval)
            this.chart = new LiveChart("平均温度,平均温度(℃)", false, true);
            this.multiChart = new LiveChart(",详细温度(℃)", true)
            {
                BorderThickness = new Thickness(0)
            };
@@ -138,19 +148,15 @@
                cells[i] = cell;
            }
            if (config.CodeParserType == "JK01")
            {
                codeParser = new JKCodeParser();
            }
            else
            {
                codeParser = new CommonCodeParser();
            }
            ScannerParser.Init(config.CodeParserType);
            ReadCount();
            testTimeTimer = new Timer();
            testTimeTimer.Interval = 10000;
            testTimeTimer.AutoReset = true;
            testTimeTimer.Elapsed += TestTimeTimer_Elapsed;
            if (!ParamSetting.ShowCoolerSetting) coolerSetting.Visibility = Visibility.Collapsed;
            if (!ParamSetting.ShowBurnInAbort) abortBtn.Visibility = Visibility.Collapsed;
        }
        private void TestTimeTimer_Elapsed(object sender, ElapsedEventArgs e)
@@ -159,7 +165,7 @@
            var now = DateTime.Now;
            Dispatcher.BeginInvoke(new Action(() =>
            {
                SetConsumeTime((now - testStartTime).Value.TotalSeconds);
                //SetConsumeTime((now - testStartTime).Value.TotalSeconds);
            }));
        }
@@ -182,23 +188,25 @@
        {
            infoTable.temperature = t;
            tempratures.Add(t);
            chart.AddData(t);
            chart.AddDynamicData("平均温度", "平均温度(℃)", DateTime.Now, t);
        }
        public void SetTemperature(string name, double t)
        {
            List<double> list;
            if (detailTempratures.ContainsKey(name))
            {
                list = detailTempratures[name];
            }
            else
            {
                list = new List<double>();
                detailTempratures.Add(name, list);
            }
            list.Add(t);
            multiChart.AddData(name, t);
            //List<double> list;
            //if (detailTempratures.ContainsKey(name))
            //{
            //    list = detailTempratures[name];
            //}
            //else
            //{
            //    list = new List<double>();
            //    detailTempratures.Add(name, list);
            //}
            //list.Add(t);
            multiChart.AddDynamicData(name, "详细温度(℃)", DateTime.Now, t);
            //multiChart.AddData(name, t);
        }
        public void SetStatus(string status)
@@ -224,20 +232,20 @@
                }
                infoTable.status = status;
                if (lastStatus != "testing" && status == "testing")
                {
                    testStartTime = DateTime.Now;
                    SetStartTime(testStartTime?.ToString("yyyy-MM-dd HH:mm:ss"));
                    testTimeTimer.Start();
                }
                if (lastStatus == "testing" && status != "testing")
                {
                    testTimeTimer.Stop();
                    var now = DateTime.Now;
                    SetConsumeTime((now - testStartTime).Value.TotalSeconds);
                    SetEndTime(now.ToString("yyyy-MM-dd HH:mm:ss"));
                    testStartTime = null;
                }
                //if (lastStatus != "testing" && status == "testing")
                //{
                //    testStartTime = DateTime.Now;
                //    SetStartTime(testStartTime?.ToString("yyyy-MM-dd HH:mm:ss"));
                //    testTimeTimer.Start();
                //}
                //if (lastStatus == "testing" && status != "testing")
                //{
                //    testTimeTimer.Stop();
                //    var now = DateTime.Now;
                //    infoTable.UpdateConsumeTime((now - testStartTime).Value.TotalSeconds, null);
                //    SetEndTime(now.ToString("yyyy-MM-dd HH:mm:ss"));
                //    testStartTime = null;
                //}
            }));
        }
@@ -261,9 +269,9 @@
            infoTable.endTimeStr = endTime;
        }
        public void SetConsumeTime(double consumeTime)
        public void UpdateConsumeTime(double consumeTime, double? leftTime)
        {
            infoTable.consumeTime = consumeTime;
            infoTable.UpdateConsumeTime(consumeTime, leftTime);
        }
        private ChartWindow window;
@@ -301,15 +309,44 @@
        {
            if (IsTesting)
            {
                if (MsgBoxHelper2.WarnChoose($"确实停止老化炉[{title}]的测试吗") == MessageBoxResult.OK)
                if (MsgBoxHelper2.WarnChoose(this.lang("Tr.MakeSureStopOvenTest", title)) == MessageBoxResult.OK)
                {
                    LogHelper.Info("UI", $"老化炉[{title}]停止按钮按下", out _);
                    ViewControl.Logger.Info($"老化炉[{title}]停止按钮按下");
                    parent.SetStartFlag(this.index, false);
                }
            }
            else
            {
                ClearChartData();
                parent.SetStartFlag(this.index, true);
                /// 检查是否关门
                if (parent.executionWrapper?.GetStationGlobalValue<bool>($"StationState.DoorClose[{this.index}]", 0) != true)
                {
                    /// 没关门不允许启动
                    MsgBoxHelper2.Warn("请先关闭舱门!");
                    return;
                }
                /// 检查是否有条码
                bool flag = false;
                foreach (var cell in cells)
                {
                    if (!string.IsNullOrEmpty(cell.sn))
                    {
                        flag = true;
                        break;
                    }
                }
                if (flag)
                {
                    LogHelper.Info("UI", $"老化炉[{title}]启动按钮按下", out _);
                    ViewControl.Logger.Info($"老化炉[{title}]启动按钮按下");
                    ClearChartData();
                    parent.SetStartFlag(this.index, true);
                }
                else
                {
                    MsgBoxHelper2.Warn("请先完成扫码!");
                }
            }
        }
@@ -317,7 +354,7 @@
        {
            if (!parent.IsRunning)
            {
                MsgBoxHelper.WarnMessage(this, "请先点击右侧启动按钮启动测试程序!", null, MessageBoxButton.OK);
                MsgBoxHelper.WarnMessage(this, this.lang("Tr.StartSeqFirst"), null, MessageBoxButton.OK);
                return;
            }
@@ -327,7 +364,8 @@
            }
            else
            {
                scanner = new Scanner(this.lang("Tr.ScanTitle", title))
                int rows = config.CellCount / config.PositionColumn + 1;
                scanner = new Scanner(this.index, this.lang("Tr.ScanTitle", title), CbProduct.SelectedItem?.ToString(), mainGrid.Columns, rows)
                {
                    Owner = Window.GetWindow(this),
                    Tag = title
@@ -342,8 +380,9 @@
        private void Scanner_ComplateClick(object sender, RoutedEventArgs e)
        {
            string paramName = $"StationState.Scanner[{index}]";
            parent.engine.Globals.SetValBoolean(paramName, 1, true);
            //parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
            parent.executionWrapper.SetStationGlobalValue<bool>(paramName, 1, true);
            //parent.engine.Globals.SetValBoolean(paramName, 1, true);
        }
        private void Scanner_Closed(object sender, EventArgs e)
@@ -353,34 +392,38 @@
        private void Scanner_FinishBarcode(object sender, BarcodeEventArg e)
        {
            if (parent.SequenceContext == null) return;
            if (parent.executionWrapper == null) return;
            //if (parent.SequenceContext == null) return;
            CellInfo cellInfo = codeParser.GetCellInfoByCode(e.positionCode);
            int rows = (config.CellCount / config.PositionColumn) + 1;
            CellInfo cellInfo = ScannerParser.GetCellInfoByCode(CbProduct.SelectedItem?.ToString(), mainGrid.Columns, rows, e.positionCode);
            string positionCode = e.positionCode, snrCode = e.snrCode;
            //将读到的条码写入到SN中
            int dutNo = this.index * this.cellCount + cellInfo.Index;
            string LookupStr = $"StationState.SN[{dutNo}]";
            cellInfo.LookUpStr = LookupStr;
            ViewControl.Logger.Debug($"PositionCode: [{e.positionCode}], SNR: [{e.snrCode}], LookUpStr: [{LookupStr}]");
            ViewControl.Logger.Debug($"OvenName: [{cellInfo.OvenName}], CellIndex: [{cellInfo.Index}]");
            var cell = parent.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index);
            var cell = TestResultView.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index);
            if (snrCode == null)
            {
                string oldLookUp = $"StationState.SN[{e.oldIndex}]";
                var oldCellInfo = codeParser.GetCellInfoByCode(e.oldPosition);
                var oldCell = parent.nameTables[oldCellInfo.OvenName].GetSingleCell(oldCellInfo.Index);
                var oldCellInfo = e.lastInfo;
                var oldCell = TestResultView.nameTables[oldCellInfo.OvenName].GetSingleCell(oldCellInfo.Index);
                if (oldCell.status != "hadCode")
                {
                    throw new Exception($"穴位[{e.oldPosition}]当前不允许清除条码!");
                    throw new Exception(this.lang("Tr.PositionCantClearSNR", oldCellInfo.OriginCode));
                }
                // 移除条码
                parent.engine.Globals.SetValString(oldLookUp, 1, "");
                parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
                parent.executionWrapper.SetStationGlobalValue<string>(oldCellInfo.LookUpStr, 1, "");
                parent.executionWrapper.CommitToDisk(false);
                //parent.engine.Globals.SetValString(oldCellInfo.LookUpStr, 1, "");
                //parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
                oldCell.SetStatus("waiting");
                oldCell.sn = "";
                oldCell.ClearSN();
                return;
            }
@@ -392,12 +435,24 @@
            }
            // 写入条码
            parent.engine.Globals.SetValString(LookupStr, 1, snrCode);
            parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
            parent.executionWrapper.SetStationGlobalValue<string>(LookupStr, 1, snrCode);
            parent.executionWrapper.CommitToDisk(false);
            parent.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).SetStatus("hadCode");
            parent.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).sn = snrCode;
            Scanner.InsertNewCode(snrCode, positionCode, dutNo);
            //parent.engine.Globals.SetValString(LookupStr, 1, snrCode);
            //parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
            TestResultView.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).SetStatus("hadCode");
            TestResultView.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).sn = snrCode;
            Scanner.InsertNewCode(snrCode, cellInfo);
            var light = $"Oven{this.index + 1}_Cell{cell.index + 1}_Light_OK";
            if (cell.LightGreen(true, out string msg))
            {
                ViewControl.Logger.Debug($"Open Light [{light}] ON.");
            }
            else
            {
                ViewControl.Logger.Debug($"Open Light [{light}] Error.{msg}");
            }
        }
@@ -518,8 +573,6 @@
            string strs = datas_10015[2];
            string[] values = strs.Split(',');
            //string step = datas_10015[2];
            //string result = datas_10015[3];
            GetSingleCell(cellIndex).SetInfos(new Info
            {
                step = values[0],
@@ -536,10 +589,18 @@
        public void RefreshCount(int ok, int ng)
        {
            infoTable.UpdateNumber(infoTable.okCount + ok, infoTable.ngCount + ng);
            IniFileHelper.WriteIniData($"Oven_{index}", "Pass", infoTable.okCount.ToString(),
                this.CountIniPath);
            IniFileHelper.WriteIniData($"Oven_{index}", "Fail", infoTable.ngCount.ToString(),
                this.CountIniPath);
            if (ParamSetting.ProbeByModel)
            {
            }
            else
            {
                IniFileHelper.WriteIniData($"Oven_{index}", "Pass", infoTable.okCount.ToString(),
                   this.CountIniPath);
                IniFileHelper.WriteIniData($"Oven_{index}", "Fail", infoTable.ngCount.ToString(),
                    this.CountIniPath);
            }
        }
        /// <summary>
@@ -595,7 +656,7 @@
                using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
                using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8))
                {
                    string title = string.Join(",", detailTempratures.Keys) + ",平均值";
                    string title = string.Join(",", detailTempratures.Keys) + "," + this.lang("Tr.AvgTemp");
                    sw.WriteLine(title);
                    for (int i = 0; i < tempratures.Count; i++)
@@ -644,23 +705,45 @@
            {
                parent.SetOvenProduct(index, "");
            }
        }
        public void ClearElectricData()
        {
            foreach (var cell in cells)
            {
                cell.ClearElectricData();
                cell.RefreshProbe();
                cell.RefreshCharts();
            }
        }
        public void ClearVData()
        public void ClearCellData()
        {
            foreach (var cell in cells)
            {
                cell.ClearVData();
                cell.ClearChart();
            }
        }
        //public void ClearElectricData()
        //{
        //    foreach (var cell in cells)
        //    {
        //        cell.ClearElectricData();
        //    }
        //}
        //public void ClearVData()
        //{
        //    foreach (var cell in cells)
        //    {
        //        cell.ClearVData();
        //    }
        //}
        //public void ClearWaterData()
        //{
        //    foreach (var cell in cells)
        //    {
        //        cell.ClearWaterData();
        //    }
        //}
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
@@ -671,12 +754,42 @@
            setting.Open(true, this.title);
        }
        private void Manual_Cooler_Opt(object sender, RoutedEventArgs e)
        {
            //var btn = (Button)sender;
            //var target = CoolerStatus == 2 ? 0 : 2;
            //if (MsgBoxHelper2.WarnChoose($"确定要进行{btn.Content}吗?") == MessageBoxResult.OK)
            //{
            //    if (S7Context.WriteData("1", $"Oven{index + 1}_CoolerStatus", (ushort)target, out string msg))
            //    {
            //        CoolerStatus = (ushort)target;
            //        ToastHelper.Success("Success");
            //    }
            //    else
            //    {
            //        ToastHelper.Error($"{msg}");
            //    }
            //}
            if (parent.IsRunning)
            {
                MsgBoxHelper2.Warn(this.lang("Tr.CantOptCooler"));
                return;
            }
            var columns = mainGrid.Columns;
            var window = new CoolerStatus(this.index, columns, title + this.lang("Tr.CoolerSetting"))
            {
                Owner = Window.GetWindow(this)
            };
            window.ShowDialog();
        }
        private void ClearAllSnr_Click(object sender, RoutedEventArgs e)
        {
            var str = $"StationState.DoorClose[{index}]";
            if (parent.engine.Globals.GetValBoolean(str, 0) == true)
            if (parent.executionWrapper?.GetStationGlobalValue<bool>($"StationState.DoorClose[{this.index}]", 0) == true)
            {
                MsgBoxHelper.Error(Window.GetWindow(this), "程序运行中,不能清空条码");
                /// 关门了就不允许清条码
                MsgBoxHelper2.Warn(this.lang("Tr.CantClearSNR"));
                return;
            }
@@ -705,10 +818,9 @@
        public void TryClearCellSN(int cellIndex)
        {
            var str = $"StationState.DoorClose[{this.index}]";
            if (parent.engine.Globals.GetValBoolean(str, 0) == true)
            if (parent.executionWrapper?.GetStationGlobalValue<bool>($"StationState.DoorClose[{this.index}]", 0) == true)
            {
                MsgBoxHelper.Error(Window.GetWindow(this), "程序运行中,不能清空条码");
                MsgBoxHelper.Error(Window.GetWindow(this), this.lang("Tr.CantClearSNR"));
                return;
            }
            ClearCellSN(cellIndex);
@@ -720,19 +832,51 @@
            int dutNo = this.index * this.cellCount + index;
            string LookupStr = $"StationState.SN[{dutNo}]";
            var lastSN = cell.sn;
            cell.sn = "";
            cell.SetStatus("waiting");
            parent.engine.Globals.SetValString(LookupStr, 1, "");
            parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
            parent.executionWrapper.SetStationGlobalValue<string>(LookupStr, 1, "");
            parent.executionWrapper.CommitToDisk(false);
            //parent.engine.Globals.SetValString(LookupStr, 1, "");
            //parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
            if (!string.IsNullOrEmpty(lastSN)) Scanner.RemoveSNR(lastSN);
            cell.ClearSN();
        }
        private void Button_Click_2(object sender, RoutedEventArgs e)
        private void Abort_Click(object sender, RoutedEventArgs e)
        {
            if (MsgBoxHelper.WarnMessage(Window.GetWindow(this), "确定要停止该炉位的老化测试吗?") == MessageBoxResult.OK)
            if (!parent.IsRunning)
            {
                parent.SetStartFlag(this.index, false);
                MsgBoxHelper.WarnMessage(this, this.lang("Tr.StartSeqFirst"), null, MessageBoxButton.OK);
                return;
            }
            string key = $"StationState.Start[{this.index}]";
            //if (parent.executionWrapper?.GetStationGlobalValue<bool>(key, 0) == true)
            //{
            //    MsgBoxHelper2.Warn("测试启动中,不允许Abort");
            //    return;
            //}
            var win = new RequirePasswordByUser("admin")
            {
                Owner = Window.GetWindow(this)
            };
            if (win.ShowDialog() != true)
            {
                return;
            }
            if (MsgBoxHelper2.WarnChoose("请确认老化仓在安全温度,水冷机吹水完成,单击OK按钮仓位回到初始化状态") != MessageBoxResult.OK)
            {
                return;
            }
            LogHelper.Info("UI", "Abort按钮按下", out _);
            ViewControl.Logger.Info("Abort按钮按下");
            key = $"StationState.Abort[{this.index}]";
            parent.executionWrapper?.SetStationGlobalValue(key, 0, true);
        }
    }
}