فهرست منبع

agv巷道分配

xu.lu 1 سال پیش
والد
کامیت
1e85e9f636

+ 59 - 8
业务工程/分拣库/WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -153,45 +153,61 @@ namespace WCS.WorkEngineering.Systems
                                             //获取当前任务可以去的目标地址
                                             var positionList = new List<string>();
                                             var allPositionList = new List<string>();
+                                            var nearPositionList = new List<string>();
                                             switch (task.WarehouseCode)
                                             {
                                                 case "1N":
                                                     positionList.AddRange(new List<string>() { "2501", "2505", "2509", "2513" });
+                                                    nearPositionList.AddRange(new List<string>() {
+                                                        "2701", "2705", "2709", "2713" });
                                                     allPositionList.AddRange(new List<string>() {                                                        
-                                                        "2901", "2905", "2909", "2913" });
+                                                        "2901", "2905", "2909", "2913","3101", "3105", "3109", "3113", "3301", "3305", "3309", "3313","3501", "3505", "3509", "3513"});
                                                     break;
 
                                                 case "1S":
                                                     positionList.AddRange(new List<string>() { "2701", "2705", "2709", "2713"/*"2501", "2505", "2509", "2513"*/ });
+                                                    nearPositionList.AddRange(new List<string>() {
+                                                        "2501", "2505", "2509", "2513" });
                                                     allPositionList.AddRange(new List<string>() {                                                       
-                                                        "3101", "3105", "3109", "3113"});
+                                                        "3101", "3105", "3109", "3113", "2901", "2905", "2909", "2913", "3501", "3505", "3509", "3513", "3301", "3305", "3309", "3313"});
                                                     break;
 
                                                 case "2N":
                                                     positionList.AddRange(new List<string>() { "2901", "2905", "2909", "2913" });
+                                                    nearPositionList.AddRange(new List<string>() {
+                                                        "3101", "3105", "3109", "3113" });
                                                     allPositionList.AddRange(new List<string>() { 
-                                                        "2501" , "2505" , "2509" , "2513" , "3301" , "3305" , "3309" , "3313"});
+                                                        "2501" , "2505" , "2509" , "2513" , "2701", "2705", "2709", "2713","3301", "3305", "3309", "3313", "3501", "3505", "3509", "3513"});
                                                     break;
 
                                                 case "2S":
                                                     positionList.AddRange(new List<string>() { "3101", "3105", "3109", "3113"/*"2501", "2505", "2509", "2513"*/ });
+                                                    nearPositionList.AddRange(new List<string>() {
+                                                        "2901", "2905", "2909", "2913" });
                                                     allPositionList.AddRange(new List<string>() { 
-                                                        "2701" , "2705" , "2709" , "2713" , "3501" , "3505" , "3509" , "3513"});
+                                                        "2701" , "2705" , "2709" , "2713" ,"2501" , "2505" , "2509" , "2513" ,  "3501" , "3505" , "3509" , "3513","3301", "3305", "3309", "3313"});
                                                     break;
 
                                                 case "3N":
                                                     positionList.AddRange(new List<string>() { "3301", "3305", "3309", "3313" });
-                                                    allPositionList.AddRange(new List<string>() { "2901", "2905", "2909", "2913" });
+                                                    nearPositionList.AddRange(new List<string>() {
+                                                        "3501", "3505", "3509", "3513" });
+                                                    allPositionList.AddRange(new List<string>() { 
+                                                        "2901", "2905", "2909", "2913", "3101", "3105", "3109", "3113","2501" , "2505" , "2509" , "2513" , "2701", "2705", "2709", "2713" });
                                                     break;
 
                                                 case "3S":
                                                     positionList.AddRange(new List<string>() { "3501", "3505", "3509", "3513" });
-                                                    allPositionList.AddRange(new List<string>() { "3101", "3105", "3109", "3113" });
+                                                    nearPositionList.AddRange(new List<string>() {
+                                                        "3301", "3305", "3309", "3313" });
+                                                    allPositionList.AddRange(new List<string>() {
+                                                        "3101", "3105", "3109", "3113", "2901", "2905", "2909", "2913", "2701" , "2705" , "2709" , "2713" ,"2501" , "2505" , "2509" , "2513" });
                                                     break;
                                             }
 
                                             List<WCS_AgvTaskInfo> agvs = new List<WCS_AgvTaskInfo>();
                                             List<WCS_AgvTaskInfo> agvsAll = new List<WCS_AgvTaskInfo>();
+                                            List<WCS_AgvTaskInfo> agvsNear = new List<WCS_AgvTaskInfo>();
                                             //if (task.LastInteractionPoint == "2")
                                             {
                                                 //当前可用地址正在执行的任务
@@ -199,15 +215,19 @@ namespace WCS.WorkEngineering.Systems
                                                     .SplitTable(v => v.Take(2)).ToList();
                                                 agvsAll = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && allPositionList.Contains(v.Station))
                                                     .SplitTable(v => v.Take(2)).ToList();
+                                                agvsNear = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status > AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && nearPositionList.Contains(v.Station))
+                                                    .SplitTable(v => v.Take(2)).ToList();
                                                 var agvPositionLists = agvs.Select(x => x.Station).Distinct();
                                                 var agvPositionListsAll = agvsAll.Select(x => x.Station).Distinct();
+                                                var agvPositionListsNear = agvsNear.Select(x => x.Station).Distinct();
                                                 //World.Log($"执行中的AGV任务目标地址:{JsonConvert.SerializeObject(agvPositionList)}");
                                                 var endDev = positionList.Where(x => !agvPositionLists.Contains(x)).ToList();
                                                 var endAllDev = allPositionList.Where(x => !agvPositionListsAll.Contains(x)).ToList();
+                                                var endNearDev = nearPositionList.Where(x => !agvPositionListsNear.Contains(x)).ToList();
                                                 World.Log($"agv可用巷道信息:{JsonConvert.SerializeObject(endDev)}");
                                                 World.Log($"agv可用巷道信息(所有):{JsonConvert.SerializeObject(endAllDev)}");
 
-                                                if (!endDev.Any() && !endAllDev.Any())//没有可用放货站台
+                                                if (!endDev.Any() && !endAllDev.Any() && !endNearDev.Any())//没有可用放货站台
                                                 {
                                                     var msg = "已无可用放货站台,任务正在执行中:";
                                                     foreach (var ag in agvs)
@@ -227,6 +247,13 @@ namespace WCS.WorkEngineering.Systems
                                                         !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
                                                         x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
 
+                                                    var devsNear = Device.All.Where(x => endNearDev.Contains(x.Code)).Select(x =>
+                                                        new Device<IStation520, IStation521, IStation523>(x, World));
+                                                    devsNear = devsNear.Where(x =>
+                                                        !x.Data3.Status.HasFlag(StationStatus.Run) &&
+                                                        !x.Data3.Status.HasFlag(StationStatus.PH_Status) &&
+                                                        x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
+
                                                     var devsAll = Device.All.Where(x => endAllDev.Contains(x.Code)).Select(x =>
                                                         new Device<IStation520, IStation521, IStation523>(x, World));
                                                     devsAll = devsAll.Where(x =>
@@ -235,7 +262,31 @@ namespace WCS.WorkEngineering.Systems
                                                         x.Data3.Status.HasFlag(StationStatus.Auto)).OrderBy(v=> allPositionList.Contains(v.Entity.Code)).ToList();
                                                     if (!devs.Any())
                                                     {
-                                                        if (devsAll.Any())
+                                                        if (devsNear.Any())//先判断同库一侧
+                                                        {
+                                                            foreach (var dev in devsNear)
+                                                            {
+                                                                if (!dev.Data3.Status.HasFlag(StationStatus.Run) && !dev.Data3.Status.HasFlag(StationStatus.PH_Status) &&
+                                                                                                                  dev.Data3.Status.HasFlag(StationStatus.Auto))
+                                                                {
+                                                                    //World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devsAll.Select(x => x.Entity.Code).ToList())}");
+                                                                    agv.Status = AGVTaskStatus.Complete1;
+                                                                    agv.Station = dev.Entity.Code;
+                                                                    db.Default.UpdateableRowLock(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                                                    World.Log($"任务执行过程:完成agv任务更新{agv.ID}--{agv.Station}");
+                                                                    task.AddWCS_TASK_DTL(db.Default, "皮盘返库任务分配巷道", agv.Station, $"任务分配至:{agv.Station}");
+                                                                    World.Log($"任务执行过程:完成任务明细添加{agv.Station}");
+                                                                    AgvApi.ContinueTask(agv.AgvID, agv.Station);
+                                                                    World.Log($"任务执行过程:任务成功下发AGV{agv.AgvID}--{agv.Station}");
+                                                                    return;
+                                                                }
+                                                                else
+                                                                {
+                                                                    continue;
+                                                                }
+                                                            }
+                                                        }
+                                                        else if (devsAll.Any())
                                                         {
                                                             foreach (var dev in devsAll)
                                                             {

+ 61 - 21
业务工程/分拣库/WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -78,23 +78,43 @@ namespace WCS.WorkEngineering.Systems
                             case TaskType.EnterDepot:
                                 if (task.LastInteractionPoint == "2")
                                 {
+                                    string sta = "";                                                                        
+                                    if (task.WarehouseCode.Contains("1"))
+                                    {
+                                        var n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("25"))
+                                                    .SplitTable(v => v.Take(2)).Count();
+                                        var s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("27"))
+                                                    .SplitTable(v => v.Take(2)).Count();
+                                        sta = n > s ? "2701" : "2501";
+                                    }
+                                    else if (task.WarehouseCode.Contains("2"))
+                                    {
+                                        var n2 = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("29"))
+                                                    .SplitTable(v => v.Take(2)).Count();
+                                        var s2 = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("31"))
+                                                    .SplitTable(v => v.Take(2)).Count();
+                                        sta = n2 > s2 ? "3101" : "2901";
+                                    }
+                                    else if (task.WarehouseCode.Contains("3"))
+                                    {
+                                        var n3 = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("33"))
+                                                    .SplitTable(v => v.Take(2)).Count();
+                                        var s3 = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("35"))
+                                                        .SplitTable(v => v.Take(2)).Count();
+                                        sta = n3 > s3 ? "3501" : "3301";
+                                    }
+                                    else
+                                    {
+                                        return;
+                                    }
                                     var agv = new WCS_AgvTaskInfo()
                                     {
                                         ID = db.GetAgvTaskId(),
                                         TaskType = AGVTaskType.EnterDepot,
                                         Status = AGVTaskStatus.NewBuild,
                                         TaskId = task.ID,
-                                        Position = task.WorkBench,
-                                        Station = task.WarehouseCode switch
-                                        {
-                                            "1N" => "2501",
-                                            "1S" => "2701",
-                                            "2N" => "2901",
-                                            "2S" => "3101",
-                                            "3N" => "3301",
-                                            "3S" => "3501",
-                                            _ => throw new NotImplementedException(),
-                                        },
+                                        Position = task.WorkBench,                                       
+                                        Station = sta,
                                         AddWho = "WCS",
                                         AddTime = DateTime.Now
                                     };
@@ -222,6 +242,35 @@ namespace WCS.WorkEngineering.Systems
                                         var devs = Device.All.Where(x => x.HasFlag(DeviceFlags.AGV取货站台口)).Select(x => x.Code);
                                         if (devs.Contains(task.SrmStation) && task.LastInteractionPoint != "3") //车间叫料任务,此值为3时是单独取满任务
                                         {
+                                            string sta = "";
+                                            if (task.WarehouseCode.Contains("1"))
+                                            {
+                                                var n = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("25"))
+                                                            .SplitTable(v => v.Take(2)).Count();
+                                                var s = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("27"))
+                                                            .SplitTable(v => v.Take(2)).Count();
+                                                sta = n > s ? "2701" : "2501";
+                                            }
+                                            else if (task.WarehouseCode.Contains("2"))
+                                            {
+                                                var n2 = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("29"))
+                                                            .SplitTable(v => v.Take(2)).Count();
+                                                var s2 = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("31"))
+                                                            .SplitTable(v => v.Take(2)).Count();
+                                                sta = n2 > s2 ? "3101" : "2901";
+                                            }
+                                            else if (task.WarehouseCode.Contains("3"))
+                                            {
+                                                var n3 = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("33"))
+                                                            .SplitTable(v => v.Take(2)).Count();
+                                                var s3 = db.Default.Queryable<WCS_AgvTaskInfo>().NoLock().Where(v => v.Status >= AGVTaskStatus.Confirm && v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && v.Station.Contains("35"))
+                                                                .SplitTable(v => v.Take(2)).Count();
+                                                sta = n3 > s3 ? "3501" : "3301";
+                                            }
+                                            else
+                                            {
+                                                return;
+                                            }
                                             var agv = new WCS_AgvTaskInfo()
                                             {
                                                 ID = db.GetAgvTaskId(),
@@ -229,16 +278,7 @@ namespace WCS.WorkEngineering.Systems
                                                 Status = AGVTaskStatus.NewBuild,
                                                 TaskId = task.ID,
                                                 Position = task.WorkBench,
-                                                Station = task.WarehouseCode switch
-                                                {
-                                                    "1N" => "2501",
-                                                    "1S" => "2701",
-                                                    "2N" => "2901",
-                                                    "2S" => "3101",
-                                                    "3N" => "3301",
-                                                    "3S" => "3501",
-                                                    _ => throw new NotImplementedException(),
-                                                },
+                                                Station = sta,
                                                 AddWho = "WCS",
                                                 AddTime = DateTime.Now
                                             };

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/分拣支线/环形库分流点.cs

@@ -200,7 +200,7 @@ namespace WCS.WorkEngineering.Systems
                 if (goodsType == 18)
                 {
                     //判断这个垛型是否是到桁架区域进行码垛
-                    isTruss = db.Queryable<BillBomsetgrp>().First(x => x.BomCode.Contains(taskInfo.MatCode)).IsTruss;
+                    isTruss = db.Queryable<BillBomsetgrp>().First(x => x.BomCode.Contains(taskInfo.MatCode) && x.IsStop == 0).IsTruss;
                     if (isTruss)
                     {
                         nextAdd = obj.Entity.Code switch