林豪 左 vor 1 Jahr
Ursprung
Commit
f8246fca15

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

@@ -1,4 +1,5 @@
-using PlcSiemens.Core.Extension;
+using Newtonsoft.Json;
+using PlcSiemens.Core.Extension;
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
@@ -187,20 +188,39 @@ namespace WCS.WorkEngineering.Systems
                                                     break;
                                             }
 
-                                            //没有放货执行中的任务
+                                            //当前可用地址正在执行的任务
+                                            var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot && positionList.Contains(v.Station))
+                                                .SplitTable(v => v.Take(2)).ToList();
+                                            var agvPositionList = agvs.Select(x => x.Station).Distinct();
+                                            //World.Log($"执行中的AGV任务目标地址:{JsonConvert.SerializeObject(agvPositionList)}");
+                                            var endDevs = positionList.Where(x => !agvPositionList.Contains(x)).ToList();
+                                            World.Log($"agv可用巷道信息:{JsonConvert.SerializeObject(endDevs)}");
 
-                                            //获取对应的WCS任务
+                                            if (!endDevs.Any())//没有可用放货站台
+                                            {
+                                                var msg = "已无可用放货站台,任务正在执行中:";
+                                                foreach (var ag in agvs)
+                                                {
+                                                    msg += $"[任务号:{ag.ID},目标地址:{ag.Station}]";
+                                                }
+                                                throw new Exception(msg);
+                                            }
 
+                                            //获取没有光电信息的设备集合
+                                            var devs = Device.All.Where(x => endDevs.Contains(x.Code)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World));
+                                            devs = devs.Where(x => !x.Data3.Status.HasFlag(StationStatus.Run) && !x.Data3.Status.HasFlag(StationStatus.PH_Status) && x.Data3.Status.HasFlag(StationStatus.Auto)).ToList();
+                                            if (!devs.Any()) throw new Exception($"可用站台均有货或有执行中任务");
+                                            World.Log($"任务执行过程:开始{agv.ID}-{JsonConvert.SerializeObject(devs)}");
                                             agv.Status = AGVTaskStatus.Complete1;
-                                            agv.Position = "2501";
+                                            agv.Station = devs.MinBy(x => x.Entity.Code).Entity.Code;
                                             db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
-
-                                            //task.Status = TaskStatus.Finish;
-                                            //db.Default.Updateable(task).ExecuteCommand();
-                                            //task.AddWCS_TASK_DTL(db.Default, "AGV搬运任务分配放货点", agv.Position, $"任务分配至:{agv.Position}");
+                                            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}");
+
                                             break;
                                         }
                                     //取货站点安全交互
@@ -225,6 +245,12 @@ namespace WCS.WorkEngineering.Systems
                                             devinfo.Data.CmdType = StationCmd.Res2;
                                         }
                                         break;
+
+                                    case AGVTaskStatus.Cancel when agv.Status != AGVTaskStatus.Cancel:
+
+                                        agv.Status = AGVTaskStatus.Cancel;
+                                        db.Default.Updateable(agv).SplitTable(x => x.Take(2)).ExecuteCommand();
+                                        break;
                                 }
 
                                 #endregion 开始跟据AGV状态做出处理
@@ -233,7 +259,7 @@ namespace WCS.WorkEngineering.Systems
                         catch (Exception ex)
                         {
                             World.Log(ex.Message, LogLevelEnum.Mid);
-                            this.ExRecord(obj.Entity.Code, ex.Message);
+                            //this.ExRecord(obj.Entity.Code, ex.Message);
                         }
                     }
                 }

+ 1 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/DeviceWriteSystem.cs

@@ -24,7 +24,7 @@ namespace WCS.WorkEngineering.Systems
         /// </summary>
         public DeviceWriteSystem()
         {
-            Convs = Device.All.Where(v => v.Code is "1602" or "1661" or "1666").Select(v => new Station(v, this.World)).ToDictionary(v => v.Entity.Code, v => v);
+            Convs = Device.All.Where(v => v.Code is "1602" or "1661" or "1666" or "1606").Select(v => new Station(v, this.World)).ToDictionary(v => v.Entity.Code, v => v);
             //Srms = Device.All.Where(v => v.HasProtocol<ISRM520>()).Select(v => new SRM(v, this.World)).ToDictionary(v => v.Entity.Code, v => v);
         }
 

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

@@ -119,24 +119,26 @@ namespace WCS.WorkEngineering.Systems
                                                         break;
 
                                                     case "SRM2":
-                                                        srmStation[0] = "";
-                                                        srmStation[1] = "";
+                                                        srmStation[0] = "2734";
+                                                        srmStation[1] = "2733";
                                                         break;
                                                     case "SRM3":
-                                                        srmStation[0] = "";
-                                                        srmStation[1] = "";
+                                                        srmStation[0] = "2934";
+                                                        srmStation[1] = "2933";
                                                         break;
                                                     case "SRM4":
-                                                        srmStation[0] = "";
-                                                        srmStation[1] = "";
+                                                        srmStation[0] = "3134";
+                                                        srmStation[1] = "3133";
+
+
                                                         break;
                                                     case "SRM5":
-                                                        srmStation[0] = "";
-                                                        srmStation[1] = "";
+                                                        srmStation[0] = "3334";
+                                                        srmStation[1] = "3333";
                                                         break;
                                                     case "SRM6":
-                                                        srmStation[0] = "";
-                                                        srmStation[1] = "";
+                                                        srmStation[0] = "3534";
+                                                        srmStation[1] = "3533";
                                                         break;
                                                 }
 

+ 6 - 6
业务工程/分拣库/WCS.WorkEngineering/Systems/机台叫料生成AGV任务.cs

@@ -22,21 +22,21 @@ namespace WCS.WorkEngineering.Systems
 
         public override void Do(Device<IStation520, IStation521, IStation523> obj)
         {
-
+            if (!obj.Data3.Status.HasFlag(StationStatus.Auto)) return;
             if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status)) return;
+            if (obj.Data3.Status.HasFlag(StationStatus.PH_Status) && !obj.Data3.Status.HasFlag(StationStatus.Low_Station_2)) throw new Exception("设备有光电,但不在低位");
             if (!obj.Data3.Status.HasFlag(StationStatus.Low_Station_2)) return;
-            if (!obj.Data3.Status.HasFlag(StationStatus.Auto)) return;
 
             SqlSugarHelper.Do(_db =>
             {
                 var db = _db.Default;
                 var task = db.Queryable<WCS_TaskInfo>().Single(x => x.ID == obj.Data.TaskNumber);
-                if (task == null) return;
-                if (task.Status != Entity.TaskStatus.ConveyorExecution) return;
+                if (task == null) throw new Exception($"未找到对应任务{obj.Data.TaskNumber}");
+                if (task.Status != Entity.TaskStatus.ConveyorExecution) throw new Exception($"{task.ID}状态不是输送机执行中");
                 //开始创建AGV任务
                 var agvTask = db.Queryable<WCS_AgvTaskInfo>().SplitTable(x => x.Take(2)).Single(x => x.TaskId == task.ID && x.TaskType == AGVTaskType.CallMaterial);
-                if (agvTask == null) return;
-                if (agvTask.Status != AGVTaskStatus.NewBuild) return;
+                if (agvTask == null) throw new Exception($"{task.ID}未找到对应的AGV任务"); ;
+                if (agvTask.Status != AGVTaskStatus.NewBuild) throw new Exception($"AGV任务{agvTask.ID}状态不是新建"); ;
                 var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only);
 
                 var res = AgvApi.机台叫料(obj.Entity.Code, task.WorkBench, agvId);

+ 2 - 1
业务工程/分拣库/WCS.WorkEngineering/Systems/桁架码垛/桁架码垛区补空托盘任务生成.cs

@@ -6,6 +6,7 @@ using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.Station;
 using WCS.WorkEngineering.Worlds;
+using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
 using TaskStatus = WCS.Entity.TaskStatus;
 
 namespace WCS.WorkEngineering.Systems
@@ -33,7 +34,7 @@ namespace WCS.WorkEngineering.Systems
                 var palleTask = db.Queryable<WCS_TaskInfo>().First(x => x.ID == palletizingInfo.TaskId && (x.Status == TaskStatus.FinishOfShunt || x.Status == TaskStatus.ConveyorExecution));
                 if (palleTask == null) throw new Exception($"未找到任务{palleTask.ID}");
                 //获取可以使用的放货站台信息
-                var taskAddNext = Device.All.FirstOrDefault(x => x.Code == palleTask.AddrNext).Targets.FirstOrDefault().Targets.FirstOrDefault().Targets;
+                var taskAddNext = Device.All.FirstOrDefault(x => x.Code == palleTask.AddrNext).Targets.FirstOrDefault().Targets.Where(x => x.HasFlag(DeviceFlags.桁架码垛位));
                 if (taskAddNext == null) throw new Exception($"未找到{palleTask.AddrNext}可去的码垛工位");
                 var devs = Device.All.Where(x => taskAddNext.Contains(x)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).ToList();
 

+ 6 - 2
业务工程/分拣库/WCS.WorkEngineering/WebApi/Controllers/AgvController.cs

@@ -100,11 +100,15 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                                 break;
 
                             case "cancel": //取消任务
-                                           //agvTask.AgvStatus = AGVTaskStatus.Cancel;
+                                if (agvTask.TaskType == AGVTaskType.EnterDepot)
+                                {
+                                    agvTask.AgvStatus = AGVTaskStatus.Cancel;
+                                }
+
                                 break;
                         }
 
-                        db.Default.Updateable(agvTask).SplitTable(x=>x.Take(2)).ExecuteCommand();
+                        db.Default.Updateable(agvTask).SplitTable(x => x.Take(2)).ExecuteCommand();
                         res.code = AgvResponseCode.Success;
                         res.message = "成功";
                     });

+ 3 - 3
业务工程/分拣库/WCS.WorkEngineering/WorkStart.cs

@@ -786,8 +786,8 @@ namespace WCS.WorkEngineering
                 new("545", new[] {  "1662","1663","1664","1665","1670","1671","1672","1673", "1674","1675"}),
                 new("559", new[] {  "1662","1663","1664","1665","1670","1671","1672","1673", "1674","1675"}),
                 new("573", new[] {  "1662","1663","1664","1665","1670","1671","1672","1673", "1674","1675"}),
-                new("586", new[] { "1677","1678","1679","1680", "1685","1686","1687","1688","1689","1690" }),//分拣一南侧
-                new("661", new[] { "1677","1678","1679","1680", "1685","1686","1687","1688","1689","1690" }),
+                new("586", new[] { "1662","1663","1664","1665","1670","1671","1672","1673", "1674","1675" }),
+                new("661", new[] { "1677","1678","1679","1680", "1685","1686","1687","1688","1689","1690" }),//分拣一南侧
                 new("675", new[] { "1677","1678","1679","1680", "1685","1686","1687","1688","1689","1690" }),
                 new("689", new[] { "1677","1678","1679","1680", "1685","1686","1687","1688","1689","1690" }),
                 new("703", new[] { "1677","1678","1679","1680", "1685","1686","1687","1688","1689","1690" }),
@@ -1077,7 +1077,7 @@ namespace WCS.WorkEngineering
                 { DeviceFlags.拆盘机非09, new List<string>(){ "1602","1612","1622","1632","1642","1652" } },
                 { DeviceFlags.桁架码垛位, new List<string>(){ "1670", "1671", "1672", "1673", "1674", "1675","1664","1662","1663","1665","1677","1678","1679","1680","1685","1686","1687","1688","1689","1690", "1692", "1693", "1694", "1695", "1700", "1701", "1702", "1703", "1704", "1705", "1707", "1708", "1709", "1710", "1715", "1716", "1717", "1718", "1719", "1720", "1722", "1723", "1724", "1725", "1730", "1731", "1732", "1733", "1734", "1735", "1737", "1738", "1739", "1740", "1745", "1746", "1747", "1748", "1749", "1750" } },
                 { DeviceFlags.环形库码垛工位, new List<string>(){ "1666", "1661"/*,"1676","1681", "1691", "1696", "1706", "1711", "1721", "1726", "1736", "1741"*/ } },
-                { DeviceFlags.AGV取货站台口, new List<string>(){ "2533", "2534", "2734" } },
+                { DeviceFlags.AGV取货站台口, new List<string>(){ "2533", "2534", "2734","2733","2934","2933","3133","3134","3333","3334","3533","3534" } },
                 { DeviceFlags.Robot, new List<string>(){ "Robot1", "Robot2", "Robot3","Robot4" , "Robot5", "Robot6" } },
         };