using System; using System.Collections.Generic; using System.IO; using CRVM.Entity; using System.Threading; using System.Threading.Tasks; using System.Data; namespace CRVM.CIDExcuter { public class IDataHelper { protected Machine mac; protected StreamWriter fileTxtOriginalWriter, fileTxtEnergyWriter; protected BinaryWriter fileBitOriginalWriter; private string saveFileName; private string savePathOrigin; private string savePathEnergy; private string savePathAlarm; Dictionary allDefectData = new Dictionary(); Dictionary defectMaxEnergyValue = new Dictionary(); public IDataHelper(Machine mac) { this.mac = mac; } //创建文件 public void CreateFileHead() { string temppath = SysParam.Instance.savePath + "\\" + DateTime.Now.ToString("yyyyMMdd") + "\\"; savePathAlarm = temppath + "AlarmInfo" + DateTime.Now.ToString("yyyyMMdd") + ".txt"; saveFileName = DateTime.Now.ToString("yyyyMMddHHmmss"); if (!Directory.Exists(temppath)) { Directory.CreateDirectory(temppath + "original data\\"); Directory.CreateDirectory(temppath + "energy data\\"); } Console.WriteLine(DateTime.Now.ToString("HH:mm:ss fff") + " CreateFileHead 0"); if (SysParam.Instance.checkTXT) { savePathOrigin = temppath + "original data\\" + saveFileName + ".txt"; fileTxtOriginalWriter = new StreamWriter(new FileStream(savePathOrigin, FileMode.OpenOrCreate)); fileTxtOriginalWriter.WriteLine("原始数据"); for (int i = 0; i < SysParam.Instance.channelCount; i++) { fileTxtOriginalWriter.Write((i + 1) + "#机架振动" + "\t"); } fileTxtOriginalWriter.WriteLine(); fileTxtOriginalWriter.WriteLine(SysParam.Instance.sampleFre); fileTxtOriginalWriter.WriteLine(SysParam.Instance.samplePoint); } else if (SysParam.Instance.checkBIT) { savePathOrigin = temppath + "original data\\" + saveFileName + ".dat"; fileBitOriginalWriter = new BinaryWriter(new FileStream(savePathOrigin, FileMode.OpenOrCreate)); Console.WriteLine(DateTime.Now.ToString("HH:mm:ss fff") + " CreateFileHead 1"); fileBitOriginalWriter.Write("原始数据"); for (int i = 0; i < SysParam.Instance.channelCount; i++) { fileBitOriginalWriter.Write((i + 1) + "#机架振动"); } fileBitOriginalWriter.Write("/r/n"); fileBitOriginalWriter.Write(Convert.ToSingle(SysParam.Instance.sampleFre)); fileBitOriginalWriter.Write(Convert.ToSingle(SysParam.Instance.samplePoint)); } Console.WriteLine(DateTime.Now.ToString("HH:mm:ss fff") + " CreateFileHead 2"); savePathEnergy = temppath + "energy data\\" + saveFileName + ".txt"; fileTxtEnergyWriter = new StreamWriter(new FileStream(savePathEnergy, FileMode.OpenOrCreate)); //能量数据 string tempStr = ""; for (int i = 0; i < SysParam.Instance.channelCount; i++) { tempStr = tempStr + (i + 1) + "#机架,"; } tempStr = tempStr.Substring(0, tempStr.Length - 1) + "能量数据\r\n"; tempStr = tempStr + "采样点数:" + SysParam.Instance.samplePoint + ";采样频率(Hz):" + SysParam.Instance.sampleFre + "\r\n"; int istandno = 0; for (int i = 0; i < SysParam.Instance.channelCount; i++) { istandno++; tempStr = tempStr + istandno + "#机架轧制速度" + "\t" + istandno + "#机架全局" + "\t" + istandno + "#机架低频" + "\t" + istandno + "#机架中频" + "\t" + istandno + "#机架高频" + "\t" + istandno + "#机架低频报警值" + "\t" + istandno + "#机架中频报警值" + "\t" + istandno + "#机架高频报警值" + "\t"; } fileTxtEnergyWriter.WriteLine(tempStr); Console.WriteLine(DateTime.Now.ToString("HH:mm:ss fff") + " CreateFileHead 3"); SysParam.Instance.fileCreated = true; } //采集数据写入文件 public virtual void writeNew(int dataCount) { //Console.WriteLine(DateTime.Now.ToString("HH:mm:ss fff") + " " + Thread.CurrentThread.ManagedThreadId + " " + Thread.CurrentThread.IsThreadPoolThread); //原始数据 //int dataCount = data.GetLength(1); if (SysParam.Instance.checkBIT) { fileBitOriginalWriter.Write(Convert.ToSingle(1111)); for (int i = 0; i < dataCount; i++) { for (int k = 0; k < SysParam.Instance.channelCount; k++) { fileBitOriginalWriter.Write(Convert.ToSingle(mac.Stand[k].vib[i])); } } for (int k = 0; k < SysParam.Instance.SpeedChannelCount; k++) { fileBitOriginalWriter.Write(Convert.ToSingle(mac.Stand[k].speed)); } fileBitOriginalWriter.Write(Convert.ToSingle(mac.stripLength)); } else if (SysParam.Instance.checkTXT) { for (int i = 0; i < dataCount; i++) { for (int k = 0; k < SysParam.Instance.channelCount; k++) { fileTxtOriginalWriter.Write((mac.Stand[k].vib[i]).ToString("e6") + "\t"); } fileTxtOriginalWriter.WriteLine(); //new line of data (start next scan); } for (int k = 0; k < 5; k++) { fileTxtOriginalWriter.Write(mac.Stand[k].speed.ToString("e6") + "\t"); } fileTxtOriginalWriter.WriteLine(mac.stripLength.ToString("e6")); } for (int k = 0; k < SysParam.Instance.channelCount; k++) { fileTxtEnergyWriter.Write(mac.Stand[k].speed.ToString("e6") + "\t" + mac.Stand[k].energy_All.ToString("e6") + "\t" + mac.Stand[k].energy_L.ToString("e6") + "\t" + mac.Stand[k].energy_M.ToString("e6") + "\t" + mac.Stand[k].energy_H.ToString("e6") + "\t" + mac.Stand[k].alarm_L_Value_ck.ToString("e6") + "\t" + mac.Stand[k].alarm_M_Value_ck.ToString("e6") + "\t" + mac.Stand[k].alarm_H_Value_ck.ToString("e6") + "\t"); } fileTxtEnergyWriter.WriteLine(); } /// /// 文件写入关闭,写报警日志并更新数据库 /// /// 文件结束标志:0=超时,1=剪切,2=手动关闭 /// 写报警日志所需报警信息 /// 钢卷剪切长度 public virtual void CloseFile(int endFlag, List alarmInfo, int cutLength, int defectflag, Dictionary allDefectData, Dictionary defectMaxEnergyValue) { //关闭文件流 if (SysParam.Instance.fileCreated)////连续执行两次closefile函数会造成不能向已关闭的文件中写 { if (SysParam.Instance.checkTXT) { fileTxtOriginalWriter.Close(); } else if (SysParam.Instance.checkBIT) { fileBitOriginalWriter.Write(Convert.ToSingle(111111111)); fileBitOriginalWriter.Close(); } fileTxtEnergyWriter.Close(); } SysParam.Instance.fileCreated = false; string[] tempAlarmInfo = alarmInfo.ToArray(); string savePathOriginTemp = this.savePathOrigin; string savePathEnergyTemp = this.savePathEnergy; new Task(() => WriteAlarmInfo(endFlag, tempAlarmInfo, cutLength, savePathOriginTemp, savePathEnergyTemp, defectflag)).Start(); if (allDefectData.Keys.Count > 0) { DbHelper.GetInstance("").recordLocalDefectData(allDefectData, defectMaxEnergyValue); } } private void WriteAlarmInfo(int endFlag, string[] alarmInfo, int cutLength, string savePathOrigin, string savePathEnergy, int defectflag) { int alarmstate = 0;//无报警 //写报警日志 if (alarmInfo.Length > 0) { alarmstate = 1;//有报警 string alarmlog = ""; for (int i = 0; i < alarmInfo.Length; i++) { alarmlog = alarmlog + alarmInfo[i] + Environment.NewLine; } //结束时再空两行以区分不同钢卷 alarmlog = alarmlog + Environment.NewLine + Environment.NewLine; File.AppendAllText(savePathAlarm, alarmlog); } //数据库写入钢卷文件信息 DbHelper.GetInstance("").AddNewCoilInfo(alarmstate, endFlag, savePathOrigin, savePathEnergy, cutLength.ToString(), defectflag); //数据库写入报警信息 if (alarmstate == 1) { AlarmInfoInsertDb(); } } private void AlarmInfoInsertDb() { //报警信息合并 List start = new List(); List end = new List(); List value = new List(); List standNo = new List(); List alarmType = new List(); for (int k = 0; k < SysParam.Instance.SpeedChannelCount; k++) { for (int i = 0; i < mac.Stand[k].indexLow; i++) { start.Add(mac.Stand[k].alarmLowInfo[i].startPos); end.Add(mac.Stand[k].alarmLowInfo[i].endPos); value.Add(mac.Stand[k].alarmLowInfo[i].value); standNo.Add(k); alarmType.Add(0); } mac.Stand[k].indexLow = 0; mac.Stand[k].alarmLowInfo.Clear(); for (int i = 0; i < mac.Stand[k].indexMid; i++) { start.Add(mac.Stand[k].alarmMidInfo[i].startPos); end.Add(mac.Stand[k].alarmMidInfo[i].endPos); value.Add(mac.Stand[k].alarmMidInfo[i].value); standNo.Add(k); alarmType.Add(1); } mac.Stand[k].indexMid = 0; mac.Stand[k].alarmMidInfo.Clear(); for (int i = 0; i < mac.Stand[k].indexHigh; i++) { start.Add(mac.Stand[k].alarmHighInfo[i].startPos); end.Add(mac.Stand[k].alarmHighInfo[i].endPos); value.Add(mac.Stand[k].alarmHighInfo[i].value); standNo.Add(k); alarmType.Add(2); } mac.Stand[k].indexHigh = 0; mac.Stand[k].alarmHighInfo.Clear(); } DbHelper.GetInstance("").InsertAlarmInfo(start.ToArray(), end.ToArray(), standNo.ToArray(), alarmType.ToArray(), value.ToArray()); } } }