CRVM-redis-6/RestApi/BoxData.cs

474 lines
13 KiB
C#
Raw Normal View History

2025-11-07 02:02:31 +08:00
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.Serialization;
namespace RestApi
{
public class CustomDateTimeConverter : IsoDateTimeConverter
{
public CustomDateTimeConverter()
{
DateTimeFormat = "yyyy-MM-dd HH:mm:ss.fff"; // 可覆盖默认ISO格式
}
}
/// <summary>
/// 最新的5分钟轧机振动能量
/// </summary>
public class EnergyTrend
{
[DataMember]
public double[] energyValues { get; set; }
[DataMember]
public double[] energyThreshold { get; set; }
public static readonly int dataLenth = 1500;
public EnergyTrend()
{
energyValues = new double[dataLenth];
energyThreshold = new double[dataLenth];
}
}
public class CZState
{
[DataMember]
public bool[] values { get; set; }
[DataMember]
public string[] names { get; set; }
public CZState()
{
values = new bool[2] { false, false };
names = new string[2] { "CZ02", "CZ03" };
}
public void initData(bool[] values, string[] names)
{
this.values = values;
this.names = names;
}
}
public class RMVibData
{
[DataMember]
public double[] vib_data { get; set; }
public static readonly int dataLenth = 1024;//采样点数
public RMVibData()
{
vib_data = new double[dataLenth];
}
}
public class StandRMVibData
{
[DataMember]
public RMVibData F1;
[DataMember]
public RMVibData F2;
[DataMember]
public RMVibData F3;
[DataMember]
public RMVibData F4;
[DataMember]
public RMVibData F5;
[DataMember]
public RMVibData F6;
[DataMember]
public int flag;
//[JsonConverter(typeof(CustomDateTimeConverter))]
//public DateTime nowTime { set; get; }
public StandRMVibData()
{
F1 = new RMVibData();
F2 = new RMVibData();
F3 = new RMVibData();
F4 = new RMVibData();
F5 = new RMVibData();
F6 = new RMVibData();
flag = 0;
}
public StandRMVibData(RMVibData[] rmVibData)
{
if (rmVibData.Length != 6)
{
return;
}
F1 = rmVibData[0];
F2 = rmVibData[1];
F3 = rmVibData[2];
F4 = rmVibData[3];
F5 = rmVibData[4];
F6 = rmVibData[5];
// nowTime = DateTime.Now;
}
public bool BindData(RMVibData[] rmVibData)
{
if (rmVibData.Length != 6)
{
return false;
}
F1 = rmVibData[0];
F2 = rmVibData[1];
F3 = rmVibData[2];
F4 = rmVibData[3];
F5 = rmVibData[4];
F6 = rmVibData[5];
// nowTime = DateTime.Now;
return true;
}
public RMVibData[] ToArray()
{
return new RMVibData[] { F1, F2, F3, F4, F5, F6 };
}
}
public class RollMillEnergyTrend
{
public EnergyTrend F1 { set; get; }
public EnergyTrend F2 { set; get; }
public EnergyTrend F3 { set; get; }
public EnergyTrend F4 { set; get; }
public EnergyTrend F5 { set; get; }
public EnergyTrend F6 { set; get; }
public int startIndex { set; get; }
public RollMillEnergyTrend()
{
F1 = new EnergyTrend();
F2 = new EnergyTrend();
F3 = new EnergyTrend();
F4 = new EnergyTrend();
F5 = new EnergyTrend();
F6 = new EnergyTrend();
startIndex = 0;
}
public void updateData(double[] energyValues, double[] energyThreshold)
{
F1.energyValues[startIndex] = energyValues[0];
F2.energyValues[startIndex] = energyValues[1];
F3.energyValues[startIndex] = energyValues[2];
F4.energyValues[startIndex] = energyValues[3];
F5.energyValues[startIndex] = energyValues[4];
F6.energyValues[startIndex] = energyValues[5];
F1.energyThreshold[startIndex] = energyThreshold[0];
F2.energyThreshold[startIndex] = energyThreshold[1];
F3.energyThreshold[startIndex] = energyThreshold[2];
F4.energyThreshold[startIndex] = energyThreshold[3];
F5.energyThreshold[startIndex] = energyThreshold[4];
F6.energyThreshold[startIndex] = energyThreshold[5];
startIndex++;
startIndex = startIndex % EnergyTrend.dataLenth;
}
}
public class BoxData
{
//最小的数据 包括点位名称,数据值,各数据点的报警水平,总体报警水平
[DataMember]
public string[] names { get; set; }
[DataMember]
public double[] values { get; set; }
[DataMember]
public int[] levels { get; set; }
[DataMember]
public int level { get; set; }
[DataMember]
public double[] alarmValues { get; set; }
[DataMember]
public double[] faultValues { get; set; }
public void update_data(double[] rvalues, double[] rvaluesL, double[] rvalueH)
{
try
{
int data_size = rvalues.Length;
int l = 0;
for (int i = 0; i < data_size; i++)
{
values[i] = rvalues[i];
alarmValues[i] = rvaluesL[i];
faultValues[i] = rvalueH[i];
levels[i] = rvalues[i] < rvaluesL[i] ? 0 : (rvalues[i] < rvalueH[i] ? 1 : 2);
l = Math.Max(l, levels[i]);
}
level = l;
}
catch (Exception ex)
{
throw new Exception("|BoxData|update_data|ERROR| " + ex.Message + "StackTrace:" + ex.StackTrace);
}
}
public BoxData copy()
{
return new BoxData
{
names = (string[])this.names.Clone(),
values = (double[])this.values.Clone(),
levels = (int[])this.levels.Clone(),
level = this.level,
alarmValues = (double[])this.alarmValues.Clone(),
faultValues = (double[])this.faultValues.Clone()
};
}
public BoxData SortDes(int max_indexi)
{
int max_index = Math.Min(max_indexi, this.values.Length);
if (max_indexi <= 0)
{
max_index = this.values.Length;
}
//Dictionary<int, int> dic = new Dictionary<int, int>();
Dictionary<int, double> dic = new Dictionary<int, double>();
for (int i = 0; i < this.values.Length; i++)
{
dic.Add(i, this.values[i]);
}
dic = dic.OrderByDescending(o => o.Value).ToDictionary(p => p.Key, o => o.Value);
string[] names = new string[max_index];
int[] levels = new int[max_index];
int level = 0;
double[] values = new double[max_index];
double[] alarmValues = new double[max_index];
double[] faultValues = new double[max_index];
int index = 0;
foreach (var item in dic)
{
names[index] = this.names[item.Key];
values[index] = this.values[item.Key];
levels[index] = this.levels[item.Key];
level = Math.Max(level, levels[index]);
alarmValues[index] = this.alarmValues[item.Key];
faultValues[index] = this.faultValues[item.Key];
index = index + 1;
if (index >= max_index)
{
return new BoxData
{
names = (string[])names.Clone(),
values = (double[])values.Clone(),
levels = (int[])levels.Clone(),
level = level,
alarmValues = (double[])alarmValues.Clone(),
faultValues = (double[])faultValues.Clone()
};
}
}
return this;
}
}
public class StandAlarmState
{
[DataMember]
public bool[,] standAlarmState;
public bool[] stdIsAlarm { set; get; }
private int[,] standAlarmTimes;
private bool lastState;
private bool nowState;
private readonly int falseTimesMin = 3;
public StandAlarmState()
{
standAlarmState = new bool[6, 3];
standAlarmTimes = new int[6, 3];
stdIsAlarm = new bool[6] { false, false, false, false, false, false };
for (int i = 0; i < 6; i++)
{
for (int j = 0; j < 3; j++)
{
standAlarmState[i, j] = false;
standAlarmTimes[i, j] = 0;
}
}
}
public void update(bool[,] standAlarmStateP)
{
for (int i = 0; i < 6; i++)
{
bool flag = false;
for (int j = 0; j < 3; j++)
{
lastState = standAlarmState[i, j];
nowState = standAlarmStateP[i, j];
//下降沿 延迟 standAlarmTimes[j, i]次
if (lastState == true && nowState == false)
{
standAlarmTimes[i, j]++;
if (standAlarmTimes[i, j] >= falseTimesMin)
{
standAlarmState[i, j] = nowState;
}
}
else
{
standAlarmState[i, j] = nowState;
standAlarmTimes[i, j] = 0;
}
flag = flag || standAlarmState[i, j];
}
stdIsAlarm[i] = flag;
}
}
}
/// <summary>
/// 报警信息
/// </summary>
public class AlarmInfo
{
public AlarmInfo()
{
message = "无报警";
level = 0;
outLetStripLenth = 0;
outLetStripLenthName = "卷取长度";
isAlarm = false;
//stdNo = 0;
stdIsAlarm = new bool[6] { false, false, false, false, false, false };
standAlarmState = new StandAlarmState();
standAlarmStates = new bool[6, 3];
standAlarmStates = standAlarmState.standAlarmState;
stdIsAlarm = standAlarmState.stdIsAlarm;
}
[IgnoreDataMember]
public StandAlarmState standAlarmState { get; set; }
[DataMember]
public string message { set; get; }
[DataMember]
public int level { set; get; }
[DataMember]
public bool isAlarm { set; get; }
[DataMember]
//public int stdNo { set; get; }
public bool[] stdIsAlarm { set; get; }
[DataMember]
public bool[,] standAlarmStates { set; get; }
[DataMember]
public double outLetStripLenth { get; set; }
[DataMember]
public string outLetStripLenthName { set; get; }
public void reset()
{
message = "无报警";
level = 0;
outLetStripLenth = 0;
isAlarm = false;
//stdNo = 0;
for (int i = 0; i < 6; i++)
{
stdIsAlarm[i] = false;
}
}
public void update(string alarmInfo, int stdNo, string alarmType, bool[,] defectflag)
{
message = alarmInfo;
int indexF = alarmType == "低频" ? 0 : (alarmType == "中频" ? 1 : 2);
level = defectflag[stdNo, indexF] == true ? 2 : 1;
//this.stdNo = stdNo + 1;
}
public void update(string alarmInfo, bool defectflag)
{
message = alarmInfo;
level = defectflag == true ? 2 : 1;
}
}
public class RollMillData
{
[DataMember]
public BoxData F1 { get; set; }
[DataMember]
public BoxData F2 { get; set; }
[DataMember]
public BoxData F3 { get; set; }
[DataMember]
public BoxData F4 { get; set; }
[DataMember]
public BoxData F5 { get; set; }
[DataMember]
public BoxData F6 { get; set; }
[DataMember]
public AlarmInfo AF { get; set; }
//[JsonConverter(typeof(CustomDateTimeConverter))]
//public DateTime nowTime { set; get; }
public RollMillData() { }
public RollMillData(BoxData[] box_data_array)
{
F1 = box_data_array[0];
F2 = box_data_array[1];
F3 = box_data_array[2];
F4 = box_data_array[3];
F5 = box_data_array[4];
F6 = box_data_array[5];
AF = new AlarmInfo();
// nowTime = DateTime.Now;
}
}
}