林豪 左 2 years ago
parent
commit
bd1280aa15
1 changed files with 56 additions and 30 deletions
  1. 56 30
      Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

+ 56 - 30
Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

@@ -347,7 +347,7 @@ namespace WCS.Service.Works.RGV
                         //是否需要取货
                         if (devs != null && devs.Count() > 0)
                         {
-                            if (devs.Count!= devs[0].Data2.Goodsnum) throw new WarnException($"取货位货物数量不一致");
+                            if (devs.Count != devs[0].Data2.Goodsnum) throw new WarnException($"取货位货物数量不一致");
                             if (obj.Data2.TaskType_1 != RGVTaskType.移动) throw new WarnException($"RGV正在执行{obj.Data2.TaskType_1}");
                             if (obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV有光电,无法取货,请检查实际情况");
                             if (!obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.RGV到站)) throw new WarnException("RGV无到站状态,请检查RGV实际状态");
@@ -409,7 +409,9 @@ namespace WCS.Service.Works.RGV
                                 if (obj.Data2.WorkMode != RGVMode.自动) throw new WarnException($"RGV状态{obj.Data2.WorkMode},无法分配巷道");
                                 if (obj.Data2.SystemStatus != RGVRunStatus.空闲) throw new WarnException($"rgv状态为{obj.Data2.SystemStatus},无法分配巷道");
                                 if (!obj.Data2.Status_1.HasFlag(WCS.Entity.Protocol.RGVStatus.光电)) throw new WarnException("RGV无光电,无法分配巷道");
+
                                 #region 开始分配巷道
+
                                 var taskIds = new List<int>() { obj.Data2.TaskID_1, obj.Data2.TaskID_2 };
                                 taskIds = taskIds.Where(v => v > 10000).ToList(); //筛选出有效的任务
 
@@ -428,55 +430,80 @@ namespace WCS.Service.Works.RGV
 
                                     foreach (var item in tunnels)
                                     {
-                                        //当前巷道的取货点
-                                        var allIn = Device.Where(v => v.Is(DF.SRMBOPP取货))
-                                                          .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
-                                                          .Select(v => v.CODE)
-                                                          .ToList();
-                                        //下一个目标地址包含取货点的设备,此时获得的数据是旋转台
-                                        var turntable = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && allIn.Contains(p.NEXT.CODE))).Select(v => v.CODE);
                                         //获得RGV的交货点
-                                        StationDevice rgvDeliveryPoint = null;
+                                        StationDeviceGroup rgvDeliveryPoint = null;
                                         if (item.CODE == "TY1")
                                         {
-                                            rgvDeliveryPoint = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && turntable.Contains(p.NEXT.CODE)))
-                                                      .Select(v => v.Create<StationDevice>()) //取所有可以到达取货点设备的信息
-                                                      .Where(v => v.Data3.Status.HasFlag(StationStatus.自动))//筛选出空闲的路径点,此处因输送机都是一个动力,因此可以先找路径点再找设备组
-                                                      .Distinct()
-                                                      .FirstOrDefault();//去一次重
+                                            var deviceGroup = Device.Find("G16").Create<StationDeviceGroup>();
+                                            if (deviceGroup.Items.Count(v => v.Data3.Status.HasFlag(StationStatus.自动)) == 2) //设备组中两个设备都是自动状态时表示当前设备可用
+                                            {
+                                                rgvDeliveryPoint = deviceGroup;
+                                            }
                                         }
                                         else
                                         {
-                                            rgvDeliveryPoint = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => p.NEXT != null && turntable.Contains(p.NEXT.CODE)))
-                                                     .Select(v => v.Create<StationDevice>()) //取所有可以到达取货点设备的信息
-                                                     .Where(v => !v.Data3.Status.HasFlag(StationStatus.运行状态位)
-                                                              && !v.Data2.Status.HasFlag(IstationStatus.光电状态)
-                                                              && v.Data2.Tasknum < 10000
-                                                              && v.Data3.Status.HasFlag(StationStatus.自动))//筛选出空闲的路径点,此处因输送机都是一个动力,因此可以先找路径点再找设备组
-                                                     .Distinct()
-                                                     .FirstOrDefault();//去一次重
+                                            StationDeviceGroup deviceGroup = null;
+
+                                            #region 根据巷道获取放货设备组编号
+
+                                            if (item.CODE == "TY2")
+                                            {
+                                                deviceGroup = Device.Find("G15").Create<StationDeviceGroup>();
+                                            }
+                                            else if (item.CODE is "TY3" or "TY4")
+                                            {
+                                                deviceGroup = Device.Find("G14").Create<StationDeviceGroup>();
+                                            }
+                                            else if (item.CODE is "TY5" or "TY6")
+                                            {
+                                                deviceGroup = Device.Find("G13").Create<StationDeviceGroup>();
+                                            }
+                                            else if (item.CODE is "TY7" or "TY8")
+                                            {
+                                                deviceGroup = Device.Find("G12").Create<StationDeviceGroup>();
+                                            }
+
+                                            #endregion 根据巷道获取放货设备组编号
+
+                                            if (deviceGroup != null && deviceGroup.Items.Count(v => !v.Data3.Status.HasFlag(StationStatus.运行状态位)
+                                                                                                 && !v.Data2.Status.HasFlag(IstationStatus.光电状态)
+                                                                                                 && v.Data2.Tasknum < 10000
+                                                                                                 && v.Data3.Status.HasFlag(StationStatus.自动)) == 2) // 设备组中两个设备都可用
+                                            {
+                                                rgvDeliveryPoint = deviceGroup;
+                                            }
                                         }
                                         if (rgvDeliveryPoint == null) continue;
-                                        var taskInStation = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == rgvDeliveryPoint.Entity)).MinBy(p => p.CODE);
+
                                         //只能有一组任务的下一个地址是交货点
-                                        if (db.Default.Set<WCS_TASK>().Any(v => v.ADDRNEXT == taskInStation.CODE && v.STATUS < TaskStatus.已完成)) continue;
+                                        if (db.Default.Set<WCS_TASK>().Any(v => v.ADDRNEXT == rgvDeliveryPoint.Entity.CODE && v.STATUS < TaskStatus.已完成)) continue;
                                         //RGV是否有正在前往这个地址的任务
                                         var rgvList = Device.Where(v => v.Is(DF.BOPPRGV)).Select(v => v.Create<RGVDevice>());
 
                                         var rgvTaskCount = ProtocolProxy.YGWMS150Redis.Get("BoppRgvTaskCount").ToInt();
                                         if (rgvList.Count(v => (!v.Data2.SystemStatus.HasFlag(WCS.Entity.Protocol.RGV.RGVRunStatus.空闲) || !v.Data2.WorkMode.HasFlag(WCS.Entity.Protocol.RGV.RGVMode.自动))
-                                                            && v.Data2.TaskType_1 == WCS.Entity.Protocol.RGV.RGVTaskType.放货
-                                                            && v.Data2.DestPosition_1 == taskInStation?.CODE.Replace("G", "").ToShort()) > rgvTaskCount) continue;
+                                                              && v.Data2.TaskType_1 == WCS.Entity.Protocol.RGV.RGVTaskType.放货
+                                                              && v.Data2.DestPosition_1 == rgvDeliveryPoint.Entity.CODE.Replace("G", "").ToShort()) >= rgvTaskCount) continue;
                                         tunnelInfos.Add(new TunnelInfo
                                         {
                                             Tunnel = item,
-                                            taskIN = taskInStation, //找到放货点设备所在组
+                                            taskIN = rgvDeliveryPoint.Entity, //找到放货点设备所在组
                                             SRM = Device.Where(p => p.IsSC()).FirstOrDefault(p => item.ROUTES.Any(d => d.NEXT.CODE == p.CODE)).Create<SRMDevice>()
                                         });
                                     }
 
                                     //筛选出优先级最高的可用巷道
-                                    var tunnelInfo = tunnelInfos.Where(v => { try { return (v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程) || v.SRM.Entity.CODE == "SRM1"; } catch { return false; } }).MinBy(v => tunnelNo.IndexOf(v.Tunnel.CODE));
+                                    var tunnelInfo = tunnelInfos.Where(v =>
+                                    {
+                                        try
+                                        {
+                                            return (v.SRM.Data3.SCAlarm == 0 && v.SRM.Data2.SRMMode == SCMode.远程) || v.SRM.Entity.CODE == "SRM1";
+                                        }
+                                        catch
+                                        {
+                                            return false;
+                                        }
+                                    }).MinBy(v => tunnelNo.IndexOf(v.Tunnel.CODE));
 
                                     if (tunnelInfo == null) throw new WarnException("无可用巷道");
 
@@ -499,10 +526,9 @@ namespace WCS.Service.Works.RGV
                                     obj.Data.TaskType_1 = RGVTaskType.放货;
                                     obj.Data.DestPosition_1 = tunnelInfo.taskIN.CODE.Replace("G", "").ToShort();
                                     obj.Data.Trigger_1++;
-
                                 });
 
-                                #endregion
+                                #endregion 开始分配巷道
                             }
 
                             #endregion 上一个任务为移动