using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; using Serilog; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Data; using System.Data.SqlClient; using System.Linq; using System.Threading.Tasks; using System.Windows.Threading; using WPFWCSDemo.Common; using WPFWCSDemo.Data; using WPFWCSDemo.Models.Tables; using WPFWCSDemo.StateCode; using WPFWCSDemo.Utilities; using WPFWCSDemo.Utilities.Table; namespace WPFWCSDemo.ViewModels { public partial class AlarmViewModel : ObservableObject { /// /// 用于报警的定时器 /// private DispatcherTimer dispatcherTimer; /// /// 查询操作停止刷新页面标志 true-查询操作后停止刷新 false-正常定时刷新 /// bool b; public AlarmViewModel() { Alarm = new ObservableCollection(); b = false; //AlarmInitialize(); LoadAlarm(); //Task.Run(() => AlarmMonitorAsync()); // 设置定时器属性 dispatcherTimer = new DispatcherTimer(); dispatcherTimer.Interval = TimeSpan.FromSeconds(2); // 设置时间间隔1秒 dispatcherTimer.Tick += AlarmDispatcherTimer_Tick; // 添加事件处理程序 dispatcherTimer.Start(); // 启动计时器 } static Dictionary alarms = new Dictionary(); /// /// 实时表数据 /// [ObservableProperty] ObservableCollection _alarm; /// /// 报警级别选中项 /// [ObservableProperty] int _alarmLevelSelectedIndex; /// /// 报警级别选中项 /// [ObservableProperty] int _alarmLevelSelectedItem; string alarmLevel; /// /// 查询关键词 /// [ObservableProperty] string _keywords; private void AlarmDispatcherTimer_Tick(object? sender, EventArgs e) { RealTimeAlarm(); if (!b) { LoadAlarm(); } } /// /// 加载表数据 /// [RelayCommand] void LoadAlarm() { using var context = new AppDbContext(); var alarms = context.Set() .OrderBy(t => t.Gen_Time) .ToList(); Alarm.Clear(); if (alarms is null || alarms.Count == 0) return; foreach (var alarm in alarms) { Alarm.Add(alarm); } } /// /// 切换优先级筛选报警 /// [RelayCommand] void AlarmLevelSelectItemChanged() { Alarm.Clear(); DataTable? dt; if (AlarmLevelSelectedIndex == 0) alarmLevel = "HIGH"; if (AlarmLevelSelectedIndex == 1) alarmLevel = "MEDIUM"; if (AlarmLevelSelectedIndex == 2) alarmLevel = "LOW"; if (string.IsNullOrEmpty(Keywords)) { dt = SqlHelper.ExecuteTable( "SELECT POINT_ID,DESCRIPTION,PRIORITY,DEVICE_ID,GEN_TIME FROM ALARM WHERE PRIORITY=@Priority", new SqlParameter("@Priority", alarmLevel)); } else { dt = SqlHelper.ExecuteTable( "SELECT POINT_ID,DESCRIPTION,PRIORITY,DEVICE_ID,GEN_TIME FROM ALARM WHERE PRIORITY=@Priority AND DESCRIPTION LIKE @Keywords", new SqlParameter("@Priority", alarmLevel), new SqlParameter("@Keywords", $"%{Keywords}%"));//此处代表如果未填写关键词则忽略该条件 } var datas = dt.Rows; //遍历表中每行数据并初始化值 foreach (DataRow data in datas) { Alarm a = new Alarm(); a.Point_Id = data["Point_Id"].ToString(); a.Description = data["Description"].ToString(); a.Priority = data["Priority"].ToString(); a.Device_Id = data["Device_Id"].ToString(); a.Gen_Time = Convert.ToDateTime(data["Gen_Time"]); Alarm.Add(a); } LoadAlarm(); b = true; } /// /// 查询 /// [RelayCommand] void Query() { Alarm.Clear(); DataTable? dt; if (!string.IsNullOrEmpty(Keywords)) { dt = SqlHelper.ExecuteTable( $"SELECT * FROM ALARM WHERE DESCRIPTION like @Keywords ORDER BY Gen_Time DESC", new SqlParameter("@Keywords", $"%{Keywords}%")); } else { dt = SqlHelper.ExecuteTable("SELECT * FROM ALARM"); } var datas = dt.Rows; foreach (DataRow data in datas) { Alarm a = new Alarm(); a.Point_Id = data["Point_Id"].ToString(); a.Description = data["Description"].ToString(); a.Priority = data["Priority"].ToString(); a.Device_Id = data["Device_Id"].ToString(); try { a.Gen_Time = Convert.ToDateTime(data["Gen_Time"]); } catch { } Alarm.Add(a); } b = true; } /// /// 重置选择 /// [RelayCommand] void Clear() { Keywords = string.Empty; Alarm.Clear(); LoadAlarm(); b = false; } /// /// 触发报警-显示在报警表中 /// public static void RealTimeAlarm() { AlarmTrigger("DB622.0.2", false); AlarmTrigger("DB622.8.1", false); AlarmTrigger("DB622.10.1", false); AlarmTrigger("DB622.2.2", false); AlarmTrigger("DB622.2.3", false); AlarmTrigger("DB622.6.1", false); AlarmTrigger("DB622.0.1", false); AlarmTrigger("DB622.2.1", false); for (int i = 1; i <= RGVStation.RGVCount; i++) { AlarmTrigger($"DB" + (300 + i) + ".24.0", true); AlarmTrigger($"DB" + (300 + i) + ".24.1", true); AlarmTrigger($"DB" + (300 + i) + ".24.2", true); AlarmTrigger($"DB" + (300 + i) + ".24.3", true); AlarmTrigger($"DB" + (300 + i) + ".24.4", true); AlarmTrigger($"DB" + (300 + i) + ".24.5", true); AlarmTrigger($"DB" + (300 + i) + ".24.6", true); AlarmTrigger($"DB" + (300 + i) + ".25.0", true); AlarmTrigger($"DB" + (300 + i) + ".25.1", true); AlarmTrigger($"DB" + (300 + i) + ".25.2", true); AlarmTrigger($"DB" + (300 + i) + ".25.3", true); AlarmTrigger($"DB" + (300 + i) + ".25.4", true); AlarmTrigger($"DB" + (300 + i) + ".25.5", true); AlarmTrigger($"DB" + (300 + i) + ".25.6", true); AlarmTrigger($"DB" + (300 + i) + ".25.7", true); } AlarmTrigger($"DB500.1.0", true); AlarmTrigger($"DB500.1.1", true); AlarmTrigger($"DB500.1.2", true); AlarmTrigger($"DB500.1.3", true); } /// /// 实时报警触发(读PLC地址) /// /// 报警地址 /// 报警触发值:true-正常触发(0-正常 1-报警) false-取反触发(0-报警 1-正常) public static void AlarmTrigger(string address, bool b) { try { //正常触发 即true-报警 false-正常 if (b) { if (CircleRGVsViewModel.Instance.GetStationConnection().ReadBool(address).Content) { int result = AlarmManager.Insert(alarms[address]); if (result == 1 && alarms[address].Priority=="HIGH") { Log.Warning($"【报警信息】触发{alarms[address].Description}"); } } else { int result = AlarmManager.Delete(alarms[address]); if (result == 1 && alarms[address].Priority == "HIGH") { Log.Warning($"【报警信息】{alarms[address].Description}已复位"); } } } //取反触发 即true-正常 false-触发 else { if (!CircleRGVsViewModel.Instance.GetStationConnection().ReadBool(address).Content) { int result = AlarmManager.Insert(alarms[address]); if (result == 1 && alarms[address].Priority == "HIGH") { Log.Warning($"【报警信息】触发{alarms[address].Description}"); } } else { int result = AlarmManager.Delete(alarms[address]); if (result == 1 && alarms[address].Priority == "HIGH") { Log.Warning($"【报警信息】{alarms[address].Description}已复位"); } } } } catch (Exception) { } } /// /// 实时报警触发(自定义报警) /// /// /// 报警触发值:true-正常触发(0-正常 1-报警) false-取反触发(0-报警 1-正常) public void AlarmTrigger(bool b) { try { //正常触发 即true-报警 false-正常 //if (b) //{ // if (CircleRGVsViewModel.stationConnection.ReadBool(address).Content) // { // int result = AlarmManager.Insert(alarms[address]); // if (result == 1 && alarms[address].Priority == "HIGH") // { // Log.Warning($"【报警信息】触发{alarms[address].Description}"); // } // } // else // { // int result = AlarmManager.Delete(alarms[address]); // if (result == 1 && alarms[address].Priority == "HIGH") // { // Log.Warning($"【报警信息】{alarms[address].Description}已复位"); // } // } //} ////取反触发 即true-正常 false-触发 //else //{ // if (!CircleRGVsViewModel.stationConnection.ReadBool(address).Content) // { // int result = AlarmManager.Insert(alarms[address]); // if (result == 1 && alarms[address].Priority == "HIGH") // { // Log.Warning($"【报警信息】触发{alarms[address].Description}"); // } // } // else // { // int result = AlarmManager.Delete(alarms[address]); // if (result == 1 && alarms[address].Priority == "HIGH") // { // Log.Warning($"【报警信息】{alarms[address].Description}已复位"); // } // } //} } catch (Exception) { } } /// /// 将某条报警添加到集合中在表中显示,若该集合中已存在当前报警,则不执行 /// /// 报警对象 public static void AlarmInitialize() { alarms.Clear(); //alarms.Add("DB610.64.0", new Alarm() { Point_Id = "AlarmTest", Description = "报警功能测试", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add("DB622.0.2", new Alarm() { Point_Id = "Conv_Alarm1", Description = "无法下发任务-1001供实垛输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" }); alarms.Add("DB622.8.1", new Alarm() { Point_Id = "Conv_Alarm2", Description = "无法下发任务-1003供实垛/1004放空托输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" }); alarms.Add("DB622.10.1", new Alarm() { Point_Id = "Conv_Alarm3", Description = "无法下发任务-1005供实垛输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" }); alarms.Add("DB622.2.2", new Alarm() { Point_Id = "Conv_Alarm4", Description = "无法下发任务-1007放实垛输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" }); alarms.Add("DB622.2.3", new Alarm() { Point_Id = "Conv_Alarm5", Description = "无法下发任务-1008放实垛输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" }); alarms.Add("DB622.6.1", new Alarm() { Point_Id = "Conv_Alarm6", Description = "无法下发任务-1013供空托输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" }); alarms.Add("DB622.0.1", new Alarm() { Point_Id = "Conv_Alarm7", Description = "无法下发任务-1002放空托输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" }); //alarms.Add("DB622.8.1", new Alarm() { Point_Id = "Conv_Alarm6", Description = "无法下发任务-1004供空托输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" }); alarms.Add("DB622.2.1", new Alarm() { Point_Id = "Conv_Alarm8", Description = "无法下发任务-1006放空托输送机系统异常", Device_Id = "输送线", Priority = "MEDIUM" }); for (int i = 1; i <= RGVStation.RGVCount; i++) { alarms.Add($"DB" + (300 + i) + ".25.0", new Alarm() { Point_Id = $"RGV{i}_Alarm1", Description = $"{i}#环穿 急停触发", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".25.1", new Alarm() { Point_Id = $"RGV{i}_Alarm2", Description = $"{i}#环穿 运行变频报警", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".25.2", new Alarm() { Point_Id = $"RGV{i}_Alarm3", Description = $"{i}#环穿 输送变频报警", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".25.3", new Alarm() { Point_Id = $"RGV{i}_Alarm4", Description = $"{i}#环穿 取货超时", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".25.4", new Alarm() { Point_Id = $"RGV{i}_Alarm5", Description = $"{i}#环穿 放货超时", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".25.5", new Alarm() { Point_Id = $"RGV{i}_Alarm6", Description = $"{i}#环穿 BPS出错", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".25.6", new Alarm() { Point_Id = $"RGV{i}_Alarm7", Description = $"{i}#环穿 输送超时", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".25.7", new Alarm() { Point_Id = $"RGV{i}_Alarm8", Description = $"{i}#环穿 安全门打开", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".24.0", new Alarm() { Point_Id = $"RGV{i}_Alarm9", Description = $"{i}#环穿 输送机超界", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".24.1", new Alarm() { Point_Id = $"RGV{i}_Alarm10", Description = $"{i}#环穿 货物探测状态异常", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".24.2", new Alarm() { Point_Id = $"RGV{i}_Alarm11", Description = $"{i}#环穿 防撞触发", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".24.3", new Alarm() { Point_Id = $"RGV{i}_Alarm12", Description = $"{i}#环穿 触边保护", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".24.4", new Alarm() { Point_Id = $"RGV{i}_Alarm13", Description = $"{i}#环穿 倾斜检测触发", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".24.5", new Alarm() { Point_Id = $"RGV{i}_Alarm14", Description = $"{i}#环穿 维修小车移位", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".24.6", new Alarm() { Point_Id = $"RGV{i}_Alarm15", Description = $"{i}#环穿 卡阻标志", Device_Id = "环穿", Priority = "HIGH" }); alarms.Add($"DB" + (300 + i) + ".24.7", new Alarm() { Point_Id = $"RGV{i}_Alarm16", Description = $"{i}#环穿 安全光栅触发", Device_Id = "环穿", Priority = "HIGH" }); } //alarms.Add($"DB500.1.0", new Alarm() { Point_Id = $"Conv_A_Alarm1", Description = $"实垛A线 下发任务超时", Device_Id = "系统", Priority = "HIGH" }); //alarms.Add($"DB500.1.1", new Alarm() { Point_Id = $"Conv_B_Alarm1", Description = $"实垛B线 下发任务超时", Device_Id = "系统", Priority = "HIGH" }); //alarms.Add($"DB500.1.2", new Alarm() { Point_Id = $"Conv_C_Alarm1", Description = $"实垛C线 下发任务超时", Device_Id = "系统", Priority = "HIGH" }); //alarms.Add($"DB500.1.3", new Alarm() { Point_Id = $"Conv_D_Alarm1", Description = $"实垛D线 下发任务超时", Device_Id = "系统", Priority = "HIGH" }); } } }