From 7bf89fd93bc487e8445d6d85bb527251b7371a04 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期一, 12 五月 2025 13:14:11 +0800
Subject: [PATCH] 优化项目;

---
 Plugin.TsExecution/TsExecution.xaml.cs |  476 +++++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 299 insertions(+), 177 deletions(-)

diff --git a/Plugin.TsExecution/TsExecution.xaml.cs b/Plugin.TsExecution/TsExecution.xaml.cs
index 598abec..846c349 100644
--- a/Plugin.TsExecution/TsExecution.xaml.cs
+++ b/Plugin.TsExecution/TsExecution.xaml.cs
@@ -1,26 +1,29 @@
 锘縰sing 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.ParameterManage;
 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.Drawing;
+using System.ComponentModel;
 using System.IO;
 using System.Linq;
 using System.Timers;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Forms.DataVisualization.Charting;
+using System.Windows.Markup;
 
 namespace Plugin.TsExecution
 {
@@ -52,6 +55,7 @@
         private Chart chart;
         #endregion
 
+        public static ILog logger { get; private set; }
         private List<SingleControl> tsSockets = new List<SingleControl>();
         /// <summary>
         /// 鏍蜂欢妯″紡鐘舵��
@@ -90,6 +94,12 @@
             }
         }
 
+        public override void SetLogger(ILog logger)
+        {
+            base.SetLogger(logger);
+            TsExecution.logger = logger;
+        }
+
         private ObservableCollection<ProductData> products;
 
         public ObservableCollection<ProductData> Products
@@ -98,6 +108,52 @@
             set
             {
                 Set(ref products, value);
+            }
+        }
+
+        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
+            {
+                Set(ref _enableMes, value);
+                WriteConfig("EnableMes", value);
+            }
+        }
+
+        private bool _enableCanLog;
+        public bool EnableCanLog
+        {
+            get => _enableCanLog;
+            set
+            {
+                Set(ref _enableCanLog, value);
+                WriteConfig("EnableCanLog", value);
+            }
+        }
+
+        private bool _enableDebugMode;
+        public bool EnableDebugMode
+        {
+            get => _enableDebugMode;
+            set
+            {
+                Set(ref _enableDebugMode, value);
+                WriteConfig("EnableDebugMode", value);
             }
         }
 
@@ -111,63 +167,27 @@
             InitTsEngine();
             //鍒濆鍖朤estStand寮曟搸
             this.InitTestStandEngine();
-            this.ReadCount(out int pass, out int fail);
-            this.DisplayCount(pass, fail);
-            UpdateChart(pass, fail);
-            InitProducts();
         }
 
-        private Pie pie;
+        public override void SetBaseFolder(string folder)
+        {
+            CountIniPath = Path.Combine(folder, "Count.ini");
+            base.SetBaseFolder(folder);
+        }
+
+        public override void InitFinish()
+        {
+            this.ReadCount(out int pass, out int fail);
+            this.DisplayCount(pass, fail);
+            InitProducts();
+            base.InitFinish();
+        }
+
         /// <summary>
         /// 鍒濆鍖朩inform鍥捐〃
         /// </summary>
         private void InitChart()
         {
-            //ChartArea chartArea1 = new ChartArea();
-            //Legend legend1 = new Legend();
-            //Series series1 = new Series();
-            //DataPoint dataPoint1 = new DataPoint(0D, 10D);
-            //DataPoint dataPoint2 = new DataPoint(0D, 10D);
-
-            //chart = new Chart();
-            //// 
-            //// chart
-            //// 
-            //this.chart.BackColor = System.Drawing.SystemColors.Control;
-            //chartArea1.BackColor = System.Drawing.SystemColors.Control;
-            //chartArea1.Name = "ChartArea1";
-            //this.chart.ChartAreas.Add(chartArea1);
-            //this.chart.Dock = System.Windows.Forms.DockStyle.Fill;
-            //legend1.BackColor = System.Drawing.SystemColors.Control;
-            //legend1.Name = "Legend1";
-            //this.chart.Legends.Add(legend1);
-            //this.chart.Location = new System.Drawing.Point(0, 0);
-            //this.chart.Margin = new System.Windows.Forms.Padding(4, 5, 4, 5);
-            //this.chart.Name = "chart";
-            //this.chart.Palette = ChartColorPalette.None;
-            //series1.BorderColor = System.Drawing.SystemColors.Control;
-            //series1.ChartArea = "ChartArea1";
-            //series1.ChartType = SeriesChartType.Pie;
-            //series1.Color = System.Drawing.SystemColors.Control;
-            //series1.LabelBackColor = System.Drawing.Color.White;
-            //series1.Legend = "Legend1";
-            //series1.Name = "Series1";
-            //dataPoint1.AxisLabel = "OK";
-            //dataPoint1.Color = Color.Green;
-            //dataPoint1.IsVisibleInLegend = true;
-            //dataPoint1.Label = "";
-            //dataPoint2.AxisLabel = "NG";
-            //dataPoint2.Color = Color.FromArgb(230, 0, 18);
-            //series1.Points.Add(dataPoint1);
-            //series1.Points.Add(dataPoint2);
-            //this.chart.Series.Add(series1);
-            //this.chart.Size = new System.Drawing.Size(215, 191);
-            //this.chart.TabIndex = 0;
-            //this.chart.Text = "chart1";
-            //((System.ComponentModel.ISupportInitialize)(chart)).BeginInit();
-            //chartHost.Child = chart;
-            //((System.ComponentModel.ISupportInitialize)(chart)).EndInit();
-
             pieChart.Plot.Axes.Frameless();
             pieChart.Plot.HideGrid();
             pieChart.Plot.DataBackground.Color = Colors.Transparent;
@@ -193,12 +213,12 @@
 
         private void InitProducts()
         {
-            Products = new ObservableCollection<ProductData>(ParameterManager.GetProducts());
+            Products = ProductManager.GetProducts<ObservableCollection<ProductData>>();
             if (Products != null && Products.Count > 0)
             {
                 List<ParameterData> parameters =
-                    ParameterManager.GetParametersByProductName(Products[0].Name);
-                string tmpNum = parameters.FirstOrDefault(p => p.Name == "SocketNum")?.Value?.ToString();
+                    ParameterManager.GetCommonParameter<List<ParameterData>>();
+                string tmpNum = parameters?.FirstOrDefault(p => p.Name == "SocketNum")?.Value?.ToString();
                 if (!string.IsNullOrEmpty(tmpNum))
                 {
                     this.socketNum = Convert.ToInt32(tmpNum);
@@ -234,6 +254,7 @@
                     {
                         try
                         {
+                            ReadConfig();
                             //杩炴帴OPChandle
                             //this.OpcHandle.Connect2("127.0.0.1", 6543, 18081, out string ErrMsg, null);
                             //鍚姩娴嬭瘯杩涚▼
@@ -268,16 +289,35 @@
 
         private void RefershUI()
         {
-            if (this.tsSockets.Count == 0)
+            ParameterData p = ParameterManager.GetCommonParameterByName("ProbeWarn");
+            int ProbeWarn = 0;
+            if (p != null)
             {
-                panel.Children.Clear();
-                //閲嶆柊鐢熸垚瀛愰潰鏉�
-                for (int i = 0; i < this.socketNum; i++)
+                try
                 {
-                    SingleControl control = new SingleControl(i, 0, 0);
-                    panel.Children.Add(control);
-                    tsSockets.Add(control);
+                    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, ProbeWarn);
+                panel.Children.Add(control);
+                tsSockets.Add(control);
+            }
+            if (tsSockets.Count == 1)
+            {
+                panel.Columns = 1;
+            }
+            else
+            {
+                panel.Columns = 2;
             }
         }
 
@@ -308,14 +348,41 @@
         /// <param name="fail">涓嶅悎鏍兼暟</param>
         private void ReadCount(out int pass, out int fail)
         {
-            pass = 0; //Convert.ToInt32(OperateIniFile.ReadIniData("Count", "Pass", "", CountiniPath));
-            fail = 0; //Convert.ToInt32(OperateIniFile.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()
         {
-            //OperateIniFile.WriteIniData("Count", "Pass", pass.ToString(), CountiniPath);
-            //OperateIniFile.WriteIniData("Count", "Fail", fail.ToString(), CountiniPath);
+            try
+            {
+                var p = ParameterManager.GetCommonParameterByName("EnableMes");
+                EnableMes = bool.Parse(p?.Value);
+            }
+            catch
+            {
+                EnableMes = 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 WriteConfig(string name, bool value)
+        {
+            IniFileHelper.WriteIniData("Config", name, value.ToString(), CountIniPath);
+            //this.engine.Globals.SetValBoolean($"StationState.{name}", 1, value);
+        }
+
+        private void WriteCount(double pass, double fail)
+        {
+            IniFileHelper.WriteIniData("Count", "Pass", pass.ToString(), CountIniPath);
+            IniFileHelper.WriteIniData("Count", "Fail", fail.ToString(), CountIniPath);
         }
 
         /// <summary>
@@ -323,9 +390,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)
             {
@@ -339,6 +406,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);
         }
 
@@ -378,7 +450,6 @@
                 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;
@@ -400,31 +471,69 @@
             }
         }
 
+        public void StopSequenceClick()
+        {
+            new MaskWindow((WindowX)Window.GetWindow(this),
+                    (win) =>
+                    {
+                        try
+                        {
+                            bool stoped = StopSequence();
+                            if (stoped)
+                            {
+                                Dispatcher.Invoke(() =>
+                                {
+                                    this.CbProduct.IsEnabled = true;
+                                    this.BtnStartSeq.IsEnabled = true;
+                                    this.BtnStopSeq.IsEnabled = false;
+                                });
+                            }
+                        }
+                        finally
+                        {
+                            Dispatcher.Invoke(() =>
+                            {
+
+                                win.Close();
+                            });
+                        }
+                        //Dispatcher.Invoke(() =>
+                        //{
+
+                        //});
+                    }
+                    ).Info(LangUtil.Get("App.SequenceIsStopping"));
+        }
+
         /// <summary>
         /// 鍋滄娴嬭瘯搴忓垪
         /// </summary>
-        private void StopSequence()
+        private bool StopSequence()
         {
             try
             {
-                if (this.tsSockets.Count == 0)
-                    return;
-                if (this.tsSockets[0].SequenceFileContext == null)
-                    return;
-                bool val = this.tsSockets[0].SequenceFileContext.StationGlobals.Exists("StationState.StopTest", 0);
-                if (val)
+                if (this.tsSockets.Count > 0)
                 {
-                    tsSockets[0].SequenceFileContext.StationGlobals.SetValBoolean("StationState.StopTest", 0, true);
-                    bool isStop = this.execution.WaitForEndEx(2000, true, null, null);
+                    for (int i = 0; i < tsSockets.Count; i++)
+                    {
+                        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", 0, 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;
             }
         }
 
@@ -435,10 +544,9 @@
             {
                 case "BtnStartSeq":
                     StartClick();
-
                     break;
                 case "BtnStopSeq":
-                    StopSequence();
+                    StopSequenceClick();
                     break;
                 case "BtnClearNum":
                     ClearNum();
@@ -505,6 +613,19 @@
             }
         }
 
+        public void UpdatePositionStatus(int index, string status)
+        {
+            this.tsSockets[index].UpdateStatus(status);
+            this.UpdateTestCounter();
+        }
+
+        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]);
+        }
+
         /// <summary>
         /// TestStand鐢ㄦ埛浜や簰浜嬩欢
         /// </summary>
@@ -512,134 +633,125 @@
         /// <param name="e"></param>
         private void AxApplicationMgr_UIMessageEvent(object sender, _ApplicationMgrEvents_UIMessageEventEvent e)
         {
-            int EventCase = Convert.ToInt32(e.uiMsg.Event);
-            int Index = Convert.ToInt16(e.uiMsg.NumericData);//SocketIndex
-
-            switch (EventCase)
+            try
             {
-                case 10001://浼犻�扴ocketContext
-                    tsSockets[Index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData;
-                    break;
+                int EventCase = Convert.ToInt32(e.uiMsg.Event);
+                int Index = Convert.ToInt16(e.uiMsg.NumericData);//SocketIndex
+                switch (EventCase)
+                {
+                    case 10001://浼犻�扴ocketContext
+                        tsSockets[Index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData;
+                        break;
 
-                case 10002://鏇存柊娴嬭瘯鐘舵��
-                    string status = e.uiMsg.StringData;
-                    this.tsSockets[Index].UpdateStatus(status);
-                    this.UpdateTestCounter();
-                    break;
+                    case 10002://鏇存柊娴嬭瘯鐘舵��
+                        string status = e.uiMsg.StringData;
+                        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]);
+                    case 10003://鍙戦�佹祴璇曟暟鎹�
+                        AddTestData(Index, e.uiMsg.StringData);
+                        break;
 
-                    break;
+                    case 10004://鍙戦�佹祴璇曡繃绋嬩俊鎭�
+                        this.tsSockets[Index].CurrentStep = e.uiMsg.StringData;
+                        break;
 
-                case 10004://鍙戦�佹祴璇曡繃绋嬩俊鎭�
-                    this.tsSockets[Index].CurrentStep = e.uiMsg.StringData;
-                    break;
+                    case 10005://鍒濆鍖栨祴璇曟暟鎹紝娓呯┖娴嬭瘯鏁版嵁
+                        this.tsSockets[Index].IniTestData();
+                        break;
 
-                case 10005://鍒濆鍖栨祴璇曟暟鎹紝娓呯┖娴嬭瘯鏁版嵁
-                    this.tsSockets[Index].IniTestData();
-                    break;
+                    case 10006://鍙戦�佷骇鍝佹潯鐮�
+                        this.tsSockets[Index].Barcode = e.uiMsg.StringData;
+                        break;
 
-                case 10006://鍙戦�佷骇鍝佹潯鐮�
-                    this.tsSockets[Index].Barcode = e.uiMsg.StringData;
-                    break;
+                    case 10007://寮�濮嬫祴璇曡鏃�
+                        tsSockets[Index].ElapseTime = "Start Timing";
+                        BtnStopSeq.IsEnabled = false;
+                        break;
 
-                case 10007://寮�濮嬫祴璇曡鏃�
-                    tsSockets[Index].ElapseTime = "Start Timing";
-                    BtnStopSeq.IsEnabled = false;
-                    break;
+                    case 10008://鍋滄娴嬭瘯璁℃椂
+                        tsSockets[Index].ElapseTime = "Stop Timing";
+                        BtnStopSeq.IsEnabled = true;
+                        break;
 
-                case 10008://鍋滄娴嬭瘯璁℃椂
-                    tsSockets[Index].ElapseTime = "Stop Timing";
-                    BtnStopSeq.IsEnabled = true;
-                    break;
+                    case 10009:
+                        // 
+                        break;
 
-                case 10009:
-                    // reset the value of controls units failed/pass rate
-                    break;
+                    case 10010:
 
-                case 10010:
+                        //PropertyObj.SetValBoolean("Locals.MD5_Used", 0, true);
+                        //PropertyObj.SetValVariant("FileGlobals.MD5_Value", 0, MD5_DATA);
+                        //PropertyObj.SetValVariant("StationGlobals.MD5", 0, MD5_DATA);
+                        break;
 
-                    //PropertyObj.SetValBoolean("Locals.MD5_Used", 0, true);
-                    //PropertyObj.SetValVariant("FileGlobals.MD5_Value", 0, MD5_DATA);
-                    //PropertyObj.SetValVariant("StationGlobals.MD5", 0, MD5_DATA);
-                    break;
+                    case 10011:
+                        // write model
 
-                case 10011:
-                    // write model
+                        break;
 
-                    break;
+                    case 10012:
+                        // read model
 
-                case 10012:
-                    // read model
+                        break;
 
-                    break;
-
-                case 10013:
-                    // read continue
+                    case 10013:
+                        // read continue
 
 
-                    break;
+                        break;
 
-                case 10014:
+                    case 10014:
 
-                    break;
+                        break;
 
-                case 10015:
+                    case 10015:
 
-                    break;
-                case 10016://鏄剧ず3D鎷兼帴鍥剧墖
+                        break;
+                    case 10016://鏄剧ず3D鎷兼帴鍥剧墖
 
-                    break;
-                case 10017://鏇存柊娴嬭瘯璁℃椂锛岄拡瀵归儴鍒嗚鏃舵湁PLC瀹屾垚鐨勯」鐩�
-                    this.tsSockets[Index].ElapseTime = e.uiMsg.StringData;
-                    break;
-                case (int)UIMessageCodes.UIMsg_EndExecution://鎵ц缁撴潫
-                    this.BtnStartSeq.IsEnabled = true;
-                    this.BtnStopSeq.IsEnabled = true;
-                    // this.ReleaseSequenceFile();
-                    break;
-                case 10030://鏄剧ず娴嬭瘯杩涘害
-                    int ProcessVal = Convert.ToInt32(e.uiMsg.StringData);
-                    this.tsSockets[Index].SetTestProcess(ProcessVal);
-                    break;
-                default:
-                    break;
+                        break;
+                    case 10017://鏇存柊娴嬭瘯璁℃椂锛岄拡瀵归儴鍒嗚鏃舵湁PLC瀹屾垚鐨勯」鐩�
+                        this.tsSockets[Index].ElapseTime = e.uiMsg.StringData;
+                        break;
+                    case (int)UIMessageCodes.UIMsg_EndExecution://鎵ц缁撴潫
+                        this.BtnStartSeq.IsEnabled = true;
+                        this.BtnStopSeq.IsEnabled = true;
+                        // 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;
+                    default:
+                        break;
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Warn("Ts Event Error.", ex);
             }
         }
 
         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();
-
-            //Dispatcher.Invoke(() => {
-            //    ((System.ComponentModel.ISupportInitialize)(chart)).BeginInit();
-            //    chart.Series[0].Points[0].YValues[0] = pass;
-            //    chart.Series[0].Points[1].YValues[0] = fail;
-            //    ((System.ComponentModel.ISupportInitialize)(chart)).EndInit();
-            //});
         }
 
         private void SetTestSeqFile(ProductData product)
         {
             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();
         }
 
@@ -649,16 +761,26 @@
             {
                 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);
+        }
+
         private void PluginControl_SizeChanged(object sender, SizeChangedEventArgs e)
         {
 

--
Gitblit v1.9.1