alielie
2025-05-20 99df058a665ea04065a23e729ec79a2f23f79881
Plugin.TsExecution/TsExecution.xaml.cs
@@ -1,28 +1,29 @@
using HMI.Base;
using HMI.Core;
using HMI.Core.Entity;
using HMI.Core.Manager;
using HMI.Core.Util;
using HMI.ParameterManage.Entity;
using HMI.ParameterManage.Util;
using HMI.UI;
using HMI.UI.Util;
using HMI.Util;
using log4net;
using NationalInstruments.TestStand.Interop.API;
using NationalInstruments.TestStand.Interop.UI.Ax;
using Panuon.WPF.UI;
using ScottPlot;
using ScottPlot.AxisLimitManagers;
using ScottPlot.Plottables;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Timers;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Forms.DataVisualization.Charting;
using System.Xml.Linq;
namespace Plugin.TsExecution
{
@@ -31,7 +32,6 @@
    /// </summary>
    public partial class TsExecution : PluginControl
    {
        //private OpcInterface.OpcInterface OpcHandle = new OpcInterface.OpcInterface();
        #region TestStand事件
        /// <summary>
        /// TS 引擎
@@ -54,6 +54,7 @@
        private Chart chart;
        #endregion
        public static ILog logger { get; private set; }
        private List<SingleControl> tsSockets = new List<SingleControl>();
        /// <summary>
        /// 样件模式状态
@@ -68,6 +69,15 @@
                SampleTest(value);
            }
        }
        private string _currentUserCode;
        public string CurrentUserCode
        {
            get { return _currentUserCode; }
            set { Set(ref _currentUserCode, value); }
        }
        private bool isLoadOK = false;
        private Timer GCTimer;
@@ -92,6 +102,12 @@
            }
        }
        public override void SetLogger(ILog logger)
        {
            base.SetLogger(logger);
            TsExecution.logger = logger;
        }
        private ObservableCollection<ProductData> products;
        public ObservableCollection<ProductData> Products
@@ -106,6 +122,97 @@
        private Pie pie;
        private string CountIniPath;
        private bool alarmVisiable;
        public bool AlarmVisiable
        {
            get => alarmVisiable;
            set
            {
                Set(ref alarmVisiable, value);
            }
        }
        private bool _enableMes;
        public bool EnableMes
        {
            get => _enableMes;
            set
            {
                if (WriteConfig("EnableMes", value))
                {
                    Set(ref _enableMes, value);
                }
            }
        }
        private bool _enableCanLog;
        public bool EnableCanLog
        {
            get => _enableCanLog;
            set
            {
                if (WriteConfig("EnableCanLog", value))
                {
                    Set(ref _enableCanLog, value);
                }
            }
        }
        private bool _enableDebugMode;
        public bool EnableDebugMode
        {
            get => _enableDebugMode;
            set
            {
                if (WriteConfig("EnableDebugMode", value))
                {
                    Set(ref _enableDebugMode, value);
                }
            }
        }
        private bool _enableNGPause;
        public bool EnableNGPause
        {
            get => _enableNGPause;
            set
            {
                if (WriteConfig("EnableNGPause", value))
                {
                    Set(ref _enableNGPause, value);
                }
            }
        }
        private bool _enableSimpleMode;
        public bool EnableSimpleMode
        {
            get => _enableSimpleMode;
            set
            {
                if (WriteConfig("EnableSimpleMode", value))
                {
                    Set(ref _enableSimpleMode, value);
                    foreach (var cell in tsSockets) cell.SetSimpleUI(value);
                }
            }
        }
        private bool _ui_showInfoDock;
        public bool UI_ShowInfoDock
        {
            get => _ui_showInfoDock;
            set
            {
                if (WriteConfig("UI_ShowInfoDock", value))
                {
                    Set(ref _ui_showInfoDock, value);
                    detailPanel.Visibility = value ? Visibility.Visible : Visibility.Collapsed;
                }
            }
        }
        public TsExecution()
        {
            DataContext = this;
@@ -115,7 +222,6 @@
            InitTsEngine();
            //初始化TestStand引擎
            this.InitTestStandEngine();
        }
        public override void SetBaseFolder(string folder)
@@ -128,7 +234,6 @@
        {
            this.ReadCount(out int pass, out int fail);
            this.DisplayCount(pass, fail);
            UpdateChart(pass, fail);
            InitProducts();
            base.InitFinish();
        }
@@ -145,16 +250,16 @@
            var legend = pieChart.Plot.ShowLegend(Alignment.UpperRight);
            legend.Alignment = Alignment.UpperRight;
            legend.Padding = new PixelPadding(0);
            legend.FontSize = (float)CustomFontSizeConverter.CountFontSize(20, 300, 300);
            legend.FontSize = (float)WidthSizeConverter.CountFontSize(20, 300, 300);
            pieChart.UserInputProcessor.Disable();
            pieChart.Plot.Font.Automatic();
            List<PieSlice> slices = new List<PieSlice> {
    new PieSlice() { Value = 5, FillColor = Colors.Green,
        LabelFontSize = (float)CustomFontSizeConverter.CountFontSize(20,300,300),
        LabelFontSize = (float)WidthSizeConverter.CountFontSize(20,300,300),
        Label = "Pass",LegendText="Pass" },
    new PieSlice() { Value = 2, FillColor = Colors.Red,
        LabelFontSize = (float)CustomFontSizeConverter.CountFontSize(20,300,300),
        LabelFontSize = (float)WidthSizeConverter.CountFontSize(20,300,300),
        Label = "Fail",LegendText="Fail" } };
@@ -163,7 +268,7 @@
        private void InitProducts()
        {
            Products = ParameterManager.GetProducts<ObservableCollection<ProductData>>();
            Products = ProductManager.GetProducts<ObservableCollection<ProductData>>();
            if (Products != null && Products.Count > 0)
            {
                List<ParameterData> parameters =
@@ -173,10 +278,39 @@
                {
                    this.socketNum = Convert.ToInt32(tmpNum);
                }
                string lastModel = engine?.Globals.GetValString("StationState.ProductModel", 1);
                if (!string.IsNullOrEmpty(lastModel))
                {
                    var product = Products.FirstOrDefault(p => p.Name == lastModel);
                    if (product != null) SelectedProduct = product;
                    goto Write;
                }
                goto Write;
            Write:
                SelectedProduct = Products[0];
                engine?.Globals.SetValString("StationState.ProductModel", 1, Products[0].Name);
                RefershUI();
            }
            SampleStatus = false;
        }
        private bool _isTesting = false;
        public bool IsTesting
        {
            get { return _isTesting; }
            set
            {
                Set(ref _isTesting, value);
                Dispatcher.Invoke(() =>
                {
                    BtnStartSeq.IsEnabled = !value;
                    BtnStopSeq.IsEnabled = value;
                    CbProduct.IsEnabled = !value;
                });
            }
        }
        /// <summary>
@@ -200,49 +334,89 @@
            new MaskWindow((WindowX)Window.GetWindow(this),
                (win) =>
                {
                    try
                    {
                        Dispatcher.Invoke(() =>
                        {
                            try
                            {
                                UserInfo user = UserInfo.User;
                                CurrentUserCode = user?.Code;
                            }
                            catch (Exception ex)
                            {
                                log.Warn("Get Login User Failed.", ex);
                            }
                            ReadConfig();
                        });
                        isLoadOK = true;
                        StartSequence();
                    }
                    catch (Exception ex)
                    {
                        log.Error("TsExecution Loaded Failed.", ex);
                        MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
                    }
                    try
                    {
                        if (Environment.Version.ToString() != this.AxApplicationMgr.GetEngine().DotNetCLRVersion)
                            this.GCTimer.Enabled = true;
                    }
                    catch (Exception ex)
                    {
                        log.Error("TsExecution GCTimer Start Failed", ex);
                        MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.LoadFailed")}: {ex.Message}");
                    }
                    Dispatcher.Invoke(() =>
                    {
                        try
                        {
                            //连接OPChandle
                            //this.OpcHandle.Connect2("127.0.0.1", 6543, 18081, out string ErrMsg, null);
                            //启动测试进程
                            StartSequence();
                            isLoadOK = true;
                        }
                        catch (Exception ex)
                        {
                            log.Error("TsExecution Loaded Failed.", ex);
                            MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
                        }
                        try
                        {
                            if (Environment.Version.ToString() != this.AxApplicationMgr.GetEngine().DotNetCLRVersion)
                                this.GCTimer.Enabled = true;
                        }
                        catch (Exception ex)
                        {
                            log.Error("TsExecution GCTimer Start Failed", ex);
                            MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.LoadFailed")}: {ex.Message}");
                        }
                        finally
                        {
                            win.Close();
                        }
                        if (isLoadOK) Loaded -= PluginControl_Loaded;
                    });
                    //Dispatcher.Invoke(() =>
                    //{
                    //    try
                    //    {
                    //        ReadConfig();
                    //        //连接OPChandle
                    //        //this.OpcHandle.Connect2("127.0.0.1", 6543, 18081, out string ErrMsg, null);
                    //        isLoadOK = true;
                    //        //启动测试进程
                    //        StartSequence();
                    //    }
                    //    catch (Exception ex)
                    //    {
                    //        log.Error("TsExecution Loaded Failed.", ex);
                    //        MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
                    //    }
                    //});
                }
                ).Info(LangUtil.Get("App.UsercontrolIsLoading"));
        }
        private void RefershUI()
        {
            ParameterData p = ParameterManager.GetCommonParameterByName("ProbeWarn");
            int ProbeWarn = 0;
            if (p != null)
            {
                try
                {
                    ProbeWarn = Convert.ToInt32(p.Value);
                }
                catch
                {
                    ProbeWarn = 0;
                }
            }
            panel.Children.Clear();
            //重新生成子面板
            for (int i = 0; i < this.socketNum; i++)
            {
                SingleControl control = new SingleControl(i, CountIniPath);
                SingleControl control = new SingleControl(i, CountIniPath, ProbeWarn);
                panel.Children.Add(control);
                tsSockets.Add(control);
            }
@@ -283,11 +457,128 @@
        /// <param name="fail">不合格数</param>
        private void ReadCount(out int pass, out int fail)
        {
            pass = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Pass", "", CountIniPath));
            fail = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Fail", "", CountIniPath));
            pass = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Pass", "0", CountIniPath));
            fail = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Fail", "0", CountIniPath));
        }
        private void WriteCount(int pass, int fail)
        /// <summary>
        /// 读取配置文件里的几个属性
        /// </summary>
        /// <param name="pass"></param>
        /// <param name="fail"></param>
        private void ReadConfig()
        {
            ParameterData value;
            try
            {
                value = ParameterManager.GetCommonParameterByName("EnableMes");
                _enableMes = bool.Parse(value.Value);
                Set("EnableMes");
            }
            catch
            {
                _enableMes = false;
                Set("EnableMes");
            }
            try
            {
                value = ParameterManager.GetCommonParameterByName("EnableNGPause");
                _enableNGPause = bool.Parse(value.Value);
                Set("EnableNGPause");
            }
            catch
            {
                _enableNGPause = false;
                Set("EnableNGPause");
            }
            try
            {
                value = ParameterManager.GetCommonParameterByName("EnableCanLog");
                _enableCanLog = bool.Parse(value.Value);
                Set("EnableCanLog");
            }
            catch
            {
                _enableCanLog = false;
                Set("EnableCanLog");
            }
            try
            {
                value = ParameterManager.GetCommonParameterByName("EnableDebugMode");
                _enableDebugMode = bool.Parse(value.Value);
                Set("EnableDebugMode");
            }
            catch
            {
                _enableDebugMode = false;
                Set("EnableDebugMode");
            }
            try
            {
                value = ParameterManager.GetCommonParameterByName("EnableSimpleMode");
                EnableSimpleMode = bool.Parse(value.Value);
            }
            catch
            {
                EnableSimpleMode = false;
            }
            try
            {
                value = ParameterManager.GetCommonParameterByName("UI_ShowInfoDock");
                UI_ShowInfoDock = bool.Parse(value.Value);
            }
            catch
            {
                UI_ShowInfoDock = false;
            }
            //Convert.ToBoolean(IniFileHelper.ReadIniData("Config", "EnableMes", "true", CountIniPath));
            //EnableCanLog = Convert.ToBoolean(IniFileHelper.ReadIniData("Config", "EnableCanLog", "true", CountIniPath));
            //EnableDebugMode = Convert.ToBoolean(IniFileHelper.ReadIniData("Config", "EnableDebugMode", "true", CountIniPath));
        }
        //private void WriteToTsWhenInit()
        //{
        //    foreach (var ts in tsSockets)
        //    {
        //        ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableMes", 1, EnableMes);
        //        ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableNGPause", 1, EnableNGPause);
        //        ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableCanLog", 1, EnableCanLog);
        //        ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.EnableDebugMode", 1, EnableDebugMode);
        //    }
        //}
        private bool WriteConfig(string name, bool value)
        {
            //IniFileHelper.WriteIniData("Config", name, value.ToString(), CountIniPath);
            try
            {
                if (ParameterManager.UpdateCommonParameter(name, value, out string errMsg))
                {
                    foreach (var ts in tsSockets)
                    {
                        ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.{name}", 1, value);
                    }
                    return true;
                }
                else
                {
                    throw new Exception(errMsg);
                }
            }
            catch (Exception ex)
            {
                MsgBoxHelper2.Error(ex.Message);
                return false;
            }
        }
        private void WriteCount(double pass, double fail)
        {
            IniFileHelper.WriteIniData("Count", "Pass", pass.ToString(), CountIniPath);
            IniFileHelper.WriteIniData("Count", "Fail", fail.ToString(), CountIniPath);
@@ -298,9 +589,9 @@
        /// </summary>
        /// <param name="pass">合格数</param>
        /// <param name="fail">不合格数</param>
        private void DisplayCount(int pass, int fail)
        private void DisplayCount(double pass, double fail)
        {
            int total = pass + fail;
            double total = pass + fail;
            double passRate;
            if (total == 0)
            {
@@ -314,6 +605,11 @@
            this.TbFail.Text = fail.ToString();
            this.TbTotal.Text = total.ToString();
            this.TbPassRate.Text = string.Format("{0:0.00}", passRate) + "%";
            pie.Slices[0].Value = pass;
            pie.Slices[1].Value = fail;
            pieChart.Refresh();
            WriteCount(pass, fail);
        }
@@ -347,19 +643,14 @@
        /// </summary>
        private void StartSequence()
        {
            if (!isLoadOK) return;
            //MaskWindow mask = new MaskWindow();
            try
            {
                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);
                Dispatcher.Invoke(() =>
                {
                    this.CbProduct.IsEnabled = false;
                    this.BtnStartSeq.IsEnabled = false;
                    this.BtnStopSeq.IsEnabled = true;
                });
                IsTesting = true;
            }
            catch (Exception ex)
            {
@@ -380,17 +671,26 @@
            new MaskWindow((WindowX)Window.GetWindow(this),
                    (win) =>
                    {
                        Dispatcher.Invoke(() =>
                        try
                        {
                            try
                            bool stoped = StopSequence();
                            if (stoped)
                            {
                                StopSequence();
                                IsTesting = false;
                            }
                            finally
                        }
                        finally
                        {
                            Dispatcher.Invoke(() =>
                            {
                                win.Close();
                            }
                        });
                            });
                        }
                        //Dispatcher.Invoke(() =>
                        //{
                        //});
                    }
                    ).Info(LangUtil.Get("App.SequenceIsStopping"));
        }
@@ -398,27 +698,32 @@
        /// <summary>
        /// 停止测试序列
        /// </summary>
        private void StopSequence()
        private bool StopSequence()
        {
            try
            {
                if (this.tsSockets.Count > 0 && this.tsSockets[0]?.SequenceFileContext != null)
                if (this.tsSockets.Count > 0)
                {
                    bool val = this.tsSockets[0].SequenceFileContext.StationGlobals.Exists("StationState.StopTest", 0);
                    if (val)
                    for (int i = 0; i < tsSockets.Count; i++)
                    {
                        tsSockets[0].SequenceFileContext.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
                        bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
                        var context = this.tsSockets[i].SequenceFileContext;
                        //bool val = context.StationGlobals.Exists("StationState.StopTest", 0);
                        //if (val)
                        //{
                        //    context.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
                        //    bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
                        //}
                        context?.StationGlobals.SetValBoolean("StationState.StopTest", 1, true);
                    }
                }
                this.CbProduct.IsEnabled = true;
                this.BtnStartSeq.IsEnabled = true;
                this.BtnStopSeq.IsEnabled = false;
                if (this.execution == null) return true;
                return this.execution.WaitForEndEx(2000, true, null, null);
            }
            catch (Exception ex)
            {
                log.Error("Stop Sequence Failed.", ex);
                MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.StopSequenceFail")}: {ex.Message}");
                return false;
            }
        }
@@ -449,17 +754,17 @@
            new MaskWindow(Window.GetWindow(this),
                (win) =>
                {
                    Dispatcher.Invoke(() =>
                    try
                    {
                        try
                        {
                            StartSequence();
                        }
                        finally
                        StartSequence();
                    }
                    finally
                    {
                        win.Dispatcher.Invoke(() =>
                        {
                            win.Close();
                        }
                    });
                        });
                    }
                }).Info(LangUtil.Get("Ts.SequenceIsStarting"));
        }
@@ -479,7 +784,7 @@
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void AxApplicationMgr_ExecutionClosed(object sender, NationalInstruments.TestStand.Interop.UI.Ax._ApplicationMgrEvents_ExecutionClosedEvent e)
        private void AxApplicationMgr_ExecutionClosed(object sender, _ApplicationMgrEvents_ExecutionClosedEvent e)
        {
            try
            {
@@ -498,6 +803,34 @@
            }
        }
        public void UpdatePositionStatus(int index, string status)
        {
            this.tsSockets[index].UpdateStatus(status);
            this.UpdateTestCounter();
        }
        public void UpdatePositionProcessValue(int index, int value)
        {
            this.tsSockets[index].SetTestProcess(value);
        }
        public void PausePosition(int index)
        {
            this.tsSockets[index].ShowPausePanel();
        }
        public void AddTestData(int index, string data)
        {
            string[] TestItems = data.Split(',');
            tsSockets[index].AddTestData(TestItems[0], TestItems[1], TestItems[2], TestItems[3],
                TestItems[4], TestItems[5], TestItems[6]);
        }
        public void SetPositionBarcode(int index, string barcode)
        {
            this.tsSockets[index].Barcode = barcode;
        }
        /// <summary>
        /// TestStand用户交互事件
        /// </summary>
@@ -509,6 +842,17 @@
            {
                int EventCase = Convert.ToInt32(e.uiMsg.Event);
                int Index = Convert.ToInt16(e.uiMsg.NumericData);//SocketIndex
                string strData = e.uiMsg.StringData;
                try
                {
                    log.Info($"Event: {EventCase}, NumericData: {Index}, StringData: {strData}");
                }
                catch
                {
                }
                switch (EventCase)
                {
                    case 10001://传递SocketContext
@@ -517,14 +861,11 @@
                    case 10002://更新测试状态
                        string status = e.uiMsg.StringData;
                        this.tsSockets[Index].UpdateStatus(status);
                        this.UpdateTestCounter();
                        UpdatePositionStatus(Index, status);
                        break;
                    case 10003://发送测试数据
                        string[] TestItems = e.uiMsg.StringData.Split('\t');
                        tsSockets[Index].AddTestData(TestItems[0], TestItems[4], TestItems[1], TestItems[2], TestItems[3], TestItems[5]);
                        AddTestData(Index, e.uiMsg.StringData);
                        break;
                    case 10004://发送测试过程信息
@@ -536,7 +877,7 @@
                        break;
                    case 10006://发送产品条码
                        this.tsSockets[Index].Barcode = e.uiMsg.StringData;
                        SetPositionBarcode(Index, e.uiMsg.StringData);
                        break;
                    case 10007://开始测试计时
@@ -590,13 +931,18 @@
                        this.tsSockets[Index].ElapseTime = e.uiMsg.StringData;
                        break;
                    case (int)UIMessageCodes.UIMsg_EndExecution://执行结束
                        this.BtnStartSeq.IsEnabled = true;
                        this.BtnStopSeq.IsEnabled = true;
                        IsTesting = false;
                        // this.ReleaseSequenceFile();
                        break;
                    case 10030://显示测试进度
                        int ProcessVal = Convert.ToInt32(e.uiMsg.StringData);
                        this.tsSockets[Index].SetTestProcess(ProcessVal);
                        break;
                    case 10031://导出CSV
                        this.tsSockets[Index].WriteToCSV(e.uiMsg.StringData);
                        break;
                    case 10032://按下标暂停测试
                        this.tsSockets[Index].ShowPausePanel();
                        break;
                    default:
                        break;
@@ -610,29 +956,27 @@
        private void UpdateTestCounter()
        {
            int PassNum = 0;
            int FailNum = 0;
            double PassNum = 0;
            double FailNum = 0;
            foreach (SingleControl socket in this.tsSockets)
            {
                PassNum += socket.PassNum;
                FailNum += socket.FailNum;
            }
            this.DisplayCount(PassNum, FailNum);
            UpdateChart(PassNum, FailNum);
        }
        private void UpdateChart(int pass, int fail)
        {
            pie.Slices[0].Value = pass;
            pie.Slices[1].Value = fail;
            pieChart.Refresh();
        }
        private void SetTestSeqFile(ProductData product)
        {
            if (product == null)
            {
                testSeqFile = null;
                return;
            }
            string name = product.Name;
            List<ParameterData> parameters = ParameterManager.GetParametersByProductName(name);
            List<ParameterData> parameters = ProductManager.GetParametersByProductName(name);
            testSeqFile = parameters.FirstOrDefault(p => p.Name == "TestSequence")?.Value?.ToString();
            StartSequence();
        }
        private void ClearNum()
@@ -641,25 +985,33 @@
            {
                PassAmount = 0;
                FailAmount = 0;
                DisplayCount(PassAmount, FailAmount);
                UpdateChart(PassAmount, FailAmount);
                //this.OpcHandle.DoFctWriteSingle("Count_Clear", "1", out string ErrMsg);
                foreach (SingleControl socket in tsSockets)
                {
                    socket.ResetCounter();
                }
                DisplayCount(PassAmount, FailAmount);
            }
        }
        public override void OnClose(object sender, CancelEventArgs e)
        {
            StopSequence();
            this.engine?.ReleaseSequenceFileEx(this.testSeq, 0);
            this.engine?.ReleaseSequenceFileEx(this.modeSeq, 0);
            this.engine?.UnloadAllModules();
            this.testSeq = null;
            this.modeSeq = null;
            base.OnClose(sender, e);
            try
            {
                StopSequence();
                // this.engine?.TerminateAll();
                // this.engine?.ReleaseSequenceFileEx(this.testSeq, 0);
                // this.engine?.ReleaseSequenceFileEx(this.modeSeq, 0);
                // this.engine?.UnloadAllModules();
                // this.engine?.ShutDown(true);
                //this.testSeq = null;
                //this.modeSeq = null;
                base.OnClose(sender, e);
            }
            catch (Exception ex)
            {
                log.Error("OnClose Error.", ex);
            }
        }
        private void PluginControl_SizeChanged(object sender, SizeChangedEventArgs e)