From b544d5cccd76735e034c8055918a50927b437474 Mon Sep 17 00:00:00 2001
From: wenxiangchao <wenxiangchao@ihengxin.com.cn>
Date: 星期二, 10 十一月 2026 08:29:04 +0800
Subject: [PATCH] fix: 维护模式重复进入失败与按钮灰死 + Broker 并发验证用例
---
HMI.AlermInfoManage/AlarmInfoManage.xaml.cs | 435 +++--------------------------------------------------
1 files changed, 30 insertions(+), 405 deletions(-)
diff --git a/HMI.AlermInfoManage/AlarmInfoManage.xaml.cs b/HMI.AlermInfoManage/AlarmInfoManage.xaml.cs
index 4a3ae83..02cb527 100644
--- a/HMI.AlermInfoManage/AlarmInfoManage.xaml.cs
+++ b/HMI.AlermInfoManage/AlarmInfoManage.xaml.cs
@@ -1,19 +1,15 @@
-锘縰sing HMI.AlarmInfoManage.Entity;
-using HMI.Base;
-using HMI.Core.Api;
-using HMI.Core.Setting;
+锘縰sing HMI.Base;
+using HMI.Core.Entity;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
+using HMI.Util.Alarm;
using Microsoft.Win32;
-using S7Driver;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Data;
using System.IO;
-using System.Linq;
-using System.Timers;
using System.Windows;
using System.Windows.Controls;
@@ -24,120 +20,17 @@
/// </summary>
public partial class AlarmInfoManage : PluginControl
{
- private string blockPath;
- private string markPath;
private string alarmTextPath;
-
-
- private volatile bool isClosing = false;
private string dbPath;
- private bool isHaveAlarm;
- private bool isNewAlarm;
-
private SqliteHelper sqliteHelper;
-
- private Timer MonitorTimer;
- private Timer PcTimer;
-
- /// <summary>
- /// pc璀﹀憡鏁板瓧淇″彿
- /// </summary>
- private int isPcAlarmnumber = 0;
-
- /// <summary>
- /// 褰撳墠鎶ヨ淇℃伅
- /// </summary>
- private string currentInfo = null;
-
- /// <summary>
- /// 鎺ユ敹鎶ヨ鐨勯槦鍒�
- /// </summary>
- private MSMQHelper alarmQueue = new MSMQHelper("HMI_Alarm");
- /// <summary>
- /// 鏃ュ織鐢熸垚鍣�
- /// </summary>
- private MSMQHelper loggeralarm = new MSMQHelper("LTHMI_Logger");
- /// <summary>
- /// 鍒锋柊鎶ヨ鐨勯槦鍒�
- /// </summary>
- private MSMQHelper alarmRefershToMain = new MSMQHelper("LTHMI_Alarm_Rrfresh");
//private string opcIP = "127.0.0.1";
//private int opcPort = 6543;
//private int localPort = 18888;
//private SCADAApi lTSCADAApi = new OPCClient();
-
- private PLCS7Driver pLCS7Driver;
-
- /// <summary>
- /// 鎶ヨ
- /// </summary>
- private byte[] alarmCodeBytes;
- /// <summary>
- /// 鎶ヨ淇℃伅缂撳瓨
- /// </summary>
- private List<AlarmText> currentAlarmCachePlc = new List<AlarmText>();
- /// <summary>
- /// PLC鎶ヨ淇℃伅缂撳瓨
- /// </summary>
- private List<AlarmText> preAlarmCachePlc = new List<AlarmText>();
- /// <summary>
- /// 鎶ヨ淇℃伅缂撳瓨
- /// </summary>
- private List<AlarmText> currentAlarmCachePc = new List<AlarmText>();
-
- /// <summary>
- /// 浠g爜绠$悊
- /// </summary>
- private ObservableCollection<AlarmSetting> blockAlarmSettings = new ObservableCollection<AlarmSetting>();
-
- public ObservableCollection<AlarmSetting> BlockAlarmSettings
- {
- get => blockAlarmSettings;
- set
- {
- blockAlarmSettings = value;
- RefreshBlockCache();
- }
- }
- private Dictionary<string, Dictionary<string, string>> BlockMap = new Dictionary<string, Dictionary<string, string>>();
- private Dictionary<string, string> BlockReadCache = new Dictionary<string, string>();
-
- private void RefreshBlockCache()
- {
- BlockMap.Clear();
- BlockReadCache.Clear();
- if (BlockAlarmSettings == null || BlockAlarmSettings.Count <= 0)
- {
- return;
- }
- foreach (var setting in BlockAlarmSettings)
- {
- string key = $"{setting.DBAddress}.{setting.StartAddress}";
- if (!BlockMap.ContainsKey(key))
- {
- BlockMap[key] = new Dictionary<string, string>();
- }
- var codes = BlockMap[key];
- codes[setting.AlarmCode] = setting.Description;
- }
- }
-
- // <summary>
- /// 鏍囧織浣嶆姤璀︾鐞�
- /// </summary>
- private ObservableCollection<AlarmSetting> markAlarmSetting = new ObservableCollection<AlarmSetting>();
-
- /// <summary>
- /// 浼犺嚦涓荤獥浣撶殑鎶ヨ淇℃伅
- /// </summary>
- private List<AlarmText> currentAlarmCachePlcToMain = new List<AlarmText>();
-
- //private AlarmText alarm;
- private SystemSetting systemSetting;
private ObservableCollection<AlarmText> datasource = new ObservableCollection<AlarmText>();
@@ -156,8 +49,6 @@
get { return alarmTexts; }
set { Set(ref alarmTexts, value); }
}
-
- public Dictionary<string, AlarmText> textMap = new Dictionary<string, AlarmText>();
private double size = 30;
@@ -185,8 +76,6 @@
public AlarmInfoManage()
{
DataContext = this;
- systemSetting = SystemSetting.Instance;
- pLCS7Driver = new PLCS7Driver(systemSetting.PlcIp, systemSetting.PlcPort);
InitializeComponent();
}
@@ -195,9 +84,6 @@
base.SetBaseFolder(folder);
dbPath = Path.Combine(BaseFolder, "alarm.db");
alarmTextPath = Path.Combine(BaseFolder, "AlarmText.data");
-
- blockPath = Path.Combine(BaseFolder, "BlockSetting.xml");
- markPath = Path.Combine(BaseFolder, "MarkSetting.xml");
}
public override void InitFinish()
@@ -214,14 +100,9 @@
alarminfo TEXT,
time DATETIME);");
- LoadAlarmSetting();
LoadAlarmText();
- MonitorTimer = new Timer
- {
- Interval = 1000,
- };
- MonitorTimer.Elapsed += MonitorTimer_Elapsed;
+ AlarmUtil.OnAlarm += AlarmUtil_OnAlarm;
//if (!lTSCADAApi.Connect2(opcIP, opcPort, localPort, out string errMsg))
//{
//}
@@ -229,33 +110,26 @@
//{
// this.MonitorTimer.Start();
//}
-
- if (pLCS7Driver.Connect(out string errMSg))
- {
- this.MonitorTimer.Start();
- }
- else
- {
- log.Error($"PLC Driver Connect Error. {errMSg}");
- }
-
- PcTimer = new Timer
- {
- Interval = 1000,
- AutoReset = false
- };
- PcTimer.Elapsed += PcTimer_Elapsed;
- PcTimer.Enabled = true;
}
- public override void DoClose(object sender, EventArgs e)
+ private void AlarmUtil_OnAlarm(object sender, List<AlarmText> e)
{
- isClosing = true;
- PcTimer.Enabled = false;
- PcTimer?.Dispose();
-
- MonitorTimer.Enabled = false;
- MonitorTimer?.Dispose();
+ foreach (AlarmText alarm in e)
+ {
+ var sql = string.Empty;
+ if (alarm.IsPLCAlarm)
+ {
+ var currentInfo = alarm.AlarmInfo;
+ sql = string.Format("INSERT INTO Alarm (source, alarmcode, alarminfo, time) VALUES('{0}','{1}','{2}','{3}');",
+ alarm.Source, alarm.AlarmCode, currentInfo, alarm.Time);
+ }
+ else
+ {
+ sql = string.Format("INSERT INTO Alarm (source, alarmcode, alarminfo, time) VALUES('{0}','{1}','{2}','{3}');",
+ alarm.Source, alarm.AlarmCode, alarm.AlarmInfo, alarm.Time);
+ }
+ sqliteHelper.ExecuteSql(sql);
+ }
}
private void Button_Click(object sender, RoutedEventArgs e)
@@ -280,13 +154,11 @@
private void OpenSettingWindow()
{
- AlarmSettingList listModal = new AlarmSettingList(blockPath, markPath, BlockAlarmSettings, markAlarmSetting, log)
+ AlarmSettingList listModal = new AlarmSettingList(log)
{
Owner = Window.GetWindow(this)
};
listModal.ShowDialog();
- BlockAlarmSettings = listModal.Datasource;
- markAlarmSetting = listModal.MarkDatasource;
}
private void RefreshPage(int? page = null)
@@ -443,40 +315,19 @@
{
try
{
- textMap.Clear();
- AlarmTexts = XmlHelper.DeserializeFromXml<ObservableCollection<AlarmText>>(alarmTextPath);
- foreach (var text in AlarmTexts)
+ if (string.IsNullOrEmpty(alarmTextPath) || !File.Exists(alarmTextPath))
{
- textMap[text.AlarmCode] = text;
+ AlarmTexts = new ObservableCollection<AlarmText>();
+ }
+ else
+ {
+ AlarmTexts = XmlHelper.DeserializeFromXml<ObservableCollection<AlarmText>>(alarmTextPath);
}
}
catch (Exception ex)
{
log.Error("LoadAlarmText Error.", ex);
AlarmTexts = new ObservableCollection<AlarmText>();
- }
- }
-
- private void LoadAlarmSetting()
- {
- try
- {
- BlockAlarmSettings = XmlHelper.DeserializeFromXml<ObservableCollection<AlarmSetting>>(blockPath);
- }
- catch (Exception ex)
- {
- log.Error("LoadAlarmSetting Error.", ex);
- BlockAlarmSettings = new ObservableCollection<AlarmSetting>();
- }
-
- try
- {
- markAlarmSetting = XmlHelper.DeserializeFromXml<ObservableCollection<AlarmSetting>>(markPath);
- }
- catch (Exception ex)
- {
- log.Error("LoadAlarmText Error.", ex);
- markAlarmSetting = new ObservableCollection<AlarmSetting>();
}
}
@@ -493,77 +344,9 @@
Loaded -= UserControl_Loaded;
}
- private void PcTimer_Elapsed(object sender, ElapsedEventArgs e)
+ public override void DoClose(object sender, EventArgs e)
{
- try
- {
- PcTimer.Enabled = false;
- this.alarmQueue.Receive(100, out string MessageID, out string MsgStr);
- if (MessageID != string.Empty)
- {
- switch (MessageID)
- {
- case "Clear":
- this.currentAlarmCachePc.Clear();
- this.RefershAlarm();
- break;
- case "AlarmCode":
- AlarmText aalarm = AlarmTexts.FirstOrDefault(alarm => alarm.AlarmCode == MsgStr);
- if (aalarm == null) break;
- var data = new AlarmText
- {
- Source = "PC",
- AlarmCode = aalarm.AlarmCode,
- AlarmInfo = aalarm.MAlarmText_CN,
- Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
- };
- //aalarm.Source = "PC";
- //aalarm.Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
- if (this.currentAlarmCachePc.Find(alarm => alarm.AlarmCode == aalarm.AlarmCode) == null)
- {
- this.currentAlarmCachePc.Add(data);
- this.RefershAlarm();
- this.isPcAlarmnumber = this.currentAlarmCachePc.Count;
- }
- break;
- default:
- string[] arr = MsgStr.Split(',');
- string source = "PC";
- string info = string.Empty;
- if (arr.Length > 1)
- {
- source = arr[0];
- info = arr[1];
- }
- else
- {
- info = MsgStr;
- }
- AlarmText newAlarm = new AlarmText
- {
- Source = source,
- AlarmInfo = info,
- Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")
- };
- if (this.currentAlarmCachePc
- .Find(alarm => alarm.Source == newAlarm.Source && alarm.AlarmInfo == newAlarm.AlarmInfo) == null)
- {
- this.currentAlarmCachePc.Add(newAlarm);
- this.RefershAlarm();
- this.isPcAlarmnumber = this.currentAlarmCachePc.Count;
- }
- break;
- }
- }
- }
- catch (Exception ex)
- {
- log.Error("PcTimer Execute Failed", ex);
- }
- finally
- {
- if (!isClosing) PcTimer.Enabled = true;
- }
+ // AlarmUtil.OnAlarm -= AlarmUtil_OnAlarm;
}
//private void MonitorTimer_Elapsed_bak(object sender, ElapsedEventArgs e)
@@ -637,163 +420,5 @@
// this.MonitorTimer.Enabled = true;
// }
//}
-
- /// <summary>
- /// PLC鎶ヨ璇诲彇
- /// </summary>
- /// <param name="sender"></param>
- /// <param name="e"></param>
- private void MonitorTimer_Elapsed(object sender, ElapsedEventArgs e)
- {
- try
- {
- this.MonitorTimer.Enabled = false;
-
- /// 妫�鏌ヨ繛鎺�
- //if (!lTSCADAApi.IsConnected(out string errMsg))
- //{
- // log.Warn($"OPCServer Connection Error. {errMsg}");
- // if (!lTSCADAApi.Connect2(opcIP, opcPort, localPort, out errMsg))
- // {
- // log.Warn($"OPCServer Try ReConnection Error. {errMsg}");
- // return;
- // }
- //}
-
- isHaveAlarm = false;
- List<AlarmText> cache = new List<AlarmText>();
- //foreach (var item in BlockAlarmSettings)
- //{
- // var name = $"{item.DBAddress}.{item.StartAddress}";
- // if (lTSCADAApi.DoFctReadSingle(name, out string alarmCode, out errMsg) && alarmCode != "0")
- // {
- // isHaveAlarm = true;
- // if (!textMap.TryGetValue(alarmCode, out alarm)) {
- // continue;
- // }
- // var newAlarm = new AlarmText
- // {
- // Source = "PLC",
- // AlarmCode = alarm.AlarmCode,
- // ModuleName_CN = alarm.ModuleName_CN,
- // MAlarmText_CN = alarm.MAlarmText_CN,
- // Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
- // AlarmInfo = $"{alarm.ModuleName_CN} {alarm.MAlarmText_CN}"
- // };
- // if (this.currentAlarmCachePlc
- // .Find(alarm => alarm.AlarmCode == newAlarm.AlarmCode) == null)
- // {
- // this.currentAlarmCachePlc.Add(newAlarm);
- // }
- // }
- //}
-
- foreach (var key in BlockMap.Keys)
- {
- if (pLCS7Driver.ReadShort(key, out short alarmVal, out string errMsg) && BlockMap[key].ContainsKey(alarmVal.ToString()))
- {
- //if(BlockReadCache.ContainsKey(key) && alarmCode)
- var alarmCode = alarmVal.ToString();
- isHaveAlarm = true;
- var text = BlockMap[key][alarmCode];
- var newAlarm = new AlarmText
- {
- PLC_DB_BLOCK = key,
- Source = "PLC",
- AlarmCode = alarmCode,
- ModuleName_CN = text,
- MAlarmText_CN = text,
- Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
- AlarmInfo = $"{alarmCode} {text}"
- };
- if (this.currentAlarmCachePlc
- .Find(alarm => alarm.AlarmCode == newAlarm.AlarmCode && alarm.PLC_DB_BLOCK == newAlarm.PLC_DB_BLOCK) == null)
- {
- this.currentAlarmCachePlc.Add(newAlarm);
- }
- }
- }
-
- foreach (var item in markAlarmSetting)
- {
- var name = $"{item.DBAddress}.{item.StartAddress}";
- if (pLCS7Driver.ReadShort(name, out short alarmVal, out string errMsg) && alarmVal != 0)
- {
- var alarmCode = alarmVal.ToString();
- isHaveAlarm = true;
- var newAlarm = new AlarmText
- {
- Source = "PLC",
- AlarmCode = alarmCode,
- Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"),
- AlarmInfo = item.Description
- };
- if (this.currentAlarmCachePlc
- .Find(d => d.AlarmInfo == newAlarm.AlarmInfo) == null)
- {
- this.currentAlarmCachePlc.Add(newAlarm);
- }
- }
- }
- this.RefershAlarm();
- this.isPcAlarmnumber = this.currentAlarmCachePc.Count;
-
- if (!isHaveAlarm) currentAlarmCachePlc.Clear();
- }
- catch (Exception ex)
- {
- log.Error("Read OPCServer Data Error.", ex);
- }
- finally
- {
- if (!isClosing) this.MonitorTimer.Enabled = true;
- }
- }
-
- /// <summary>
- /// 鍒锋柊鎶ヨ鍧椾俊鎭�
- /// </summary>
- private void RefreshDBSetting()
- {
- List<byte> bytes = new List<byte>();
- foreach (var item in BlockAlarmSettings)
- {
- //byte[] itemalarmCodeBytes = this.plc.Simens_S7_ReadBytes_DB("DB", item.DBAddress, item.StartAddress, item.Length);
- //bytes.AddRange(itemalarmCodeBytes.ToList());
- }
- alarmCodeBytes = bytes.ToArray();
- }
-
-
-
- /// <summary>
- /// 鍒锋柊鎶ヨ淇℃伅
- /// </summary>
- private void RefershAlarm()
- {
- this.alarmRefershToMain.Send("AlarmRefersh", string.Empty);
-
- foreach (AlarmText alarm in this.currentAlarmCachePlc)
- {
- var currentInfo = alarm.AlarmInfo;
- string sqladd = string.Format("INSERT INTO Alarm (source, alarmcode, alarminfo, time) VALUES('{0}','{1}','{2}','{3}');",
- alarm.Source, alarm.AlarmCode, currentInfo, alarm.Time);
- if (AlarmShowHelper.ShowAlarm(currentInfo))
- {
- sqliteHelper.ExecuteSql(sqladd);
- }
- }
- //this.currentAlarmCachePlc.Clear();
-
- foreach (AlarmText alarm in this.currentAlarmCachePc)
- {
- string sqladd2 = string.Format("INSERT INTO Alarm (source, alarmcode, alarminfo, time) VALUES('{0}','{1}','{2}','{3}');", alarm.Source, alarm.AlarmCode, alarm.AlarmInfo, alarm.Time);
- if (AlarmShowHelper.ShowAlarm(alarm.AlarmInfo))
- {
- sqliteHelper.ExecuteSql(sqladd2);
- }
- }
- this.currentAlarmCachePc.Clear();
- }
}
}
--
Gitblit v1.9.1