alielie
2026-04-16 1afe548ac40cc7f975917ef9bf2e156595cf81f3
Plugin.TestResult/TestResultView.xaml.cs
@@ -8,6 +8,7 @@
using Plugin.TsSupport;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows;
using System.Windows.Controls;
@@ -26,23 +27,31 @@
        public static Dictionary<string, DataTable> nameTables { get; private set; } = new Dictionary<string, DataTable>();
        private readonly BaseConfig config;
        public AxApplicationMgr testApp;
        public string testModelFile;
        public string testSeqFile;
        /// <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 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 })
        {
@@ -133,18 +142,27 @@
            InitializeComponent();
            testApp = TestAppManager.GetAxApplicationMgr();
            testApp.ExitApplication += this.axApplicationMgr_ExitApplication;
            testApp.UIMessageEvent += this.axApplicationMgr_UIMessageEvent;
            testApp.ExecutionClosed += this.axApplicationMgr_ExecutionClosed;
            executionWrapper = new TsExecutionWrapper(); //new TsExecutionWrapper();
            if (executionWrapper is TsExecutionWrapper tsWrapper)
            {
                tsWrapper.AxApplicationMgr.ExitApplication += this.axApplicationMgr_ExitApplication;
                tsWrapper.AxApplicationMgr.UIMessageEvent += this.axApplicationMgr_UIMessageEvent;
                tsWrapper.AxApplicationMgr.ExecutionClosed += this.axApplicationMgr_ExecutionClosed;
                ((System.ComponentModel.ISupportInitialize)(tsWrapper.AxApplicationMgr)).BeginInit();//myClient为第三方控件名
                host.Child = tsWrapper.AxApplicationMgr;
                ((System.ComponentModel.ISupportInitialize)(tsWrapper.AxApplicationMgr)).EndInit();
            }
            ((System.ComponentModel.ISupportInitialize)(this.testApp)).BeginInit();//myClient为第三方控件名
            host.Child = testApp;
            ((System.ComponentModel.ISupportInitialize)(this.testApp)).EndInit();
            //InitTestStandEngine();
            //StartTestSequence();
            //testApp = TestAppManager.GetAxApplicationMgr();
            //testApp.ExitApplication += this.axApplicationMgr_ExitApplication;
            //testApp.UIMessageEvent += this.axApplicationMgr_UIMessageEvent;
            //testApp.ExecutionClosed += this.axApplicationMgr_ExecutionClosed;
            //((System.ComponentModel.ISupportInitialize)(this.testApp)).BeginInit();//myClient为第三方控件名
            //host.Child = testApp;
            //((System.ComponentModel.ISupportInitialize)(this.testApp)).EndInit();
        }
        private void Refresh()
@@ -203,12 +221,13 @@
        {
            try
            {
                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);
                //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)
            {
@@ -222,10 +241,10 @@
            try
            {
                if (string.IsNullOrEmpty(testSeqFile)) return;
                this.modeSeq = this.engine.GetSequenceFileEx(@"C:\Program Files\National Instruments\TestStand 2020\Components\Models\TestStandModels\ParallelModel.seq");
                this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 0, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
                this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
                this.engine.Globals.SetValBoolean("StationState.StopTest", 0, false);
                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)
            {
@@ -238,13 +257,24 @@
        {
            try
            {
                if (this.SequenceContext == null)
                    return;
                bool val = this.SequenceContext.StationGlobals.Exists("StationState.StopTest", 0);
                if (val)
                executionWrapper?.SetStationGlobalValue<bool>("StationState.StopTest", 0, true, true);
                try
                {
                    this.SequenceContext.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
                    bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
                    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)
@@ -256,7 +286,7 @@
        private void axApplicationMgr_ExitApplication(object sender, EventArgs e)
        {
            Environment.ExitCode = testApp.ExitCode;
            //Environment.ExitCode = testApp.ExitCode;
            //TSHelper.DoSynchronousGCForCOMObjectDestruction();
        }
@@ -286,7 +316,11 @@
                if (MethodCode == 0)
                {
                    /// 设置句柄
                    this.SequenceContext = (SequenceContext)e.uiMsg.ActiveXData;
                    //this.SequenceContext = (SequenceContext)e.uiMsg.ActiveXData;
                    if (executionWrapper is TsExecutionWrapper tsWrapper)
                    {
                        tsWrapper.context = (SequenceContext)e.uiMsg.ActiveXData;
                    }
                    return;
                }
@@ -425,6 +459,7 @@
                    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)
@@ -550,11 +585,13 @@
                    int index = int.Parse(datas[0]);
                    if (MsgBoxHelper2.WarnChoose(datas[1], "提示") == MessageBoxResult.OK)
                    {
                        SequenceContext.StationGlobals.SetValNumber($"StationState.Pipe[{index}]", 1, 1);
                        executionWrapper.SetStationGlobalValue<int>($"StationState.Pipe[{index}]", 1, 1);
                        //SequenceContext.StationGlobals.SetValNumber($"StationState.Pipe[{index}]", 1, 1);
                    }
                    else
                    {
                        SequenceContext.StationGlobals.SetValNumber($"StationState.Pipe[{index}]", 1, 0);
                        executionWrapper.SetStationGlobalValue<int>($"StationState.Pipe[{index}]", 1, 0);
                        //SequenceContext.StationGlobals.SetValNumber($"StationState.Pipe[{index}]", 1, 0);
                    }
                    return;
                }
@@ -567,20 +604,34 @@
        public void SetStartFlag(int index, bool data)
        {
            if (this.SequenceContext == null) return;
            string name = tables[index].title;
            ViewControl.Logger?.Info($"将老化炉[{name}] 的Start变量设置为 {data};");
            string key = $"StationState.Start[{index}]";
            this.engine.Globals.SetValBoolean(key, 1, data);
            //bool val = this.engine.Globals.GetValBoolean(key, 0);
            //this.SequenceContext.StationGlobals.SetValBoolean(key, 0, data);
            //bool val = this.SequenceContext.StationGlobals.GetValBoolean(key, 0);
            executionWrapper?.SetStationGlobalValue<bool>(key, 1, data);
            if (data == false)
            {
                key = $"StationState.Scanner[{index}]";
                executionWrapper?.SetStationGlobalValue<bool>(key, 1, false);
            }
        }
        public bool? GetStartFlag(int index)
        {
            string key = $"StationState.Start[{index}]";
            return executionWrapper.GetStationGlobalValue<bool>(key, 0);
        }
        public void ReleaseResource()
        {
            testApp.ExitApplication -= this.axApplicationMgr_ExitApplication;
            testApp.UIMessageEvent -= this.axApplicationMgr_UIMessageEvent;
            testApp.ExecutionClosed -= this.axApplicationMgr_ExecutionClosed;
            if (executionWrapper is TsExecutionWrapper tsWrapper)
            {
                tsWrapper.AxApplicationMgr.ExitApplication -= this.axApplicationMgr_ExitApplication;
                tsWrapper.AxApplicationMgr.UIMessageEvent -= this.axApplicationMgr_UIMessageEvent;
                tsWrapper.AxApplicationMgr.ExecutionClosed -= this.axApplicationMgr_ExecutionClosed;
            }
            foreach (var table in tables)
            {
                table.RelaseResource();
@@ -611,9 +662,10 @@
            for (int i = 0; i < tables.Length; i++)
            {
                var table = tables[i];
                // table.SetCurrentProduct(currentProduct);
                string LookupStr = $"StationState.Model[{i}]";
                string tableModel = engine?.Globals?.GetValString(LookupStr, 1);
                string tableModel = executionWrapper?.GetStationGlobalValue<string>(LookupStr, 1);
                //engine?.Globals?.GetValString(LookupStr, 1);
                table.SetCurrentProduct(tableModel);
            }
        }
@@ -621,8 +673,12 @@
        public void SetOvenProduct(int index, string product)
        {
            string LookupStr = $"StationState.Model[{index}]";
            engine?.Globals?.SetValString(LookupStr, 1, product);
            engine?.CommitGlobalsToDisk(promptOnSaveConflicts: false);
            executionWrapper?.SetStationGlobalValue<string>(LookupStr, 1, product);
            executionWrapper?.CommitToDisk(false);
        }
        public void RefreshProducts()
        {
        }
    }
}