alielie
2026-04-23 ef52fd6fd07508883dce4eb002acda59f0169e59
Plugin.TestResult/ViewControl.xaml.cs
@@ -4,6 +4,7 @@
using HMI.Core.Manager;
using HMI.Core.Setting;
using HMI.Core.Util;
using HMI.LogUtil;
using HMI.StdControl;
using HMI.UI.Util;
using log4net;
@@ -11,6 +12,7 @@
using NationalInstruments.TestStand.Interop.UI.Ax;
using PLCHelper;
using Plugin.TestResult.Util;
using Plugin.TsSupport;
using System;
using System.Collections.Generic;
using System.ComponentModel;
@@ -25,10 +27,6 @@
    /// </summary>
    public partial class ViewControl : PluginMaskControl, IAlarmHandler
    {
        /// <summary>
        /// 测试序列操作句柄
        /// </summary>
        private SequenceContext SequenceContext = null;
        private System.Timers.Timer timer;
@@ -59,6 +57,22 @@
            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);
@@ -74,13 +88,20 @@
                Set(ref isRunning, value);
                testResultView.IsRunning = value;
                this.modelSelect.IsEnabled = !value;
                this.btnStart.IsEnabled = !value;
                this.btnStop.IsEnabled = value;
                stdEnableMes.CbEnabled = !value;
            }
        }
        private bool AutoExecuteSeq = true;
        #region TS相关
        /// <summary>
        /// 测试序列操作句柄
        /// </summary>
        private SequenceContext SequenceContext = null;
        #endregion
        public ViewControl()
        {
@@ -90,9 +111,18 @@
            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);
            if (testResultView.executionWrapper is TsExecutionWrapper tsWrapper)
            {
                tsWrapper.AxApplicationMgr.ExitApplication += new EventHandler(this.axApplicationMgr_ExitApplication);
                tsWrapper.AxApplicationMgr.UIMessageEvent += new _ApplicationMgrEvents_UIMessageEventEventHandler(this.axApplicationMgr_UIMessageEvent);
                tsWrapper.AxApplicationMgr.ExecutionClosed += new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.axApplicationMgr_ExecutionClosed);
            }
            //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 Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
@@ -144,26 +174,35 @@
                testResultView.testSeqFile = string.Empty;
                FileName = string.Empty;
            }
            RefreshUIConfig();
        }
        public override void DoClose(object sender, EventArgs e)
        /// <summary>
        /// 刷新UI配置
        /// </summary>
        private void RefreshUIConfig()
        {
            try
            {
                timer?.Stop();
                testResultView.ReleaseResource();
                /// 运行中就不管
                if (IsRunning)
                {
                    return;
                }
                bool enableManualDebug = ParameterManager.GetCommonParameterByName("EnableManualDebug", false);
                if (enableManualDebug)
                {
                    FgEnableManualDebug.Visibility = Visibility.Visible;
                }
                else
                {
                    FgEnableManualDebug.Visibility = Visibility.Collapsed;
                    EnableManualDebug = false;
                }
            }
            catch
            catch (Exception ex)
            {
            }
        }
        public override void OnClose(object sender, CancelEventArgs e)
        {
            if (IsRunning)
            {
                MsgBoxHelper2.Warn("请先停止老化测试!");
                e.Cancel = true;
                log.Error("RefreshUIConfig Error.", ex);
            }
        }
@@ -265,18 +304,20 @@
                productSource.Add(prd.Name);
            }
            testResultView.SetProductSource(productSource);
            testResultView.SetCurrentProduct(null);
            string model = 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);
            }
            //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)
@@ -285,8 +326,12 @@
            {
                string currentModel = this.modelSelect.SelectedItem.ToString();
                List<ParameterData> parameters = ProductManager.GetParametersByProductName(currentModel);
                testResultView.engine.Globals.SetValString("ProductModel", 0, currentModel);
                testResultView.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
                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)
            {
@@ -304,6 +349,8 @@
                    IsRunning = false;
                    return;
                }
                LogHelper.Info("UI", "总启动按钮按下", out _);
                log.Info("总启动按钮按下");
                ShowMask(() =>
                {
                    testResultView.StartTestSequence();
@@ -332,7 +379,30 @@
        {
            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)
@@ -368,13 +438,15 @@
        private void StdEnableMes_ValueChanged(object sender, StdUIEventArg e)
        {
            testResultView.SequenceContext?.StationGlobals.SetValBoolean($"SystemSetting.{e.StringValue}", 1, e.BoolValue);
            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);
@@ -398,8 +470,37 @@
            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
            {
            }
        }
    }
}