From 9d1660270272180cd71147d6ddd53d1382643d2e Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 02 十一月 2026 18:00:14 +0800
Subject: [PATCH] merge: 并入远程 Initial commit 作为历史根节点

---
 Plugin.BurnIn/TestResultView.xaml.cs |  684 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 684 insertions(+), 0 deletions(-)

diff --git a/Plugin.BurnIn/TestResultView.xaml.cs b/Plugin.BurnIn/TestResultView.xaml.cs
new file mode 100644
index 0000000..eb767aa
--- /dev/null
+++ b/Plugin.BurnIn/TestResultView.xaml.cs
@@ -0,0 +1,684 @@
+锘縰sing HMI.Core.Entity;
+using HMI.Core.Manager;
+using HMI.Core.Util;
+using HMI.UI.Util;
+using NationalInstruments.TestStand.Interop.UI.Ax;
+using Plugin.BurnIn.Model;
+using Plugin.TsSupport;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace Plugin.BurnIn
+{
+    /// <summary>
+    /// TestResultView.xaml 鐨勪氦浜掗�昏緫
+    /// </summary>
+    public partial class TestResultView : UserControl
+    {
+        private int rowCount;
+        private int colCount;
+        private int cellCount;
+
+        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 string testModelFile;
+        public string testSeqFile;
+        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;
+            if (config.CellCount < 0)
+            {
+                this.cellCount = rowCount * colCount;
+            }
+            else
+            {
+                this.cellCount = config.CellCount;
+            }
+            tables = new DataTable[this.cellCount];
+
+
+            InitializeComponent();
+
+            
+        }
+
+        private void ExecutionWrapper_UIMessageEvent(object sender, UIMessageEvent e)
+        {
+            try
+            {
+                HandleUIMessage(e.EventCode, Convert.ToInt16(e.NumberData), e.StrData, e.Data);
+            }
+            catch (Exception ex)
+            {
+
+            }
+        }
+
+        private void Refresh()
+        {
+        }
+
+        /// <summary>
+        /// 鎺㈤拡璁℃暟閰嶇疆璺緞
+        /// </summary>
+        private string CountIniPath;
+        public void SetCountIniPath(string countIniPath)
+        {
+            CountIniPath = countIniPath;
+        }
+
+        public void InitMainGrid()
+        {
+            nameTables = new Dictionary<string, DataTable>();
+            for (int r = 0; r < rowCount; r++)
+            {
+                RowDefinition row = new RowDefinition();
+                mainGrid.RowDefinitions.Add(row);
+            }
+
+            for (int c = 0; c < colCount; c++)
+            {
+                ColumnDefinition col = new ColumnDefinition();
+                mainGrid.ColumnDefinitions.Add(col);
+            }
+            string[] names = config.NameStr.Split(',');
+            for (int n = 0; n < cellCount; n++)
+            {
+                string name = n < names.Length ? names[n] : "";
+                DataTable child = new DataTable(this, n, name, CountIniPath, config);
+                mainGrid.Children.Add(child);
+                tables[n] = child;
+                nameTables[name] = child;
+                int row = n / colCount;
+                int col = n % colCount;
+                Grid.SetRow(child, row);
+                Grid.SetColumn(child, col);
+            }
+            if (config.testing) Refresh();
+        }
+
+        public DataTable GetDataTable(int index)
+        {
+            if (index >= 0 && index < tables.Length) return tables[index];
+            return null;
+        }
+
+        /// <summary>
+        /// 鍚姩娴嬭瘯搴忓垪
+        /// </summary>
+        public void InitTestStandEngine(bool isTap)
+        {
+            try
+            {
+                if (isTap)
+                {
+                    executionWrapper = new TapWrapper();
+                }
+                else
+                {
+                    executionWrapper = new TeststandWrapper();
+                }
+                executionWrapper.UIMessageEvent += ExecutionWrapper_UIMessageEvent;
+
+                if (executionWrapper is TeststandWrapper tsWrapper)
+                {
+                    ((System.ComponentModel.ISupportInitialize)(tsWrapper.AxApplicationMgr)).BeginInit();
+                    host.Child = tsWrapper.AxApplicationMgr;
+                    ((System.ComponentModel.ISupportInitialize)(tsWrapper.AxApplicationMgr)).EndInit();
+                }
+                //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)
+            {
+                BurnInUI.Logger.Error("InitTestStandEngine Failed.", ex);
+                throw new Exception($"{this.lang("Ts.InitTestStandEngineFail")}: {ex.Message}");
+            }
+        }
+
+        public void SetOvenName()
+        {
+            foreach (var oven in tables)
+            {
+                executionWrapper?.SetStationGlobalValue<string>($"StationHMI.UUTHMI[{oven.index}].Name", 1, oven.title);
+            }
+            executionWrapper?.CommitToDisk(false);
+        }
+
+        public void StartTestSequence()
+        {
+            try
+            {
+                if (string.IsNullOrEmpty(testSeqFile)) return;
+                executionWrapper?.StartSequence(this.testSeqFile,
+                    @"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq");
+
+                executionWrapper.SetStationGlobalValue<bool>("StationHMI.AllStop", 0, false);
+            }
+            catch (Exception ex)
+            {
+                BurnInUI.Logger.Error("StartTestSequence Failed.", ex);
+                throw new Exception($"{this.lang("Ts.StartTestSequenceFailed")}: {ex.Message}");
+            }
+        }
+
+        public void StopTest()
+        {
+            try
+            {
+                executionWrapper?.SetStationGlobalValue<bool>("StationHMI.AllStop", 0, true, true);
+
+                try
+                {
+                    executionWrapper?.WaitForExit();
+                    executionWrapper?.ReleaseSeqFile();
+                }
+                catch (Exception ex)
+                {
+                    BurnInUI.Logger.Error("Wait For Exit error.", ex);
+                    //if (ex is NullReferenceException ne)
+                    //{
+
+                    //}
+                    //else
+                    //{
+                    //    throw ex;
+                    //}
+                }
+            }
+            catch (Exception ex)
+            {
+                BurnInUI.Logger.Error("StopTest Failed.", ex);
+                throw new Exception($"{this.lang("Ts.StopTestSequenceFailed")}: {ex.Message}");
+            }
+        }
+
+        [Obsolete]
+        private void axApplicationMgr_ExitApplication(object sender, EventArgs e)
+        {
+            //Environment.ExitCode = testApp.ExitCode;
+            //TSHelper.DoSynchronousGCForCOMObjectDestruction();
+        }
+
+        [Obsolete]
+        private void axApplicationMgr_ExecutionClosed(object sender, _ApplicationMgrEvents_ExecutionClosedEvent e)
+        {
+            try
+            {
+                //this.ReleaseSequenceFile();
+            }
+            catch (Exception ex)
+            {
+                MsgBoxHelper.Error(Window.GetWindow(this),
+                    $"{this.lang("Ts.ReleaseSequenceFileFail")}: {ex.Message}");
+            }
+        }
+
+
+        private void HandleUIMessage(int EventCase, int MethodCode, string strData, object xData)
+        {
+            try
+            {
+                if (EventCase != 10014) return;
+
+                if (MethodCode == 0)
+                {
+                    /// 璁剧疆鍙ユ焺
+                    executionWrapper.SetContext(xData);
+                    return;
+                }
+
+                if (MethodCode == 1)
+                {
+                    /// 鏇存柊鐐夊瓙鐘舵��
+                    string[] datas_10014 = strData.Split(';');
+                    int ovenIndex = int.Parse(datas_10014[0]);
+
+                    string status = datas_10014[1];
+                    tables[ovenIndex].SetStatus(status);
+                    return;
+                }
+                if (MethodCode == 2)
+                {
+                    /// 鏇存柊鐐夊瓙鏁伴噺淇℃伅
+                    string[] datas_10014 = strData.Split(';');
+                    int ovenIndex = int.Parse(datas_10014[0]);
+
+                    string okCount = datas_10014[1];
+                    string ngCount = datas_10014[2];
+                    tables[ovenIndex].SetOkCount(int.Parse(okCount));
+                    tables[ovenIndex].SetNgCount(int.Parse(ngCount));
+                    return;
+                }
+                if (MethodCode == 3)
+                {
+                    /// 鏇存柊鐐夊瓙鏃堕棿淇℃伅
+                    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].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)
+                {
+                    /// 鏇存柊鑰佸寲鐐夊簳閮ㄧ姸鎬佹爮
+                    string[] datas_10014 = strData.Split(';');
+                    int ovenIndex = int.Parse(datas_10014[0]);
+
+                    string statusBar = datas_10014[1];
+                    tables[ovenIndex].SetStatusText(statusBar);
+                    return;
+                }
+                if (MethodCode == 5)
+                {
+                    /// 閲囬泦鐐夋俯搴�
+                    string[] datas_10016 = strData.Split(';');
+                    int ovenIndex = int.Parse(datas_10016[0]);
+
+                    string[] names = datas_10016[1].Split(',');
+                    string[] values = datas_10016[2].Split(',');
+
+                    for (int x = 0; x < values.Length; x++)
+                    {
+                        if (x == 0) tables[ovenIndex].SetTemperature(double.Parse(values[x]));
+                        else tables[ovenIndex].SetTemperature(names[x - 1], double.Parse(values[x]));
+                    }
+                    return;
+                }
+                if (MethodCode == 6)
+                {
+                    Dispatcher.Invoke(() =>
+                    {/// 鏇存柊绌翠綅鐘舵��
+                        string[] datas_10015 = strData.Split(';');
+                        int ovenIndex = int.Parse(datas_10015[0]);
+                        int cellIndex = int.Parse(datas_10015[1]);
+                        string status_10015 = datas_10015[2];
+                        tables[ovenIndex].GetSingleCell(cellIndex).SetStatus(status_10015);
+
+                        if (status_10015 == "OK" || status_10015 == "ok")
+                        {
+                            tables[ovenIndex].RefreshCount(1, 0);
+                        }
+                        else if (status_10015 == "ng" || status_10015 == "NG")
+                        {
+                            tables[ovenIndex].RefreshCount(0, 1);
+                        }
+                    });
+                    return;
+                }
+                if (MethodCode == 7)
+                {
+                    /// 鏇存柊绌翠綅鍙傛暟
+                    string[] datas_10015 = strData.Split(';');
+                    int ovenIndex = int.Parse(datas_10015[0]);
+                    int cellIndex = int.Parse(datas_10015[1]);
+
+                    string strs = datas_10015[2];
+                    string[] values = strs.Split(',');
+
+                    //string step = datas_10015[2];
+                    //string result = datas_10015[3];
+                    tables[ovenIndex].GetSingleCell(cellIndex).SetInfos(new Info
+                    {
+                        step = values[0],
+                        value = values[1],
+                        limitUp = values[2],
+                        limitDown = values[3],
+                        unit = values[4],
+                        result = values[5],
+                        updateTime = values[6]
+                    });
+                    return;
+                }
+                if (MethodCode == 10)
+                {
+                    /// 娓呯┖鐐夊瓙鐨勬俯搴﹀浘琛�
+                    int ovenIndex = int.Parse(strData);
+                    tables[ovenIndex].ClearChartData();
+                    return;
+                }
+                
+                if (MethodCode == 11)
+                {
+                    /// 娓呴櫎绌翠綅鍙傛暟
+                    string[] datas_10015 = strData.Split(';');
+                    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)
+                {
+                    /// 淇濆瓨鐐変綋娓╁害鏂囦欢
+                    string[] datas = strData.Split(';');
+                    int ovenIndex = int.Parse(datas[0]);
+                    string folder = datas[1];
+                    tables[ovenIndex].SaveTempFile(folder);
+                    return;
+                }
+                if (MethodCode == 13)
+                {
+                    /// 娣诲姞鐢垫祦鏁版嵁
+                    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).AddElectricData(eData);
+                    return;
+                }
+
+                if (MethodCode == 14)
+                {
+                    /// 娓呯┖鐢垫祦鍜岀數鍘嬫暟鎹�
+                    int ovenIndex = int.Parse(strData);
+                    tables[ovenIndex].ClearCellData();
+                    //tables[ovenIndex].ClearElectricData();
+                    //tables[ovenIndex].ClearVData();
+                    //tables[ovenIndex].ClearWaterData();
+                    return;
+                }
+
+                if (MethodCode == 15)
+                {
+                    /// 淇濆瓨鐢垫祦鏁版嵁
+                    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)
+                {
+                    /// 娣诲姞鐢靛帇鍥捐〃鏁版嵁
+                    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)
+                {
+                    /// 淇濆瓨鐢靛帇鏁版嵁
+                    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
+                    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
+                    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
+                    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)
+                {
+                    /// 娓呯┖鏉$爜
+                    int ovenIndex = int.Parse(strData);
+                    tables[ovenIndex].ClearAllSN();
+                    return;
+                }
+
+                if (MethodCode == 21)
+                {
+                    /// 娣诲姞姘存祦鍥捐〃鏁版嵁
+                    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)
+                {
+                    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;
+                }
+            }
+            catch (Exception ex)
+            {
+                BurnInUI.Logger.Warn("TestStand Event Error.", ex);
+            }
+        }
+
+        private void axApplicationMgr_UIMessageEvent(object sender, _ApplicationMgrEvents_UIMessageEventEvent e)
+        {
+            int EventCase = Convert.ToInt32(e.uiMsg.Event);
+            int MethodCode = Convert.ToInt16(e.uiMsg.NumericData);
+            string strData = e.uiMsg.StringData;
+            HandleUIMessage(EventCase, MethodCode, strData, e.uiMsg.ActiveXData);
+        }
+
+        public void SetStartFlag(int index, bool data)
+        {
+            string name = tables[index].title;
+            string key = string.Empty;
+            if (data)
+            {
+                BurnInUI.Logger?.Info($"鍚姩鑰佸寲鐐塠{name}]");
+                key = $"StationHMI.UUTHMI[{index}].Start";
+            }
+            else
+            {
+                BurnInUI.Logger?.Info($"鍋滄鑰佸寲鐐塠{name}]");
+                key = $"StationHMI.UUTHMI[{index}].Stop";
+            }
+            executionWrapper?.SetStationGlobalValue<bool>(key, 1, true);
+        }
+
+        public void ReleaseResource()
+        {
+            executionWrapper.UIMessageEvent -= ExecutionWrapper_UIMessageEvent;
+            executionWrapper.Dispose();
+            foreach (var table in tables)
+            {
+                table.RelaseResource();
+            }
+        }
+
+        /// <summary>
+        /// 璁℃暟娓呴浂
+        /// </summary>
+        public void ClearNumber()
+        {
+            foreach (var table in tables)
+            {
+                table.ClearNumber();
+            }
+        }
+
+        public void SetProductSource(List<string> productSource)
+        {
+            foreach (var table in tables)
+            {
+                table.SetProductSource(productSource);
+            }
+        }
+
+        public void SetCurrentProduct(string currentProduct)
+        {
+            for (int i = 0; i < tables.Length; i++)
+            {
+                var table = tables[i];
+                string LookupStr = $"StationHMI.UUTHMI[{i}].Model";
+
+                string tableModel = executionWrapper?.GetStationGlobalValue<string>(LookupStr, 1);
+                //engine?.Globals?.GetValString(LookupStr, 1);
+                table.SetCurrentProduct(tableModel);
+            }
+        }
+
+        public void SetOvenProduct(int index, string product)
+        {
+            string LookupStr = $"StationHMI.UUTHMI[{index}].Model";
+            executionWrapper?.SetStationGlobalValue<string>(LookupStr, 1, product);
+            executionWrapper?.CommitToDisk(false);
+        }
+
+        public void RefreshProducts()
+        {
+        }
+    }
+}

--
Gitblit v1.9.1