using ScottPlot;
using SWRIS.Enums;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Net.Sockets;
using System.Threading.Tasks;
using System.Windows;
namespace SWRIS.Models
{
public class EquipmentDataModel : INotifyPropertyChanged
{
private int ropeNumber;
private string ropeName;
private string ipAddress;
private string serialNo;
private bool isConnect = false;
private int sensorCount = 4;
private double liftHightRatio = 1;
private double ropeLength = 100f; // 默认长度为100米
private RunningStatus runningStatus = RunningStatus.Stopped;
private DirectionState direction;
private FaultType? faultType;
private double speed;
private double position;
private double absolutePosition;
private double liftHeight;
private double maxDamageValue;
private double avgDamageValue;
private int damageCount;
private int mildCount;
private int lightCount;
private int moderateCount;
private int severeCount;
private int criticalCount;
private int extremeCount;
private DetectionDataModel detectionData;
private RiskLevel riskLevel = RiskLevel.Normal;
private Socket clientSocket;
private double samplingStep;
private DebugMessageModel debugMessage = new DebugMessageModel(string.Empty);
private bool isAlerting = false;
private bool isSpeedStable = true;
private double variationThreshold = 0.25;
private bool isHeartbeatReceived;
private uint detectionNo;
private bool disableAlarm;
private int[] inUseSensor = new int[] { 1, 2, 3, 4 };
///
/// 钢丝绳绳号
///
public int RopeNumber
{
get => ropeNumber;
set { ropeNumber = value; OnPropertyChanged(nameof(RopeNumber)); }
}
///
/// 钢丝绳名称
///
public string RopeName
{
get => ropeName;
set { ropeName = value; OnPropertyChanged(nameof(RopeName)); }
}
///
/// 设备Ip地址
///
public string IpAddress
{
get => ipAddress;
set { ipAddress = value; OnPropertyChanged(nameof(IpAddress)); }
}
///
/// 设备序列号
///
public string SerialNo
{
get => serialNo;
set { serialNo = value; OnPropertyChanged(nameof(SerialNo)); }
}
///
/// 连接状态
///
public bool IsConnect
{
get => isConnect;
set { isConnect = value; OnPropertyChanged(nameof(IsConnect)); }
}
///
/// 传感器数量
///
public int SensorCount
{
get => sensorCount;
set { sensorCount = value; OnPropertyChanged(nameof(SensorCount)); }
}
///
/// 钢丝绳绳长
///
public double RopeLength
{
get => ropeLength;
set { ropeLength = value; OnPropertyChanged(nameof(RopeLength)); }
}
public double LiftHightRatio
{
get => liftHightRatio;
set { liftHightRatio = value; OnPropertyChanged(nameof(LiftHightRatio)); }
}
///
/// 采样步长
///
public double SamplingStep
{
get => samplingStep;
set { samplingStep = value; OnPropertyChanged(nameof(SamplingStep)); }
}
///
/// 运行状态
///
public RunningStatus RunningStatus
{
get => runningStatus;
set { runningStatus = value; OnPropertyChanged(nameof(RunningStatus)); }
}
///
/// 运行方向
///
public DirectionState Direction
{
get => direction;
set { direction = value; OnPropertyChanged(nameof(Direction)); }
}
///
/// 故障类型
///
public FaultType? FaultType
{
get => faultType;
set { faultType = value; OnPropertyChanged(nameof(FaultType)); }
}
///
/// 速度
///
public double Speed
{
get => speed;
set { speed = value; OnPropertyChanged(nameof(Speed)); }
}
///
/// 速度变化率阈值
///
public double VariationThreshold
{
get => variationThreshold;
set { variationThreshold = value; OnPropertyChanged(nameof(VariationThreshold)); }
}
///
/// 速度是否稳定
///
public bool IsSpeedStable
{
get => isSpeedStable;
set { isSpeedStable = value; OnPropertyChanged(nameof(IsSpeedStable)); }
}
///
/// 位置
///
public double Position
{
get => position;
set { position = value; OnPropertyChanged(nameof(Position)); }
}
///
/// 绝对位置
///
public double AbsolutePosition
{
get => absolutePosition;
set { absolutePosition = value; OnPropertyChanged(nameof(AbsolutePosition)); }
}
///
/// 起升高度
///
public double LiftHeight
{
get => liftHeight;
set { liftHeight = value; OnPropertyChanged(nameof(LiftHeight)); }
}
///
/// 健康程度
///
public RiskLevel RiskLevel
{
get => riskLevel;
set { riskLevel = value; OnPropertyChanged(nameof(RiskLevel)); }
}
///
/// 平均损伤值
///
public double AvgDamageValue
{
get => avgDamageValue;
set { avgDamageValue = value; OnPropertyChanged(nameof(AvgDamageValue)); }
}
///
/// 最大损伤值
///
public double MaxDamageValue
{
get => maxDamageValue;
set { maxDamageValue = value; OnPropertyChanged(nameof(MaxDamageValue)); }
}
///
/// 损伤报警数量
///
public int DamageCount
{
get => damageCount;
set { damageCount = value; OnPropertyChanged(nameof(DamageCount)); }
}
///
/// 轻微损伤数量
///
public int MildCount
{
get => mildCount;
set { mildCount = value; OnPropertyChanged(nameof(MildCount)); }
}
///
/// 轻度损伤数量
///
public int LightCount
{
get => lightCount;
set { lightCount = value; OnPropertyChanged(nameof(LightCount)); }
}
///
/// 中度损伤数量
///
public int ModerateCount
{
get => moderateCount;
set { moderateCount = value; OnPropertyChanged(nameof(ModerateCount)); }
}
///
/// 较重损伤数量
///
public int SevereCount
{
get => severeCount;
set { severeCount = value; OnPropertyChanged(nameof(SevereCount)); }
}
///
/// 严重损伤数量
///
public int CriticalCount
{
get => criticalCount;
set { criticalCount = value; OnPropertyChanged(nameof(CriticalCount)); }
}
///
/// 超限损伤数量
///
public int ExtremeCount
{
get => extremeCount;
set { extremeCount = value; OnPropertyChanged(nameof(ExtremeCount)); }
}
///
/// 最后一次的检测数据
///
public DetectionDataModel DetectionData
{
get => detectionData;
set { detectionData = value; OnPropertyChanged(nameof(DetectionData)); }
}
///
/// 调试信息
///
public DebugMessageModel DebugMessage
{
get => debugMessage;
set { debugMessage = value; OnPropertyChanged(nameof(DebugMessage)); }
}
///
/// TCP 客户端
///
public Socket ClientSocket
{
get => clientSocket;
set { clientSocket = value; OnPropertyChanged(nameof(ClientSocket)); }
}
///
/// 是否报警中
///
public bool IsAlerting
{
get => isAlerting;
set { isAlerting = value; OnPropertyChanged(nameof(IsAlerting)); }
}
public bool IsHeartbeatReceived
{
get => isHeartbeatReceived;
set
{
isHeartbeatReceived = value;
OnPropertyChanged(nameof(IsHeartbeatReceived));
if (value)
{
// 延迟一段时间后重置,以便动画可以重复触发
Task.Delay(600).ContinueWith(_ =>
{
Application.Current.Dispatcher.Invoke(() =>
{
IsHeartbeatReceived = false;
});
});
}
}
}
///
/// 检测编号
///
public uint DetectionNo
{
get => detectionNo;
set { detectionNo = value; OnPropertyChanged(nameof(DetectionNo)); }
}
///
/// 禁用报警
///
public bool DisableAlarm
{
get => disableAlarm;
set { disableAlarm = value; OnPropertyChanged(nameof(DisableAlarm)); }
}
///
/// 在用传感器
///
public int[] InUseSensor
{
get => inUseSensor;
set { inUseSensor = value; OnPropertyChanged(nameof(InUseSensor)); }
}
public ObservableCollection Alarms { get; set; } = new ObservableCollection();
public ObservableCollection Faults { get; set; } = new ObservableCollection();
public ObservableCollection Limits { get; set; } = new ObservableCollection();
public ObservableCollection Messages { get; set; } = new ObservableCollection();
public Coordinates[] ChartSource { get; internal set; }
public Queue RecentSpeeds { get; internal set; } = new Queue();
public void AddSpeedData(double speed)
{
// 更新数据窗口
RecentSpeeds.Enqueue(speed);
if (RecentSpeeds.Count > 3)
RecentSpeeds.Dequeue();
if (RecentSpeeds.Count < 2)
return;
double avgSpeed = RecentSpeeds.Average();
if (avgSpeed == 0)
{
IsSpeedStable = true;
return;
}
// 计算当前速度相对于平均值的偏差
bool _isStable = (Math.Abs(speed - avgSpeed) / avgSpeed) <= VariationThreshold;
if (IsSpeedStable != _isStable)
{
IsSpeedStable = _isStable;
}
}
public void AddAlarm(AlarmDataModel alarm)
{
DamageCount++;
MaxDamageValue = alarm.DamageValue > MaxDamageValue ? alarm.DamageValue : MaxDamageValue;
AvgDamageValue = (AvgDamageValue * (DamageCount - 1) + alarm.DamageValue) / DamageCount;
switch (alarm.DamageLevel)
{
case DamageLevel.Mild:
MildCount++;
break;
case DamageLevel.Light:
LightCount++;
break;
case DamageLevel.Moderate:
ModerateCount++;
break;
case DamageLevel.Severe:
SevereCount++;
break;
case DamageLevel.Critical:
CriticalCount++;
break;
case DamageLevel.ExceededLimit:
ExtremeCount++;
break;
}
Alarms.Add(alarm);
RiskLevel = Alarms.Any() ? (RiskLevel)Alarms.Max(c => (int)c.DamageLevel) : RiskLevel.Normal;
IsAlerting = true;
Task.Run(() =>
{
Task.Delay(3000).Wait();
IsAlerting = false;
});
}
public void ClearData()
{
Speed = 0;
MaxDamageValue = 0;
AvgDamageValue = 0;
DamageCount = 0;
MildCount = 0;
LightCount = 0;
ModerateCount = 0;
SevereCount = 0;
CriticalCount = 0;
ExtremeCount = 0;
ChartSource = null;
RiskLevel = RiskLevel.Normal;
DetectionNo += 1;
Application.Current.Dispatcher.Invoke(() => Alarms.Clear());
Task.Run(async () =>
{
// 持续监控直到条件满足
while (DetectionData?.RawDataReceiving == true)
{
await Task.Delay(100); // 避免CPU占用过高
}
// 条件满足时执行
DetectionData = null;
});
}
public event PropertyChangedEventHandler PropertyChanged;
protected internal virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
}