From 559890c482f5973f06aafdfec9550fee5ba3c7f2 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 09 十一月 2026 17:02:15 +0800
Subject: [PATCH] feat: CAN 模拟器 TCP 化 + 多设备并发调试 + 后台生命周期管理

---
 Plugin.CurrentSensorControl/ControlPage.xaml.cs |  188 ++++++++++++++++++++++++++++------------------
 1 files changed, 114 insertions(+), 74 deletions(-)

diff --git a/Plugin.CurrentSensorControl/ControlPage.xaml.cs b/Plugin.CurrentSensorControl/ControlPage.xaml.cs
index fb11a44..7116394 100644
--- a/Plugin.CurrentSensorControl/ControlPage.xaml.cs
+++ b/Plugin.CurrentSensorControl/ControlPage.xaml.cs
@@ -1,12 +1,13 @@
 锘縰sing CommunityToolkit.Mvvm.ComponentModel;
-using ConnectionUtil;
 using HMI.Base;
-using HMI.Core.Setting;
 using HMI.Core.Util;
 using HMI.UI.Util;
 using HMI.Util;
+using HslCommunication.Profinet.Siemens;
 using log4net;
 using Microsoft.Win32;
+using PLCHelper;
+using PLCHelper.Entity;
 using Plugin.CurrentSensorControl.Entity;
 using System.Collections.ObjectModel;
 using System.IO;
@@ -28,10 +29,33 @@
 
         private System.Timers.Timer timer;
         private System.Timers.Timer opcTimer;
-        private SCADAApi api;
         public static ILog Logger { get; private set; }
 
         private volatile bool needRead = false;
+
+        private SiemensS7Net api;
+
+        private bool plcMute = false;
+        public bool PlcMute
+        {
+            get => plcMute;
+            set
+            {
+                try
+                {
+                    string name = $"PLC_Mute";
+                    if (S7Context.WriteData(api, name, value))
+                    {
+                        plcMute = value;
+                        OnPropertyChanged(nameof(PlcMute));
+                    }
+                }
+                catch (Exception ex)
+                {
+
+                }
+            }
+        }
 
         public ControlPage()
         {
@@ -45,8 +69,6 @@
             opcTimer.AutoReset = false;
             opcTimer.Interval = 1000;
 
-            S7Context.Init(SystemSetting.Instance.PlcIp, SystemSetting.Instance.PlcPort);
-
             DataContext = this;
             InitializeComponent();
         }
@@ -54,12 +76,26 @@
         private void OpcTimer_Elapsed(object sender, ElapsedEventArgs e)
         {
             opcTimer.Enabled = false;
+
+            try
+            {
+                if (S7Context.GetData(api, "PLC_Mute", out object val))
+                {
+                    plcMute = (bool)val;
+                    OnPropertyChanged("PlcMute");
+                }
+            }
+            catch (Exception ex)
+            {
+
+            }
+
             try
             {
                 var time = DateTime.Now;
                 ovenCollection.Refresh();
+                S7Context.ResetFailCount();
                 log.Debug($"Time Cast: {(DateTime.Now - time).TotalMilliseconds}ms");
-
             }
             catch (Exception ex)
             {
@@ -73,6 +109,7 @@
         private void Timer_Elapsed(object sender, ElapsedEventArgs e)
         {
             timer.Enabled = false;
+
             try
             {
                 foreach (var ctl in controls)
@@ -98,10 +135,19 @@
         public override void InitFinish()
         {
             Logger = log;
+            try
+            {
+                LoadBurnInSetting();
+            }
+            catch (Exception ex)
+            {
+                log.Error("LoadBurnInSetting Error.", ex);
+            }
         }
 
         public override void Active()
         {
+            if (!isLoaded) return;
             StartReadCurrent();
         }
 
@@ -113,6 +159,7 @@
         public override void DoClose(object sender, EventArgs e)
         {
             StopReadCurrent();
+            S7Context.Release();
             base.DoClose(sender, e);
         }
 
@@ -150,65 +197,79 @@
 
         private void ClearSensorControl()
         {
-            foreach (var ctl in diWrap.Children)
-            {
-                if (ctl is SingleSensor ss)
-                {
-                    ss.Close();
-                }
-            }
-            diWrap.Children.Clear();
-            controls.Clear();
+            //foreach (var ctl in diWrap.Children)
+            //{
+            //    if (ctl is SingleSensor ss)
+            //    {
+            //        ss.Close();
+            //    }
+            //}
+            //diWrap.Children.Clear();
+            //controls.Clear();
         }
 
         private void RefreshSensorControl(bool start)
         {
-            StopReadCurrent();
-            ClearSensorControl();
-            foreach (var data in Datasource)
-            {
-                SingleSensor ss = new SingleSensor(data.Name, data.Ip, data.Port, data.Address, data.Channel)
-                {
-                    Width = 240
-                };
-                diWrap.Children.Add(ss);
-                controls.Add(ss);
-                Task.Factory.StartNew(() =>
-                {
-                    ss.Connect();
-                });
-            }
-            if (start) StartReadCurrent();
+            //StopReadCurrent();
+            //ClearSensorControl();
+            //foreach (var data in Datasource)
+            //{
+            //    SingleSensor ss = new SingleSensor(data.Name, data.Ip, data.Port, data.Address, data.Channel)
+            //    {
+            //        Width = 240
+            //    };
+            //    diWrap.Children.Add(ss);
+            //    controls.Add(ss);
+            //    Task.Factory.StartNew(() =>
+            //    {
+            //        ss.Connect();
+            //    });
+            //}
+            //if (start) StartReadCurrent();
         }
 
         private void ConnectAllSensor()
         {
-            foreach (var ctl in diWrap.Children)
-            {
-                if (ctl is SingleSensor ss)
-                {
-                    ss.Connect();
-                }
-            }
+            //foreach (var ctl in diWrap.Children)
+            //{
+            //    if (ctl is SingleSensor ss)
+            //    {
+            //        ss.Connect();
+            //    }
+            //}
         }
 
         private void DisconnectAllSensor()
         {
-            foreach (var ctl in diWrap.Children)
-            {
-                if (ctl is SingleSensor ss)
-                {
-                    ss.Close();
-                }
-            }
+            //foreach (var ctl in diWrap.Children)
+            //{
+            //    if (ctl is SingleSensor ss)
+            //    {
+            //        ss.Close();
+            //    }
+            //}
         }
 
+        private bool isLoaded = false;
         private void SimpleMaskControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
         {
-            LoadSensorData();
-            RefreshSensorControl(needRead);
-            LoadBurnInSetting();
-            Loaded -= SimpleMaskControl_Loaded;
+            ShowMask(() =>
+            {
+                api = S7Context.Get($"1");
+                Dispatcher.Invoke(() =>
+                {
+                    LoadSensorData();
+                    RefreshSensorControl(needRead);
+                    //LoadBurnInSetting();
+                    StartReadCurrent();
+                    isLoaded = true;
+                    Loaded -= SimpleMaskControl_Loaded;
+                });
+            }, (ex) =>
+            {
+                ToastHelper.Error("Loaded Failed.");
+                log.Error("Load Error.", ex);
+            }, null, "璇风◢鍚�");
         }
 
         private void OpenDataModal(SensorData data)
@@ -299,7 +360,7 @@
 
         private void DoDelete(SensorData data)
         {
-            if (MsgBoxHelper2.WarnChoose("鍒犻櫎?") == MessageBoxResult.OK)
+            if (MsgBoxHelper2.WarnChoose("纭畾瑕佸垹闄ゅ悧?") == MessageBoxResult.OK)
             {
                 var index = Datasource.IndexOf(data);
                 if (index >= 0)
@@ -354,34 +415,13 @@
 
         private void LoadBurnInSetting()
         {
-            S7Context.dataCache.Clear();
-            ObservableCollection<PLCTagData> datas;
-            try
-            {
-                string path = Path.Combine(BaseFolder, "BurnInSettingData.data");
-                if (File.Exists(path))
-                {
-                    datas = XmlHelper.DeserializeFromXml<ObservableCollection<PLCTagData>>(path);
-                }
-                else
-                {
-                    datas = new ObservableCollection<PLCTagData>();
-                }
-            }
-            catch (Exception ex)
-            {
-                datas = new ObservableCollection<PLCTagData>();
-            }
-            BurnInSettingData = datas;
-            LoadBurnInSettingCache();
+            S7Context.LoadTagData();
+            BurnInSettingData = S7Context.Datasource;
         }
 
         private void LoadBurnInSettingCache()
         {
-            foreach (var data in BurnInSettingData)
-            {
-                S7Context.dataCache[data.Name] = data;
-            }
+            S7Context.LoadTagData();
         }
 
         private void OpenBurnSettingModal()

--
Gitblit v1.9.1