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/ViewControl.xaml.cs | 495 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 495 insertions(+), 0 deletions(-)
diff --git a/Plugin.TestResult/ViewControl.xaml.cs b/Plugin.TestResult/ViewControl.xaml.cs
new file mode 100644
index 0000000..ebff038
--- /dev/null
+++ b/Plugin.TestResult/ViewControl.xaml.cs
@@ -0,0 +1,495 @@
+锘縰sing HMI.Base;
+using HMI.Core.Api;
+using HMI.Core.Entity;
+using HMI.Core.Manager;
+using HMI.Core.Setting;
+using HMI.Core.Util;
+using HMI.LogUtil;
+using HMI.StdControl;
+using HMI.UI.Util;
+using log4net;
+using NationalInstruments.TestStand.Interop.API;
+using NationalInstruments.TestStand.Interop.UI.Ax;
+using PLCHelper;
+using Plugin.TestResult.Util;
+using Plugin.TsSupport;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.IO;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace Plugin.TestResult_WPF
+{
+ /// <summary>
+ /// ViewControl.xaml 鐨勪氦浜掗�昏緫
+ /// </summary>
+ public partial class ViewControl : PluginMaskControl, IAlarmHandler
+ {
+
+ private System.Timers.Timer timer;
+
+ public static ILog Logger { get; private set; }
+
+
+ private bool _mesStatus;
+
+ public bool mesStatus
+ {
+ get => _mesStatus;
+ set => Set(ref _mesStatus, value);
+ }
+
+ private string _produceStatus = "INIT";
+
+ public string produceStatus
+ {
+ get => _produceStatus;
+ set => Set(ref _produceStatus, value);
+ }
+
+ private string _fileName;
+
+ public string FileName
+ {
+ get => _fileName;
+ set => Set(ref _fileName, value);
+ }
+
+ private bool enableManualDebug;
+ public bool EnableManualDebug
+ {
+ get => enableManualDebug;
+ set
+ {
+ if (IsRunning)
+ {
+ MsgBoxHelper2.Warn("璇峰厛缁撴潫鑷姩娴嬭瘯");
+ return;
+ }
+ testResultView.inManualDebugMode = value;
+ Set(ref enableManualDebug, value);
+ }
+ }
+
+ public override void SetLogger(ILog logger)
+ {
+ base.SetLogger(logger);
+ Logger = logger;
+ }
+
+ private bool isRunning = false;
+ public bool IsRunning
+ {
+ get => isRunning;
+ set
+ {
+ Set(ref isRunning, value);
+ testResultView.IsRunning = value;
+ this.modelSelect.IsEnabled = !value;
+ this.btnStop.IsEnabled = value;
+ stdEnableMes.CbEnabled = !value;
+ }
+ }
+
+ private bool AutoExecuteSeq = true;
+
+ #region TS鐩稿叧
+
+ /// <summary>
+ /// 娴嬭瘯搴忓垪鎿嶄綔鍙ユ焺
+ /// </summary>
+ private SequenceContext SequenceContext = null;
+ #endregion
+
+ public ViewControl()
+ {
+ S7Context.Init(SystemSetting.Instance.PlcIp, SystemSetting.Instance.PlcPort);
+ DataContext = this;
+ timer = new System.Timers.Timer();
+ timer.Interval = 1000;
+ timer.Elapsed += Timer_Elapsed;
+ InitializeComponent();
+
+
+ //testResultView.testApp.ExitApplication += new EventHandler(this.axApplicationMgr_ExitApplication);
+ //testResultView.testApp.UIMessageEvent += new _ApplicationMgrEvents_UIMessageEventEventHandler(this.axApplicationMgr_UIMessageEvent);
+ //testResultView.testApp.ExecutionClosed += new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.axApplicationMgr_ExecutionClosed);
+ }
+
+ private void HandleUIMessage(int EventCase, int MethodCode, string strData, object xData)
+ {
+ try
+ {
+ try
+ {
+ log.Debug($"EventCase: {EventCase}, MethodCode: {MethodCode}, StrData: {strData}");
+ }
+ catch
+ {
+
+ }
+
+ if (EventCase == 8)
+ {
+ IsRunning = false;
+ return;
+ }
+
+ if (EventCase != 10014) return;
+
+ if (MethodCode == 0)
+ {
+ /// 璁剧疆鍙ユ焺
+ this.SequenceContext = (SequenceContext)xData;
+ return;
+ }
+
+
+ if (MethodCode == 8)
+ {
+ /// 鏇存柊MES鐘舵��
+ mesStatus = strData == "1";
+ return;
+ }
+
+ if (MethodCode == 9)
+ {
+ /// 鏇存柊鐢熶骇鐘舵��
+ produceStatus = strData;
+ return;
+ }
+ }
+ catch
+ { }
+ }
+
+ private void ExecutionWrapper_UIMessageEvent(object sender, UIMessageEvent e)
+ {
+ HandleUIMessage(e.EventCode, Convert.ToInt16(e.NumberData), e.StrData, e.Data);
+ }
+
+ private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
+ {
+ testResultView.RefreshCooler();
+ }
+
+ public TestResultView View
+ {
+ get => testResultView;
+ }
+ public static string SannerIniFile { get; private set; }
+
+ public override void InitFinish()
+ {
+ base.InitFinish();
+ string path = Path.Combine(BaseFolder, "Count.ini");
+ testResultView.SetCountIniPath(path);
+ testResultView.InitMainGrid();
+
+ path = Path.Combine(BaseFolder, "Scanner.ini");
+ if (!File.Exists(path))
+ {
+ File.Create(path).Close();
+ }
+ SannerIniFile = path;
+ LoadProduct();
+ var api = S7Context.Get(RunTimeVariablePool.DEFAULT_PLC_NAME);
+ log.Debug($"PLC {api.IpAddress}:{api.Port}");
+ try
+ {
+ var value = ParameterManager.GetCommonParameterByName("AutoExecuteSeq");
+ AutoExecuteSeq = bool.Parse(value.Value);
+ }
+ catch
+ {
+ AutoExecuteSeq = true;
+ }
+
+ try
+ {
+ var value = ParameterManager.GetCommonParameterByName("BurnInMainSeq");
+ testResultView.testSeqFile = value.Value;
+ FileName = Path.GetFileName(value.Value);
+ }
+ catch
+ {
+ testResultView.testSeqFile = string.Empty;
+ FileName = string.Empty;
+ }
+ string type = Path.GetExtension(FileName);
+ bool isTap = string.Equals(".tapplan", type, StringComparison.OrdinalIgnoreCase);
+
+ testResultView.InitTestStandEngine(isTap);
+ testResultView.executionWrapper.UIMessageEvent += ExecutionWrapper_UIMessageEvent;
+
+ RefreshUIConfig();
+ }
+
+ /// <summary>
+ /// 鍒锋柊UI閰嶇疆
+ /// </summary>
+ private void RefreshUIConfig()
+ {
+ try
+ {
+ /// 杩愯涓氨涓嶇
+ if (IsRunning)
+ {
+ return;
+ }
+ bool enableManualDebug = ParameterManager.GetCommonParameterByName("EnableManualDebug", false);
+ if (enableManualDebug)
+ {
+ FgEnableManualDebug.Visibility = Visibility.Visible;
+ }
+ else
+ {
+ FgEnableManualDebug.Visibility = Visibility.Collapsed;
+ EnableManualDebug = false;
+ }
+ }
+ catch (Exception ex)
+ {
+ log.Error("RefreshUIConfig Error.", ex);
+ }
+ }
+
+ private bool isLoaded;
+ private void UserControl_Loaded(object sender, RoutedEventArgs e)
+ {
+ AlarmShowHelper.AddHandler(this);
+ if (AutoExecuteSeq)
+ {
+ ShowMask(() =>
+ {
+ Dispatcher.BeginInvoke(new Action(() =>
+ {
+ Start_Click(null, null);
+ }), System.Windows.Threading.DispatcherPriority.Background);
+ }, (ex) =>
+ {
+ ToastHelper.Error("Loaded Failed.");
+ log.Error("Loaded Failed.", ex);
+ }, "璇风◢鍚�", LangUtil.Get("Ts.SequenceIsStarting"));
+ }
+ else
+ {
+ IsRunning = false;
+ }
+ Loaded -= UserControl_Loaded;
+ }
+
+ public void LoadProduct()
+ {
+ List<ProductData> products = ProductManager.GetProducts<List<ProductData>>()
+ ?? new List<ProductData>();
+ this.modelSelect.Items.Clear();
+ List<string> productSource = new List<string>();
+ foreach (var prd in products)
+ {
+ this.modelSelect.Items.Add(prd.Name);
+ productSource.Add(prd.Name);
+ }
+ testResultView.SetProductSource(productSource);
+ testResultView.SetCurrentProduct(null);
+
+ //string model = testResultView.executionWrapper.GetStationGlobalValue<string>("ProductModel", 1);
+ ////testResultView.engine.Globals.GetValString("ProductModel", 1);
+ //if (!string.IsNullOrEmpty(model))
+ //{
+ // this.modelSelect.SelectedItem = model;
+ // testResultView.SetCurrentProduct(model);
+ //}
+ //else if (products.Count > 0)
+ //{
+ // this.modelSelect.SelectedIndex = 0;
+ // testResultView.SetCurrentProduct(products[0].Name);
+ //}
+ }
+
+ private void modelSelect_SelectionChanged(object sender, SelectionChangedEventArgs e)
+ {
+ try
+ {
+ string currentModel = this.modelSelect.SelectedItem.ToString();
+ List<ParameterData> parameters = ProductManager.GetParametersByProductName(currentModel);
+
+ testResultView.executionWrapper.SetStationGlobalValue<string>("ProductModel", 0, currentModel);
+ testResultView.executionWrapper.CommitToDisk(false);
+
+ //testResultView.engine.Globals.SetValString("ProductModel", 0, currentModel);
+ //testResultView.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
+ }
+ catch (Exception ex)
+ {
+ MessageBox.Show("鍒囨崲浜у搧鍨嬪彿澶辫触!" + ex.Message + ex.StackTrace);
+ }
+ }
+
+ private void Start_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ if (string.IsNullOrEmpty(testResultView.testSeqFile))
+ {
+ MsgBoxHelper2.Warn("璇峰厛璁剧疆BurnInMainSeq灞炴��!");
+ IsRunning = false;
+ return;
+ }
+ LogHelper.Info("UI", "鎬诲惎鍔ㄦ寜閽寜涓�", out _);
+ log.Info("鎬诲惎鍔ㄦ寜閽寜涓�");
+ ShowMask(() =>
+ {
+ testResultView.StartTestSequence();
+ Dispatcher.Invoke(() =>
+ {
+ IsRunning = true;
+ });
+ }, (ex) =>
+ {
+ log.Error("StartTestSequence Error.", ex);
+ Dispatcher.Invoke(() =>
+ {
+ MsgBoxHelper.Error(Window.GetWindow(this), $"{this.lang("Ts.StartTestSequenceFailed")}: {ex.Message}");
+ });
+ }, null, "璇风◢鍚�...");
+ }
+ catch (Exception ex)
+ {
+ log.Error("Start_Click Failed.", ex);
+ MsgBoxHelper.Error(Window.GetWindow(this),
+ $"{this.lang("Ts.StartTestSequenceFailed")}: {ex.Message}");
+ }
+ }
+
+ private void Stop_Click(object sender, RoutedEventArgs e)
+ {
+ try
+ {
+ bool breakStop = false;
+ foreach (var oven in TestResultView.tables)
+ {
+ if (oven.IsTesting)
+ {
+ breakStop = true;
+ break;
+ }
+ }
+ if (breakStop)
+ {
+ MsgBoxHelper2.Warn(this.lang("Tr.OvenIsTesting"));
+ return;
+ }
+
+ if (MsgBoxHelper2.WarnChoose(this.lang("Tr.MakeSureStopAllTest")) != MessageBoxResult.OK)
+ {
+ return;
+ }
+
+ LogHelper.Info("UI", "鎬诲仠姝㈡寜閽寜涓�", out _);
+ log.Info("鎬诲仠姝㈡寜閽寜涓�");
+ testResultView.StopTest();
+ /// 宸茬粡鍔犱簡WaitForExit,杩欓噷鍙互鏀逛负false
+ IsRunning = false;
+ }
+ catch (Exception ex)
+ {
+ log.Error("Stop_Click Failed.", ex);
+ MsgBoxHelper.Error(Window.GetWindow(this),
+ $"{this.lang("Ts.StopTestSequenceFailed")}: {ex.Message}");
+ }
+ }
+
+ private void testResultView_Loaded(object sender, RoutedEventArgs e)
+ {
+ }
+
+ /// <summary>
+ /// 璁℃暟娓呴浂鎸夐挳浜嬩欢
+ /// </summary>
+ /// <param name="sender"></param>
+ /// <param name="e"></param>
+ private void BtnClear_Click(object sender, RoutedEventArgs e)
+ {
+ testResultView.ClearNumber();
+ }
+
+ private void ScannerSetting_Click(object sender, RoutedEventArgs e)
+ {
+ Plugin.TestResult.ScannerSetting setting = new Plugin.TestResult.ScannerSetting()
+ {
+ Owner = Window.GetWindow(this)
+ };
+ setting.Open(false, "Config");
+ }
+
+ private void StdEnableMes_ValueChanged(object sender, StdUIEventArg e)
+ {
+ testResultView.executionWrapper.SetStationGlobalValue<bool>($"SystemSetting.{e.StringValue}", 1, e.BoolValue);
+ //testResultView.SequenceContext?.StationGlobals.SetValBoolean($"SystemSetting.{e.StringValue}", 1, e.BoolValue);
+ }
+
+ public void HandleAlarm(AlarmText alarm)
+ {
+ if (alarm.Level >= 4 && TestResultView.tables != null)
+ {
+ log.Info($"4绾ф姤璀﹁Е鍙�: [{alarm.AlarmInfo}],灏嗗仠姝㈡墍鏈夌倝浣撴祴璇�");
+ foreach (var oven in TestResultView.tables)
+ {
+ testResultView.SetStartFlag(oven.index, false);
+ }
+ return;
+ }
+
+ DataTable targetOven = null;
+ foreach (var oven in TestResultView.tables)
+ {
+ if (alarm.AlarmInfo?.StartsWith(oven.title) == true)
+ {
+ targetOven = oven;
+ break;
+ }
+ }
+ if (targetOven == null)
+ {
+ return;
+ }
+ if (alarm.Level >= 3)
+ {
+ /// 3绾т互涓婄殑鎶ヨ浼氬仠姝㈡祴璇�
+ log.Info($"3绾ф姤璀﹁Е鍙�: [{alarm.AlarmInfo}],灏嗗仠姝㈣�佸寲鐐塠{targetOven.title}]娴嬭瘯");
+ testResultView.SetStartFlag(targetOven.index, false);
+ }
+ }
+
+ public override void Active()
+ {
+ base.Active();
+ LoadProduct();
+ RefreshUIConfig();
+ }
+
+ public override void OnClose(object sender, CancelEventArgs e)
+ {
+ if (IsRunning)
+ {
+ MsgBoxHelper2.Warn("璇峰厛鍋滄鑰佸寲娴嬭瘯锛�");
+ e.Cancel = true;
+ }
+ }
+
+ public override void DoClose(object sender, EventArgs e)
+ {
+ try
+ {
+ timer?.Stop();
+ testResultView.ReleaseResource();
+ }
+ catch
+ {
+ }
+ }
+ }
+}
--
Gitblit v1.9.1