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.TestResult/TestResultView.xaml.cs | 668 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 668 insertions(+), 0 deletions(-)
diff --git a/Plugin.TestResult/TestResultView.xaml.cs b/Plugin.TestResult/TestResultView.xaml.cs
new file mode 100644
index 0000000..a207482
--- /dev/null
+++ b/Plugin.TestResult/TestResultView.xaml.cs
@@ -0,0 +1,668 @@
+锘縰sing HMI.Core.Entity;
+using HMI.Core.Manager;
+using HMI.Core.Util;
+using HMI.UI.Util;
+using NationalInstruments.TestStand.Interop.UI.Ax;
+using Plugin.TestResult_WPF.Model;
+using Plugin.TsSupport;
+using System;
+using System.Collections.Generic;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace Plugin.TestResult_WPF
+{
+ /// <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)
+ {
+ ViewControl.Logger.Error("InitTestStandEngine Failed.", ex);
+ throw new Exception($"{this.lang("Ts.InitTestStandEngineFail")}: {ex.Message}");
+ }
+ }
+
+ 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>("StationState.StopTest", 0, false);
+ }
+ catch (Exception ex)
+ {
+ ViewControl.Logger.Error("StartTestSequence Failed.", ex);
+ throw new Exception($"{this.lang("Ts.StartTestSequenceFailed")}: {ex.Message}");
+ }
+ }
+
+ public void StopTest()
+ {
+ try
+ {
+ executionWrapper?.SetStationGlobalValue<bool>("StationState.StopTest", 0, true, true);
+
+ try
+ {
+ 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)
+ {
+ ViewControl.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)
+ {
+ ViewControl.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;
+ ViewControl.Logger?.Info($"灏嗚�佸寲鐐塠{name}] 鐨凷tart鍙橀噺璁剧疆涓� {data};");
+ string key = $"StationState.Start[{index}]";
+
+ executionWrapper?.SetStationGlobalValue<bool>(key, 1, data);
+ }
+
+ 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 = $"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.Model[{index}]";
+ executionWrapper?.SetStationGlobalValue<string>(LookupStr, 1, product);
+ executionWrapper?.CommitToDisk(false);
+ }
+
+ public void RefreshProducts()
+ {
+ }
+ }
+}
--
Gitblit v1.9.1