瀏覽代碼

优化二级品入库巷道分配

林豪 左 3 年之前
父節點
當前提交
fb9ab2953c

二進制
DLL/PLC.Siemens.dll


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

@@ -1,4 +1,5 @@
-using System;
+using DBHelper;
+using System;
 using System.Collections.Generic;
 using System.Linq;
 using WCS.Core;
@@ -392,11 +393,69 @@ namespace WCS.Service.Extensions
         /// </summary>
         public List<StationDevice> GetPickPoint()
         {
-            return Device.Where(v => v.Is(DF.SRM取货))
+            return Device.Where(v => v.Is(DF.一楼SRM取货) || v.Is(DF.二楼SRM取货))
                          .Where(v => v.ROUTES.Any(p => p.NEXT.ROUTES.Any(d => d.NEXT == Entity)))
                          .Select(v => v.Create<StationDevice>())
                          .ToList();
         }
+
+        /// <summary>
+        /// 处理完成任务
+        /// </summary>
+        public void FinishedTaskHandle()
+        {
+            WCS_TASK task = new WCS_TASK();
+            DB.Do(db =>
+            {
+                var taskIds = new List<int>() { Data2.FinishedTask_1, Data2.FinishedTask_2 }.ToArray();
+
+                for (int i = 0; i < taskIds.Length; i++)
+                {
+                    //判断当前工位是否有完成任务
+                    if (taskIds[i] == 0) continue;
+                    //获取当前工位的目标地址
+                    var ELine = i == 0 ? Data.ELine_1.ToString() : Data.ELine_2.ToString();
+                    task = db.Default.Set<WCS_TASK>().Single(v => taskIds[i] == v.ID);
+                    if (task.STATUS != TaskStatus.堆垛机执行)
+                        throw new Exception(LogHelper.SpliceLogMessage($"堆垛机已完成任务[{task.ID}]但WCS状态为[{task.STATUS}],应为[{TaskStatus.堆垛机执行}]", Entity.CODE, WCS_EXCEPTIONTYPE.逻辑异常, GetType()));
+
+                    if (task.TYPE == TaskType.入库)
+                    {
+                        task.ENDTIME = DateTime.Now;
+                        task.STATUS = TaskStatus.已完成;
+                        task.UPDATETIME = DateTime.Now;
+                        db.Default.SaveChanges();
+                    }
+                    else if (task.TYPE == TaskType.出库)
+                    {
+                        task.STATUS = TaskStatus.堆垛机完成;
+                        task.UPDATETIME = DateTime.Now;
+                        db.Default.SaveChanges();
+                        Uploader.Upload(db);
+
+                        var target = Device.Find(ELine).Create<StationDevice>();
+                        target.Data.Tasknum = task.ID;
+                        target.Data.Goodsstart = ELine.ToShort();
+                        target.Data.Goodsend = task.ADDRNEXT.ToShort();
+                    }
+                    else if (task.TYPE == TaskType.移库)
+                    {
+                        if (task.STATUS == TaskStatus.堆垛机执行)
+                        {
+                            task.STATUS = TaskStatus.已完成;
+                            task.UPDATETIME = DateTime.Now;
+                            db.Default.SaveChanges();
+                            Uploader.Upload(db);
+                        }
+                    }
+                    else throw new Exception($"[{Entity.CODE}]任务类型错误");
+
+                    if (i == 0) Data.FinishedACK_1 = 1;
+                    else Data.FinishedACK_2 = 1;
+                    task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机执行}]变更为[{task.STATUS}]", this.GetType());
+                }
+            });
+        }
     }
 
     /// <summary>

+ 4 - 17
Projects/永冠OPP/WCS.Service/Worker.cs

@@ -94,25 +94,12 @@ namespace WCS.Service
                 #region 设备扩展数据配置
 
                 Device.AddFlag(DF.一楼RGV放货, "G1035", "G1044", "G1053", "G1062");
-                Device.AddFlag(DF.堆垛机, "SRM1", "SRM2", "SRM3", "SRM4", "SRM5", "SRM6", "SRM7", "SRM8");
-
-                Device.AddFlag(DF.月台出货, "G1469", "G1561", "G1538", "G1574", "G1509");
-                Device.AddFlag(DF.RGV1, "G1244");
-                Device.AddFlag(DF.RGV2, "G1244");
-
-                #region SRM放货
-
+                Device.AddFlag(DF.SRM, "SRM1", "SRM2", "SRM3", "SRM4", "SRM5", "SRM6", "SRM7", "SRM8");
+                Device.AddFlag(DF.月台, "G1469", "G1561", "G1538", "G1574", "G1509");
                 Device.AddFlag(DF.SRM放货, "1473", "1476", "1474", "1475", "1491", "1492", "1493", "1494");
                 Device.AddFlag(DF.SRM放货, "1520", "1521", "1522", "1523", "1545", "1546", "1451", "1453");
-
-                #endregion SRM放货
-
-                #region SRM取货
-
-                Device.AddFlag(DF.SRM取货, "1440", "1441", "1442", "1443", "1449", "1450", "1451", "1452");
-                Device.AddFlag(DF.SRM取货, "1058", "1059", "1060", "1061", "1067", "1068");
-
-                #endregion SRM取货
+                Device.AddFlag(DF.一楼SRM取货, "1440", "1441", "1442", "1443", "1449", "1450", "1451", "1452");
+                Device.AddFlag(DF.一楼SRM取货, "1058", "1059", "1060", "1061", "1067", "1068");
 
                 #endregion 设备扩展数据配置
 

+ 1 - 51
Projects/永冠OPP/WCS.Service/Works/SRM/SRMWork.cs

@@ -46,57 +46,7 @@ namespace WCS.Service.Works.SRM
             //处理堆垛机已完成的任务
             if (obj.Data2.FinishedTask_1 != 0 || obj.Data2.FinishedTask_2 != 0)
             {
-                WCS_TASK task = new WCS_TASK();
-                DB.Do(db =>
-                {
-                    var taskIds = new List<int>() { obj.Data2.FinishedTask_1, obj.Data2.FinishedTask_2 }.ToArray();
-
-                    for (int i = 0; i < taskIds.Length; i++)
-                    {
-                        //判断当前工位是否有完成任务
-                        if (taskIds[i] == 0) continue;
-                        //获取当前工位的目标地址
-                        var ELine = i == 0 ? obj.Data.ELine_1.ToString() : obj.Data.ELine_2.ToString();
-                        task = db.Default.Set<WCS_TASK>().Single(v => taskIds[i] == v.ID);
-                        if (task.STATUS != TaskStatus.堆垛机执行)
-                            throw new Exception(LogHelper.SpliceLogMessage($"堆垛机已完成任务[{task.ID}]但WCS状态为[{task.STATUS}],应为[{TaskStatus.堆垛机执行}]", deviceCode, WCS_EXCEPTIONTYPE.逻辑异常, GetType()));
-
-                        if (task.TYPE == TaskType.入库)
-                        {
-                            task.ENDTIME = DateTime.Now;
-                            task.STATUS = TaskStatus.已完成;
-                            task.UPDATETIME = DateTime.Now;
-                            db.Default.SaveChanges();
-                        }
-                        else if (task.TYPE == TaskType.出库)
-                        {
-                            task.STATUS = TaskStatus.堆垛机完成;
-                            task.UPDATETIME = DateTime.Now;
-                            db.Default.SaveChanges();
-                            Uploader.Upload(db);
-
-                            var target = Device.Find(ELine).Create<StationDevice>();
-                            target.Data.Tasknum = task.ID;
-                            target.Data.Goodsstart = ELine.ToShort();
-                            target.Data.Goodsend = task.ADDRNEXT.ToShort();
-                        }
-                        else if (task.TYPE == TaskType.移库)
-                        {
-                            if (task.STATUS == TaskStatus.堆垛机执行)
-                            {
-                                task.STATUS = TaskStatus.已完成;
-                                task.UPDATETIME = DateTime.Now;
-                                db.Default.SaveChanges();
-                                Uploader.Upload(db);
-                            }
-                        }
-                        else throw new Exception($"[{deviceCode}]任务类型错误");
-
-                        if (i == 0) obj.Data.FinishedACK_1 = 1;
-                        else obj.Data.FinishedACK_2 = 1;
-                        task.CreateStatusLog(db, $"状态由[{TaskStatus.堆垛机执行}]变更为[{task.STATUS}]", this.GetType());
-                    }
-                });
+                obj.FinishedTaskHandle();
                 return;
             }
 

+ 11 - 7
Projects/永冠OPP/WCS.Service/Works/Station/一楼入库.cs

@@ -96,16 +96,20 @@ namespace WCS.Service.Works.Station
                 var tunnelNo = res.TunnelNum.Split(',').Select(v => "TY" + v).ToList();
 
                 var tunnels = Device.Where(v => tunnelNo.Contains(v.CODE)).ToList();
+
                 List<TunnelInfo> tunnelInfos = new List<TunnelInfo>();
                 foreach (var item in tunnels)
                 {
-                    //找到空闲的取货点 先找到下一个路径点是当前巷道的设备
-                    var q = Device.Where(p => p.PATHPOINTS.Any(d => d.NEXT == item))
-                                    .SelectMany(p => p.PATHPOINTS) //将所有取货点的路线信息提取到一个集合中
-                                    .Select(p => p.PREV.Create<StationDevice>())//取出所有取货点的前一个路径点
-                                    .Where(p => !p.Data3.Status.HasFlag(StationStatus.运行状态位) && !p.Data2.Status.HasFlag(IstationStatus.光电状态) && p.Data2.Tasknum < 10000)//筛选出空闲的路径点,此处因输送机都是一个动力,因此可以先找路径点再找设备组
-                                    .Where(p => Device.Where(d => d.CODE.StartsWith("G")).Any(d => d.DEVICEGROUP.Any(c => c.MEMBER == p.Entity)))//找到有效路径点对应的设备组
-                                    .Distinct().FirstOrDefault();//去一次重
+                    //当前巷道的取货点
+                    var allIn = Device.Where(v => v.Is(DF.一楼SRM取货)) //一楼所有取货点
+                                      .Where(v => v.ROUTES.Any(p => p.NEXT == item)) //下一个点为当前巷道的取货点
+                                      .Select(v => v.CODE)
+                                      .ToList();
+                    var q = Device.Where(v => v.IsConv() && v.ROUTES.Any(p => allIn.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)//筛选出空闲的路径点,此处因输送机都是一个动力,因此可以先找路径点再找设备组
+                                  .Distinct()
+                                  .FirstOrDefault();//去一次重
                     if (q == null) continue;
                     var dev = Device.Where(p => p.CODE.StartsWith("G") && p.DEVICEGROUP.Any(d => d.MEMBER == q.Entity)).OrderBy(p => p.CODE).FirstOrDefault();
 

+ 18 - 15
WCS.Core/Device.cs

@@ -152,23 +152,26 @@ public static class Device
     #endregion 静态方法
 }
 
+/// <summary>
+/// 设备配置
+/// </summary>
 [Flags]
 public enum DF
 {
     无 = 0,
-    扫码 = 1 << 0,
-    入库 = 1 << 1,
-    出库 = 1 << 2,
-    SRM货 = 1 << 3,
-    SRM放货 = 1 << 4,
-    RGV取货 = 1 << 5,
-    RGV放货 = 1 << 6,
-    拆盘 = 1 << 7,
-    组盘 = 1 << 8,
-    一楼RGV放货 = 1 << 9,
-    堆垛机 = 1 << 10,
-    月台出货 = 1 << 11,
-    月台区 = 1 << 12,
-    RGV1 = 1 << 13,
-    RGV2 = 1 << 14,
+    SRM = 1 << 0,
+    一楼SRM取货 = 1 << 1,
+    二楼SRM取货 = 1 << 2,
+    SRM货 = 1 << 3,
+    一楼RGV放货 = 1 << 4,
+    月台 = 1 << 5,
+    备用1 = 1 << 6,
+    备用2 = 1 << 7,
+    备用3 = 1 << 8,
+    备用4 = 1 << 9,
+    备用5 = 1 << 10,
+    备用6 = 1 << 11,
+    备用7 = 1 << 12,
+    备用8 = 1 << 13,
+    备用9 = 1 << 14,
 }