alielie
2025-11-24 9211ec11c112e18cd99e77f889a01110a70031ce
Plugin.TestResult/DataTable.xaml.cs
@@ -1,15 +1,20 @@
using HMI.Core.Util;
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 SuperSocket.SocketBase.Config;
using SuperSocket.SocketBase.Protocol;
using System;
using System.CodeDom.Compiler;
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;
@@ -51,6 +56,14 @@
            set => RaiseAndSetIfchanged(ref _statusText, value);
        }
        private bool _isTesting;
        public bool IsTesting
        {
            get { return _isTesting; }
            set => RaiseAndSetIfchanged(ref _isTesting, value);
        }
        private string tcpServerStatus;
        public string TcpServerStatus
@@ -67,7 +80,7 @@
            set { RaiseAndSetIfchanged(ref tcpServerInfo, value); }
        }
        private static CommonCodeParser codeParser = new CommonCodeParser();
        private static ICodeParser codeParser;
        private readonly int index;
        private readonly int cellCount;
        private readonly string chartTitle;
@@ -80,6 +93,10 @@
        private TcpServer tcpServer;
        private string CountIniPath;
        private DateTime? testStartTime;
        private Timer testTimeTimer;
        // 平均温度
        public List<double> tempratures = new List<double>();
@@ -112,11 +129,38 @@
            for (int i = 0; i < this.cellCount; i++)
            {
                var cell = new SingleCell(title, i, config.CellListMaxSize, countIniPath);
                var cellRow = (i / config.PositionColumn) + 1;
                var cellCol = (i % config.PositionColumn) + 1;
                var cellTitle = $"{title}-{cellRow}-{cellCol}";
                var cell = new SingleCell(this, cellTitle, i, config.CellListMaxSize, countIniPath);
                mainGrid.Children.Add(cell);
                cells[i] = cell;
            }
            if (config.CodeParserType == "JK01")
            {
                codeParser = new JKCodeParser();
            }
            else
            {
                codeParser = new CommonCodeParser();
            }
            ReadCount();
            testTimeTimer = new Timer();
            testTimeTimer.Interval = 10000;
            testTimeTimer.AutoReset = true;
            testTimeTimer.Elapsed += TestTimeTimer_Elapsed;
        }
        private void TestTimeTimer_Elapsed(object sender, ElapsedEventArgs e)
        {
            if (testStartTime == null) return;
            var now = DateTime.Now;
            Dispatcher.BeginInvoke(new Action(() =>
            {
                SetConsumeTime((now - testStartTime).Value.TotalSeconds);
            }));
        }
        public int GetSize()
@@ -159,7 +203,42 @@
        public void SetStatus(string status)
        {
            infoTable.status = status;
            ViewControl.Logger.Debug($"In Status: {status}");
            Dispatcher.BeginInvoke(new Action(() =>
            {
                var lastStatus = infoTable.status;
                if (status == "preCheck")
                {
                    ViewControl.Logger.Debug($"In preCheck");
                    IsTesting = true;
                    return;
                }
                if (status == "stop")
                {
                    IsTesting = false;
                    return;
                }
                if (status == "abort")
                {
                    IsTesting = false;
                }
                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;
                }
            }));
        }
        public void SetOkCount(int count)
@@ -215,26 +294,56 @@
        private void SetStationGlobal_Click(object sender, RoutedEventArgs e)
        {
            ClearChartData();
            parent.SetStartFlag(this.index, true);
        }
        private void StartSingleClick(object sender, RoutedEventArgs e)
        {
            if (IsTesting)
            {
                if (MsgBoxHelper2.WarnChoose($"确实停止老化炉[{title}]的测试吗") == MessageBoxResult.OK)
                {
                    parent.SetStartFlag(this.index, false);
                }
            }
            else
            {
                ClearChartData();
                parent.SetStartFlag(this.index, true);
            }
        }
        private void ScanWindow_Click(object sender, RoutedEventArgs e)
        {
            if (!parent.IsRunning)
            {
                MsgBoxHelper.WarnMessage(this, "请先点击右侧启动按钮启动测试程序!", null, MessageBoxButton.OK);
                return;
            }
            if (scanner != null)
            {
                scanner.Activate();
                scanner.ShowDialog();
            }
            else
            {
                scanner = new Scanner(this.lang("Tr.ScanTitle", title))
                {
                    Owner = Window.GetWindow(this),
                    Tag = title
                };
                scanner.FinishBarcode += Scanner_FinishBarcode;
                scanner.ComplateClick += Scanner_ComplateClick; ;
                scanner.Closed += Scanner_Closed;
                scanner.Show();
                scanner.ShowDialog();
            }
        }
        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);
        }
        private void Scanner_Closed(object sender, EventArgs e)
@@ -245,23 +354,50 @@
        private void Scanner_FinishBarcode(object sender, BarcodeEventArg e)
        {
            if (parent.SequenceContext == null) return;
            CellInfo cellInfo = codeParser.GetCellInfoByCode(e.positionCode);
            string paramName = $"StationState.StartScanner_{title}";
            parent.engine.Globals.SetValBoolean(paramName, 0, true);
            CellInfo cellInfo = codeParser.GetCellInfoByCode(e.positionCode);
            string positionCode = e.positionCode, snrCode = e.snrCode;
            //TODO 需要增加条码校验功能
            //将读到的条码写入到SN中
            int dutNo = Convert.ToInt16(positionCode.Split('-')[2]) - 1;
            dutNo = this.index * this.cellCount + dutNo;
            int dutNo = this.index * this.cellCount + cellInfo.Index;
            string LookupStr = $"StationState.SN[{dutNo}]";
            parent.engine.Globals.SetValString(LookupStr, 0, snrCode);
            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);
            if (snrCode == null)
            {
                string oldLookUp = $"StationState.SN[{e.oldIndex}]";
                var oldCellInfo = codeParser.GetCellInfoByCode(e.oldPosition);
                var oldCell = parent.nameTables[oldCellInfo.OvenName].GetSingleCell(oldCellInfo.Index);
                if (oldCell.status != "hadCode")
                {
                    throw new Exception($"穴位[{e.oldPosition}]当前不允许清除条码!");
                }
                // 移除条码
                parent.engine.Globals.SetValString(oldLookUp, 1, "");
                parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
                oldCell.SetStatus("waiting");
                oldCell.sn = "";
                return;
            }
            /// 清掉上个条码的记录
            var lastSn = cell.sn;
            if (!string.IsNullOrEmpty(lastSn))
            {
                Scanner.RemoveSNR(lastSn);
            }
            // 写入条码
            parent.engine.Globals.SetValString(LookupStr, 1, snrCode);
            parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
            string code = parent.engine.Globals.GetValString(LookupStr, 0);
            parent.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).SetStatus("hadCode");
            parent.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).sn = snrCode;
            Scanner.InsertNewCode(snrCode, positionCode, dutNo);
        }
@@ -282,13 +418,18 @@
        /// </summary>
        private void StartTcpServer()
        {
            var serverConfig = new ServerConfig()
            {
                MaxRequestLength = 1024 * 1024,
                Port = config.PortStart + index
            };
            try
            {
                if (tcpServer == null)
                {
                    tcpServer = new TcpServer();
                    tcpServer.NewRequestReceived += TcpServer_NewRequestReceived;
                    if (!tcpServer.Setup(config.PortStart + index))
                    if (!tcpServer.Setup(serverConfig))
                    {
                        ChangeTcpServerStatus("ERROR", this.lang("Tr.TcpServer.SettingFailed"));
                        return;
@@ -302,7 +443,7 @@
                }
                else if (tcpServer.State != SuperSocket.SocketBase.ServerState.Running)
                {
                    if (!tcpServer.Setup(config.PortStart + index))
                    if (!tcpServer.Setup(serverConfig))
                    {
                        ChangeTcpServerStatus("ERROR", this.lang("Tr.TcpServer.SettingFailed"));
                        return;
@@ -358,6 +499,7 @@
        /// </summary>
        public void RelaseResource()
        {
            testTimeTimer?.Stop();
            StopTcpServer();
        }
@@ -369,6 +511,7 @@
        private void TcpServer_NewRequestReceived(TcpSession session, StringRequestInfo requestInfo)
        {
            string msg = requestInfo.Body;
            ViewControl.Logger.Debug($"TCP Data From {session.RemoteEndPoint}: {msg}.");
            string[] datas_10015 = msg.Split(';');
            int cellIndex = int.Parse(datas_10015[1]);
@@ -381,10 +524,11 @@
            {
                step = values[0],
                value = values[1],
                result = values[2],
                range = values[3],
                condition = values[4],
                updateTime = values[5]
                limitUp = values[2],
                limitDown = values[3],
                unit = values[4],
                result = values[5],
                updateTime = values[6]
            });
            //session.Send("1");
        }
@@ -510,6 +654,14 @@
            }
        }
        public void ClearVData()
        {
            foreach (var cell in cells)
            {
                cell.ClearVData();
            }
        }
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            ScannerSetting setting = new ScannerSetting()
@@ -518,5 +670,69 @@
            };
            setting.Open(true, this.title);
        }
        private void ClearAllSnr_Click(object sender, RoutedEventArgs e)
        {
            var str = $"StationState.DoorClose[{index}]";
            if (parent.engine.Globals.GetValBoolean(str, 0) == true)
            {
                MsgBoxHelper.Error(Window.GetWindow(this), "程序运行中,不能清空条码");
                return;
            }
            if (MsgBoxHelper.WarnMessage(Window.GetWindow(this), LangUtil.Get("Tr.MakeSureClearAllSNR")) == MessageBoxResult.OK)
            {
                try
                {
                    ClearAllSN();
                    ToastHelper.Success(LangUtil.Get("App.DeleteSuccess"));
                }
                catch (Exception ex)
                {
                    ViewControl.Logger.Error("ClearAllSnr_Click Error.", ex);
                    MsgBoxHelper.Error(Window.GetWindow(this), ex.Message);
                }
            }
        }
        public void ClearAllSN()
        {
            for (int i = 0; i < this.cellCount; i++)
            {
                ClearCellSN(i);
            }
        }
        public void TryClearCellSN(int cellIndex)
        {
            var str = $"StationState.DoorClose[{this.index}]";
            if (parent.engine.Globals.GetValBoolean(str, 0) == true)
            {
                MsgBoxHelper.Error(Window.GetWindow(this), "程序运行中,不能清空条码");
                return;
            }
            ClearCellSN(cellIndex);
        }
        private void ClearCellSN(int index)
        {
            var cell = GetSingleCell(index);
            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);
            if (!string.IsNullOrEmpty(lastSN)) Scanner.RemoveSNR(lastSN);
        }
        private void Button_Click_2(object sender, RoutedEventArgs e)
        {
            if (MsgBoxHelper.WarnMessage(Window.GetWindow(this), "确定要停止该炉位的老化测试吗?") == MessageBoxResult.OK)
            {
                parent.SetStartFlag(this.index, false);
            }
        }
    }
}