Files
FT479/WPFWCSDemo/ViewModels/AlarmViewModel.cs
2026-06-29 14:46:32 +08:00

456 lines
18 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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
{
/// <summary>
/// 用于报警的定时器
/// </summary>
private DispatcherTimer dispatcherTimer;
/// <summary>
/// 查询操作停止刷新页面标志 true-查询操作后停止刷新 false-正常定时刷新
/// </summary>
bool b;
public AlarmViewModel()
{
Alarm = new ObservableCollection<Alarm>();
b = false;
//AlarmInitialize();
LoadAlarm();
//Task.Run(() => AlarmMonitorAsync());
// 设置定时器属性
dispatcherTimer = new DispatcherTimer();
dispatcherTimer.Interval = TimeSpan.FromSeconds(2); // 设置时间间隔1秒
dispatcherTimer.Tick += AlarmDispatcherTimer_Tick; // 添加事件处理程序
dispatcherTimer.Start(); // 启动计时器
}
static Dictionary<string, Alarm> alarms = new Dictionary<string, Alarm>();
/// <summary>
/// 实时表数据
/// </summary>
[ObservableProperty]
ObservableCollection<Alarm> _alarm;
/// <summary>
/// 报警级别选中项
/// </summary>
[ObservableProperty]
int _alarmLevelSelectedIndex;
/// <summary>
/// 报警级别选中项
/// </summary>
[ObservableProperty]
int _alarmLevelSelectedItem;
string alarmLevel;
/// <summary>
/// 查询关键词
/// </summary>
[ObservableProperty]
string _keywords;
private void AlarmDispatcherTimer_Tick(object? sender, EventArgs e)
{
RealTimeAlarm();
if (!b)
{
LoadAlarm();
}
}
/// <summary>
/// 加载表数据
/// </summary>
[RelayCommand]
void LoadAlarm()
{
using var context = new AppDbContext();
var alarms = context.Set<Alarm>()
.OrderBy(t => t.Gen_Time)
.ToList();
Alarm.Clear();
if (alarms is null || alarms.Count == 0) return;
foreach (var alarm in alarms)
{
Alarm.Add(alarm);
}
}
/// <summary>
/// 切换优先级筛选报警
/// </summary>
[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;
}
/// <summary>
/// 查询
/// </summary>
[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;
}
/// <summary>
/// 重置选择
/// </summary>
[RelayCommand]
void Clear()
{
Keywords = string.Empty;
Alarm.Clear();
LoadAlarm();
b = false;
}
/// <summary>
/// 触发报警-显示在报警表中
/// </summary>
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);
}
/// <summary>
/// 实时报警触发(读PLC地址)
/// </summary>
/// <param name="address">报警地址</param>
/// <param name="b">报警触发值:true-正常触发(0-正常 1-报警) false-取反触发(0-报警 1-正常)</param>
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)
{
}
}
/// <summary>
/// 实时报警触发(自定义报警)
/// </summary>
/// <param name="address"></param>
/// <param name="b">报警触发值:true-正常触发(0-正常 1-报警) false-取反触发(0-报警 1-正常)</param>
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)
{
}
}
/// <summary>
/// 将某条报警添加到集合中在表中显示,若该集合中已存在当前报警,则不执行
/// </summary>
/// <param name="alarm">报警对象</param>
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" });
}
}
}