林豪 左 1 year ago
parent
commit
f7bd4c7f86
2 changed files with 296 additions and 239 deletions
  1. 290 238
      WCS.WorkEngineering/Systems/DataCollectionSysyem.cs
  2. 6 1
      WCS.WorkEngineering/WorkStart.cs

+ 290 - 238
WCS.WorkEngineering/Systems/DataCollectionSysyem.cs

@@ -22,10 +22,10 @@ using WCS.WorkEngineering.Worlds;
 namespace WCS.WorkEngineering.Systems
 {
     /// <summary>
-    ///  数据采集系统
+    ///  数据处理系统
     /// </summary>
     [BelongTo(typeof(MainWorld))]
-    [Description("数据采集系统")]
+    [Description("数据处理系统")]
     public class DataCollectionSysyem : DeviceSystem<Device<IStation520>>
     {
         public static DeviceDataPack pack = new DeviceDataPack();
@@ -54,62 +54,16 @@ namespace WCS.WorkEngineering.Systems
         {
             //通过数据条数处理
             var db = new SqlSugarHelper().PLC;
-            ExRobotRunInfo(db);
-            ExRobotAlarmInfo(db);
-            ExSrmAlarmInfo(db);
-            ExRgvAlarmInfo(db);
-
-            //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.Frame == end.Frame)) return;
-            //    List<DevAlarmInfo> runInfos = new List<DevAlarmInfo>();
-            //    foreach (var info in infos)
-            //    {
-            //        if (info.Frame == start.Frame)
-            //        {
-            //            runInfos.Add(new DevAlarmInfo()
-            //            {
-            //                Frame = info.Frame,
-            //                Code = info.Code,
-            //                Alarm = info.Alarm.ToString(),
-            //                StartTime = startTime,
-            //                EndTime = info.Frame,
-            //                Duration = Convert.ToInt64((info.Frame - startTime).Milliseconds)
-            //            });
-            //        }
-            //        else if (info.Frame == end.Frame)
-            //        {
-            //            runInfos.Add(new DevAlarmInfo()
-            //            {
-            //                Frame = info.Frame,
-            //                Code = info.Code,
-            //                Alarm = info.Alarm.ToString(),
-            //                StartTime = info.Frame,
-            //                EndTime = endTime,
-            //                Duration = Convert.ToInt64((endTime - info.Frame).Milliseconds)
-            //            });
-            //        }
-            //        else
-            //        {
-            //            if (start.Alarm != info.Alarm)
-            //            {
-            //                runInfos.Add(new DevAlarmInfo()
-            //                {
-            //                    Frame = info.Frame,
-            //                    Code = info.Code,
-            //                    Alarm = info.Alarm.ToString(),
-            //                    StartTime = start.Frame,
-            //                    EndTime = info.Frame,
-            //                    Duration = Convert.ToInt64((info.Frame - start.Frame).Milliseconds)
-            //                });
-            //                start = info;
-            //            }
-            //        }
-            //    }
-            //    db.Insertable(runInfos).ExecuteCommand();
-            // });
+            var plcEx= new SqlSugarHelper().PLCEX;
+            ExRobotRunInfo(db, plcEx);
+            ExSrmRunInfo(db, plcEx);
+            ExRgvRunInfo(db, plcEx);
+            ExTrussRunInfo(db, plcEx);
+            ExRobotAlarmInfo(db, plcEx);
+            ExSrmAlarmInfo(db, plcEx);
+            ExRgvAlarmInfo(db, plcEx);
+            ExTrussAlarmInfo(db, plcEx);
+            ExRobotTaskSumRunInfo(db, plcEx);
         }
 
         #region 设备运行信息收集
@@ -118,16 +72,17 @@ namespace WCS.WorkEngineering.Systems
         /// 机械臂
         /// </summary>
         /// <param name="db"></param>
-        public void ExRobotRunInfo(SqlSugarScopeProvider db)
+        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 (db.Queryable<DevRunInfo>().Any(x => x.Type == DevType.Robot))
+            if (plcEx.Queryable<DevRunInfo>().Any(x => x.Type == type))
             {
                 //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
-                var runInfo = db.Queryable<DevRunInfo>().Where(x => x.Type == DevType.Robot).OrderByDescending(x => x.Frame).First();
+                var runInfo = plcEx.Queryable<DevRunInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
                 startTime = runInfo.Frame.AddDays(+1).Date;//后一天的初始时间
                 endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
             }
@@ -138,13 +93,13 @@ namespace WCS.WorkEngineering.Systems
                 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.Robot)) return;
+            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())
             {
-                db.Insertable(new DevRunInfo()
+                plcEx.Insertable(new DevRunInfo()
                 {
                     Frame = endTime,
                     Code = "当前时段无有效数据",
@@ -153,7 +108,7 @@ namespace WCS.WorkEngineering.Systems
                     StartTime = startTime,
                     EndTime = endTime,
                     Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
-                    Type = DevType.Robot
+                    Type = type
                 }).ExecuteCommand();
             }
 
@@ -163,9 +118,9 @@ namespace WCS.WorkEngineering.Systems
                 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;
+                if (plcEx.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();
+                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))
                 {
@@ -182,7 +137,7 @@ namespace WCS.WorkEngineering.Systems
                                 StartTime = startTime,
                                 EndTime = info.Frame,
                                 Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
-                                Type = DevType.Robot
+                                Type = type
                             });
                         }
                         else //如果有就用前一天的最后一条数据做计算
@@ -196,7 +151,7 @@ namespace WCS.WorkEngineering.Systems
                                 StartTime = startTime,
                                 EndTime = info.Frame,
                                 Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
-                                Type = DevType.Robot
+                                Type = type
                             });
                         }
                     }
@@ -211,7 +166,7 @@ namespace WCS.WorkEngineering.Systems
                             StartTime = info.Frame,
                             EndTime = endTime,
                             Duration = Convert.ToInt64((endTime - info.Frame).TotalMilliseconds),
-                            Type = DevType.Robot
+                            Type = type
                         });
                     }
                     else //中间数据
@@ -226,14 +181,14 @@ namespace WCS.WorkEngineering.Systems
                             StartTime = start.Frame,
                             EndTime = info.Frame,
                             Duration = Convert.ToInt64((info.Frame - start.Frame).TotalMilliseconds),
-                            Type = DevType.Robot
+                            Type = type
                         });
                         start = info;
                     }
                 }
 
-                var sql = db.Insertable(runInfos).ToSqlString();
-                db.Ado.ExecuteCommand(GetString(sql));
+                var sql = plcEx.Insertable(runInfos).ToSqlString();
+                plcEx.Ado.ExecuteCommand(GetString(sql));
             });
         }
 
@@ -241,16 +196,17 @@ namespace WCS.WorkEngineering.Systems
         /// 堆垛机
         /// </summary>
         /// <param name="db"></param>
-        public void ExSrmRunInfo(SqlSugarScopeProvider db)
+        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 (db.Queryable<DevRunInfo>().Any(x => x.Type == DevType.SRM))
+            if (plcEx.Queryable<DevRunInfo>().Any(x => x.Type == type))
             {
                 //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
-                var runInfo = db.Queryable<DevRunInfo>().Where(x => x.Type == DevType.SRM).OrderByDescending(x => x.Frame).First();
+                var runInfo = plcEx.Queryable<DevRunInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
                 startTime = runInfo.Frame.AddDays(+1).Date;//后一天的初始时间
                 endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
             }
@@ -261,13 +217,13 @@ namespace WCS.WorkEngineering.Systems
                 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.SRM)) return;
+            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())
             {
-                db.Insertable(new DevRunInfo()
+                plcEx.Insertable(new DevRunInfo()
                 {
                     Frame = endTime,
                     Code = "当前时段无有效数据",
@@ -276,7 +232,7 @@ namespace WCS.WorkEngineering.Systems
                     StartTime = startTime,
                     EndTime = endTime,
                     Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
-                    Type = DevType.SRM
+                    Type = type
                 }).ExecuteCommand();
             }
 
@@ -286,9 +242,9 @@ namespace WCS.WorkEngineering.Systems
                 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;
+                if (plcEx.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();
+                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))
                 {
@@ -305,7 +261,7 @@ namespace WCS.WorkEngineering.Systems
                                 StartTime = startTime,
                                 EndTime = info.Frame,
                                 Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
-                                Type = DevType.SRM
+                                Type = type
                             });
                         }
                         else //如果有就用前一天的最后一条数据做计算
@@ -319,7 +275,7 @@ namespace WCS.WorkEngineering.Systems
                                 StartTime = startTime,
                                 EndTime = info.Frame,
                                 Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
-                                Type = DevType.SRM
+                                Type = type
                             });
                         }
                     }
@@ -334,7 +290,7 @@ namespace WCS.WorkEngineering.Systems
                             StartTime = info.Frame,
                             EndTime = endTime,
                             Duration = Convert.ToInt64((endTime - info.Frame).TotalMilliseconds),
-                            Type = DevType.SRM
+                            Type = type
                         });
                     }
                     else //中间数据
@@ -349,14 +305,14 @@ namespace WCS.WorkEngineering.Systems
                             StartTime = start.Frame,
                             EndTime = info.Frame,
                             Duration = Convert.ToInt64((info.Frame - start.Frame).TotalMilliseconds),
-                            Type = DevType.SRM
+                            Type = type
                         });
                         start = info;
                     }
                 }
 
-                var sql = db.Insertable(runInfos).ToSqlString();
-                db.Ado.ExecuteCommand(GetString(sql));
+                var sql = plcEx.Insertable(runInfos).ToSqlString();
+                plcEx.Ado.ExecuteCommand(GetString(sql));
             });
         }
 
@@ -364,16 +320,17 @@ namespace WCS.WorkEngineering.Systems
         /// rgv
         /// </summary>
         /// <param name="db"></param>
-        public void ExRgvRunInfo(SqlSugarScopeProvider db)
+        public void ExRgvRunInfo(SqlSugarScopeProvider db, SqlSugarScopeProvider plcEx)
         {
             var startTime = DateTime.Now;
             var endTime = DateTime.Now;
             IEnumerable<IGrouping<string, WCS_RGV521>> rgv521 = new List<IGrouping<string, WCS_RGV521>>();
+            var type = DevType.RGV.ToString();
             //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
-            if (db.Queryable<DevRunInfo>().Any(x => x.Type == DevType.RGV))
+            if (plcEx.Queryable<DevRunInfo>().Any(x => x.Type == type))
             {
                 //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
-                var runInfo = db.Queryable<DevRunInfo>().Where(x => x.Type == DevType.RGV).OrderByDescending(x => x.Frame).First();
+                var runInfo = plcEx.Queryable<DevRunInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
                 startTime = runInfo.Frame.AddDays(+1).Date;//后一天的初始时间
                 endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
             }
@@ -384,7 +341,7 @@ namespace WCS.WorkEngineering.Systems
                 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.RGV)) return;
+            if (plcEx.Queryable<DevRunInfo>().Any(x => x.EndTime == endTime && x.Type == type)) return;
 
             rgv521 = db.Queryable<WCS_RGV521>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
 
@@ -399,7 +356,7 @@ namespace WCS.WorkEngineering.Systems
                     StartTime = startTime,
                     EndTime = endTime,
                     Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
-                    Type = DevType.RGV
+                    Type = type
                 }).ExecuteCommand();
             }
 
@@ -409,9 +366,9 @@ namespace WCS.WorkEngineering.Systems
                 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;
+                if (plcEx.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();
+                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))
                 {
@@ -428,7 +385,7 @@ namespace WCS.WorkEngineering.Systems
                                 StartTime = startTime,
                                 EndTime = info.Frame,
                                 Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
-                                Type = DevType.RGV
+                                Type = type
                             });
                         }
                         else //如果有就用前一天的最后一条数据做计算
@@ -442,7 +399,7 @@ namespace WCS.WorkEngineering.Systems
                                 StartTime = startTime,
                                 EndTime = info.Frame,
                                 Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
-                                Type = DevType.RGV
+                                Type = type
                             });
                         }
                     }
@@ -457,7 +414,7 @@ namespace WCS.WorkEngineering.Systems
                             StartTime = info.Frame,
                             EndTime = endTime,
                             Duration = Convert.ToInt64((endTime - info.Frame).TotalMilliseconds),
-                            Type = DevType.RGV
+                            Type = type
                         });
                     }
                     else //中间数据
@@ -472,14 +429,14 @@ namespace WCS.WorkEngineering.Systems
                             StartTime = start.Frame,
                             EndTime = info.Frame,
                             Duration = Convert.ToInt64((info.Frame - start.Frame).TotalMilliseconds),
-                            Type = DevType.Robot
+                            Type = type
                         });
                         start = info;
                     }
                 }
 
-                var sql = db.Insertable(runInfos).ToSqlString();
-                db.Ado.ExecuteCommand(GetString(sql));
+                var sql = plcEx.Insertable(runInfos).ToSqlString();
+                plcEx.Ado.ExecuteCommand(GetString(sql));
             });
         }
 
@@ -487,16 +444,17 @@ namespace WCS.WorkEngineering.Systems
         /// 桁架
         /// </summary>
         /// <param name="db"></param>
-        public void ExTrussRunInfo(SqlSugarScopeProvider db)
+        public void ExTrussRunInfo(SqlSugarScopeProvider db, SqlSugarScopeProvider plcEx)
         {
             var startTime = DateTime.Now;
             var endTime = DateTime.Now;
             IEnumerable<IGrouping<string, WCS_Truss521>> truss521 = new List<IGrouping<string, WCS_Truss521>>();
+            var type = DevType.Truss.ToString();
             //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
-            if (db.Queryable<DevRunInfo>().Any(x => x.Type == DevType.Truss))
+            if (plcEx.Queryable<DevRunInfo>().Any(x => x.Type == type))
             {
                 //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
-                var runInfo = db.Queryable<DevRunInfo>().Where(x => x.Type == DevType.Truss).OrderByDescending(x => x.Frame).First();
+                var runInfo = plcEx.Queryable<DevRunInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
                 startTime = runInfo.Frame.AddDays(+1).Date;//后一天的初始时间
                 endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
             }
@@ -507,7 +465,7 @@ namespace WCS.WorkEngineering.Systems
                 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.Truss)) return;
+            if (plcEx.Queryable<DevRunInfo>().Any(x => x.EndTime == endTime && x.Type == type)) return;
 
             truss521 = db.Queryable<WCS_Truss521>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
 
@@ -522,7 +480,7 @@ namespace WCS.WorkEngineering.Systems
                     StartTime = startTime,
                     EndTime = endTime,
                     Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
-                    Type = DevType.Truss
+                    Type = type
                 }).ExecuteCommand();
             }
 
@@ -532,9 +490,9 @@ namespace WCS.WorkEngineering.Systems
                 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;
+                if (plcEx.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();
+                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))
                 {
@@ -550,7 +508,7 @@ namespace WCS.WorkEngineering.Systems
                                 StartTime = startTime,
                                 EndTime = info.Frame,
                                 Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
-                                Type = DevType.Truss
+                                Type = type
                             });
                         }
                         else //如果有就用前一天的最后一条数据做计算
@@ -564,7 +522,7 @@ namespace WCS.WorkEngineering.Systems
                                 StartTime = startTime,
                                 EndTime = info.Frame,
                                 Duration = Convert.ToInt64((info.Frame - startTime).TotalMilliseconds),
-                                Type = DevType.Robot
+                                Type = type
                             });
                         }
                     }
@@ -578,7 +536,7 @@ namespace WCS.WorkEngineering.Systems
                             StartTime = info.Frame,
                             EndTime = endTime,
                             Duration = Convert.ToInt64((endTime - info.Frame).TotalMilliseconds),
-                            Type = DevType.Truss
+                            Type = type
                         });
                     }
                     else //中间数据
@@ -592,14 +550,14 @@ namespace WCS.WorkEngineering.Systems
                             StartTime = start.Frame,
                             EndTime = info.Frame,
                             Duration = Convert.ToInt64((info.Frame - start.Frame).TotalMilliseconds),
-                            Type = DevType.Truss
+                            Type = type
                         });
                         start = info;
                     }
                 }
 
-                var sql = db.Insertable(runInfos).ToSqlString();
-                db.Ado.ExecuteCommand(GetString(sql));
+                var sql = plcEx.Insertable(runInfos).ToSqlString();
+                plcEx.Ado.ExecuteCommand(GetString(sql));
             });
         }
 
@@ -611,16 +569,17 @@ namespace WCS.WorkEngineering.Systems
         /// 机械臂
         /// </summary>
         /// <param name="db"></param>
-        public void ExRobotAlarmInfo(SqlSugarScopeProvider db)
+        public void ExRobotAlarmInfo(SqlSugarScopeProvider db, SqlSugarScopeProvider plcEx)
         {
             var startTime = DateTime.Now;
             var endTime = DateTime.Now;
             IEnumerable<IGrouping<string, QuestDb_Robot522>> robot522 = new List<IGrouping<string, QuestDb_Robot522>>();
+            var type = DevType.Robot.ToString();
             //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
-            if (db.Queryable<DevAlarmInfo>().Any(x => x.Type == DevType.Robot))
+            if (plcEx.Queryable<DevAlarmInfo>().Any(x => x.Type == type))
             {
                 //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
-                var alarmInfo = db.Queryable<DevAlarmInfo>().Where(x => x.Type == DevType.Robot).OrderByDescending(x => x.Frame).First();
+                var alarmInfo = plcEx.Queryable<DevAlarmInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
                 startTime = alarmInfo.Frame.AddDays(+1).Date;//后一天的初始时间
                 endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
             }
@@ -631,13 +590,13 @@ namespace WCS.WorkEngineering.Systems
                 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;
+            if (plcEx.Queryable<DevAlarmInfo>().Any(x => x.EndTime == endTime && x.Type == type)) 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()
+                plcEx.Insertable(new DevAlarmInfo()
                 {
                     Frame = endTime,
                     Code = "当前时段无有效数据",
@@ -645,7 +604,7 @@ namespace WCS.WorkEngineering.Systems
                     StartTime = startTime,
                     EndTime = endTime,
                     Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
-                    Type = DevType.Robot
+                    Type = type
                 }).ExecuteCommand();
             }
 
@@ -655,9 +614,9 @@ namespace WCS.WorkEngineering.Systems
                 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;
+                if (plcEx.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();
+                var yesterEnd = plcEx.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))
@@ -683,7 +642,7 @@ namespace WCS.WorkEngineering.Systems
                             StartTime = alarm.Time,
                             EndTime = endTime,
                             Duration = Convert.ToInt64((endTime - alarm.Time).TotalMilliseconds),
-                            Type = DevType.Robot
+                            Type = type
                         }));
                     }
                     else
@@ -698,7 +657,7 @@ namespace WCS.WorkEngineering.Systems
                                 StartTime = alarm.Time,
                                 EndTime = info.Frame,
                                 Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
-                                Type = DevType.Robot
+                                Type = type
                             }));
 
                             alarmList = new List<EquipmentAlarm>(); //清空现有报警信息
@@ -722,7 +681,7 @@ namespace WCS.WorkEngineering.Systems
                                     StartTime = alarm.Time,
                                     EndTime = info.Frame,
                                     Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
-                                    Type = DevType.Robot
+                                    Type = type
                                 });
                                 treatedAlarm.Add(alarm.Msg);
                             }
@@ -734,12 +693,12 @@ namespace WCS.WorkEngineering.Systems
 
                 if (runInfos.Any())
                 {
-                    var sql = db.Insertable(runInfos).ToSqlString();
-                    db.Ado.ExecuteCommand(GetString(sql));
+                    var sql = plcEx.Insertable(runInfos).ToSqlString();
+                    plcEx.Ado.ExecuteCommand(GetString(sql));
                 }
                 else
                 {
-                    db.Insertable(new DevAlarmInfo()
+                    plcEx.Insertable(new DevAlarmInfo()
                     {
                         Frame = endTime,
                         Code = infos.Key,
@@ -747,7 +706,7 @@ namespace WCS.WorkEngineering.Systems
                         StartTime = startTime,
                         EndTime = endTime,
                         Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
-                        Type = DevType.Robot
+                        Type = type
                     }).ExecuteCommand();
                 }
             });
@@ -757,16 +716,17 @@ namespace WCS.WorkEngineering.Systems
         /// 堆垛机
         /// </summary>
         /// <param name="db"></param>
-        public void ExSrmAlarmInfo(SqlSugarScopeProvider db)
+        public void ExSrmAlarmInfo(SqlSugarScopeProvider db, SqlSugarScopeProvider plcEx)
         {
             var startTime = DateTime.Now;
             var endTime = DateTime.Now;
             IEnumerable<IGrouping<string, QuestDb_SRM523>> srm523 = new List<IGrouping<string, QuestDb_SRM523>>();
+            var type = DevType.SRM.ToString();
             //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
-            if (db.Queryable<DevAlarmInfo>().Any(x => x.Type == DevType.SRM))
+            if (plcEx.Queryable<DevAlarmInfo>().Any(x => x.Type == type))
             {
                 //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
-                var alarmInfo = db.Queryable<DevAlarmInfo>().Where(x => x.Type == DevType.SRM).OrderByDescending(x => x.Frame).First();
+                var alarmInfo = plcEx.Queryable<DevAlarmInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
                 startTime = alarmInfo.Frame.AddDays(+1).Date;//后一天的初始时间
                 endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
             }
@@ -777,13 +737,13 @@ namespace WCS.WorkEngineering.Systems
                 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;
+            if (plcEx.Queryable<DevAlarmInfo>().Any(x => x.EndTime == endTime && x.Type == type)) 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()
+                plcEx.Insertable(new DevAlarmInfo()
                 {
                     Frame = endTime,
                     Code = "当前时段无有效数据",
@@ -791,7 +751,7 @@ namespace WCS.WorkEngineering.Systems
                     StartTime = startTime,
                     EndTime = endTime,
                     Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
-                    Type = DevType.SRM
+                    Type = type
                 }).ExecuteCommand();
             }
 
@@ -801,9 +761,9 @@ namespace WCS.WorkEngineering.Systems
                 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;
+                if (plcEx.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();
+                var yesterEnd = plcEx.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))
@@ -829,7 +789,7 @@ namespace WCS.WorkEngineering.Systems
                             StartTime = alarm.Time,
                             EndTime = endTime,
                             Duration = Convert.ToInt64((endTime - alarm.Time).TotalMilliseconds),
-                            Type = DevType.SRM
+                            Type = type
                         }));
                     }
                     else
@@ -844,7 +804,7 @@ namespace WCS.WorkEngineering.Systems
                                 StartTime = alarm.Time,
                                 EndTime = info.Frame,
                                 Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
-                                Type = DevType.SRM
+                                Type = type
                             }));
 
                             alarmList = new List<EquipmentAlarm>(); //清空现有报警信息
@@ -868,7 +828,7 @@ namespace WCS.WorkEngineering.Systems
                                     StartTime = alarm.Time,
                                     EndTime = info.Frame,
                                     Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
-                                    Type = DevType.SRM
+                                    Type = type
                                 });
                                 treatedAlarm.Add(alarm.Msg);
                             }
@@ -880,12 +840,12 @@ namespace WCS.WorkEngineering.Systems
 
                 if (runInfos.Any())
                 {
-                    var sql = db.Insertable(runInfos).ToSqlString();
-                    db.Ado.ExecuteCommand(GetString(sql));
+                    var sql = plcEx.Insertable(runInfos).ToSqlString();
+                    plcEx.Ado.ExecuteCommand(GetString(sql));
                 }
                 else
                 {
-                    db.Insertable(new DevAlarmInfo()
+                    plcEx.Insertable(new DevAlarmInfo()
                     {
                         Frame = endTime,
                         Code = infos.Key,
@@ -893,7 +853,7 @@ namespace WCS.WorkEngineering.Systems
                         StartTime = startTime,
                         EndTime = endTime,
                         Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
-                        Type = DevType.SRM
+                        Type = type
                     }).ExecuteCommand();
                 }
             });
@@ -903,16 +863,17 @@ namespace WCS.WorkEngineering.Systems
         /// rgv
         /// </summary>
         /// <param name="db"></param>
-        public void ExRgvAlarmInfo(SqlSugarScopeProvider db)
+        public void ExRgvAlarmInfo(SqlSugarScopeProvider db, SqlSugarScopeProvider plcEx)
         {
             var startTime = DateTime.Now;
             var endTime = DateTime.Now;
             IEnumerable<IGrouping<string, QuestDb_RGV523>> rgv523 = new List<IGrouping<string, QuestDb_RGV523>>();
+            var type = DevType.RGV.ToString();
             //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
-            if (db.Queryable<DevAlarmInfo>().Any(x => x.Type == DevType.RGV))
+            if (plcEx.Queryable<DevAlarmInfo>().Any(x => x.Type == type))
             {
                 //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
-                var alarmInfo = db.Queryable<DevAlarmInfo>().Where(x => x.Type == DevType.RGV).OrderByDescending(x => x.Frame).First();
+                var alarmInfo = plcEx.Queryable<DevAlarmInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
                 startTime = alarmInfo.Frame.AddDays(+1).Date;//后一天的初始时间
                 endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
             }
@@ -923,13 +884,13 @@ namespace WCS.WorkEngineering.Systems
                 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;
+            if (plcEx.Queryable<DevAlarmInfo>().Any(x => x.EndTime == endTime && x.Type == type)) 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()
+                plcEx.Insertable(new DevAlarmInfo()
                 {
                     Frame = endTime,
                     Code = "当前时段无有效数据",
@@ -937,7 +898,7 @@ namespace WCS.WorkEngineering.Systems
                     StartTime = startTime,
                     EndTime = endTime,
                     Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
-                    Type = DevType.RGV
+                    Type = type
                 }).ExecuteCommand();
             }
 
@@ -947,9 +908,9 @@ namespace WCS.WorkEngineering.Systems
                 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;
+                if (plcEx.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();
+                var yesterEnd = plcEx.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))
@@ -975,7 +936,7 @@ namespace WCS.WorkEngineering.Systems
                             StartTime = alarm.Time,
                             EndTime = endTime,
                             Duration = Convert.ToInt64((endTime - alarm.Time).TotalMilliseconds),
-                            Type = DevType.RGV
+                            Type = type
                         }));
                     }
                     else
@@ -990,7 +951,7 @@ namespace WCS.WorkEngineering.Systems
                                 StartTime = alarm.Time,
                                 EndTime = info.Frame,
                                 Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
-                                Type = DevType.RGV
+                                Type = type
                             }));
 
                             alarmList = new List<EquipmentAlarm>(); //清空现有报警信息
@@ -1014,7 +975,7 @@ namespace WCS.WorkEngineering.Systems
                                     StartTime = alarm.Time,
                                     EndTime = info.Frame,
                                     Duration = Convert.ToInt64((info.Frame - alarm.Time).TotalMilliseconds),
-                                    Type = DevType.RGV
+                                    Type = type
                                 });
                                 treatedAlarm.Add(alarm.Msg);
                             }
@@ -1026,11 +987,11 @@ namespace WCS.WorkEngineering.Systems
 
                 if (runInfos.Any())
                 {
-                    db.Insertable(runInfos).ExecuteCommand();
+                    plcEx.Insertable(runInfos).ExecuteCommand();
                 }
                 else
                 {
-                    db.Insertable(new DevAlarmInfo()
+                    plcEx.Insertable(new DevAlarmInfo()
                     {
                         Frame = endTime,
                         Code = infos.Key,
@@ -1038,7 +999,153 @@ namespace WCS.WorkEngineering.Systems
                         StartTime = startTime,
                         EndTime = endTime,
                         Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
-                        Type = DevType.RGV
+                        Type = type
+                    }).ExecuteCommand();
+                }
+            });
+        }
+
+        /// <summary>
+        /// Truss
+        /// </summary>
+        /// <param name="db"></param>
+        public void ExTrussAlarmInfo(SqlSugarScopeProvider db, SqlSugarScopeProvider plcEx)
+        {
+            var startTime = DateTime.Now;
+            var endTime = DateTime.Now;
+            IEnumerable<IGrouping<string, QuestDb_Truss523>> rgv523 = new List<IGrouping<string, QuestDb_Truss523>>();
+            var type = DevType.Truss.ToString();
+            //查看rgv类型是否存在运行信息,用于系统被第一次启用时进行初始化
+            if (plcEx.Queryable<DevAlarmInfo>().Any(x => x.Type == type))
+            {
+                //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
+                var alarmInfo = plcEx.Queryable<DevAlarmInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
+                startTime = alarmInfo.Frame.AddDays(+1).Date;//后一天的初始时间
+                endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
+            }
+            else
+            {
+                if (!db.Queryable<QuestDb_Truss523>().Any()) return;
+                startTime = db.Queryable<QuestDb_Truss523>().OrderBy(x => x.Frame).First().Frame.Date;
+                endTime = startTime.AddDays(+1).AddMilliseconds(-1);
+            }
+            if (endTime > DateTime.Now.AddHours(1)) return; //一次处理24小时的数据
+            if (plcEx.Queryable<DevAlarmInfo>().Any(x => x.EndTime == endTime && x.Type == type)) return;
+
+            rgv523 = db.Queryable<QuestDb_Truss523>().Where(x => x.Frame > startTime && x.Frame <= endTime).ToList().GroupBy(x => x.Code).ToList();
+
+            if (!rgv523.Any())
+            {
+                plcEx.Insertable(new DevAlarmInfo()
+                {
+                    Frame = endTime,
+                    Code = "当前时段无有效数据",
+                    Alarm = "当前时段无有效数据",
+                    StartTime = startTime,
+                    EndTime = endTime,
+                    Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
+                    Type = type
+                }).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 (plcEx.Queryable<DevAlarmInfo>().Any(x => x.Code == infos.Key && x.EndTime == end.Frame)) return;
+                //获取前一天最后的一条数据
+                var yesterEnd = plcEx.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 = type
+                        }));
+                    }
+                    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 = type
+                            }));
+
+                            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 = type
+                                });
+                                treatedAlarm.Add(alarm.Msg);
+                            }
+
+                            alarmList = alarmList.Where(x => !treatedAlarm.Contains(x.Msg)).ToList();
+                        }
+                    }
+                }
+
+                if (runInfos.Any())
+                {
+                    plcEx.Insertable(runInfos).ExecuteCommand();
+                }
+                else
+                {
+                    plcEx.Insertable(new DevAlarmInfo()
+                    {
+                        Frame = endTime,
+                        Code = infos.Key,
+                        Alarm = "当前时段无有效数据",
+                        StartTime = startTime,
+                        EndTime = endTime,
+                        Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
+                        Type = type
                     }).ExecuteCommand();
                 }
             });
@@ -1049,19 +1156,20 @@ namespace WCS.WorkEngineering.Systems
         #region 任务状态分析
 
         /// <summary>
-        /// 机械臂
+        /// 机械臂分析单双爪任务占比,需要按照任务类型分类
         /// </summary>
         /// <param name="db"></param>
-        public void ExRobotTaskSumRunInfo(SqlSugarScopeProvider db)
+        public void ExRobotTaskSumRunInfo(SqlSugarScopeProvider db, SqlSugarScopeProvider plcEx)
         {
             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 == DevType.RobotTaskSum))
+            if (plcEx.Queryable<DevRunInfo>().Any(x => x.Type == type))
             {
                 //已有信息,查找最后一条信息用于获取开始时间,最后一条通常是前一天的最后条数据
-                var runInfo = db.Queryable<DevRunInfo>().Where(x => x.Type == DevType.RobotTaskSum).OrderByDescending(x => x.Frame).First();
+                var runInfo = plcEx.Queryable<DevRunInfo>().Where(x => x.Type == type).OrderByDescending(x => x.Frame).First();
                 startTime = runInfo.Frame.AddDays(+1).Date;//后一天的初始时间
                 endTime = startTime.AddDays(+1).AddMilliseconds(-1);//
             }
@@ -1072,13 +1180,13 @@ namespace WCS.WorkEngineering.Systems
                 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;
+            if (plcEx.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()
+                plcEx.Insertable(new DevRunInfo()
                 {
                     Frame = endTime,
                     Code = "当前时段无有效数据",
@@ -1087,89 +1195,33 @@ namespace WCS.WorkEngineering.Systems
                     StartTime = startTime,
                     EndTime = endTime,
                     Duration = Convert.ToInt64((endTime - startTime).TotalMilliseconds),
-                    Type = DevType.RobotTaskSum
+                    Type = type
                 }).ExecuteCommand();
             }
 
             Parallel.ForEach(robot520, infos =>
             {
-                //infos = infos.Where(x => x.TaskNumber1 != 0 || x.TaskNumber2 != 0).ToList();
+                var infoList = infos.Where(x => x.TaskNumber1 != 0 || x.TaskNumber2 != 0).ToList().DistinctItemBy(x => x.VoucherNo);
 
-                // 获取第一条数据与最后一条数据
-                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));
+                foreach (var info in infoList.OrderBy(x => x.Frame))
+                {
+                    var taskSum = 0;
+                    if (info.TaskNumber1 != 0) taskSum += 1;
+                    if (info.TaskNumber2 != 0) taskSum += 1;
+                    runInfos.Add(new DevRunInfo()
+                    {
+                        Frame = info.Frame,
+                        Code = info.Code,
+                        RunMode = taskSum.ToString(),
+                        RunStatus = $"{info.TaskNumber1}--{info.TaskNumber2}--{info.TaskType}",
+                        Duration = 0,
+                        Type = type
+                    });
+                }
+
+                var sql = plcEx.Insertable(runInfos).ToSqlString();
+                plcEx.Ado.ExecuteCommand(GetString(sql));
             });
         }
 

+ 6 - 1
WCS.WorkEngineering/WorkStart.cs

@@ -56,8 +56,13 @@ namespace WCS.WorkEngineering
 
                             SqlSugarHelper.SetPLC(connectionString.Key);
 
+                            break;
+                        case "PlcEx"://PLC
+
+                            SqlSugarHelper.SetPLCEX(connectionString.Key);
+
                             _db.DbMaintenance.CreateDatabase();
-                            //_db.CodeFirst.InitTables<DevRunInfo>();
+                            _db.CodeFirst.InitTables<DevRunInfo>();
                             _db.CodeFirst.InitTables<DevAlarmInfo>();
 
                             break;