wenxiangchao
2026-11-02 fe2aa4880d5c9fd88088ad0ed81ebaca05629f5f
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,63 @@
            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);
            //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)
@@ -112,7 +187,6 @@
            string path = Path.Combine(BaseFolder, "Count.ini");
            testResultView.SetCountIniPath(path);
            testResultView.InitMainGrid();
            testResultView.InitTestStandEngine();
            path = Path.Combine(BaseFolder, "Scanner.ini");
            if (!File.Exists(path))
@@ -144,88 +218,42 @@
                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();
        }
        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)
            {
                log.Error("RefreshUIConfig Error.", ex);
            }
        }
        public override void OnClose(object sender, CancelEventArgs e)
        {
            if (IsRunning)
            {
                MsgBoxHelper2.Warn("请先停止老化测试!");
                e.Cancel = true;
            }
        }
        private void axApplicationMgr_ExitApplication(object sender, EventArgs e)
        {
        }
        private void axApplicationMgr_ExecutionClosed(object sender, _ApplicationMgrEvents_ExecutionClosedEvent e)
        {
        }
        private void axApplicationMgr_UIMessageEvent(object sender, _ApplicationMgrEvents_UIMessageEventEvent e)
        {
            try
            {
                int EventCase = Convert.ToInt32(e.uiMsg.Event);
                int MethodCode = Convert.ToInt16(e.uiMsg.NumericData);
                string strData;
                try
                {
                    log.Debug($"EventCase: {EventCase}, MethodCode: {MethodCode}, StrData: {e.uiMsg.StringData}");
                }
                catch
                {
                }
                if (EventCase == 8)
                {
                    IsRunning = false;
                    return;
                }
                if (EventCase != 10014) return;
                if (MethodCode == 0)
                {
                    /// 设置句柄
                    this.SequenceContext = (SequenceContext)e.uiMsg.ActiveXData;
                    return;
                }
                if (MethodCode == 8)
                {
                    /// 更新MES状态
                    strData = e.uiMsg.StringData;
                    mesStatus = strData == "1";
                    return;
                }
                if (MethodCode == 9)
                {
                    /// 更新生产状态
                    strData = e.uiMsg.StringData;
                    produceStatus = strData;
                    return;
                }
            }
            catch
            { }
        }
        private bool isLoaded;
@@ -265,18 +293,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 +315,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 +338,8 @@
                    IsRunning = false;
                    return;
                }
                LogHelper.Info("UI", "总启动按钮按下", out _);
                log.Info("总启动按钮按下");
                ShowMask(() =>
                {
                    testResultView.StartTestSequence();
@@ -332,7 +368,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 +427,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 +459,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
            {
            }
        }
    }
}