Преглед на файлове

涂布环穿维护相关优化

林豪 左 преди 3 години
родител
ревизия
72b57c3ec7
променени са 2 файла, в които са добавени 37 реда и са изтрити 42 реда
  1. 1 1
      Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs
  2. 36 41
      Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

+ 1 - 1
Projects/永冠OPP/WCS.Service/Extensions/DeviceExtension.cs

@@ -125,7 +125,6 @@ namespace WCS.Service.Extensions
         /// <summary>
         /// 获取设备组中需要取货的设备
         /// </summary>
-        /// <param name="obj"></param>
         /// <returns></returns>
         public List<Device<IStation520, IStation521, IStation523>> RGVGetTaskedDevice()
         {
@@ -389,6 +388,7 @@ namespace WCS.Service.Extensions
         {
             get
             {
+                //利用WorkMode来排除的环穿维护设备
                 return AllRGVList.Where(v => v.Entity.PROTOCOLS.Any(d => Entity.PROTOCOLS.Any(e => e.DB.PLC.IP == d.DB.PLC.IP)))
                     .Where(v => v.Entity.CODE != Entity.CODE && v.Data2.WorkMode != 0).ToList();
             }

+ 36 - 41
Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

@@ -106,13 +106,13 @@ namespace WCS.Service.Works.RGV
                     //取小车上的任务
                     DB.Do(db =>
                     {
-                        List<int> taskids = new List<int>() { obj.Data2.TaskID_1, obj.Data2.TaskID_2 };
+                        var taskids = new List<int>() { obj.Data2.TaskID_1, obj.Data2.TaskID_2 };
                         var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
                         if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
                             throw new WarnException("任务组ID不一致");
                         if (!tasks.GroupBy(p => p.TaskGroupKey).Any())
                             throw new WarnException("无任务组ID");
-                        var destStation = Device.Find(tasks.FirstOrDefault().ADDRNEXT).Create<StationDeviceGroup>();
+                        var destStation = Device.Find(tasks.FirstOrDefault()!.ADDRNEXT).Create<StationDeviceGroup>();
                         obj.Put(destStation, obj.Data2.TaskID_1, obj.Data2.TaskID_2);
                     });
                     return;
@@ -166,6 +166,19 @@ namespace WCS.Service.Works.RGV
                             });
                             return;
                         }
+
+                        if (obj.RGVList.Count != 6)//有小车进入维修站时启用该逻辑,避免在正常使用时影响效率
+                        {
+                            var station11 = obj.LocationList.Where(v => v.Entity.Is(DF.涂布RGV取货设备组)).Where(v => v.RGVGetTaskedDevice().Any())
+                                .Where(v => v.CurrentRGV() == null).MinBy(obj.Distance);
+
+                            //该站台到当前小车的范围中没有车
+                            if (obj.RGVList.Any(v => station11!.Position <= v.Position && obj.Position > v.Position))
+                            {
+                                obj.Move(station11);
+                                return;
+                            }
+                        }
                         else if (pickStation.Entity.CODE == "G9")
                         {
                             //九站台的小车需要额外检测一下11站台是否需要取货
@@ -184,57 +197,39 @@ namespace WCS.Service.Works.RGV
                         //自己是否阻挡了该小车
                         if (afterRgv.Data2.WorkMode == RGVMode.自动 && afterRgv.Data2.SystemStatus != RGVRunStatus.空闲 && obj.StopedByMe(afterRgv))
                         {
-                            if (pickStation.Entity.CODE == "G2")
+                            switch (pickStation.Entity.CODE)
                             {
-                                //此站台因需要进行排队,因此是否需要赶车取决于是否拦住了两个小车的任务
-                                var afterRgv1 = afterRgv.After();
-                                //如果是空闲或者没有拦住他,就不执行赶车
-                                if (afterRgv1.Data2.WorkMode == RGVMode.自动 && (afterRgv1.Data2.SystemStatus == RGVRunStatus.空闲 || !afterRgv.StopedByMe(afterRgv1))) return;
-                            }
-                            else if (pickStation.Entity.CODE == "G3")
-                            {
-                                //为了减少空跑,需要被阻拦的小车后面的小车任务类型为移动并且位置值要大于618500小于被阻拦小车的位置值
-                                var afterRgv1 = afterRgv.After();
-                                if (afterRgv1.Data2.WorkMode == RGVMode.自动 && afterRgv.Data2.TaskType_1 != RGVTaskType.移动 && !(afterRgv1.Position < afterRgv.Position && afterRgv1.Position > 618500)) return;
+                                case "G2":
+                                    {
+                                        if (obj.RGVList.Count != 6) break;
+                                        //此站台因需要进行排队,因此是否需要赶车取决于是否拦住了两个小车的任务
+                                        var afterRgv1 = afterRgv.After();
+                                        //如果是空闲或者没有拦住他,就不执行赶车
+                                        if (afterRgv1.Data2.WorkMode == RGVMode.自动 && (afterRgv1.Data2.SystemStatus == RGVRunStatus.空闲 || !afterRgv.StopedByMe(afterRgv1))) return;
+                                        break;
+                                    }
+                                case "G3":
+                                    {
+                                        //为了减少空跑,需要被阻拦的小车后面的小车任务类型为移动并且位置值要大于618500小于被阻拦小车的位置值
+                                        var afterRgv1 = afterRgv.After();
+                                        if (afterRgv1.Data2.WorkMode == RGVMode.自动 && afterRgv.Data2.TaskType_1 != RGVTaskType.移动 && !(afterRgv1.Position < afterRgv.Position && afterRgv1.Position > 618500)) return;
+                                        break;
+                                    }
                             }
                             //找到当前所在站台的下一个取货点
                             var beforeStation = Device.Where(v => v.Is(DF.涂布RGV取货设备组) && v.CODE != pickStation.Entity.CODE)
-                                          .Select(v => v.Create<StationDeviceGroup>())
-                                          .OrderBy(v => pickStation.Distance(v))
-                                          .FirstOrDefault();
+                                .Select(v => v.Create<StationDeviceGroup>()).MinBy(v => pickStation.Distance(v));
 
                             //写入移动任务
                             obj.Move(beforeStation);
                             return;
                         }
-                        else if (pickStation.Entity.CODE == "G11")
+
+                        if (pickStation.Entity.CODE == "G11")
                         {
                             obj.Move(Device.Find("G2").Create<StationDeviceGroup>());
                             return;
                         }
-                        else
-                        {
-                            //找到自己前面的 有货 没有小车 没有正在过来的小车 距离自己最近的 的站台
-                            var station = Device.Where(v => v.Is(DF.涂布RGV取货设备组))
-                                                    .Select(v => v.Create<StationDeviceGroup>())
-                                                    .Where(v => v.Position > obj.Position) //前面的
-                                                    .Where(v => v.CurrentRGV() == null)
-                                                    .Where(v => !v.RgvList.Any(c => c.Data2.SystemStatus != RGVRunStatus.空闲 && c.Data2.DestPosition_1 == v.Entity.CODE.GetShortCode()))
-                                                    .Where(v =>
-                                                    {
-                                                        // 筛选出有任务号和起始及目标地址的设备
-                                                        var b = pickStation.RGVGetTaskedDevice();
-                                                        //是否需要取货
-                                                        if (b != null && b.Count > 0) return true;
-                                                        else return false;
-                                                    })
-                                                    .OrderBy(v => obj.Distance(v)).FirstOrDefault();//取当前小车最近
-                            if (obj.Data2.TaskType_1 == RGVTaskType.移动 && obj.Distance(station) > 100000)         
-                            {
-                                obj.Move(station);
-                                return;
-                            }
-                        }
                     }
 
                     //是否在一个放货站台
@@ -278,7 +273,7 @@ namespace WCS.Service.Works.RGV
                     //取小车上的任务
                     DB.Do(db =>
                     {
-                        List<int> taskids = new List<int>() { obj.Data2.TaskID_1, obj.Data2.TaskID_2 };
+                        var taskids = new List<int>() { obj.Data2.TaskID_1, obj.Data2.TaskID_2 };
                         var tasks = db.Default.Set<WCS_TASK>().Where(p => taskids.Contains(p.ID));
                         if (tasks.GroupBy(p => p.TaskGroupKey).Count() > 1)
                             throw new WarnException("任务组ID不一致");