1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027 |
- using ServiceCenter.Extensions;
- using ServiceCenter.SqlSugars;
- using SqlSugar;
- using System.Collections.Concurrent;
- using System.ComponentModel;
- using System.Data;
- using WCS.Core;
- using WCS.Entity.Protocol.DataStructure;
- using WCS.Entity.Protocol.HUB;
- using WCS.Entity.Protocol.Robot;
- using WCS.Entity.Protocol.SRM;
- using WCS.Entity.Protocol.Station;
- using WCS.WorkEngineering.Worlds;
- namespace WCS.WorkEngineering.Systems
- {
- /// <summary>
- /// 数据采集系统
- /// </summary>
- [BelongTo(typeof(MainWorld))]
- [Description("数据采集系统")]
- public class DataCollectionSysyem : DeviceSystem<Device<IStation520>>
- {
- public static DeviceDataPack pack = new DeviceDataPack();
- private static object locker = new object();
- public DataCollectionSysyem()
- {
- }
- /// <summary>
- /// 所有设备数据
- /// Key 是不同设备所使用的类型 例如DeviceDataCollection<SRMData>
- /// value 不同设备的具体数据
- /// </summary>
- public static ConcurrentDictionary<string, DeviceData> AllDatas = new ConcurrentDictionary<string, DeviceData>();
- protected override bool ParallelDo => true;
- public override bool Select(Device dev)
- {
- return dev.Code == "1";
- }
- public override void Do(Device<IStation520> objDev)
- {
- //通过数据条数处理
- var db = new SqlSugarHelper().PLC;
- var plcEx = new SqlSugarHelper().PLCEX;
- //ExRobotRunInfo(db, plcEx);
- ExSrmRunInfo(db, plcEx);
- //ExRobotAlarmInfo(db);
- //ExSrmAlarmInfo(db);
- //ExRgvAlarmInfo(db);
- ExSrmTaskSumRunInfo(db, plcEx);
- }
- #region 设备运行信息收集
- /// <summary>
- /// 机械臂
- /// </summary>
- /// <param name="db"></param>
- public void ExRobotRunInfo(SqlSugarScopeProvider db, SqlSugarScopeProvider plcEx)
- {
- var startTime = DateTime.Now;
- var endTime = DateTime.Now;
- IEnumerable<IGrouping<string, WCS_Robot521>> robot521 = new List<IGrouping<string, WCS_Robot521>>();
- var type = DevType.Robot.ToString();
- //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
- if (plcEx.Queryable<DevRunInfo>().Any(x => x.Type == type))
- {
- //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
- var runInfo = plcEx.Queryable<DevRunInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
- startTime = runInfo.Frame.AddHours(+1);//后一个小时
- startTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, 0, 0); //后一个小时的开始时间
- endTime = startTime.AddHours(+1).AddMilliseconds(-1);//
- }
- else
- {
- if (!db.Queryable<WCS_Robot521>().Any()) return;
- startTime = db.Queryable<WCS_Robot521>().OrderBy(x => x.Frame).First().Frame;
- startTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, 0, 0); //后一个小时的开始时间
- endTime = startTime.AddHours(+1).AddMilliseconds(-1);
- }
- //取上一小时的第一秒
- var now = DateTime.Now;
- now = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0);
- var nowEndTime = new DateTime(endTime.Year, endTime.Month, endTime.Day, endTime.Hour, 0, 0);
- if (endTime > now) return; //当前时间之前
- if (nowEndTime == now) return; //是当前这一个小时
- now = new DateTime(now.Year, now.Month, now.Day, now.Hour, 1, 0);
- if (DateTime.Now < now) return;// 每个小时的前十分钟不进行数据分析处理,仅在每小时的10-59之内进行处理
- if (plcEx.Queryable<DevRunInfo>().Any(x => x.EndTime == endTime && x.Type == type)) return;
- robot521 = db.Queryable<WCS_Robot521>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
- if (!robot521.Any())
- {
- plcEx.Insertable(new DevRunInfo()
- {
- Frame = endTime,
- Code = "当前时段无有效数据",
- RunMode = "当前时段无有效数据",
- RunStatus = "当前时段无有效数据",
- StartTime = startTime,
- EndTime = endTime,
- Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
- Type = type
- }).ExecuteCommand();
- }
- foreach (var infos in robot521)
- {
- // 获取第一条数据与最后一条数据
- var start = infos.OrderBy(x => x.Frame).First();
- var end = infos.OrderByDescending(x => x.Frame).First();
- //通过是否有最后一条数据来确定当前数据是否有分析存储过
- if (plcEx.Queryable<DevRunInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
- //获取前一天最后的一条数据
- var yesterEnd = plcEx.Queryable<DevRunInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
- List<DevRunInfo> runInfos = new List<DevRunInfo>();
- foreach (var info in infos.OrderBy(x => x.Frame))
- {
- if (info.Frame == start.Frame) //当天的第一条数据
- {
- if (yesterEnd == null) //如果没有前一天的最后一条数据,就有用当天的第一条数据状态做计算
- {
- runInfos.Add(new DevRunInfo()
- {
- Frame = info.Frame,
- Code = info.Code,
- RunMode = info.Mode.GetDescription(),
- RunStatus = info.Status.GetDescription(),
- StartTime = startTime,
- EndTime = info.Frame,
- Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
- Type = type
- });
- }
- else //如果有就用前一天的最后一条数据做计算
- {
- runInfos.Add(new DevRunInfo()
- {
- Frame = info.Frame,
- Code = info.Code,
- RunMode = yesterEnd.RunMode,
- RunStatus = yesterEnd.RunStatus,
- StartTime = startTime,
- EndTime = info.Frame,
- Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
- Type = type
- });
- }
- }
- else //状态出现状态变化时或最后一条数据
- {
- if (start.Mode != info.Mode || start.Status != info.Status || info.Frame == end.Frame)
- {
- var runInfo = new DevRunInfo()
- {
- Frame = info.Frame,
- Code = info.Code,
- RunMode = start.Mode.GetDescription(),
- RunStatus = start.Status.GetDescription(),
- StartTime = start.Frame,
- Type = type
- };
- if (info.Frame == end.Frame) runInfo.EndTime = endTime;
- else runInfo.EndTime = info.Frame;
- runInfo.Duration = Convert.ToInt64((runInfo.EndTime - runInfo.StartTime).TotalMilliseconds);
- runInfos.Add(runInfo);
- start = info;
- }
- }
- }
- var sql = plcEx.Insertable(runInfos).ToSqlString();
- plcEx.Ado.ExecuteCommand(GetString(sql));
- }
- }
- /// <summary>
- /// 堆垛机
- /// </summary>
- /// <param name="db"></param>
- public void ExSrmRunInfo(SqlSugarScopeProvider db, SqlSugarScopeProvider plcEx)
- {
- var startTime = DateTime.Now;
- var endTime = DateTime.Now;
- IEnumerable<IGrouping<string, WCS_SRM521>> srm521 = new List<IGrouping<string, WCS_SRM521>>();
- var type = DevType.SRM.ToString();
- //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
- if (plcEx.Queryable<DevRunInfo>().Any(x => x.Type == type))
- {
- //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
- var runInfo = plcEx.Queryable<DevRunInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
- startTime = runInfo.Frame.AddHours(+1);//后一个小时
- startTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, 0, 0); //后一个小时的开始时间
- endTime = startTime.AddHours(+1).AddMilliseconds(-1);//
- }
- else
- {
- if (!db.Queryable<WCS_SRM521>().Any()) return;
- startTime = db.Queryable<WCS_SRM521>().OrderBy(x => x.Frame).First().Frame;
- startTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, 0, 0); //后一个小时的开始时间
- endTime = startTime.AddHours(+1).AddMilliseconds(-1);
- }
- //取上一小时的第一秒
- var now = DateTime.Now;
- now = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0);
- var nowEndTime = new DateTime(endTime.Year, endTime.Month, endTime.Day, endTime.Hour, 0, 0);
- if (endTime > now) return; //当前时间之前
- if (nowEndTime == now) return; //是当前这一个小时
- now = new DateTime(now.Year, now.Month, now.Day, now.Hour, 10, 0);
- if (DateTime.Now < now) return;// 每个小时的前十分钟不进行数据分析处理,仅在每小时的10-59之内进行处理
- if (plcEx.Queryable<DevRunInfo>().Any(x => x.EndTime == endTime && x.Type == type)) return;
- srm521 = db.Queryable<WCS_SRM521>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
- if (!srm521.Any())
- {
- plcEx.Insertable(new DevRunInfo()
- {
- Frame = endTime,
- Code = "当前时段无有效数据",
- RunMode = "当前时段无有效数据",
- RunStatus = "当前时段无有效数据",
- StartTime = startTime,
- EndTime = endTime,
- Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
- Type = type
- }).ExecuteCommand();
- }
- foreach (var infos in srm521)
- {
- // 获取第一条数据与最后一条数据
- var start = infos.OrderBy(x => x.Frame).First();
- var end = infos.OrderByDescending(x => x.Frame).First();
- //通过是否有最后一条数据来确定当前数据是否有分析存储过
- if (plcEx.Queryable<DevRunInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
- //获取前一天最后的一条数据
- var yesterEnd = plcEx.Queryable<DevRunInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
- List<DevRunInfo> runInfos = new List<DevRunInfo>();
- foreach (var info in infos.OrderBy(x => x.Frame))
- {
- if (info.Frame == start.Frame) //当天的第一条数据
- {
- if (yesterEnd == null) //如果没有前一天的最后一条数据,就有用当天的第一条数据状态做计算
- {
- runInfos.Add(new DevRunInfo()
- {
- Frame = info.Frame,
- Code = info.Code,
- RunMode = info.Mode.GetDescription(),
- RunStatus = info.Status.GetDescription(),
- StartTime = startTime,
- EndTime = info.Frame,
- Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
- Type = type
- });
- }
- else //如果有就用前一天的最后一条数据做计算
- {
- runInfos.Add(new DevRunInfo()
- {
- Frame = info.Frame,
- Code = info.Code,
- RunMode = yesterEnd.RunMode,
- RunStatus = yesterEnd.RunStatus,
- StartTime = startTime,
- EndTime = info.Frame,
- Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
- Type = type
- });
- }
- }
- else //状态出现状态变化时或最后一条数据
- {
- if (start.Mode != info.Mode || start.Status != info.Status || info.Frame == end.Frame)
- {
- var runInfo = new DevRunInfo()
- {
- Frame = info.Frame,
- Code = info.Code,
- RunMode = start.Mode.GetDescription(),
- RunStatus = start.Status.GetDescription(),
- StartTime = start.Frame,
- Type = type
- };
- if (info.Frame == end.Frame) runInfo.EndTime = endTime;
- else runInfo.EndTime = info.Frame;
- runInfo.Duration = Convert.ToInt64((runInfo.EndTime - runInfo.StartTime).TotalMilliseconds);
- runInfos.Add(runInfo);
- start = info;
- }
- }
- }
- var sql = plcEx.Insertable(runInfos).ToSqlString();
- plcEx.Ado.ExecuteCommand(GetString(sql));
- }
- }
- #endregion 设备运行信息收集
- #region 异常报警信息
- ///// <summary>
- ///// 机械臂
- ///// </summary>
- ///// <param name="db"></param>
- //public void ExRobotAlarmInfo(SqlSugarScopeProvider db)
- //{
- // var startTime = DateTime.Now;
- // var endTime = DateTime.Now;
- // IEnumerable<IGrouping<string, QuestDb_Robot522>> robot522 = new List<IGrouping<string, QuestDb_Robot522>>();
- // //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
- // if (db.Queryable<DevAlarmInfo>().Any(x => x.Type == DevType.Robot))
- // {
- // //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
- // var alarmInfo = db.Queryable<DevAlarmInfo>().Where(x => x.Type == DevType.Robot).OrderByDescending(x => x.Frame).First();
- // startTime = alarmInfo.Frame.AddDays(+1).Date;//后一天的初始时间
- // endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
- // }
- // else
- // {
- // if (!db.Queryable<QuestDb_Robot522>().Any()) return;
- // startTime = db.Queryable<QuestDb_Robot522>().OrderBy(x => x.Frame).First().Frame.Date;
- // endTime = startTime.AddDays(+1).AddMilliseconds(-1);
- // }
- // if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
- // if (db.Queryable<DevAlarmInfo>().Any(x => x.EndTime == endTime && x.Type == DevType.Robot)) return;
- // robot522 = db.Queryable<QuestDb_Robot522>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
- // if (!robot522.Any())
- // {
- // db.Insertable(new DevAlarmInfo()
- // {
- // Frame = endTime,
- // Code = "当前时段无有效数据",
- // Alarm = "当前时段无有效数据",
- // StartTime = startTime,
- // EndTime = endTime,
- // Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
- // Type = DevType.Robot
- // }).ExecuteCommand();
- // }
- // Parallel.ForEach(robot522, infos =>
- // {
- // // 获取第一条数据与最后一条数据
- // var start = infos.OrderBy(x => x.Frame).First();
- // var end = infos.OrderByDescending(x => x.Frame).First();
- // //通过是否有最后一条数据来确定当前数据是否有分析存储过
- // if (db.Queryable<DevAlarmInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
- // //获取前一天最后的一条数据
- // var yesterEnd = db.Queryable<DevAlarmInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
- // List<DevAlarmInfo> runInfos = new List<DevAlarmInfo>();//需要保存的数据
- // var alarmList = new List<EquipmentAlarm>();//未结束的报警信息
- // foreach (var info in infos.OrderBy(x => x.Frame))
- // {
- // if (info.Frame == end.Frame) //最后一条数据
- // {
- // if (info.Alarm != "无")
- // {
- // //先判断是否有没有记录的报警信息
- // var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).ToList();
- // var msgList = alarmList.Select(x => x.Msg);
- // //将未记录的报警信息增加到缓存中
- // alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
- // }
- // if (!alarmList.Any()) continue;
- // runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
- // {
- // Frame = alarm.Time,
- // Code = info.Code,
- // Alarm = alarm.Msg,
- // StartTime = alarm.Time,
- // EndTime = endTime,
- // Duration = Convert.ToInt64((endTime - alarm.Time).TotalMilliseconds),
- // Type = DevType.Robot
- // }));
- // }
- // else
- // {
- // if (info.Alarm == "无" && alarmList.Any()) //代表报警全部清空了
- // {
- // runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
- // {
- // Frame = alarm.Time,
- // Code = info.Code,
- // Alarm = alarm.Msg,
- // StartTime = alarm.Time,
- // EndTime = info.Frame,
- // Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
- // Type = DevType.Robot
- // }));
- // alarmList = new List<EquipmentAlarm>(); //清空现有报警信息
- // }
- // else if (info.Alarm != "无")
- // {
- // var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).ToList();
- // var msgList = alarmList.Select(x => x.Msg);
- // //将未记录的报警信息增加到缓存中
- // alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
- // var treatedAlarm = new List<string>();
- // //将已记录,但当前信息中没有的报警结束
- // foreach (var alarm in alarmList.Where(x => !alarmMsg.Contains(x.Msg)))
- // {
- // runInfos.Add(new DevAlarmInfo()
- // {
- // Frame = alarm.Time,
- // Code = info.Code,
- // Alarm = alarm.Msg,
- // StartTime = alarm.Time,
- // EndTime = info.Frame,
- // Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
- // Type = DevType.Robot
- // });
- // treatedAlarm.Add(alarm.Msg);
- // }
- // alarmList = alarmList.Where(x => !treatedAlarm.Contains(x.Msg)).ToList();
- // }
- // }
- // }
- // if (runInfos.Any())
- // {
- // var sql = db.Insertable(runInfos).ToSqlString();
- // db.Ado.ExecuteCommand(GetString(sql));
- // }
- // else
- // {
- // db.Insertable(new DevAlarmInfo()
- // {
- // Frame = endTime,
- // Code = infos.Key,
- // Alarm = "当前时段无有效数据",
- // StartTime = startTime,
- // EndTime = endTime,
- // Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
- // Type = DevType.Robot
- // }).ExecuteCommand();
- // }
- // });
- //}
- ///// <summary>
- ///// 堆垛机
- ///// </summary>
- ///// <param name="db"></param>
- //public void ExSrmAlarmInfo(SqlSugarScopeProvider db)
- //{
- // var startTime = DateTime.Now;
- // var endTime = DateTime.Now;
- // IEnumerable<IGrouping<string, QuestDb_SRM523>> srm523 = new List<IGrouping<string, QuestDb_SRM523>>();
- // //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
- // if (db.Queryable<DevAlarmInfo>().Any(x => x.Type == DevType.SRM))
- // {
- // //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
- // var alarmInfo = db.Queryable<DevAlarmInfo>().Where(x => x.Type == DevType.SRM).OrderByDescending(x => x.Frame).First();
- // startTime = alarmInfo.Frame.AddDays(+1).Date;//后一天的初始时间
- // endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
- // }
- // else
- // {
- // if (!db.Queryable<QuestDb_SRM523>().Any()) return;
- // startTime = db.Queryable<QuestDb_SRM523>().OrderBy(x => x.Frame).First().Frame.Date;
- // endTime = startTime.AddDays(+1).AddMilliseconds(-1);
- // }
- // if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
- // if (db.Queryable<DevAlarmInfo>().Any(x => x.EndTime == endTime && x.Type == DevType.SRM)) return;
- // srm523 = db.Queryable<QuestDb_SRM523>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
- // if (!srm523.Any())
- // {
- // db.Insertable(new DevAlarmInfo()
- // {
- // Frame = endTime,
- // Code = "当前时段无有效数据",
- // Alarm = "当前时段无有效数据",
- // StartTime = startTime,
- // EndTime = endTime,
- // Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
- // Type = DevType.SRM
- // }).ExecuteCommand();
- // }
- // Parallel.ForEach(srm523, infos =>
- // {
- // // 获取第一条数据与最后一条数据
- // var start = infos.OrderBy(x => x.Frame).First();
- // var end = infos.OrderByDescending(x => x.Frame).First();
- // //通过是否有最后一条数据来确定当前数据是否有分析存储过
- // if (db.Queryable<DevAlarmInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
- // //获取前一天最后的一条数据
- // var yesterEnd = db.Queryable<DevAlarmInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
- // List<DevAlarmInfo> runInfos = new List<DevAlarmInfo>();//需要保存的数据
- // var alarmList = new List<EquipmentAlarm>();//未结束的报警信息
- // foreach (var info in infos.OrderBy(x => x.Frame))
- // {
- // if (info.Frame == end.Frame) //最后一条数据
- // {
- // if (info.Alarm != "无,无")
- // {
- // //先判断是否有没有记录的报警信息
- // var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).Where(x => x != "无").ToList();
- // var msgList = alarmList.Select(x => x.Msg);
- // //将未记录的报警信息增加到缓存中
- // alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
- // }
- // if (!alarmList.Any()) continue;
- // runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
- // {
- // Frame = alarm.Time,
- // Code = info.Code,
- // Alarm = alarm.Msg,
- // StartTime = alarm.Time,
- // EndTime = endTime,
- // Duration = Convert.ToInt64((endTime - alarm.Time).TotalMilliseconds),
- // Type = DevType.SRM
- // }));
- // }
- // else
- // {
- // if (info.Alarm == "无,无" && alarmList.Any()) //代表报警全部清空了
- // {
- // runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
- // {
- // Frame = alarm.Time,
- // Code = info.Code,
- // Alarm = alarm.Msg,
- // StartTime = alarm.Time,
- // EndTime = info.Frame,
- // Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
- // Type = DevType.SRM
- // }));
- // alarmList = new List<EquipmentAlarm>(); //清空现有报警信息
- // }
- // else if (info.Alarm != "无,无")
- // {
- // var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).Where(x => x != "无").ToList();
- // var msgList = alarmList.Select(x => x.Msg);
- // //将未记录的报警信息增加到缓存中
- // alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
- // var treatedAlarm = new List<string>();
- // //将已记录,但当前信息中没有的报警结束
- // foreach (var alarm in alarmList.Where(x => !alarmMsg.Contains(x.Msg)))
- // {
- // runInfos.Add(new DevAlarmInfo()
- // {
- // Frame = alarm.Time,
- // Code = info.Code,
- // Alarm = alarm.Msg,
- // StartTime = alarm.Time,
- // EndTime = info.Frame,
- // Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
- // Type = DevType.SRM
- // });
- // treatedAlarm.Add(alarm.Msg);
- // }
- // alarmList = alarmList.Where(x => !treatedAlarm.Contains(x.Msg)).ToList();
- // }
- // }
- // }
- // if (runInfos.Any())
- // {
- // var sql = db.Insertable(runInfos).ToSqlString();
- // db.Ado.ExecuteCommand(GetString(sql));
- // }
- // else
- // {
- // db.Insertable(new DevAlarmInfo()
- // {
- // Frame = endTime,
- // Code = infos.Key,
- // Alarm = "当前时段无有效数据",
- // StartTime = startTime,
- // EndTime = endTime,
- // Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
- // Type = DevType.SRM
- // }).ExecuteCommand();
- // }
- // });
- //}
- ///// <summary>
- ///// rgv
- ///// </summary>
- ///// <param name="db"></param>
- //public void ExRgvAlarmInfo(SqlSugarScopeProvider db)
- //{
- // var startTime = DateTime.Now;
- // var endTime = DateTime.Now;
- // IEnumerable<IGrouping<string, QuestDb_RGV523>> rgv523 = new List<IGrouping<string, QuestDb_RGV523>>();
- // //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
- // if (db.Queryable<DevAlarmInfo>().Any(x => x.Type == DevType.RGV))
- // {
- // //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
- // var alarmInfo = db.Queryable<DevAlarmInfo>().Where(x => x.Type == DevType.RGV).OrderByDescending(x => x.Frame).First();
- // startTime = alarmInfo.Frame.AddDays(+1).Date;//后一天的初始时间
- // endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
- // }
- // else
- // {
- // if (!db.Queryable<QuestDb_RGV523>().Any()) return;
- // startTime = db.Queryable<QuestDb_RGV523>().OrderBy(x => x.Frame).First().Frame.Date;
- // endTime = startTime.AddDays(+1).AddMilliseconds(-1);
- // }
- // if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
- // if (db.Queryable<DevAlarmInfo>().Any(x => x.EndTime == endTime && x.Type == DevType.RGV)) return;
- // rgv523 = db.Queryable<QuestDb_RGV523>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
- // if (!rgv523.Any())
- // {
- // db.Insertable(new DevAlarmInfo()
- // {
- // Frame = endTime,
- // Code = "当前时段无有效数据",
- // Alarm = "当前时段无有效数据",
- // StartTime = startTime,
- // EndTime = endTime,
- // Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
- // Type = DevType.RGV
- // }).ExecuteCommand();
- // }
- // Parallel.ForEach(rgv523/*.Where(x => x.Key == "RGV4")*/, infos =>
- // {
- // // 获取第一条数据与最后一条数据
- // var start = infos.OrderBy(x => x.Frame).First();
- // var end = infos.OrderByDescending(x => x.Frame).First();
- // //通过是否有最后一条数据来确定当前数据是否有分析存储过
- // if (db.Queryable<DevAlarmInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
- // //获取前一天最后的一条数据
- // var yesterEnd = db.Queryable<DevAlarmInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
- // List<DevAlarmInfo> runInfos = new List<DevAlarmInfo>();//需要保存的数据
- // var alarmList = new List<EquipmentAlarm>();//未结束的报警信息
- // foreach (var info in infos.OrderBy(x => x.Frame))
- // {
- // if (info.Frame == end.Frame) //最后一条数据
- // {
- // if (info.Alarm != "无")
- // {
- // //先判断是否有没有记录的报警信息
- // var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).ToList();
- // var msgList = alarmList.Select(x => x.Msg);
- // //将未记录的报警信息增加到缓存中
- // alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
- // }
- // if (!alarmList.Any()) continue;
- // runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
- // {
- // Frame = alarm.Time,
- // Code = info.Code,
- // Alarm = alarm.Msg,
- // StartTime = alarm.Time,
- // EndTime = endTime,
- // Duration = Convert.ToInt64((endTime - alarm.Time).TotalMilliseconds),
- // Type = DevType.RGV
- // }));
- // }
- // else
- // {
- // if (info.Alarm == "无" && alarmList.Any()) //代表报警全部清空了
- // {
- // runInfos.AddRange(alarmList.Select(alarm => new DevAlarmInfo()
- // {
- // Frame = alarm.Time,
- // Code = info.Code,
- // Alarm = alarm.Msg,
- // StartTime = alarm.Time,
- // EndTime = info.Frame,
- // Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
- // Type = DevType.RGV
- // }));
- // alarmList = new List<EquipmentAlarm>(); //清空现有报警信息
- // }
- // else if (info.Alarm != "无")
- // {
- // var alarmMsg = Convert.ToString(info.Alarm).Split(",").Select(x => x.Split(",")).SelectMany(x => x).ToList();
- // var msgList = alarmList.Select(x => x.Msg);
- // //将未记录的报警信息增加到缓存中
- // alarmList.AddRange(alarmMsg.Where(msg => !msgList.Contains(msg)).Select(msg => new EquipmentAlarm() { Time = info.Frame, Msg = msg }));
- // var treatedAlarm = new List<string>();
- // //将已记录,但当前信息中没有的报警结束
- // foreach (var alarm in alarmList.Where(x => !alarmMsg.Contains(x.Msg)))
- // {
- // runInfos.Add(new DevAlarmInfo()
- // {
- // Frame = alarm.Time,
- // Code = info.Code,
- // Alarm = alarm.Msg,
- // StartTime = alarm.Time,
- // EndTime = info.Frame,
- // Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
- // Type = DevType.RGV
- // });
- // treatedAlarm.Add(alarm.Msg);
- // }
- // alarmList = alarmList.Where(x => !treatedAlarm.Contains(x.Msg)).ToList();
- // }
- // }
- // }
- // if (runInfos.Any())
- // {
- // db.Insertable(runInfos).ExecuteCommand();
- // }
- // else
- // {
- // db.Insertable(new DevAlarmInfo()
- // {
- // Frame = endTime,
- // Code = infos.Key,
- // Alarm = "当前时段无有效数据",
- // StartTime = startTime,
- // EndTime = endTime,
- // Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
- // Type = DevType.RGV
- // }).ExecuteCommand();
- // }
- // });
- //}
- #endregion 异常报警信息
- #region 任务状态分析
- /// <summary>
- /// 机械臂
- /// </summary>
- /// <param name="db"></param>
- public void ExRobotTaskSumRunInfo(SqlSugarScopeProvider db)
- {
- var startTime = DateTime.Now;
- var endTime = DateTime.Now;
- IEnumerable<IGrouping<string, WCS_Robot520>> robot520 = new List<IGrouping<string, WCS_Robot520>>();
- var type = DevType.RobotTaskSum.ToString();
- //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
- if (db.Queryable<DevRunInfo>().Any(x => x.Type == type))
- {
- //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
- var runInfo = db.Queryable<DevRunInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
- startTime = runInfo.Frame.AddDays(+1).Date;//后一天的初始时间
- endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
- }
- else
- {
- if (!db.Queryable<WCS_Robot520>().Any()) return;
- startTime = db.Queryable<WCS_Robot520>().OrderBy(x => x.Frame).First().Frame.Date;
- endTime = startTime.AddDays(+1).AddMilliseconds(-1);
- }
- if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
- if (db.Queryable<DevRunInfo>().Any(x => x.EndTime == endTime && x.Type == type)) return;
- robot520 = db.Queryable<WCS_Robot520>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
- if (!robot520.Any())
- {
- db.Insertable(new DevRunInfo()
- {
- Frame = endTime,
- Code = "当前时段无有效数据",
- RunMode = "当前时段无有效数据",
- RunStatus = "当前时段无有效数据",
- StartTime = startTime,
- EndTime = endTime,
- Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
- Type = type
- }).ExecuteCommand();
- }
- Parallel.ForEach(robot520, infos =>
- {
- //infos = infos.Where(x => x.TaskNumber1 != 0 || x.TaskNumber2 != 0).ToList();
- // 获取第一条数据与最后一条数据
- var start = infos.OrderBy(x => x.Frame).First();
- var end = infos.OrderByDescending(x => x.Frame).First();
- //通过是否有最后一条数据来确定当前数据是否有分析存储过
- if (db.Queryable<DevRunInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
- //获取前一天最后的一条数据
- var yesterEnd = db.Queryable<DevRunInfo>().Where(x => x.Code == infos.Key && x.Frame < endTime).OrderByDescending(x => x.Frame).First();
- List<DevRunInfo> runInfos = new List<DevRunInfo>();
- //foreach (var info in infos.OrderBy(x => x.Frame))
- //{
- // if (info.Frame == start.Frame) //当天的第一条数据
- // {
- // if (yesterEnd == null) //如果没有前一天的最后一条数据,就有用当天的第一条数据状态做计算
- // {
- // runInfos.Add(new DevRunInfo()
- // {
- // Frame = info.Frame,
- // Code = info.Code,
- // RunMode = info.RobotMode.GetDescription(),
- // RunStatus = info.RunStatus.GetDescription(),
- // StartTime = startTime,
- // EndTime = info.Frame,
- // Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
- // Type = DevType.RobotTaskSum
- // });
- // }
- // else //如果有就用前一天的最后一条数据做计算
- // {
- // runInfos.Add(new DevRunInfo()
- // {
- // Frame = info.Frame,
- // Code = info.Code,
- // RunMode = yesterEnd.RunMode,
- // RunStatus = yesterEnd.RunStatus,
- // StartTime = startTime,
- // EndTime = info.Frame,
- // Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
- // Type = DevType.RobotTaskSum
- // });
- // }
- // }
- // else if (info.Frame == end.Frame) //当天的最后一条数据
- // {
- // runInfos.Add(new DevRunInfo()
- // {
- // Frame = info.Frame,
- // Code = info.Code,
- // RunMode = info.RobotMode.GetDescription(),
- // RunStatus = info.RunStatus.GetDescription(),
- // StartTime = info.Frame,
- // EndTime = endTime,
- // Duration = Convert.ToInt64((endTime - info.Frame).TotalMilliseconds),
- // Type = DevType.RobotTaskSum
- // });
- // }
- // else //中间数据
- // {
- // if (start.RobotMode == info.RobotMode && start.RunStatus == info.RunStatus) continue;
- // runInfos.Add(new DevRunInfo()
- // {
- // Frame = info.Frame,
- // Code = info.Code,
- // RunMode = start.RobotMode.GetDescription(),
- // RunStatus = start.RunStatus.GetDescription(),
- // StartTime = start.Frame,
- // EndTime = info.Frame,
- // Duration = Convert.ToInt64((info.Frame - start.Frame).TotalMilliseconds),
- // Type = DevType.RobotTaskSum
- // });
- // start = info;
- // }
- //}
- var sql = db.Insertable(runInfos).ToSqlString();
- db.Ado.ExecuteCommand(GetString(sql));
- });
- }
- /// <summary>
- /// 堆垛机任务数量统计
- /// </summary>
- /// <param name="db"></param>
- public void ExSrmTaskSumRunInfo(SqlSugarScopeProvider db, SqlSugarScopeProvider plcEx)
- {
- var startTime = DateTime.Now;
- var endTime = DateTime.Now;
- IEnumerable<IGrouping<string, WCS_SRM520>> srm520 = new List<IGrouping<string, WCS_SRM520>>();
- var type = DevType.SrmTaskSum.ToString();
- //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
- if (plcEx.Queryable<DevRunInfo>().Any(x => x.Type == type))
- {
- //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
- var runInfo = plcEx.Queryable<DevRunInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
- startTime = runInfo.Frame.AddHours(+1);//后一个小时
- startTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, 0, 0); //后一个小时的开始时间
- endTime = startTime.AddHours(+1).AddMilliseconds(-1);//
- }
- else
- {
- if (db.Queryable<WCS_SRM520>().Count() <= 0) return;
- startTime = db.Queryable<WCS_SRM520>().OrderBy(x => x.Frame).First().Frame;
- startTime = new DateTime(startTime.Year, startTime.Month, startTime.Day, startTime.Hour, 0, 0); //后一个小时的开始时间
- endTime = startTime.AddHours(+1).AddMilliseconds(-1);
- }
- //取上一小时的第一秒
- var now = DateTime.Now;
- now = new DateTime(now.Year, now.Month, now.Day, now.Hour, 0, 0);
- var nowEndTime = new DateTime(endTime.Year, endTime.Month, endTime.Day, endTime.Hour, 0, 0);
- if (endTime > now) return; //当前时间之前
- if (nowEndTime == now) return; //是当前这一个小时
- now = new DateTime(now.Year, now.Month, now.Day, now.Hour, 01, 0);
- if (DateTime.Now < now) return;// 每个小时的前十分钟不进行数据分析处理,仅在每小时的10-59之内进行处理
- if (plcEx.Queryable<DevRunInfo>().Any(x => x.EndTime == endTime && x.Type == type)) return;
- srm520 = db.Queryable<WCS_SRM520>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
- if (!srm520.Any())
- {
- plcEx.Insertable(new DevRunInfo()
- {
- Frame = endTime,
- Code = "当前时段无有效数据",
- RunMode = "当前时段无有效数据",
- RunStatus = "当前时段无有效数据",
- StartTime = startTime,
- EndTime = endTime,
- Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
- Type = type
- }).ExecuteCommand();
- }
- foreach (var infos in srm520)
- {
- var infoList = infos.Where(x => x.TaskID1 != 0 || x.TaskID2 != 0).ToList().DistinctItemBy(x => x.VoucherNo);
- List<DevRunInfo> runInfos = new List<DevRunInfo>();
- foreach (var info in infoList.OrderBy(x => x.Frame))
- {
- var taskSum = 0;
- if (info.TaskID1 != 0) taskSum += 1;
- if (info.TaskID2 != 0) taskSum += 1;
- var taskType = info.TaskType1 == 0 ? info.TaskType2 : info.TaskType1;
- runInfos.Add(new DevRunInfo()
- {
- Frame = info.Frame,
- Code = info.Code,
- RunMode = taskSum.ToString(),
- RunStatus = $"{info.TaskID1}--{info.TaskID2}--{taskType}",
- Duration = 0,
- Type = type
- });
- }
- var sql = plcEx.Insertable(runInfos).ToSqlString();
- plcEx.Ado.ExecuteCommand(GetString(sql));
- }
- }
- #endregion 任务状态分析
- public string GetString(string value)
- {
- return value.Replace(",N'", ",'")
- .Replace("\0", "")
- .Replace("(N'", "('") + "\r";
- }
- }
- /// <summary>
- /// 设备报警
- /// </summary>
- public class EquipmentAlarm
- {
- /// <summary>
- /// 内容
- /// </summary>
- public string Msg { get; set; }
- /// <summary>
- /// 时间
- /// </summary>
- public DateTime Time { get; set; }
- }
- /// <summary>
- /// 设备状态信息
- /// </summary>
- public class EquipmentStatus
- {
- /// <summary>
- /// 设备号
- /// </summary>
- public string Code { get; set; }
- /// <summary>
- /// 内容
- /// </summary>
- public string con { get; set; }
- /// <summary>
- /// 内容
- /// </summary>
- public int Status { get; set; }
- /// <summary>
- /// 时间
- /// </summary>
- public DateTime Time { get; set; }
- }
- /// <summary>
- ///
- /// </summary>
- /// <typeparam name="T"></typeparam>
- public class Quest<T>
- {
- public T Data { get; set; }
- }
- public class KeyValue
- {
- public string key { get; set; }
- public string value { get; set; }
- }
- }
|