diff --git a/JinYuan.ControlCenter/ControlCenter.cs b/JinYuan.ControlCenter/ControlCenter.cs index e92790f..3cdf5f8 100644 --- a/JinYuan.ControlCenter/ControlCenter.cs +++ b/JinYuan.ControlCenter/ControlCenter.cs @@ -1527,56 +1527,63 @@ namespace JinYuan.ControlCenters /// List listOld = new List(); List listNew = new List(); - List listAlarmStatus = null; + //List listAlarmStatus = null; string alarmStartDate = ""; int AlarmCount = 0; string strAllAlarm = ""; bool isRead = false; + private readonly object _alarmLock = new object(); private void ShowAlarmEven_Run(string strGuidAlarm) { if (CommonMethods.IsRun && CommonMethods.plcDevice.IsConnected) { - //StringBuilder sb = new StringBuilder(); - listNew.Clear(); string Date = DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss"); JYResult resByte = CommonMethods.PlcLink.ReadValue>("D10010", Data_Type.ArrByte, 500); - if (resByte.IsSuccess && resByte != null) - { - if (resByte == null) { return; } - //如果未配置报警地址信息返回 TODO - if (listAlarmForm == null) { return; } - int startPlcAddr = 10010;//TODO 读取起始地址 - //3.公用方法解析byte[]数据 => List - if (resByte == null) { return; } //如果未配置报警地址信息返回 - //TODO 切换三菱和欧姆龙 - listAlarmStatus = PLCAlarmParseHelper.OmronFinsByte2Status(startPlcAddr, resByte.Content); - //4.判定有不良后,关联AlarmStatus 和AlarmForm - if (listAlarmStatus == null) { return; } //状态信息为空返回 - //如果有报警,获取报警信息 - if (listAlarmStatus.Any(p => p.Status)) - { - //关联表单数据和报警记录,获取报警信息 - listNew = listAlarmStatus - .Where(s => s.Status) - .Join(listAlarmForm - , s => s.PLCAdress - , f => f.PLCAdress - , (s, f) => new AlarmData() - { - AlarmGuid = strGuidAlarm, - PLCAdress = s.PLCAdress, - AlarmCode = f.AlarmCode, - AlarmContent = f.AlarmContent == "" ? s.PLCAdress : f.AlarmContent, - AlarmType = "停机报警", - AlarmDesc = f.AlarmContent == "" ? s.PLCAdress : f.AlarmContent, - AlarmState = "1", - StartTime = Date, - EndTime = Date, - Flag = 0 - }).ToList(); - } - string strAlarm = ""; + if (!resByte.IsSuccess || resByte == null || listAlarmForm == null) + { + return; + } + + int startPlcAddr = 10010; + var listAlarmStatus = PLCAlarmParseHelper.OmronFinsByte2Status(startPlcAddr, resByte.Content); + + if (listAlarmStatus == null || !listAlarmStatus.Any(p => p.Status)) + { + return; + } + + // 当前新的报警信息 + var newAlarmData = new List(); + // 当前已经消除的报警信息 + var saveAlarmData = new List(); + var listOldAlarm = new List(); + + #region 操作共享列表listNew、listOld时加锁 + lock (_alarmLock) + { + listNew.Clear(); + + //关联表单数据和报警记录,获取报警信息 + listNew = listAlarmStatus + .Where(s => s.Status) + .Join(listAlarmForm + , s => s.PLCAdress + , f => f.PLCAdress + , (s, f) => new AlarmData() + { + AlarmGuid = strGuidAlarm, + PLCAdress = s.PLCAdress, + AlarmCode = f.AlarmCode, + AlarmContent = f.AlarmContent == "" ? s.PLCAdress : f.AlarmContent, + AlarmType = "停机报警", + AlarmDesc = f.AlarmContent == "" ? s.PLCAdress : f.AlarmContent, + AlarmState = "1", + StartTime = Date, + EndTime = Date, + Flag = 0 + }).ToList(); + //添加新的报警信息 if (listNew.Count > 0) { @@ -1595,6 +1602,8 @@ namespace JinYuan.ControlCenters if (alarmLog == null) { listOld.Add(r); + newAlarmData.Add(r.Clone() as AlarmData); + //上传报警 if (CommonMethods.sysConfig.MesModeSwitching) { @@ -1614,9 +1623,6 @@ namespace JinYuan.ControlCenters CommonMethods.SlideAlarmText = strAllAlarm.Substring(0, strAllAlarm.Length - 1); } - //移除已经消除的报警信息 - var saveAlarmData = new List(); - var listOldAlarm = new List(); listOldAlarm.AddRange(listOld); if (listOldAlarm.Count > 0) { @@ -1626,55 +1632,57 @@ namespace JinYuan.ControlCenters if (alarmLog == null) { item.EndTime = Date; - saveAlarmData.Add(item); + saveAlarmData.Add(item.Clone() as AlarmData); listOld.Remove(item); } } } + } + #endregion - if (saveAlarmData.Count > 0) + if (saveAlarmData.Count > 0) + { + string strALLAlarm = ""; + //写csv文件 + var nowDate = DateTime.Now; + string basePath = $@"{CommonMethods.strAlarmLogspath}\{DateTime.Now.Year}\{DateTime.Now.Month}"; + string fileName = $@"{nowDate.Day}.csv"; + string title = "GUID,报警地址,故障代码,报警内容,开始时间,结束时间,是否停机"; + string alarmContent = string.Empty; + + List faultCodeLists = new List(); + foreach (var m in saveAlarmData) { - string strALLAlarm = ""; - //写csv文件 - var nowDate = DateTime.Now; - string basePath = $@"{CommonMethods.strAlarmLogspath}\{DateTime.Now.Year}\{DateTime.Now.Month}"; - string fileName = $@"{nowDate.Day}.csv"; - string title = "GUID,报警地址,故障代码,报警内容,开始时间,结束时间,是否停机"; - string alarmContent = string.Empty; + FaultCodeList item = new FaultCodeList(); + item.faultCode = m.AlarmCode; + faultCodeLists.Add(item); + alarmContent += $"{m.AlarmGuid},{m.PLCAdress},{m.AlarmCode},{m.AlarmContent},{m.StartTime},{m.EndTime},{m.AlarmType}\n"; + strALLAlarm += $"{m.AlarmContent},"; - List faultCodeLists = new List(); - foreach (var m in saveAlarmData) - { - FaultCodeList item = new FaultCodeList(); - item.faultCode = m.AlarmCode; - faultCodeLists.Add(item); - alarmContent += $"{m.AlarmGuid},{m.PLCAdress},{m.AlarmCode},{m.AlarmContent},{m.StartTime},{m.EndTime},{m.AlarmType}\n"; - strALLAlarm += $"{m.AlarmContent},"; - - //上传报警 - if (CommonMethods.sysConfig.MesModeSwitching) - { - //上传报警 - MESDataCombin.EquAlarm(m, 0); - } - } - - alarmContent = alarmContent.Substring(0, alarmContent.Length - 1); - CSVHelper.WriterCSV(basePath, fileName, title, alarmContent); - - // 上传消除的报警信息 + //上传报警 if (CommonMethods.sysConfig.MesModeSwitching) { - //上传设备报警状态 - MESDataCombin.EqpStatusParam("Alert", string.IsNullOrEmpty(alarmStartDate) ? Date : alarmStartDate, strGuidAlarm, faultCodeLists); + //上传报警 + MESDataCombin.EquAlarm(m, 0); } - //报警保存 - SaveAlarmCount(saveAlarmData); } + + alarmContent = alarmContent.Substring(0, alarmContent.Length - 1); + CSVHelper.WriterCSV(basePath, fileName, title, alarmContent); + + // 上传消除的报警信息 + if (CommonMethods.sysConfig.MesModeSwitching) + { + //上传设备报警状态 + MESDataCombin.EqpStatusParam("Alert", string.IsNullOrEmpty(alarmStartDate) ? Date : alarmStartDate, strGuidAlarm, faultCodeLists); + } + //报警保存 + SaveAlarmCount(saveAlarmData, newAlarmData); } } } + List safeEqptStatus = new List(); List listSafeEqptStatus = null; private void ShowSafeEqptEven_Run() @@ -1742,7 +1750,7 @@ namespace JinYuan.ControlCenters /// /// 报警保存 /// - private void SaveAlarmCount(List alarmDatas) + private void SaveAlarmCount(List alarmDatas, List newAlarmDataList) { bool ISAdd = false; var recordToUpdate = new AlarmCountEntry(); @@ -1783,7 +1791,7 @@ namespace JinYuan.ControlCenters } else { - foreach (var m in listNew) + foreach (var m in newAlarmDataList) { AlarmCountEntry alarm = new AlarmCountEntry(); alarm.PLCAdress = m.PLCAdress; diff --git a/JinYuan.Models/Alarm/AlarmData.cs b/JinYuan.Models/Alarm/AlarmData.cs index a7af2e3..6918ddc 100644 --- a/JinYuan.Models/Alarm/AlarmData.cs +++ b/JinYuan.Models/Alarm/AlarmData.cs @@ -1,11 +1,12 @@ using CsvHelper.Configuration.Attributes; +using System; namespace JinYuan.Models { /// /// 工位报警数据 /// - public class AlarmData + public class AlarmData : ICloneable { /// /// 报警唯一标识符 @@ -56,6 +57,21 @@ namespace JinYuan.Models /// 更新状态 /// public int Flag { get; set; } + public object Clone() + { + return new AlarmData() { + AlarmGuid = this.AlarmGuid, + PLCAdress = this.PLCAdress, + AlarmContent = this.AlarmContent, + AlarmCode = this.AlarmCode, + AlarmType = this.AlarmType, + StartTime = this.StartTime, + EndTime = this.EndTime, + AlarmDesc = this.AlarmDesc, + AlarmState = this.AlarmState, + Flag = this.Flag + }; + } } public class AlarmCSVData