From 1afe548ac40cc7f975917ef9bf2e156595cf81f3 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期四, 16 四月 2026 08:58:04 +0800
Subject: [PATCH] 优化;

---
 Plugin.TsExecution/TsExecution.xaml.cs |  515 ++++++++++++++++++++++++++++++++++++++++++--------------
 1 files changed, 381 insertions(+), 134 deletions(-)

diff --git a/Plugin.TsExecution/TsExecution.xaml.cs b/Plugin.TsExecution/TsExecution.xaml.cs
index da56cd3..321bd3b 100644
--- a/Plugin.TsExecution/TsExecution.xaml.cs
+++ b/Plugin.TsExecution/TsExecution.xaml.cs
@@ -3,15 +3,14 @@
 using HMI.Core.Api;
 using HMI.Core.Entity;
 using HMI.Core.Manager;
+using HMI.Core.Setting;
 using HMI.Core.Util;
 using HMI.MQUtil;
-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 Plugin.TsSupport;
 using ScottPlot;
 using ScottPlot.Plottables;
@@ -21,6 +20,7 @@
 using System.ComponentModel;
 using System.IO;
 using System.Linq;
+using System.Runtime.InteropServices;
 using System.Timers;
 using System.Windows;
 using System.Windows.Controls;
@@ -31,7 +31,7 @@
     /// <summary>
     /// UserControl1.xaml 鐨勪氦浜掗�昏緫
     /// </summary>
-    public partial class TsExecution : PluginControl
+    public partial class TsExecution : PluginMaskControl
     {
         #region TestStand浜嬩欢
         /// <summary>
@@ -51,6 +51,8 @@
         private SequenceFile modeSeq = null;
         public AxApplicationMgr AxApplicationMgr;
         private Execution execution = null;
+
+        private SequenceContext sequenceContext = null;
 
         private Chart chart;
         #endregion
@@ -101,7 +103,25 @@
             set
             {
                 Set(ref selectedProduct, value);
+                CurrentProductModel = value?.Name;
+                if (tsSockets != null)
+                {
+                    foreach (SingleControl socket in tsSockets)
+                    {
+                        socket.RefreshProduct(value);
+                    }
+                }
                 SetTestSeqFile(value);
+            }
+        }
+
+        private string currentProductModel;
+        public string CurrentProductModel
+        {
+            get => currentProductModel;
+            set
+            {
+                Set(ref currentProductModel, value);
             }
         }
 
@@ -121,6 +141,10 @@
                 Set(ref products, value);
             }
         }
+
+        public List<double> FontSizeSource { get; set; } = new List<double> {
+            10,11,12,13,14,15,16,17,18,19,20
+        };
 
         private Pie pie;
         private string CountIniPath;
@@ -244,6 +268,8 @@
                 if (WriteIni("UI_CurrentWorkorder", value))
                 {
                     Set(ref currentWorkorder, value);
+                    engine?.Globals.SetValString("StationState.WorkOrder", 1, value);
+                    engine?.CommitGlobalsToDisk(promptOnSaveConflicts: false);
                 }
             }
         }
@@ -273,6 +299,7 @@
             DataContext = this;
             GCTimer = new Timer();
             InitializeComponent();
+
             InitChart();
             InitTsEngine();
             //鍒濆鍖朤estStand寮曟搸
@@ -334,6 +361,25 @@
             InitProducts();
             CheckSqlHelper();
             base.InitFinish();
+
+            if (ParamSetting.EnableAutoModel)
+            {
+                selectModelPanel.Visibility = Visibility.Collapsed;
+                autoModelPanel.Visibility = Visibility.Visible;
+                CurrentProductModel = string.Empty;
+            }
+
+            try
+            {
+                UserInfo user = UserInfo.User;
+                CurrentUserCode = user?.Code;
+                engine?.Globals.SetValString("StationState.OPID", 1, CurrentUserCode);
+                engine?.CommitGlobalsToDisk(promptOnSaveConflicts: false);
+            }
+            catch (Exception ex)
+            {
+                log.Warn("Get Login User Failed.", ex);
+            }
         }
 
         private void InitMQ()
@@ -410,6 +456,13 @@
                 SelectedProduct = tempProduct;
             }
             RefershUI();
+            if (tsSockets != null)
+            {
+                foreach (SingleControl socket in tsSockets)
+                {
+                    socket.RefreshProduct(SelectedProduct);
+                }
+            }
             SampleStatus = false;
         }
 
@@ -435,24 +488,31 @@
         private void InitTsEngine()
         {
             AxApplicationMgr = TestAppManager.GetAxApplicationMgr();
+
+
+            //AxApplicationMgr. += AxApplicationMgr_EndExecution;
             AxApplicationMgr.EndExecution += AxApplicationMgr_EndExecution;
-            AxApplicationMgr.ExitApplication += new EventHandler(this.AxApplicationMgr_ExitApplication);
-            AxApplicationMgr.UIMessageEvent +=
-                new _ApplicationMgrEvents_UIMessageEventEventHandler(this.AxApplicationMgr_UIMessageEvent);
-            AxApplicationMgr.ExecutionClosed +=
-                new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.AxApplicationMgr_ExecutionClosed);
+
+            AxApplicationMgr.ExitApplication += this.AxApplicationMgr_ExitApplication;
+            AxApplicationMgr.UIMessageEvent += this.AxApplicationMgr_UIMessageEvent;
+            AxApplicationMgr.ExecutionClosed += this.AxApplicationMgr_ExecutionClosed;
 
             ((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).BeginInit();
             host.Child = AxApplicationMgr;
             ((System.ComponentModel.ISupportInitialize)(AxApplicationMgr)).EndInit();
         }
 
+        private volatile bool canSwitchModel = false;
+        private volatile Action switchAction = null;
+
         private void AxApplicationMgr_EndExecution(object sender, _ApplicationMgrEvents_EndExecutionEvent e)
         {
             log.Info("AxApplicationMgr_EndExecution");
             if (ReleaseSequenceFile())
             {
+                IsTesting = false;
                 log.Info("Release SeqFile Success!");
+                if (canSwitchModel) switchAction?.Invoke();
             }
             else
             {
@@ -472,58 +532,107 @@
 
         private void PluginControl_Loaded(object sender, RoutedEventArgs e)
         {
-            new MaskWindow((WindowX)Window.GetWindow(this),
-                (win) =>
+            ShowMask(() =>
+            {
+                try
                 {
-                    try
-                    {
-                        Dispatcher.Invoke(() =>
-                        {
-                            try
-                            {
-                                UserInfo user = UserInfo.User;
-                                CurrentUserCode = user?.Code;
-                            }
-                            catch (Exception ex)
-                            {
-                                log.Warn("Get Login User Failed.", ex);
-                            }
-                        });
-                        isLoadOK = true;
-                        if (AutoExecuteSeq) StartSequence();
-                    }
-                    catch (Exception ex)
-                    {
-                        log.Error("TsExecution Loaded Failed.", ex);
-                        MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.UserControlLoadFailed")}: {ex.Message}");
-                    }
+                    //Dispatcher.Invoke(() =>
+                    //{
 
-                    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(() =>
-                    {
-                        if (isLoadOK) Loaded -= PluginControl_Loaded;
-                    });
+                    //});
+                    isLoadOK = true;
+                    if (AutoExecuteSeq) StartSequence();
                 }
-                ).Info(LangUtil.Get("App.UsercontrolIsLoading"));
+                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(() =>
+                {
+                    if (isLoadOK) Loaded -= PluginControl_Loaded;
+                });
+            }, (ex) =>
+            {
+                ToastHelper.Error("Loaded Failed.");
+                log.Error("Loaded Error.", ex);
+            }, null, LangUtil.Get("App.UsercontrolIsLoading"));
+
+            //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);
+            //                }
+            //            });
+            //            isLoadOK = true;
+            //            if (AutoExecuteSeq) 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(() =>
+            //        {
+            //            if (isLoadOK) Loaded -= PluginControl_Loaded;
+            //        });
+            //    }
+            //    ).Info(LangUtil.Get("App.UsercontrolIsLoading"));
         }
 
         private void RefershUI()
         {
             panel.Children.Clear();
+            string[] names = ParamSetting.SocketNames.Split(',');
+
             //閲嶆柊鐢熸垚瀛愰潰鏉�
             for (int i = 0; i < this.socketNum; i++)
             {
-                SingleControl control = new SingleControl(i, CountIniPath, this.probeWarn);
+                string name = string.Empty;
+                if (i < names.Length)
+                {
+                    name = names[i];
+                }
+
+                SingleControl control = new SingleControl(i, CountIniPath, this.probeWarn)
+                {
+                    SocketName = name
+                };
                 panel.Children.Add(control);
                 tsSockets.Add(control);
 
@@ -532,6 +641,10 @@
             if (tsSockets.Count == 1)
             {
                 panel.Columns = 1;
+            }
+            else if (tsSockets.Count > 0 && (tsSockets.Count % 3) == 0)
+            {
+                panel.Columns = 3;
             }
             else
             {
@@ -568,6 +681,9 @@
         {
             pass = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Pass", "0", CountIniPath));
             fail = Convert.ToInt32(IniFileHelper.ReadIniData("Count", "Fail", "0", CountIniPath));
+            var fontSize = Convert.ToDouble(IniFileHelper.ReadIniData("Config", "TableFontSize", "12", CountIniPath));
+            this.Resources["tableFontSize"] = 20d;
+            //CbFontSize.SelectedItem = fontSize;
         }
 
         private string csvDir;
@@ -780,13 +896,11 @@
             {
 
                 value = ParameterManager.GetCommonParameterByName("UI_CurrentWorkorder");
-                currentWorkorder = value.Value;
-                Set("CurrentWorkorder");
+                CurrentWorkorder = value.Value;
             }
             catch
             {
-                currentWorkorder = string.Empty;
-                Set("CurrentWorkorder");
+                CurrentWorkorder = string.Empty;
             }
 
             try
@@ -803,22 +917,13 @@
             {
             }
 
-            try
-            {
-
-                value = ParameterManager.GetCommonParameterByName("TS_DataLogPath");
-                dataLogPath = value.Value;
-            }
-            catch
-            {
-                dataLogPath = Path.Combine(PathHelper.ConfigFolder, "DataBoard");
-            }
+            dataLogPath = ParamSetting.DataLogFolder;
 
             try
             {
 
                 value = ParameterManager.GetCommonParameterByName("TsModelPath");
-                tsModelPath = value.Value;
+                tsModelPath = value?.Value ?? @"C:\Users\Public\Documents\National Instruments\TestStand 2020 (64-bit)\Components\Models\ParallelModel.seq";
             }
             catch
             {
@@ -850,6 +955,11 @@
                     foreach (var ts in tsSockets)
                     {
                         ts?.SequenceFileContext?.StationGlobals.SetValBoolean($"SystemSetting.{name}", 1, value);
+                        if (ts?.SequenceFileContext?.Sequence != null)
+                        {
+                            ts.SequenceFileContext.Sequence.FailureAction =
+                                value ? FailureActions.FailureAction_None : FailureActions.FailureAction_GotoCleanup;
+                        }
                     }
                     return true;
                 }
@@ -952,53 +1062,70 @@
         private void StartSequence()
         {
             if (!isLoadOK) return;
-            //MaskWindow mask = new MaskWindow();
-            try
+            engine?.Globals.SetValBoolean("StationState.StopTest", 0, false);
+            if (ParamSetting.EnableAutoModel)
             {
-                engine?.Globals.SetValString("StationState.ProductModel", 1, SelectedProduct?.Name);
-                engine?.CommitGlobalsToDisk(promptOnSaveConflicts: false);
-                this.modeSeq = this.engine.GetSequenceFileEx(tsModelPath);
-                this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 2, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
-                this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
-                IsTesting = true;
-            }
-            catch (Exception ex)
-            {
-                Dispatcher.Invoke(() =>
+                try
                 {
-                    log.Error("Start Sequence Failed.", ex);
-                    MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.StartSequenceFail")}: {ex.Message}");
-                });
+                    var path = ParameterManager.GetCommonParameterByName<string>("CommonMainSeq", "");
+                    if (string.IsNullOrEmpty(path))
+                    {
+                        Dispatcher.Invoke(() =>
+                        {
+                            MsgBoxHelper.Error(this, $"璇峰厛璁剧疆CommonMainSeq鍙傛暟");
+                        });
+                        return;
+                    }
+                    this.testSeqFile = path;
+                    this.modeSeq = this.engine.GetSequenceFileEx(tsModelPath);
+                    this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 2, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
+                    this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
+                    IsTesting = true;
+                }
+                catch (Exception ex)
+                {
+                    Dispatcher.Invoke(() =>
+                    {
+                        log.Error("Start Sequence Failed.", ex);
+                        MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.StartSequenceFail")}: {ex.Message}");
+                    });
+                }
             }
-            finally
+            else
             {
+                //MaskWindow mask = new MaskWindow();
+                try
+                {
+                    engine?.Globals.SetValString("StationState.ProductModel", 1, CurrentProductModel);
+                    engine?.CommitGlobalsToDisk(promptOnSaveConflicts: false);
+                    this.modeSeq = this.engine.GetSequenceFileEx(tsModelPath);
+                    this.testSeq = this.engine.GetSequenceFileEx(this.testSeqFile, 2, TypeConflictHandlerTypes.ConflictHandler_UseGlobalType);
+                    this.execution = this.engine.NewExecution(this.testSeq, "Test UUTs", this.modeSeq, false, 0, null, null, null);
+                    IsTesting = true;
+                }
+                catch (Exception ex)
+                {
+                    Dispatcher.Invoke(() =>
+                    {
+                        log.Error("Start Sequence Failed.", ex);
+                        MsgBoxHelper.Error(this, $"{LangUtil.Get("Ts.StartSequenceFail")}: {ex.Message}");
+                    });
+                }
+                finally
+                {
 
+                }
             }
         }
 
         public void StopSequenceClick()
         {
-            new MaskWindow((WindowX)Window.GetWindow(this),
-                    (win) =>
-                    {
-                        try
-                        {
-                            bool stoped = StopSequence();
-                            if (stoped)
-                            {
-                                IsTesting = false;
-                            }
-                        }
-                        finally
-                        {
-                            Dispatcher.Invoke(() =>
-                            {
-
-                                win.Close();
-                            });
-                        }
-                    }
-                    ).Info(LangUtil.Get("App.SequenceIsStopping"));
+            canSwitchModel = false;
+            switchAction = null;
+            ShowMask(() =>
+            {
+                bool stoped = StopSequence();
+            }, null, null, LangUtil.Get("App.SequenceIsStopping"));
         }
 
         /// <summary>
@@ -1013,18 +1140,15 @@
                     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", 1, true);
                     }
                 }
                 if (this.execution == null) return true;
 
-                bool res = this.execution.WaitForEndEx(2000, true, null, null);
+                //bool res = this.execution.WaitForEndEx(-1, true, null, null);
+                bool res = this.execution?.WaitForEndEx(-1, true, Type.Missing, null) == true;
+                Marshal.ReleaseComObject(this.execution);
+                this.execution = null;
                 return res;
             }
             catch (Exception ex)
@@ -1059,21 +1183,29 @@
 
         private void StartClick()
         {
-            new MaskWindow(Window.GetWindow(this),
-                (win) =>
-                {
-                    try
-                    {
-                        StartSequence();
-                    }
-                    finally
-                    {
-                        win.Dispatcher.Invoke(() =>
-                        {
-                            win.Close();
-                        });
-                    }
-                }).Info(LangUtil.Get("Ts.SequenceIsStarting"));
+            canSwitchModel = true;
+            ShowMask(() =>
+            {
+                StartSequence();
+            }, null, null, LangUtil.Get("Ts.SequenceIsStarting"));
+            //new MaskWindow(Window.GetWindow(this),
+            //    (win) =>
+            //    {
+            //        try
+            //        {
+            //            StartSequence();
+            //        }
+            //        catch (Exception ex) { 
+
+            //        }
+            //        finally
+            //        {
+            //            win.Dispatcher.Invoke(() =>
+            //            {
+            //                win.Close();
+            //            });
+            //        }
+            //    }).Info(LangUtil.Get("Ts.SequenceIsStarting"));
         }
 
         /// <summary>
@@ -1137,7 +1269,7 @@
         {
             var time = DateTime.Now;
             string status = this.tsSockets[index].Status == "Passed" ? "PASS" : "FAIL";
-            string csvPath = Path.Combine(csvDir, SelectedProduct?.Name ?? "鏈煡浜у搧", time.ToString("yyyyMMdd"), status, $"{this.tsSockets[index].Barcode}-{time.ToString("HHmmss")}.csv");
+            string csvPath = Path.Combine(csvDir, CurrentProductModel ?? "鏈煡浜у搧", time.ToString("yyyyMMdd"), status, $"{this.tsSockets[index].Barcode}-{time.ToString("HHmmss")}.csv");
             this.tsSockets[index].WriteToCSV(csvPath);
         }
 
@@ -1147,7 +1279,7 @@
             var socket = this.tsSockets[index];
             var time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
             string snr = socket.Barcode;
-            string model = SelectedProduct?.Name;
+            string model = CurrentProductModel;
 
             List<string> sqls = new List<string>();
             foreach (var data in socket.Datasource)
@@ -1236,7 +1368,7 @@
                     this.tsSockets[index].ElapseTime = strData;
                     break;
                 case (int)UIMessageCodes.UIMsg_EndExecution://鎵ц缁撴潫
-                    IsTesting = false;
+                    //IsTesting = false;
                     //this.ReleaseSequenceFile();
                     break;
                 case 10030://鏄剧ず娴嬭瘯杩涘害
@@ -1273,19 +1405,91 @@
                     this.tsSockets[index].ShowPausePanel();
                     break;
                 case 10033:
-                    ShowAlarm(strData);
+                    var alarm = new AlarmText
+                    {
+                        VirtualId = DateTime.Now.ToString("yyyyMMddHHmmssfff"),
+                        AlarmInfo = strData
+                    };
+                    ShowAlarm(alarm);
+                    break;
+                case 10034:
+                    CurrentProductModel = strData;
+                    break;
+                case 10035:
+                    string[] arr_10035 = strData.Split(';');
+
+                    int[][] points = new int[arr_10035.Length - 1][];
+
+                    for (int i = 1; i < arr_10035.Length; i++)
+                    {
+                        string[] strs = arr_10035[i].Split(',');
+                        points[i - 1] = new int[2] { int.Parse(strs[0]), int.Parse(strs[1]) };
+                    }
+                    this.tsSockets[index].DrawScreenPoints(int.Parse(arr_10035[0]), points);
+                    break;
+                case 10036:
+                    this.tsSockets[index].ClearScreenPoint(int.Parse(strData));
                     break;
                 case 10099:
+                    string[] arr = strData.Split(',');
+                    if (canSwitchModel) SwitchSequenceByModel(index, arr[0], arr[1]);
                     break;
                 default:
                     break;
             }
         }
 
-        private void ShowAlarm(string info)
+        private void SwitchSequenceByModel(int index, string model, string snr)
         {
-            AlarmShowHelper.ShowAlarm(info);
-            mSMQHelper.Send("Alarm", $"ATE娴嬭瘯 {info}");
+            Dispatcher.Invoke(() =>
+            {
+                var target = Products.FirstOrDefault(e => e.Name == model);
+
+                ShowMask(() =>
+                {
+                    bool stoped = StopSequence();
+                    //if (stoped)
+                    //{
+                    //    IsTesting = false;
+                    //}
+                }, null, null, "鎹㈠瀷涓紝璇风◢鍚�...");
+
+                if (target == null)
+                {
+                    MsgBoxHelper2.Warn($"璇峰厛鍦ㄤ骇鍝佺鐞嗛〉闈㈤厤缃瀷鍙� [{model}] 鐨勪骇鍝佷俊鎭紒");
+                    return;
+                }
+
+                switchAction = () =>
+                {
+                    switchAction = null;
+                    log?.Info($"灏濊瘯鑷姩鎹㈠瀷: {switchAction}");
+                    if (canSwitchModel)
+                    {
+                        Dispatcher.Invoke(() =>
+                        {
+                            try
+                            {
+                                log?.Info("寮�濮嬭嚜鍔ㄦ崲鍨�");
+                                SelectedProduct = target;
+                                engine?.Globals.SetValString($"CacheSNR[{index}]", 1, snr);
+                                engine?.CommitGlobalsToDisk(false);
+                                StartClick();
+                            }
+                            catch (Exception ex)
+                            {
+                                log?.Error("鑷姩鎹㈠瀷澶辫触", ex);
+                            }
+                        });
+                    }
+                };
+            });
+        }
+
+        private void ShowAlarm(AlarmText alarm)
+        {
+            AlarmShowHelper.ShowAlarm(alarm);
+            mSMQHelper.Send("Alarm", $"ATE娴嬭瘯 {alarm.AlarmInfo}");
         }
 
         /// <summary>
@@ -1303,7 +1507,7 @@
 
                 try
                 {
-                    log.Info($"Event: {eventCode}, NumericData: {index}, StringData: {strData}");
+                    log.Debug($"Event: {eventCode}, NumericData: {index}, StringData: {strData}");
                 }
                 catch
                 {
@@ -1311,6 +1515,8 @@
                 }
                 if (eventCode == 10001)
                 {
+                    sequenceContext = (SequenceContext)e.uiMsg.ActiveXData;
+
                     tsSockets[index].SequenceFileContext = (SequenceContext)e.uiMsg.ActiveXData;
                     return;
                 }
@@ -1392,6 +1598,10 @@
             {
                 lock (this)
                 {
+                    if (this.testSeq == null)
+                    {
+                        return true;
+                    }
                     //execution.Abort();
                     int count = 10;
                     while (count > 0)
@@ -1401,15 +1611,18 @@
                             if (this.testSeq == null)
                                 return true;
 
-                            if (this.engine.ReleaseSequenceFileEx(this.testSeq, 4))
+                            if (this.engine?.ReleaseSequenceFileEx(this.testSeq, 4) == true)
                             {
+                                Marshal.ReleaseComObject(this.testSeq);
                                 this.testSeq = null;
+                                // GC.Collect();
                             }
-                            if (this.engine.ReleaseSequenceFileEx(this.modeSeq, 4))
+                            if (this.engine?.ReleaseSequenceFileEx(this.modeSeq, 4) == true)
                             {
+                                Marshal.ReleaseComObject(this.modeSeq);
                                 this.modeSeq = null;
                             }
-                            this.engine.UnloadAllModules();
+                            this.engine?.UnloadAllModules();
                             return this.testSeq == null && this.modeSeq == null;
                         }
                         catch (Exception ex)
@@ -1434,5 +1647,39 @@
         {
 
         }
+
+        private void CbFontSize_SelectionChanged(object sender, SelectionChangedEventArgs e)
+        {
+            try
+            {
+                if (e.AddedItems != null && e.AddedItems.Count > 0)
+                {
+                    var fontSize = (double)e.AddedItems[0];
+                    this.Resources["tableFontSize"] = fontSize;
+                    IniFileHelper.WriteIniData("Config", "TableFontSize", fontSize.ToString(), CountIniPath);
+                }
+            }
+            catch
+            {
+            }
+        }
+
+        private void Label_MouseDoubleClick(object sender, System.Windows.Input.MouseButtonEventArgs e)
+        {
+            //workOrderEditor.Focus();
+            //workOrderEditor.IsEditing = true;
+            if (RequirePassword() == true)
+            {
+                var win = new WorkOrderWin
+                {
+                    WorkOrder = CurrentWorkorder,
+                    Owner = Window.GetWindow(this)
+                };
+                if (win.ShowDialog() == true)
+                {
+                    CurrentWorkorder = win.WorkOrder;
+                }
+            }
+        }
     }
 }
\ No newline at end of file

--
Gitblit v1.9.1