浏览代码

优化涂布环穿调度,优化堆垛机出库排序逻辑,涂布出库分配AGV取货点新增同步判断

林豪 左 3 年之前
父节点
当前提交
c01068c0f3

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

@@ -68,7 +68,7 @@ namespace WCS.Service.Extensions
         {
             get
             {
-                return AllRGVList.Where(v => v.LocationList.Any(p => p.Entity == Entity)).ToList();
+                return AllRGVList.Where(v => v.LocationList.Any(p => p.Entity == Entity) && v.Data2.WorkMode != 0).ToList();
             }
         }
 
@@ -135,19 +135,6 @@ namespace WCS.Service.Extensions
             return a.Count == 0 ? null : a;
         }
 
-        /// <summary>
-        /// 获取设备组中需要分配目标地址的设备
-        /// </summary>
-        /// <param name="obj"></param>
-        /// <returns></returns>
-        public List<Device<IStation520, IStation521, IStation523>> TaskedDeviceGetNextAddress()
-        {
-            var a = Items.Where(v => v.Data2.Status.HasFlag(IstationStatus.光电状态) && v.Data2.Tasknum > 10000)
-                        .Where(v => v.Data2.Goodsend != 0)
-                        .ToList();
-            return a.Count == 0 ? null : a;
-        }
-
         /// <summary>
         /// 入库位置获取需要生产任务的设备及条码信息
         /// </summary>
@@ -221,12 +208,12 @@ namespace WCS.Service.Extensions
         }
 
         /// <summary>
-        ///
+        /// 最近的RGV
         /// </summary>
         /// <returns></returns>
-        public RGVDevice NextRGV()
+        public RGVDevice RecentRGV()
         {
-            return new RGVDevice(new WCS_DEVICE());
+            return RgvList.OrderBy(v => v.Distance(this)).FirstOrDefault();
         }
 
         /// <summary>
@@ -403,7 +390,7 @@ namespace WCS.Service.Extensions
             get
             {
                 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 == RGVMode.自动).ToList();
+                    .Where(v => v.Entity.CODE != Entity.CODE && v.Data2.WorkMode != 0).ToList();
             }
         }
 
@@ -534,7 +521,7 @@ namespace WCS.Service.Extensions
         }
 
         /// <summary>
-        /// 计算当前RGV与指定R站台之间的距离
+        /// 计算当前RGV与指定站台之间的距离
         /// </summary>
         /// <param name="after"></param>
         /// <returns></returns>

+ 10 - 0
Projects/永冠OPP/WCS.Service/Extensions/TypeExtension.cs

@@ -54,5 +54,15 @@ namespace WCS.Service.Extensions
             if (value % 2 == 0) return false;
             else return true;
         }
+
+        /// <summary>
+        /// 获取short类型Code,只限设备组
+        /// </summary>
+        /// <param name="value"></param>
+        /// <returns></returns>
+        public static short GetShortCode(this string value)
+        {
+            return value.Replace("G", "").ToShort();
+        }
     }
 }

+ 28 - 3
Projects/永冠OPP/WCS.Service/Works/RGV/RGVWorks.cs

@@ -182,20 +182,20 @@ namespace WCS.Service.Works.RGV
                         var afterRgv = obj.After();
 
                         //自己是否阻挡了该小车
-                        if (afterRgv.Data2.SystemStatus != RGVRunStatus.空闲 && obj.StopedByMe(afterRgv))
+                        if (afterRgv.Data2.WorkMode == RGVMode.自动 && afterRgv.Data2.SystemStatus != RGVRunStatus.空闲 && obj.StopedByMe(afterRgv))
                         {
                             if (pickStation.Entity.CODE == "G2")
                             {
                                 //此站台因需要进行排队,因此是否需要赶车取决于是否拦住了两个小车的任务
                                 var afterRgv1 = afterRgv.After();
                                 //如果是空闲或者没有拦住他,就不执行赶车
-                                if (afterRgv1.Data2.SystemStatus == RGVRunStatus.空闲 || !afterRgv.StopedByMe(afterRgv1)) return;
+                                if (afterRgv.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.TaskType_1 != RGVTaskType.移动 || !(afterRgv1.Position < afterRgv.Position && afterRgv1.Position > 618500)) return;
+                                if (afterRgv.Data2.WorkMode == RGVMode.自动 && afterRgv1.Data2.TaskType_1 != RGVTaskType.移动 || !(afterRgv1.Position < afterRgv.Position && afterRgv1.Position > 618500)) return;
                             }
                             //找到当前所在站台的下一个取货点
                             var beforeStation = Device.Where(v => v.Is(DF.涂布RGV取货设备组) && v.CODE != pickStation.Entity.CODE)
@@ -211,6 +211,31 @@ namespace WCS.Service.Works.RGV
                         {
                             obj.Move(Device.Find("G2").Create<StationDeviceGroup>());
                         }
+                        else
+                        {
+                            //有货 没有小车也并没有正在过来的小车  的站台
+                            var stationList = Device.Where(v => v.Is(DF.涂布RGV取货设备组))
+                                                    .Select(v => v.Create<StationDeviceGroup>())
+                                                    .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;
+                                                        return false;
+                                                    });
+                            foreach (var station in stationList)
+                            {
+                                //找到距离当前站台最近的一个小车
+                                var rgv = station.RecentRGV();
+                                if (rgv.Data2.TaskType_1 == RGVTaskType.移动 && rgv.Distance(station) > 100000)
+                                {
+                                    rgv.Move(station);
+                                }
+                            }
+                        }
                     }
 
                     //是否在一个放货站台

+ 30 - 25
Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

@@ -303,34 +303,39 @@ namespace WCS.Service.Works.SRM
 
                         //同时对结果进行排序,分组
                         var maxnum = ProtocolProxy.YGWMS150Redis.Get("SaleTaskGroupCount").ToInt();
+                        //所有 有优先级任务的出货口
+                        var priorityADDRTO = db.Default.Set<WCS_TASK>().Where(v => v.Priority > 0 && v.STATUS == TaskStatus.新建).GroupBy(v => v.ADDRTO).Select(v => v.Key);
                         var outDepotList = waitTask.Where(v =>
-                        {
-                            var max = v.ADDRTO == "G1340" ? 4 : maxnum;
-                            return db.Default.Set<WCS_TASK>()
-                               .AsNoTracking()
-                               .Where(d => d.TYPE == TaskType.出库)
-                               .Where(d => d.STATUS > TaskStatus.新建)
-                               .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
-                               .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
-                               .GroupBy(d => d.TaskGroupKey).Count() < max;
-                        })
-                                .OrderByDescending(v => v.Priority)
-                                .ThenBy(v => v.FLOOR == floor ? 0 : 1)
-                                .ThenBy(v =>
-                                {
-                                    return db.Default.Set<WCS_TASK>()
-                                                     .AsNoTracking()
-                                                     .Where(d => d.TYPE == TaskType.出库)
-                                                     .Where(d => d.STATUS > TaskStatus.新建)
-                                                     .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
-                                                     .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
-                                                     .GroupBy(d => d.TaskGroupKey).Count();
-                                })
-                                .ThenBy(v => v.CREATETIME)
-                                .GroupBy(v => v.ADDRTO).ToArray();
+                                                    {
+                                                        var max = v.ADDRTO == "G1340" ? 4 : maxnum;
+                                                        return db.Default.Set<WCS_TASK>()
+                                                           .AsNoTracking()
+                                                           .Where(d => d.TYPE == TaskType.出库)
+                                                           .Where(d => d.STATUS > TaskStatus.新建)
+                                                           .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
+                                                           .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
+                                                           .GroupBy(d => d.TaskGroupKey).Count() < max;
+                                                    })
+                                                   .OrderByDescending(v => v.Priority)
+                                                   .ThenBy(v => v.FLOOR == floor ? 0 : 1)
+                                                   .ThenBy(v =>
+                                                   {
+                                                       return db.Default.Set<WCS_TASK>()
+                                                                        .AsNoTracking()
+                                                                        .Where(d => d.TYPE == TaskType.出库)
+                                                                        .Where(d => d.STATUS > TaskStatus.新建)
+                                                                        .Where(d => d.STATUS < TaskStatus.已完成 || taskidList.Contains(d.ID))
+                                                                        .Where(d => d.ADDRTO == v.ADDRTO && d.FLOOR == v.FLOOR)
+                                                                        .GroupBy(d => d.TaskGroupKey).Count();
+                                                   })
+                                                   .ThenBy(v => v.CREATETIME)
+                                                   .GroupBy(v => v.ADDRTO)
+                                                   .Where(v => !priorityADDRTO.Contains(v.Key))
+                                                   .FirstOrDefault()
+                                                   .Select(v => v).ToList();
 
                         //获取两个个可执行任务,此时这两个任务的目标地址是一致的
-                        var tasks = outDepotList.GetSrmValidTaskList(obj).GetOutTask();
+                        var tasks = outDepotList.GetOutTask();
 
                         #region 校验两个产品是否为同规格
 

+ 41 - 3
Projects/永冠OPP/WCS.Service/Works/Station/涂布出库.cs

@@ -222,6 +222,8 @@ namespace WCS.Service.Works.Station
                     //开始检查任务数是否匹配
                     if (devs.Count != taskCount) throw new WarnException($"可执行数{devs.Count},任务组任务数{taskCount},数量不匹配,{task1.ID}-{task1.TaskGroupKey}");
 
+                    var stationList = new List<FinishTaskList<WCS_TASK>>();
+
                     //开始处理需要分配目标地址的设备
                     foreach (var dev in devs)
                     {
@@ -245,7 +247,42 @@ namespace WCS.Service.Works.Station
                         task.ADDRNEXT = addNext;
                         task.CreateStatusLog(db, $"状态由[{WCS.Entity.TaskStatus.堆垛机完成}]变更为[{task.STATUS}]-{obj.Entity.Code}", this.GetType());
                         finishTaskList.Add(new FinishTaskList<int>(task.ID, dev.Station));
+                        stationList.Add(new FinishTaskList<WCS_TASK>(task, dev.Station));
+                    }
+
+                    #region 校验两个地址是否一致
+
+                    if (stationList.Count == 2)
+                    {
+                        var task3 = stationList[0];
+                        var task4 = stationList[1];
+                        if (task3.FinishCode.ADDRNEXT == "1343" && task3.FinishCode.ADDRNEXT == "1344")
+                        {
+                        }
+                        else if (task3.FinishCode.ADDRNEXT == "1340" && task3.FinishCode.ADDRNEXT == "1341")
+                        {
+                        }
+                        else
+                        {
+                            var devs1 = stationList.Select(v => v.Station);
+                            foreach (var dev in devs1)
+                            {
+                                if (!dev.Data3.Status.HasFlag(StationStatus.自动))
+                                {
+                                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--不是自动", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    continue;
+                                }
+                                if (dev.Data2.Tasknum > 10000)
+                                {
+                                    InfoLog.INFO_WarnDb($"{dev.Entity.CODE}--已有任务号", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
+                                    continue;
+                                }
+                            }
+                        }
                     }
+
+                    #endregion 校验两个地址是否一致
+
                     db.Default.SaveChanges();
                 });
 
@@ -387,10 +424,11 @@ namespace WCS.Service.Works.Station
 
                              //涂布叫料默认目标地址G1340,到达G1340后再决定是否要继续前进一步
                              List<I_WCS_GetOutTaskResponseSingle> res;
-                             try 
+                             try
                              {
-                                  res = WMS.GetOutTask(agvtask.Position.Replace("_OUT", ""), "G1340");
-                             } catch (WarnException ex)
+                                 res = WMS.GetOutTask(agvtask.Position.Replace("_OUT", ""), "G1340");
+                             }
+                             catch (WarnException ex)
                              {
                                  InfoLog.INFO_WarnDb($"{ex.Message}", obj.Entity.CODE, WCS_EXCEPTIONTYPE.设备异常);
                                  continue;