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