456 lines
18 KiB
C#
456 lines
18 KiB
C#
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" });
|
||
|
||
|
||
}
|
||
|
||
|
||
}
|
||
}
|