CRVM-redis-6/RestApi/BoxData.cs
2025-11-07 02:02:31 +08:00

474 lines
13 KiB
C#
Raw Permalink 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 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;
}
}
}