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