From d1b72117058f1131046b6aa3add8e3ccfae033d8 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 09 十一月 2026 10:36:07 +0800
Subject: [PATCH] docs: CAN 模拟器独立 TCP 服务进程设计规格(统一 CanDeviceDriver + 双工推送协议)

---
 Plugin.TestResult/ViewControl.xaml.cs |  284 +++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 187 insertions(+), 97 deletions(-)

diff --git a/Plugin.TestResult/ViewControl.xaml.cs b/Plugin.TestResult/ViewControl.xaml.cs
index 47d1fe5..ebff038 100644
--- a/Plugin.TestResult/ViewControl.xaml.cs
+++ b/Plugin.TestResult/ViewControl.xaml.cs
@@ -4,6 +4,7 @@
 using HMI.Core.Manager;
 using HMI.Core.Setting;
 using HMI.Core.Util;
+using HMI.LogUtil;
 using HMI.StdControl;
 using HMI.UI.Util;
 using log4net;
@@ -11,6 +12,7 @@
 using NationalInstruments.TestStand.Interop.UI.Ax;
 using PLCHelper;
 using Plugin.TestResult.Util;
+using Plugin.TsSupport;
 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
@@ -25,10 +27,6 @@
     /// </summary>
     public partial class ViewControl : PluginMaskControl, IAlarmHandler
     {
-        /// <summary>
-        /// 娴嬭瘯搴忓垪鎿嶄綔鍙ユ焺
-        /// </summary>
-        private SequenceContext SequenceContext = null;
 
         private System.Timers.Timer timer;
 
@@ -59,6 +57,22 @@
             set => Set(ref _fileName, value);
         }
 
+        private bool enableManualDebug;
+        public bool EnableManualDebug
+        {
+            get => enableManualDebug;
+            set
+            {
+                if (IsRunning)
+                {
+                    MsgBoxHelper2.Warn("璇峰厛缁撴潫鑷姩娴嬭瘯");
+                    return;
+                }
+                testResultView.inManualDebugMode = value;
+                Set(ref enableManualDebug, value);
+            }
+        }
+
         public override void SetLogger(ILog logger)
         {
             base.SetLogger(logger);
@@ -74,13 +88,20 @@
                 Set(ref isRunning, value);
                 testResultView.IsRunning = value;
                 this.modelSelect.IsEnabled = !value;
-                this.btnStart.IsEnabled = !value;
                 this.btnStop.IsEnabled = value;
                 stdEnableMes.CbEnabled = !value;
             }
         }
 
         private bool AutoExecuteSeq = true;
+
+        #region TS鐩稿叧
+
+        /// <summary>
+        /// 娴嬭瘯搴忓垪鎿嶄綔鍙ユ焺
+        /// </summary>
+        private SequenceContext SequenceContext = null;
+        #endregion
 
         public ViewControl()
         {
@@ -90,9 +111,63 @@
             timer.Interval = 1000;
             timer.Elapsed += Timer_Elapsed;
             InitializeComponent();
-            testResultView.testApp.ExitApplication += new EventHandler(this.axApplicationMgr_ExitApplication);
-            testResultView.testApp.UIMessageEvent += new _ApplicationMgrEvents_UIMessageEventEventHandler(this.axApplicationMgr_UIMessageEvent);
-            testResultView.testApp.ExecutionClosed += new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.axApplicationMgr_ExecutionClosed);
+
+
+            //testResultView.testApp.ExitApplication += new EventHandler(this.axApplicationMgr_ExitApplication);
+            //testResultView.testApp.UIMessageEvent += new _ApplicationMgrEvents_UIMessageEventEventHandler(this.axApplicationMgr_UIMessageEvent);
+            //testResultView.testApp.ExecutionClosed += new _ApplicationMgrEvents_ExecutionClosedEventHandler(this.axApplicationMgr_ExecutionClosed);
+        }
+
+        private void HandleUIMessage(int EventCase, int MethodCode, string strData, object xData)
+        {
+            try
+            {
+                try
+                {
+                    log.Debug($"EventCase: {EventCase}, MethodCode: {MethodCode}, StrData: {strData}");
+                }
+                catch
+                {
+
+                }
+
+                if (EventCase == 8)
+                {
+                    IsRunning = false;
+                    return;
+                }
+
+                if (EventCase != 10014) return;
+
+                if (MethodCode == 0)
+                {
+                    /// 璁剧疆鍙ユ焺
+                    this.SequenceContext = (SequenceContext)xData;
+                    return;
+                }
+
+
+                if (MethodCode == 8)
+                {
+                    /// 鏇存柊MES鐘舵��
+                    mesStatus = strData == "1";
+                    return;
+                }
+
+                if (MethodCode == 9)
+                {
+                    /// 鏇存柊鐢熶骇鐘舵��
+                    produceStatus = strData;
+                    return;
+                }
+            }
+            catch
+            { }
+        }
+
+        private void ExecutionWrapper_UIMessageEvent(object sender, UIMessageEvent e)
+        {
+            HandleUIMessage(e.EventCode, Convert.ToInt16(e.NumberData), e.StrData, e.Data);
         }
 
         private void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
@@ -112,7 +187,6 @@
             string path = Path.Combine(BaseFolder, "Count.ini");
             testResultView.SetCountIniPath(path);
             testResultView.InitMainGrid();
-            testResultView.InitTestStandEngine();
 
             path = Path.Combine(BaseFolder, "Scanner.ini");
             if (!File.Exists(path))
@@ -144,88 +218,42 @@
                 testResultView.testSeqFile = string.Empty;
                 FileName = string.Empty;
             }
+            string type = Path.GetExtension(FileName);
+            bool isTap = string.Equals(".tapplan", type, StringComparison.OrdinalIgnoreCase);
+
+            testResultView.InitTestStandEngine(isTap);
+            testResultView.executionWrapper.UIMessageEvent += ExecutionWrapper_UIMessageEvent;
+
+            RefreshUIConfig();
         }
 
-        public override void DoClose(object sender, EventArgs e)
+        /// <summary>
+        /// 鍒锋柊UI閰嶇疆
+        /// </summary>
+        private void RefreshUIConfig()
         {
             try
             {
-                timer?.Stop();
-                testResultView.ReleaseResource();
+                /// 杩愯涓氨涓嶇
+                if (IsRunning)
+                {
+                    return;
+                }
+                bool enableManualDebug = ParameterManager.GetCommonParameterByName("EnableManualDebug", false);
+                if (enableManualDebug)
+                {
+                    FgEnableManualDebug.Visibility = Visibility.Visible;
+                }
+                else
+                {
+                    FgEnableManualDebug.Visibility = Visibility.Collapsed;
+                    EnableManualDebug = false;
+                }
             }
-            catch
+            catch (Exception ex)
             {
+                log.Error("RefreshUIConfig Error.", ex);
             }
-        }
-
-        public override void OnClose(object sender, CancelEventArgs e)
-        {
-            if (IsRunning)
-            {
-                MsgBoxHelper2.Warn("璇峰厛鍋滄鑰佸寲娴嬭瘯锛�");
-                e.Cancel = true;
-            }
-        }
-
-        private void axApplicationMgr_ExitApplication(object sender, EventArgs e)
-        {
-        }
-
-        private void axApplicationMgr_ExecutionClosed(object sender, _ApplicationMgrEvents_ExecutionClosedEvent e)
-        {
-        }
-
-        private void axApplicationMgr_UIMessageEvent(object sender, _ApplicationMgrEvents_UIMessageEventEvent e)
-        {
-            try
-            {
-                int EventCase = Convert.ToInt32(e.uiMsg.Event);
-                int MethodCode = Convert.ToInt16(e.uiMsg.NumericData);
-                string strData;
-
-                try
-                {
-                    log.Debug($"EventCase: {EventCase}, MethodCode: {MethodCode}, StrData: {e.uiMsg.StringData}");
-                }
-                catch
-                {
-
-                }
-
-                if (EventCase == 8)
-                {
-                    IsRunning = false;
-                    return;
-                }
-
-                if (EventCase != 10014) return;
-
-                if (MethodCode == 0)
-                {
-                    /// 璁剧疆鍙ユ焺
-                    this.SequenceContext = (SequenceContext)e.uiMsg.ActiveXData;
-                    return;
-                }
-
-
-                if (MethodCode == 8)
-                {
-                    /// 鏇存柊MES鐘舵��
-                    strData = e.uiMsg.StringData;
-                    mesStatus = strData == "1";
-                    return;
-                }
-
-                if (MethodCode == 9)
-                {
-                    /// 鏇存柊鐢熶骇鐘舵��
-                    strData = e.uiMsg.StringData;
-                    produceStatus = strData;
-                    return;
-                }
-            }
-            catch
-            { }
         }
 
         private bool isLoaded;
@@ -265,18 +293,20 @@
                 productSource.Add(prd.Name);
             }
             testResultView.SetProductSource(productSource);
+            testResultView.SetCurrentProduct(null);
 
-            string model = testResultView.engine.Globals.GetValString("ProductModel", 1);
-            if (!string.IsNullOrEmpty(model))
-            {
-                this.modelSelect.SelectedItem = model;
-                testResultView.SetCurrentProduct(model);
-            }
-            else if (products.Count > 0)
-            {
-                this.modelSelect.SelectedIndex = 0;
-                testResultView.SetCurrentProduct(products[0].Name);
-            }
+            //string model = testResultView.executionWrapper.GetStationGlobalValue<string>("ProductModel", 1);
+            ////testResultView.engine.Globals.GetValString("ProductModel", 1);
+            //if (!string.IsNullOrEmpty(model))
+            //{
+            //    this.modelSelect.SelectedItem = model;
+            //    testResultView.SetCurrentProduct(model);
+            //}
+            //else if (products.Count > 0)
+            //{
+            //    this.modelSelect.SelectedIndex = 0;
+            //    testResultView.SetCurrentProduct(products[0].Name);
+            //}
         }
 
         private void modelSelect_SelectionChanged(object sender, SelectionChangedEventArgs e)
@@ -285,8 +315,12 @@
             {
                 string currentModel = this.modelSelect.SelectedItem.ToString();
                 List<ParameterData> parameters = ProductManager.GetParametersByProductName(currentModel);
-                testResultView.engine.Globals.SetValString("ProductModel", 0, currentModel);
-                testResultView.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
+
+                testResultView.executionWrapper.SetStationGlobalValue<string>("ProductModel", 0, currentModel);
+                testResultView.executionWrapper.CommitToDisk(false);
+
+                //testResultView.engine.Globals.SetValString("ProductModel", 0, currentModel);
+                //testResultView.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
             }
             catch (Exception ex)
             {
@@ -304,6 +338,8 @@
                     IsRunning = false;
                     return;
                 }
+                LogHelper.Info("UI", "鎬诲惎鍔ㄦ寜閽寜涓�", out _);
+                log.Info("鎬诲惎鍔ㄦ寜閽寜涓�");
                 ShowMask(() =>
                 {
                     testResultView.StartTestSequence();
@@ -332,7 +368,30 @@
         {
             try
             {
+                bool breakStop = false;
+                foreach (var oven in TestResultView.tables)
+                {
+                    if (oven.IsTesting)
+                    {
+                        breakStop = true;
+                        break;
+                    }
+                }
+                if (breakStop)
+                {
+                    MsgBoxHelper2.Warn(this.lang("Tr.OvenIsTesting"));
+                    return;
+                }
+
+                if (MsgBoxHelper2.WarnChoose(this.lang("Tr.MakeSureStopAllTest")) != MessageBoxResult.OK)
+                {
+                    return;
+                }
+
+                LogHelper.Info("UI", "鎬诲仠姝㈡寜閽寜涓�", out _);
+                log.Info("鎬诲仠姝㈡寜閽寜涓�");
                 testResultView.StopTest();
+                /// 宸茬粡鍔犱簡WaitForExit,杩欓噷鍙互鏀逛负false
                 IsRunning = false;
             }
             catch (Exception ex)
@@ -368,13 +427,15 @@
 
         private void StdEnableMes_ValueChanged(object sender, StdUIEventArg e)
         {
-            testResultView.SequenceContext?.StationGlobals.SetValBoolean($"SystemSetting.{e.StringValue}", 1, e.BoolValue);
+            testResultView.executionWrapper.SetStationGlobalValue<bool>($"SystemSetting.{e.StringValue}", 1, e.BoolValue);
+            //testResultView.SequenceContext?.StationGlobals.SetValBoolean($"SystemSetting.{e.StringValue}", 1, e.BoolValue);
         }
 
         public void HandleAlarm(AlarmText alarm)
         {
             if (alarm.Level >= 4 && TestResultView.tables != null)
             {
+                log.Info($"4绾ф姤璀﹁Е鍙�: [{alarm.AlarmInfo}],灏嗗仠姝㈡墍鏈夌倝浣撴祴璇�");
                 foreach (var oven in TestResultView.tables)
                 {
                     testResultView.SetStartFlag(oven.index, false);
@@ -398,8 +459,37 @@
             if (alarm.Level >= 3)
             {
                 /// 3绾т互涓婄殑鎶ヨ浼氬仠姝㈡祴璇�
+                log.Info($"3绾ф姤璀﹁Е鍙�: [{alarm.AlarmInfo}],灏嗗仠姝㈣�佸寲鐐塠{targetOven.title}]娴嬭瘯");
                 testResultView.SetStartFlag(targetOven.index, false);
             }
         }
+
+        public override void Active()
+        {
+            base.Active();
+            LoadProduct();
+            RefreshUIConfig();
+        }
+
+        public override void OnClose(object sender, CancelEventArgs e)
+        {
+            if (IsRunning)
+            {
+                MsgBoxHelper2.Warn("璇峰厛鍋滄鑰佸寲娴嬭瘯锛�");
+                e.Cancel = true;
+            }
+        }
+
+        public override void DoClose(object sender, EventArgs e)
+        {
+            try
+            {
+                timer?.Stop();
+                testResultView.ReleaseResource();
+            }
+            catch
+            {
+            }
+        }
     }
 }

--
Gitblit v1.9.1