From 9d1660270272180cd71147d6ddd53d1382643d2e Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期一, 02 十一月 2026 18:00:14 +0800
Subject: [PATCH] merge: 并入远程 Initial commit 作为历史根节点

---
 Plugin.CurrentSensorControl/ControlPage.xaml.cs |  450 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 450 insertions(+), 0 deletions(-)

diff --git a/Plugin.CurrentSensorControl/ControlPage.xaml.cs b/Plugin.CurrentSensorControl/ControlPage.xaml.cs
new file mode 100644
index 0000000..7116394
--- /dev/null
+++ b/Plugin.CurrentSensorControl/ControlPage.xaml.cs
@@ -0,0 +1,450 @@
+锘縰sing CommunityToolkit.Mvvm.ComponentModel;
+using HMI.Base;
+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;
+using System.Timers;
+using System.Windows;
+using System.Windows.Controls;
+
+namespace Plugin.CurrentSensorControl
+{
+    /// <summary>
+    /// ControlPage.xaml 鐨勪氦浜掗�昏緫
+    /// </summary>
+    [ObservableObject]
+    public partial class ControlPage : SimpleMaskControl
+    {
+        [ObservableProperty]
+        private ObservableCollection<SensorData> datasource = new ObservableCollection<SensorData>();
+        private List<SingleSensor> controls = new List<SingleSensor>();
+
+        private System.Timers.Timer timer;
+        private System.Timers.Timer opcTimer;
+        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()
+        {
+            timer = new System.Timers.Timer();
+            timer.Elapsed += Timer_Elapsed;
+            timer.AutoReset = false;
+            timer.Interval = 1000;
+
+            opcTimer = new System.Timers.Timer();
+            opcTimer.Elapsed += OpcTimer_Elapsed; ;
+            opcTimer.AutoReset = false;
+            opcTimer.Interval = 1000;
+
+            DataContext = this;
+            InitializeComponent();
+        }
+
+        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)
+            {
+            }
+            finally
+            {
+                if (needRead) opcTimer.Enabled = true;
+            }
+        }
+
+        private void Timer_Elapsed(object sender, ElapsedEventArgs e)
+        {
+            timer.Enabled = false;
+
+            try
+            {
+                foreach (var ctl in controls)
+                {
+                    if (!needRead) return;
+                    if (ctl is SingleSensor ss)
+                    {
+                        ss.ReadCurrent();
+                        Thread.Sleep(50);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+
+            }
+            finally
+            {
+                if (needRead) timer.Enabled = true;
+            }
+        }
+
+        public override void InitFinish()
+        {
+            Logger = log;
+            try
+            {
+                LoadBurnInSetting();
+            }
+            catch (Exception ex)
+            {
+                log.Error("LoadBurnInSetting Error.", ex);
+            }
+        }
+
+        public override void Active()
+        {
+            if (!isLoaded) return;
+            StartReadCurrent();
+        }
+
+        public override void DeActive()
+        {
+            StopReadCurrent();
+        }
+
+        public override void DoClose(object sender, EventArgs e)
+        {
+            StopReadCurrent();
+            S7Context.Release();
+            base.DoClose(sender, e);
+        }
+
+        public void StartReadCurrent()
+        {
+            needRead = true;
+            timer.Enabled = true;
+            opcTimer.Enabled = true;
+        }
+
+        public void StopReadCurrent()
+        {
+            needRead = false;
+            timer.Enabled = false;
+            opcTimer.Enabled = false;
+        }
+
+        private void LoadSensorData()
+        {
+            string path = Path.Combine(BaseFolder, "sensor.data");
+            var list = new ObservableCollection<SensorData>();
+            try
+            {
+                if (File.Exists(path))
+                {
+                    list = XmlHelper.DeserializeFromXml<ObservableCollection<SensorData>>(path);
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Load Sensor Data Failed.", ex);
+            }
+            Datasource = list;
+        }
+
+        private void ClearSensorControl()
+        {
+            //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();
+        }
+
+        private void ConnectAllSensor()
+        {
+            //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();
+            //    }
+            //}
+        }
+
+        private bool isLoaded = false;
+        private void SimpleMaskControl_Loaded(object sender, System.Windows.RoutedEventArgs e)
+        {
+            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)
+        {
+            DataModal modal = new DataModal()
+            {
+                Title = "鏂板",
+                Owner = Window.GetWindow(this)
+            };
+            if (modal.Open(data, Datasource) == true)
+            {
+                string path = Path.Combine(BaseFolder, "sensor.data");
+                try
+                {
+                    XmlHelper.SerializeToXml(path, Datasource);
+                    LoadSensorData();
+                    RefreshSensorControl(needRead);
+                }
+                catch (Exception ex)
+                {
+                    ToastHelper.Error("淇濆瓨澶辫触");
+                    log.Error("Save Sensor Data Failed.", ex);
+                }
+            }
+        }
+
+        private void DoExport()
+        {
+            try
+            {
+                SaveFileDialog sfd = new SaveFileDialog();
+                sfd.Filter = "Excel 鏂囦欢 (*.xls)|*.xls";
+                if (sfd.ShowDialog() == true)
+                {
+                    ExcelHelper.ExportExcel(sfd.FileName, Datasource);
+                }
+                ToastHelper.Success(this.lang("App.ExportSuccess"));
+            }
+            catch (Exception ex)
+            {
+                log.Error("Export Failed.", ex);
+                ToastHelper.Error(this.lang("App.ExportFailed"));
+            }
+        }
+
+        private void DoImport()
+        {
+            try
+            {
+                OpenFileDialog ofd = new OpenFileDialog();
+                ofd.Filter = "Excel 鏂囦欢 (*.xls)|*.xls";
+                if (ofd.ShowDialog() == true)
+                {
+                    var datas = ExcelHelper.ReadFromExcel<SensorData>(ofd.FileName);
+                    string path = Path.Combine(BaseFolder, "sensor.data");
+                    XmlHelper.SerializeToXml(path, datas);
+                    DoRefresh();
+                    ToastHelper.Success(this.lang("App.ExportSuccess"));
+                }
+            }
+            catch (Exception ex)
+            {
+                log.Error("Export Failed.", ex);
+                ToastHelper.Error(this.lang("App.ExportFailed"));
+            }
+        }
+
+        private void SaveDatasouce(object datasource)
+        {
+            string path = Path.Combine(BaseFolder, "sensor.data");
+            XmlHelper.SerializeToXml(path, datasource);
+        }
+
+        private void DoRefresh()
+        {
+            ShowMask(() =>
+            {
+                Dispatcher.BeginInvoke(new Action(() =>
+                {
+                    LoadSensorData();
+                    RefreshSensorControl(needRead);
+                }));
+            }, (ex) =>
+            {
+                log.Error("Refresh Sensor Data Failed.", ex);
+            }, "璇风◢鍚�", "姝e湪鍔犺浇...");
+        }
+
+        private void DoDelete(SensorData data)
+        {
+            if (MsgBoxHelper2.WarnChoose("纭畾瑕佸垹闄ゅ悧?") == MessageBoxResult.OK)
+            {
+                var index = Datasource.IndexOf(data);
+                if (index >= 0)
+                {
+                    Datasource.RemoveAt(index);
+                    SaveDatasouce(Datasource);
+                    DoRefresh();
+                }
+            }
+        }
+
+        private void Button_Click(object sender, System.Windows.RoutedEventArgs e)
+        {
+            var btn = sender as Button;
+            var tag = btn?.Tag;
+            switch (btn?.Name)
+            {
+                case "addBtn":
+                    OpenDataModal(new SensorData());
+                    break;
+                case "rfhBtn":
+                    DoRefresh();
+                    break;
+                case "editBtn":
+                    OpenDataModal((SensorData)tag);
+                    break;
+                case "delBtn":
+                    DoDelete((SensorData)tag);
+                    break;
+                case "connectAllBtn":
+                    ConnectAllSensor();
+                    break;
+                case "disConnectAllBtn":
+                    DisconnectAllSensor();
+                    break;
+                case "exportBtn":
+                    DoExport();
+                    break;
+                case "importBtn":
+                    DoImport();
+                    break;
+                case "burnInSettingBtn":
+                    OpenBurnSettingModal();
+                    break;
+                default:
+                    break;
+            }
+        }
+
+        [ObservableProperty]
+        private ObservableCollection<PLCTagData> burnInSettingData;
+
+        private void LoadBurnInSetting()
+        {
+            S7Context.LoadTagData();
+            BurnInSettingData = S7Context.Datasource;
+        }
+
+        private void LoadBurnInSettingCache()
+        {
+            S7Context.LoadTagData();
+        }
+
+        private void OpenBurnSettingModal()
+        {
+            BurnInSettingModal modal = new BurnInSettingModal
+            {
+                Owner = Window.GetWindow(this)
+            };
+            if (modal.Open(BurnInSettingData) == true)
+            {
+                var datas = modal.Datasource;
+                try
+                {
+                    string path = Path.Combine(BaseFolder, "BurnInSettingData.data");
+                    XmlHelper.SerializeToXml(path, datas);
+                    BurnInSettingData = datas;
+                    LoadBurnInSettingCache();
+                }
+                catch (Exception ex)
+                {
+
+                }
+            }
+        }
+    }
+}

--
Gitblit v1.9.1