using System;
using System.Drawing;
using System.Runtime.Serialization;
using System.Text.RegularExpressions;
using System.Collections.Generic;
namespace CRVM.Entity
{
[DataContract]
public class SysParam
{
//构造函数定义为私有,只能从内部构造,防止外部直接通过new操作符构造一个新的实例
private static SysParam _intance = null;
[DataMember]
public static SysParam Instance
{
get
{
if (_intance == null)
_intance = new SysParam();
return _intance;
}
}
private SysParam()
{
_channel = new EntityChannel[_channelCount];
for (int i = 0; i < _channelCount; i++)
{
EntityChannel ch = new EntityChannel();
_channel[i] = ch;
}
}
private EntityChannel[] _channel;
public EntityChannel[] channel
{
get { return _channel; }
set { _channel = value; }
}
private readonly int _channelCount = 8;
///
/// 总采集通道数量
///
[DataMember]
public int channelCount
{
get { return _channelCount; }
}
//private readonly int _SpeedChannelCount = 5;
private readonly int _SpeedChannelCount = 6;
///
/// 速度通道数
///
[DataMember]
public int SpeedChannelCount
{
get { return _SpeedChannelCount; }
}
///
/// 采样点数
///
public int samplePoint { get; set; }
///
/// 采样频率
///
public int sampleFre { get; set; }
///
/// 能量曲线对应显示宽度的数据点数,默认为300秒宽度。
///
public int energyPoints
{
get
{
if (samplePoint > 0)
return Convert.ToInt32(300 * sampleFre / samplePoint);
else
return 1500;
}
}
///
/// 实时采集时,所显示的时域波形宽度范围对应的数据点数,默认为1秒宽度。
///
public int timePoints
{
get
{
if (sampleFre > 0)
return sampleFre;
else
return 5120;
}
}
///
/// 板形辊每个脉冲代表的轧制距离,单位:mm_Per_pulse
///
public double distanceSens { get; set; }
///
/// 数据处理是否完成
///
public bool isDatahandlered { get; set; }
public bool isL2Connected { get; set; }//系统是否能正常连接到L2数据库
#region 数据查询设置
public DateTime searchStartTime { get; set; }//数据查询开始时间
public DateTime searchEndTime { get; set; }//数据查询结束时间
public bool searchAlarmChecked { get; set; }//数据查询报警选中
#endregion
public int OrigDataNum { get; set; }
public string appPath { get; set; }
public string IP { get; set; }
public int Port { get; set; }
#region 文件存储参数
public string savePath { get; set; }
public bool checkTXT { get; set; }//文本
public bool checkBIT { get; set; }//二进制
public int saveDaysAlarm { get; set; }
public int saveDaysNoAlarm { get; set; }
public bool isFileCleared { get; set; }
public bool filePrepared { get; set; }
public bool fileCreated { get; set; }
#endregion
#region 显示参数
public bool BackgroundGridOn { get; set; }
public bool rollLineVisible { get; set; }
public int fontSize { get; set; }
public Color colorTime { get; set; }
public Color colorFre { get; set; }
public Color colorEnergy { get; set; }
public Color colorSpeed { get; set; }
public Color colorAlarm { get; set; }
public Color colorDefect { get; set; }
public Color colorCut { get; set; }
public Color colorWorkRoll { get; set; }
public Color colorMidRoll { get; set; }
public Color colorBackupRoll { get; set; }
public Color colorBackgroud { get; set; }
public Color colorFont { get; set; }
#endregion
#region 图表显示控制
//时域图
public bool checkBoxTime { get; set; }
public bool checkBoxTimeAll { get; set; }
public string comboBoxTimeAll { get; set; }
public bool checkBoxTimeL { get; set; }
public string comboBoxTimeL { get; set; }
public bool checkBoxTimeM { get; set; }
public string comboBoxTimeM { get; set; }
public bool checkBoxTimeH { get; set; }
public string comboBoxTimeH { get; set; }
public bool checkBoxTimeFre { get; set; }
public string comboBoxTimeFre { get; set; }
public bool checkBoxTimeFilt { get; set; }
public string ComboBoxTimeFilt { get; set; }
public string textBoxf1 { get; set; }
public string textBoxf2 { get; set; }
//能量图
public bool checkBoxEnergy { get; set; }
public bool checkBoxEnergyAll { get; set; }
public string comboBoxEnergyAll { get; set; }
public bool checkBoxEnergyL { get; set; }
public string comboBoxEnergyL { get; set; }
public bool checkBoxEnergyM { get; set; }
public string comboBoxEnergyM { get; set; }
public bool checkBoxEnergyH { get; set; }
public string comboBoxEnergyH { get; set; }
public bool checkBoxEnergySpeed { get; set; }
public string comboBoxEnergySpeed { get; set; }
//排列方式
public bool orderByChannel { get; set; }
public bool orderBySingleColumn { get; set; }
public bool orderByStandnoR2L { get; set; }//轧机出口在左侧
public bool orderByStandnoL2R { get; set; }//轧机出口在右侧
public bool orderByOther { get; set; }//不按机架排列
#endregion
#region 带通滤波、傅立叶算法
public double[] filterAlgor(double[] array, int f1, int f2, int n, int m, int fs)
{
int i, j;
double x, aa, fl, fh, w;
double[] b = new double[200];// { };
int xlen = n;
//float[] filt = new float[xlen] { };
double[] filt = new double[xlen];
aa = Math.PI / m;
fl = 2 * Math.PI * f1 / fs;
fh = 2 * Math.PI * f2 / fs;
w = 2 * Math.PI;
for (j = 1; j < m; j++)
{
b[j] = (1 + Math.Cos(aa * j)) * (Math.Sin(fh * j) - Math.Sin(fl * j)) / (w * j);
}
for (i = 0; i < n; i++)
{
x = (2 * (fh - fl) / w) * array[i];
//是否为循环卷积
for (j = 0; j < m; j++)
{
try
{
if ((j + i) < n)
x += b[j] * array[j + i];
if ((i - j) > 0)
x += b[j] * array[i - j];
}
catch (Exception exp)
{
string s = "i=" + i + ",j=" + j + exp.Message;
}
}
filt[i] = x;
}
return filt;
}
public int N2M(int n)
{
int x = 2;
int num = 0;
while (x <= n)
{
x = 2 * x;
num++;
}
return num;
}
public void FFT(double[] AR, double[] AI, int N, int ni)
{
int i, j, k, L, M, IP, LE, L1, N1, N2;
double SN, TR, TI, WR, WI, UR, UI, US;
M = N2M(N);
N = Convert.ToInt32(Math.Pow(2, M));
N2 = N / 2;
N1 = N - 1;
SN = ni;
j = 1;
i = 1;
while (i <= N1)
{
if (i < j)
{
TR = AR[j - 1];
AR[j - 1] = AR[i - 1];
AR[i - 1] = TR;
TI = AI[j - 1];
AI[j - 1] = AI[i - 1];
AI[i - 1] = TI;
}
k = N2;
while (k < j)
{
j = j - k;
k = k / 2;
}
j = j + k;
i++;
}
L = 1;
while (L <= M)
{
LE = Convert.ToInt32(Math.Pow(2, L));
L1 = LE / 2;
UR = 1.0f;
UI = 0.0f;
WR = Math.Cos(Math.PI / L1);
WI = SN * Math.Sin(Math.PI / L1);
j = 1;
while (j <= L1)
{
i = j;
while (i <= N)
{
IP = i + L1;
TR = AR[IP - 1] * UR - AI[IP - 1] * UI;
TI = AI[IP - 1] * UR + AR[IP - 1] * UI;
AR[IP - 1] = AR[i - 1] - TR;
AI[IP - 1] = AI[i - 1] - TI;
AR[i - 1] = AR[i - 1] + TR;
AI[i - 1] = AI[i - 1] + TI;
i += LE;
}
US = UR;
UR = US * WR - UI * WI;
UI = UI * WR + US * WI;
j++;
}
L++;
}
if (SN == -1)
{
i = 1;
while (i <= N)
{
AR[i - 1] = AR[i - 1] / N;
AI[i - 1] = AI[i - 1] / N;
i++;
}
}
}
public double[] newFFT(double[] AR, double[] AI, int N)
{
int i, j, k, L, M, IP, LE, L1, N2;
double SN, TR, TI, WR, WI, UR, UI, US;
M = N2M(N);
N = Convert.ToInt32(Math.Pow(2, M));
N2 = N / 2;
SN = 1;
j = 1;
i = 1;
while (i < N)
{
if (i < j)
{
TR = AR[j - 1];
AR[j - 1] = AR[i - 1];
AR[i - 1] = TR;
TI = AI[j - 1];
AI[j - 1] = AI[i - 1];
AI[i - 1] = TI;
}
k = N2;
while (k < j)
{
j = j - k;
k = k / 2;
}
j = j + k;
i++;
}
L = 1;
while (L <= M)
{
LE = Convert.ToInt32(Math.Pow(2, L));
L1 = LE / 2;
UR = 1;
UI = 0;
WR = Math.Cos(Math.PI / L1);
WI = SN * Math.Sin(Math.PI / L1);
j = 1;
while (j <= L1)
{
i = j;
while (i <= N)
{
IP = i + L1;
TR = AR[IP - 1] * UR - AI[IP - 1] * UI;
TI = AI[IP - 1] * UR + AR[IP - 1] * UI;
AR[IP - 1] = AR[i - 1] - TR;
AI[IP - 1] = AI[i - 1] - TI;
AR[i - 1] = AR[i - 1] + TR;
AI[i - 1] = AI[i - 1] + TI;
i += LE;
}
US = UR;
UR = US * WR - UI * WI;
UI = UI * WR + US * WI;
j++;
}
L++;
}
double[] temp = new double[N / 2];
for (i = 0; i < N / 2; i++)
{
temp[i] = 2 * Math.Sqrt(AR[i] * AR[i] + AI[i] * AI[i]) / N;
}
return temp;
//if (SN == -1)
//{
// i = 1;
// while (i <= N)
// {
// AR[i - 1] = AR[i - 1] / N;
// AI[i - 1] = AI[i - 1] / N;
// i++;
// }
//}
}
public bool DataIsMatch(string str, string pattern)
{
Regex reg = new Regex(pattern);
if (reg.IsMatch(str))
{
return true;
}
else
{
return false;
}
}
#endregion
public string reTimeSpan { get; set; }
public int reSampleFre { get; set; }
public int reSamplePoint { get; set; }
public double rollDiameterBU
{
get { return 1.2230; }
}
public double rollDiameterBL
{
get { return 1.2230; }
}
public double rollDiameterMU
{
get { return 0.5363; }
}
public double rollDiameterML
{
get { return 0.5363; }
}
public double rollDiameterWU
{
get { return 0.4040; }
}
public double rollDiameterWL
{
get { return 0.4040; }
}
public List onlineList = new List();
#region 报警铃声设置
public bool isStand1Ring { get; set; }
public bool isStand2Ring { get; set; }
public bool isStand3Ring { get; set; }
public bool isStand4Ring { get; set; }
public bool isStand5Ring { get; set; }
public bool isStand6Ring { get; set; }
public short ringFre { get; set; }
public short ringType { get; set; }
public bool alarming1 { get; set; }
public bool alarming2 { get; set; }
public bool alarming3 { get; set; }
public bool alarming4 { get; set; }
public bool alarming5 { get; set; }
public bool alarming6 { get; set; }
public int alarmingType { get; set; }//0:正常 1:设备异常 2:共振报警
public bool alarmingS1 { get; set; }//达到报警线的80%
public bool alarmingS2 { get; set; }//达到报警线的80%
public bool alarmingS3 { get; set; }//达到报警线的80%
public bool alarmingS4 { get; set; }//达到报警线的80%
public bool alarmingS5 { get; set; }//达到报警线的80%
public bool[,] ringflag = new bool[5, 3];
#endregion
public bool isOpenAlarm = false;
}
}