林豪 左 1 gadu atpakaļ
vecāks
revīzija
f29debf1af

+ 130 - 3
WCS.WorkEngineering/Systems/DataCollectionSysyem.cs

@@ -45,8 +45,6 @@ namespace WCS.WorkEngineering.Systems
 
         protected override bool ParallelDo => true;
 
-        protected override bool SaveLogsToFile => true;
-
         public override bool Select(Device dev)
         {
             return dev.Code == "1";
@@ -56,7 +54,7 @@ namespace WCS.WorkEngineering.Systems
         {
             //通过数据条数处理
             var db = new SqlSugarHelper().PLC;
-            //ExRobotRunInfo(db);
+            ExRobotRunInfo(db);
             ExRobotAlarmInfo(db);
             ExSrmAlarmInfo(db);
             ExRgvAlarmInfo(db);
@@ -1048,6 +1046,135 @@ namespace WCS.WorkEngineering.Systems
 
         #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>>();
+            //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
+            if (db.Queryable<DevRunInfo>().Any(x => x.Type == DevType.RobotTaskSum))
+            {
+                //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
+                var runInfo = db.Queryable<DevRunInfo>().Where(x => x.Type == DevType.RobotTaskSum).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 == DevType.RobotTaskSum)) 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 = DevType.RobotTaskSum
+                }).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));
+            });
+        }
+
+        #endregion 任务状态分析
+
         public string GetString(string value)
         {
             return value.Replace(",N'", ",'")

+ 2 - 2
WCS.WorkEngineering/Worlds/MainWorld.cs

@@ -36,7 +36,7 @@ namespace WCS.WorkEngineering.Worlds
         ///  更新前执行,重写改方法后请自行添加执行内容
         ///  执行内容:清空日志队列
         /// </summary>
-        protected override void BeforeUpdate()
+        protected override void BeforeUpdate(List<WorkTimes> list)
         {
             // 清空日志队列,确保日志队列中只会有当前周期日志
             Logs.Clear();
@@ -46,7 +46,7 @@ namespace WCS.WorkEngineering.Worlds
         /// 更新后执行,重写改方法后请自行添加执行内容
         /// 执行内容:清空日志队列
         /// </summary>
-        protected override void AfterUpdate()
+        protected override void AfterUpdate(List<WorkTimes> list)
         {
             LogHub.WorldPublish(Logs, this.GetType().Name);
         }