From ef52fd6fd07508883dce4eb002acda59f0169e59 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期四, 23 四月 2026 10:19:33 +0800
Subject: [PATCH] 优化;

---
 Plugin.TestResult/TestResultView.xaml.cs |  420 +++++++++++++++++++++++++++++++++++++++++++++---------------
 1 files changed, 315 insertions(+), 105 deletions(-)

diff --git a/Plugin.TestResult/TestResultView.xaml.cs b/Plugin.TestResult/TestResultView.xaml.cs
index 4f73cfe..9182ea0 100644
--- a/Plugin.TestResult/TestResultView.xaml.cs
+++ b/Plugin.TestResult/TestResultView.xaml.cs
@@ -1,12 +1,14 @@
-锘縰sing HMI.Core.Util;
+锘縰sing HMI.Core.Entity;
+using HMI.Core.Manager;
+using HMI.Core.Util;
 using HMI.UI.Util;
 using NationalInstruments.TestStand.Interop.API;
 using NationalInstruments.TestStand.Interop.UI.Ax;
-using NationalInstruments.TestStand.Utility;
-using Plugin.TestResult_WPF.Constant;
 using Plugin.TestResult_WPF.Model;
+using Plugin.TsSupport;
 using System;
 using System.Collections.Generic;
+using System.Runtime.InteropServices;
 using System.Windows;
 using System.Windows.Controls;
 
@@ -20,34 +22,111 @@
         private int rowCount;
         private int colCount;
         private int cellCount;
-        private DataTable[] tables;
-        public Dictionary<string, DataTable> nameTables { get; private set; }
+
+        public static DataTable[] tables { get; private set; }
+        public static Dictionary<string, DataTable> nameTables { get; private set; } = new Dictionary<string, DataTable>();
         private readonly BaseConfig config;
 
-        public AxApplicationMgr testApp;
+
+
+        public string testModelFile;
         public string testSeqFile;
-        /// <summary>
-        /// 娴嬭瘯搴忓垪
-        /// </summary>
-        private SequenceFile testSeq = null;
-        public Engine engine;
-        private Execution execution = null;
-        /// <summary>
-        /// 娴嬭瘯搴忓垪鎿嶄綔鍙ユ焺
-        /// </summary>
-        public SequenceContext SequenceContext { get; private set; } = null;
-        /// <summary>
-        /// 娴嬭瘯妯″瀷搴忓垪
-        /// </summary>
-        private SequenceFile modeSeq;
+        public bool inManualDebugMode = false;
+
+        #region TS鐩稿叧
+        //public AxApplicationMgr testApp;
+        ///// <summary>
+        ///// 娴嬭瘯搴忓垪
+        ///// </summary>
+        //private SequenceFile testSeq = null;
+        //public Engine engine;
+        //private Execution execution = null;
+        ///// <summary>
+        ///// 娴嬭瘯搴忓垪鎿嶄綔鍙ユ焺
+        ///// </summary>
+        //public SequenceContext SequenceContext { get; private set; } = null;
+        ///// <summary>
+        ///// 娴嬭瘯妯″瀷搴忓垪
+        ///// </summary>
+        //private SequenceFile modeSeq;
+
+        public ITestExecutionWrapper executionWrapper;
+        #endregion
 
         public TestResultView() : this(new BaseConfig { testing = false })
         {
 
         }
 
+        public bool IsRunning { get; set; } = false;
+
+        public void RefreshCooler()
+        {
+
+        }
+
+        private void RefreshNumberConfig(BaseConfig config)
+        {
+            ParameterData value = null;
+            try
+            {
+                value = ParameterManager.GetCommonParameterByName("BurnInOvenCount");
+                string[] datas = value.Value.Trim().Split(',');
+                config.Row = int.Parse(datas[0]);
+                config.Column = int.Parse(datas[1]);
+            }
+            catch (Exception ex)
+            {
+
+            }
+
+            try
+            {
+                value = ParameterManager.GetCommonParameterByName("BurnInOvenName");
+                config.NameStr = value.Value;
+            }
+            catch (Exception ex)
+            {
+
+            }
+
+            try
+            {
+                value = ParameterManager.GetCommonParameterByName("BurnInOvenPort");
+                config.PortStart = int.Parse(value.Value);
+            }
+            catch (Exception ex)
+            {
+
+            }
+
+            try
+            {
+                value = ParameterManager.GetCommonParameterByName("BurnInCellCount");
+                string[] datas = value.Value.Trim().Split(',');
+                config.PositionColumn = int.Parse(datas[0]);
+                config.PositionCount = int.Parse(datas[1]);
+            }
+            catch (Exception ex)
+            {
+
+            }
+        }
+
         public TestResultView(BaseConfig config)
         {
+            try
+            {
+                var value = ParameterManager.GetCommonParameterByName("TsModelPath");
+                testModelFile = value?.Value ?? @"C:\Users\Public\Documents\National Instruments\TestStand 2020 (64-bit)\Components\Models\ParallelModel.seq";
+            }
+            catch
+            {
+                //@"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq"
+                testModelFile = @"C:\Users\Public\Documents\National Instruments\TestStand 2020 (64-bit)\Components\Models\ParallelModel.seq";
+            }
+
+            RefreshNumberConfig(config);
             this.rowCount = config.Row;
             this.colCount = config.Column;
             this.config = config;
@@ -63,60 +142,36 @@
 
 
             InitializeComponent();
-            testApp = new AxApplicationMgr();
-            testApp.ExitApplication += new EventHandler(this.axApplicationMgr_ExitApplication);
-            testApp.UIMessageEvent += new _ApplicationMgrEvents_UIMessageEventEventHandler(this.axApplicationMgr_UIMessageEvent);
-            testApp.ExecutionClosed += new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.axApplicationMgr_ExecutionClosed);
+
+            executionWrapper = new TsExecutionWrapper(); //new TsExecutionWrapper();
+            if (executionWrapper is TsExecutionWrapper tsWrapper)
+            {
+                tsWrapper.AxApplicationMgr.ExitApplication += this.axApplicationMgr_ExitApplication;
+                tsWrapper.AxApplicationMgr.UIMessageEvent += this.axApplicationMgr_UIMessageEvent;
+                tsWrapper.AxApplicationMgr.ExecutionClosed += this.axApplicationMgr_ExecutionClosed;
+                ((System.ComponentModel.ISupportInitialize)(tsWrapper.AxApplicationMgr)).BeginInit();//myClient涓虹涓夋柟鎺т欢鍚�
+                host.Child = tsWrapper.AxApplicationMgr;
+                ((System.ComponentModel.ISupportInitialize)(tsWrapper.AxApplicationMgr)).EndInit();
+            }
 
 
-            ((System.ComponentModel.ISupportInitialize)(this.testApp)).BeginInit();//myClient涓虹涓夋柟鎺т欢鍚�
-            host.Child = testApp;
-            ((System.ComponentModel.ISupportInitialize)(this.testApp)).EndInit();
 
-            //InitTestStandEngine();
-            //StartTestSequence();
+            //testApp = TestAppManager.GetAxApplicationMgr();
+            //testApp.ExitApplication += this.axApplicationMgr_ExitApplication;
+            //testApp.UIMessageEvent += this.axApplicationMgr_UIMessageEvent;
+            //testApp.ExecutionClosed += this.axApplicationMgr_ExecutionClosed;
+            //((System.ComponentModel.ISupportInitialize)(this.testApp)).BeginInit();//myClient涓虹涓夋柟鎺т欢鍚�
+            //host.Child = testApp;
+            //((System.ComponentModel.ISupportInitialize)(this.testApp)).EndInit();
         }
 
         private void Refresh()
         {
-            for (int i = 0; i < tables.Length; i++)
-            {
-                var sb = new System.Timers.Timer()
-                {
-                    Interval = 1000,
-                    AutoReset = true,
-                };
-                var table = tables[i];
-                Random random = new Random(i * 13);
-                sb.Elapsed += (s, e) =>
-                {
-                    table.RefreshCount(1, 0);
-                    table.SetTemperature(random.Next(100));
-                    for (int j = 0; j < 3; j++)
-                    {
-                        table.SetTemperature(j + "89", random.Next(100));
-                    }
-                    //table.SetOkCount(random.Next(100));
-                    //table.SetNgCount(random.Next(100));
-                    table.SetStatus(CommonStatus.GetRandomStatus());
-                    table.SetStartTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
-                    table.SetEndTime(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
-                    table.SetConsumeTime(random.Next(10000));
-                    tables[0].GetSingleCell(0).AddElectricData(random.Next(100));
-
-                    var cell = tables[0].GetSingleCell(0);//table.GetSingleCell(random.Next(table.GetSize()));
-                    cell.SetStatus(CommonStatus.GetRandomStatus());
-                    cell.SetInfos(new Info
-                    {
-                        step = random.Next(1000) + "",
-                        value = random.Next(1000) + ""
-                    });
-                    table.SetStatusText(DateTime.Now + "");
-                };
-                sb.Start();
-            }
         }
 
+        /// <summary>
+        /// 鎺㈤拡璁℃暟閰嶇疆璺緞
+        /// </summary>
         private string CountIniPath;
         public void SetCountIniPath(string countIniPath)
         {
@@ -166,12 +221,13 @@
         {
             try
             {
-                this.engine = this.testApp.GetEngine();
-                this.engine.PersistBreakpoints = false;
-                this.testApp.IsEditor = true;
-                this.testApp.LoginOnStart = false;
-                this.testApp.Start();
-                this.modeSeq = this.engine.GetSequenceFileEx(@"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq");
+                //this.engine = this.testApp.GetEngine();
+                //this.engine.PersistBreakpoints = false;
+                //this.testApp.IsEditor = true;
+                //this.testApp.LoginOnStart = false;
+                //this.testApp.Start();
+                //this.modeSeq = this.engine.GetSequenceFileEx(testModelFile);
+                executionWrapper.Init();
             }
             catch (Exception ex)
             {
@@ -184,10 +240,11 @@
         {
             try
             {
-                this.modeSeq = this.engine.GetSequenceFileEx(@"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq");
-                this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 0, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
-                this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
-                this.engine.Globals.SetValBoolean("StationState.StopTest", 0, false);
+                if (string.IsNullOrEmpty(testSeqFile)) return;
+                executionWrapper?.StartSequence(this.testSeqFile,
+                    @"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq");
+
+                executionWrapper.SetStationGlobalValue<bool>("StationState.StopTest", 0, false);
             }
             catch (Exception ex)
             {
@@ -200,13 +257,24 @@
         {
             try
             {
-                if (this.SequenceContext == null)
-                    return;
-                bool val = this.SequenceContext.StationGlobals.Exists("StationState.StopTest", 0);
-                if (val)
+                executionWrapper?.SetStationGlobalValue<bool>("StationState.StopTest", 0, true, true);
+                
+                try
                 {
-                    this.SequenceContext.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
-                    bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
+                    executionWrapper?.WaitForExit();
+                    executionWrapper?.ReleaseSeqFile();
+                }
+                catch (Exception ex)
+                {
+                    ViewControl.Logger.Error("Wait For Exit error.", ex);
+                    //if (ex is NullReferenceException ne)
+                    //{
+
+                    //}
+                    //else
+                    //{
+                    //    throw ex;
+                    //}
                 }
             }
             catch (Exception ex)
@@ -218,8 +286,8 @@
 
         private void axApplicationMgr_ExitApplication(object sender, EventArgs e)
         {
-            Environment.ExitCode = testApp.ExitCode;
-            TSHelper.DoSynchronousGCForCOMObjectDestruction();
+            //Environment.ExitCode = testApp.ExitCode;
+            //TSHelper.DoSynchronousGCForCOMObjectDestruction();
         }
 
         private void axApplicationMgr_ExecutionClosed(object sender, _ApplicationMgrEvents_ExecutionClosedEvent e)
@@ -248,7 +316,11 @@
                 if (MethodCode == 0)
                 {
                     /// 璁剧疆鍙ユ焺
-                    this.SequenceContext = (SequenceContext)e.uiMsg.ActiveXData;
+                    //this.SequenceContext = (SequenceContext)e.uiMsg.ActiveXData;
+                    if (executionWrapper is TsExecutionWrapper tsWrapper)
+                    {
+                        tsWrapper.context = (SequenceContext)e.uiMsg.ActiveXData;
+                    }
                     return;
                 }
 
@@ -282,13 +354,19 @@
                     strData = e.uiMsg.StringData;
                     string[] datas_10014 = strData.Split(';');
                     int ovenIndex = int.Parse(datas_10014[0]);
-
                     string startTime = datas_10014[1];
                     string consumeTime = datas_10014[2];
                     string planEndTime = datas_10014[3];
+
                     tables[ovenIndex].SetStartTime(startTime);
-                    tables[ovenIndex].SetConsumeTime(double.Parse(consumeTime));
                     tables[ovenIndex].SetEndTime(planEndTime);
+                    double? leftTime = null;
+                    /// 涓轰簡鍏煎鏃х増鏈紝濡傛灉鏈夊墿浣欐椂闂村氨浼狅紝娌℃湁灏变紶null
+                    if (datas_10014.Length >= 5)
+                    {
+                        leftTime = double.Parse(datas_10014[4]);
+                    }
+                    tables[ovenIndex].UpdateConsumeTime(double.Parse(consumeTime), leftTime);
                     return;
                 }
                 if (MethodCode == 4)
@@ -357,10 +435,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]
                     });
                     return;
                 }
@@ -380,12 +459,12 @@
                     int ovenIndex = int.Parse(datas_10015[0]);
                     int cellIndex = int.Parse(datas_10015[1]);
                     tables[ovenIndex].GetSingleCell(cellIndex).ClearInfo();
+                    //GC.Collect();
                     return;
                 }
                 if (MethodCode == 12)
                 {
-                    /// 淇濆瓨娓╁害鏂囦欢
-                    /// 
+                    /// 淇濆瓨鐐変綋娓╁害鏂囦欢
                     strData = e.uiMsg.StringData;
                     string[] datas = strData.Split(';');
                     int ovenIndex = int.Parse(datas[0]);
@@ -404,23 +483,127 @@
                     tables[ovenIndex].GetSingleCell(cellIndex).AddElectricData(eData);
                     return;
                 }
+
                 if (MethodCode == 14)
                 {
-                    /// 娓呯┖鐢垫祦鏁版嵁
+                    /// 娓呯┖鐢垫祦鍜岀數鍘嬫暟鎹�
                     strData = e.uiMsg.StringData;
                     int ovenIndex = int.Parse(strData);
-                    tables[ovenIndex].ClearElectricData();
+                    tables[ovenIndex].ClearCellData();
+                    //tables[ovenIndex].ClearElectricData();
+                    //tables[ovenIndex].ClearVData();
+                    //tables[ovenIndex].ClearWaterData();
                     return;
                 }
+
                 if (MethodCode == 15)
                 {
-                    /// 娓呯┖鐢垫祦鏁版嵁
+                    /// 淇濆瓨鐢垫祦鏁版嵁
                     strData = e.uiMsg.StringData;
                     string[] datas = strData.Split(';');
                     int ovenIndex = int.Parse(datas[0]);
                     int cellIndex = int.Parse(datas[1]);
                     string filePath = datas[2];
                     tables[ovenIndex].GetSingleCell(cellIndex).SaveElectricDataToCSV(filePath);
+                    return;
+                }
+
+                if (MethodCode == 16)
+                {
+                    /// 娣诲姞鐢靛帇鍥捐〃鏁版嵁
+                    strData = e.uiMsg.StringData;
+                    string[] datas = strData.Split(';');
+                    int ovenIndex = int.Parse(datas[0]);
+                    int cellIndex = int.Parse(datas[1]);
+                    double eData = double.Parse(datas[2]);
+                    tables[ovenIndex].GetSingleCell(cellIndex).AddVData(eData);
+                    return;
+                }
+
+                if (MethodCode == 17)
+                {
+                    /// 淇濆瓨鐢靛帇鏁版嵁
+                    strData = e.uiMsg.StringData;
+                    string[] datas = strData.Split(';');
+                    int ovenIndex = int.Parse(datas[0]);
+                    int cellIndex = int.Parse(datas[1]);
+                    string filePath = datas[2];
+                    tables[ovenIndex].GetSingleCell(cellIndex).SaveVDataToCSV(filePath);
+                    return;
+                }
+
+                if (MethodCode == 18)
+                {
+                    /// 淇濆瓨绌翠綅娴嬭瘯鏁版嵁鍒癈SV
+                    strData = e.uiMsg.StringData;
+                    string[] datas = strData.Split(';');
+                    int ovenIndex = int.Parse(datas[0]);
+                    int cellIndex = int.Parse(datas[1]);
+                    string filePath = datas[2];
+                    tables[ovenIndex].GetSingleCell(cellIndex).SaveInfoToCSV(filePath);
+                    return;
+                }
+                if (MethodCode == 180)
+                {
+                    /// 淇濆瓨绌翠綅娴嬭瘯鏁版嵁鍒癈SV
+                    strData = e.uiMsg.StringData;
+                    string[] datas = strData.Split(';');
+                    int ovenIndex = int.Parse(datas[0]);
+                    int cellIndex = int.Parse(datas[1]);
+                    string filePath = datas[2];
+                    tables[ovenIndex].GetSingleCell(cellIndex).NormalCSV(filePath);
+                    return;
+                }
+
+                if (MethodCode == 19)
+                {
+                    /// 淇濆瓨绌翠綅娴嬭瘯鏁版嵁鍒癝qlite
+                    strData = e.uiMsg.StringData;
+                    string[] datas = strData.Split(';');
+                    int ovenIndex = int.Parse(datas[0]);
+                    int cellIndex = int.Parse(datas[1]);
+                    tables[ovenIndex].GetSingleCell(cellIndex).SaveInfoToDB();
+                    return;
+                }
+
+                if (MethodCode == 20)
+                {
+                    /// 娓呯┖鏉$爜
+                    strData = e.uiMsg.StringData;
+                    int ovenIndex = int.Parse(strData);
+                    tables[ovenIndex].ClearAllSN();
+                    return;
+                }
+
+                if (MethodCode == 21)
+                {
+                    /// 娣诲姞姘存祦鍥捐〃鏁版嵁
+                    strData = e.uiMsg.StringData;
+                    string[] datas = strData.Split(';');
+                    int ovenIndex = int.Parse(datas[0]);
+                    int cellIndex = int.Parse(datas[1]);
+                    double waterTemp = double.Parse(datas[2]);
+                    double backWaterTemp = double.Parse(datas[3]);
+                    double waterPressure = double.Parse(datas[4]);
+                    tables[ovenIndex].GetSingleCell(cellIndex).AddWaterData(waterTemp, backWaterTemp, waterPressure);
+                    return;
+                }
+
+                if (MethodCode == 99)
+                {
+                    strData = e.uiMsg.StringData;
+                    string[] datas = strData.Split(';');
+                    int index = int.Parse(datas[0]);
+                    if (MsgBoxHelper2.WarnChoose(datas[1], "鎻愮ず") == MessageBoxResult.OK)
+                    {
+                        executionWrapper.SetStationGlobalValue<int>($"StationState.Pipe[{index}]", 1, 1);
+                        //SequenceContext.StationGlobals.SetValNumber($"StationState.Pipe[{index}]", 1, 1);
+                    }
+                    else
+                    {
+                        executionWrapper.SetStationGlobalValue<int>($"StationState.Pipe[{index}]", 1, 0);
+                        //SequenceContext.StationGlobals.SetValNumber($"StationState.Pipe[{index}]", 1, 0);
+                    }
                     return;
                 }
             }
@@ -432,17 +615,34 @@
 
         public void SetStartFlag(int index, bool data)
         {
-            if (this.SequenceContext == null) return;
             string name = tables[index].title;
-            string key = $"StationState.Start_{name}";
-            this.engine.Globals.SetValBoolean(key, 0, data);
-            bool val = this.engine.Globals.GetValBoolean(key, 0);
-            //this.SequenceContext.StationGlobals.SetValBoolean(key, 0, data);
-            //bool val = this.SequenceContext.StationGlobals.GetValBoolean(key, 0);
+            ViewControl.Logger?.Info($"灏嗚�佸寲鐐塠{name}] 鐨凷tart鍙橀噺璁剧疆涓� {data};");
+            string key = $"StationState.Start[{index}]";
+
+            executionWrapper?.SetStationGlobalValue<bool>(key, 1, data);
+
+            if (data == false)
+            {
+                key = $"StationState.Scanner[{index}]";
+                executionWrapper?.SetStationGlobalValue<bool>(key, 1, false);
+            }
+        }
+
+        public bool? GetStartFlag(int index)
+        {
+            string key = $"StationState.Start[{index}]";
+            return executionWrapper.GetStationGlobalValue<bool>(key, 0);
         }
 
         public void ReleaseResource()
         {
+            if (executionWrapper is TsExecutionWrapper tsWrapper)
+            {
+                tsWrapper.AxApplicationMgr.ExitApplication -= this.axApplicationMgr_ExitApplication;
+                tsWrapper.AxApplicationMgr.UIMessageEvent -= this.axApplicationMgr_UIMessageEvent;
+                tsWrapper.AxApplicationMgr.ExecutionClosed -= this.axApplicationMgr_ExecutionClosed;
+            }
+
             foreach (var table in tables)
             {
                 table.RelaseResource();
@@ -470,16 +670,26 @@
 
         public void SetCurrentProduct(string currentProduct)
         {
-            foreach (var table in tables)
+            for (int i = 0; i < tables.Length; i++)
             {
-                table.SetCurrentProduct(currentProduct);
+                var table = tables[i];
+                string LookupStr = $"StationState.Model[{i}]";
+
+                string tableModel = executionWrapper?.GetStationGlobalValue<string>(LookupStr, 1);
+                //engine?.Globals?.GetValString(LookupStr, 1);
+                table.SetCurrentProduct(tableModel);
             }
         }
 
         public void SetOvenProduct(int index, string product)
         {
-            string LookupStr = $"StationState.ProductModel_{tables[index].title}";
-            engine?.Globals?.SetValString(LookupStr, 1, product);
+            string LookupStr = $"StationState.Model[{index}]";
+            executionWrapper?.SetStationGlobalValue<string>(LookupStr, 1, product);
+            executionWrapper?.CommitToDisk(false);
+        }
+
+        public void RefreshProducts()
+        {
         }
     }
 }

--
Gitblit v1.9.1