林豪 左 1 年之前
父节点
当前提交
0f603def3d

+ 7 - 1
业务工程/分拣库/WCS.WorkEngineering/Extensions/DeviceExtension.cs

@@ -289,9 +289,15 @@ namespace WCS.WorkEngineering.Extensions
                 "1606" => "1N",
                 "1666" => "1NR",
                 "1661" => "1NR",
+                "1691" => "2NR",
+                "1696" => "2NR",
                 "SRM1" => "1N",
-                "SRM2" => "2N",
+                "SRM2" => "1S",
                 "418" => "1N",
+                "618" => "2N",
+                "18" => "1S",
+                "1676" => "1SR",
+                "1681" => "1SR",
                 _ => "",
             };
         }

+ 34 - 2
业务工程/分拣库/WCS.WorkEngineering/Extensions/TaskExtension.cs

@@ -46,6 +46,38 @@ namespace WCS.WorkEngineering.Extensions
             task.UpdateableOldTask(db);
         }
 
+        /// <summary>
+        /// 更新任务执行记录
+        /// 同步更新历史任务
+        /// </summary>
+        /// <param name="task">任务信息</param>
+        /// <param name="db">数据库上下文</param>
+        /// <param name="curPoint">当前地址</param>
+        /// <param name="desc">描述</param>
+        public static void AddWCS_TASK_DTL(this WCS_TaskOld task, SqlSugarScopeProvider db, string curPoint, string desc) => task.AddWCS_TASK_DTL(db, curPoint, "", desc);
+
+        /// <summary>
+        /// 更新任务执行记录
+        /// 同步更新历史任务
+        /// </summary>
+        /// <param name="task">任务信息</param>
+        /// <param name="db">数据库上下文</param>
+        /// <param name="curPoint">当前地址</param>
+        /// <param name="nextPoint">下一个地址</param>
+        /// <param name="desc">描述</param>
+        public static void AddWCS_TASK_DTL(this WCS_TaskOld task, SqlSugarScopeProvider db, string curPoint, string nextPoint, string desc)
+        {
+            db.Insertable(new WCS_TaskDtl
+            {
+                ID = Guid.NewGuid(),
+                ParentTaskCode = task.Id,
+                CurPoint = curPoint,
+                NextPoint = nextPoint,
+                Desc = desc,
+                AddWho = "WCS"
+            }).SplitTable().ExecuteCommand();
+        }
+
         /// <summary>
         ///  更新历史表数据
         /// </summary>
@@ -63,7 +95,7 @@ namespace WCS.WorkEngineering.Extensions
                 {
                     taskOld = taskInfo.Mapper<WCS_TaskOld, WCS_TaskInfo>();
                     taskOld.Id = taskInfo.ID;
-                    db.Updateable(taskOld).Where(x => x.Id == taskOld.Id).SplitTable(x=>x.Take(2)).ExecuteCommand();
+                    db.Updateable(taskOld).Where(x => x.Id == taskOld.Id).SplitTable(x => x.Take(2)).ExecuteCommand();
                 }
             }
             else
@@ -87,7 +119,7 @@ namespace WCS.WorkEngineering.Extensions
                 taskOld = taskInfo.Mapper<WCS_TaskOld, WCS_TaskInfo>();
                 taskOld.Id = taskInfo.ID;
                 //更新任务历史表,删除任务当前表
-                db.Updateable(taskOld).SplitTable(x=>x.Take(2)).ExecuteCommand();
+                db.Updateable(taskOld).SplitTable(x => x.Take(2)).ExecuteCommand();
                 db.Deleteable(taskInfo).ExecuteCommand();
             }
             else

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

@@ -172,7 +172,7 @@ namespace WCS.WorkEngineering.Systems
                                             AgvApi.ContinueTask(agv.AgvID, dev.Code);
                                             break;
                                         }
-                                    case AGVTaskStatus.LeaveGet when agv.Status != AGVTaskStatus.LeaveGet:
+                                    case AGVTaskStatus.LeavePut when agv.Status != AGVTaskStatus.LeavePut:
                                         var devinfo = new Device<IStation520, IStation521>(Device.All.First(x => x.Code == agv.Position), World);
                                         devinfo.Data.CmdType = StationCmd.Res2;
                                         break;

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

@@ -62,17 +62,18 @@ namespace WCS.WorkEngineering.Systems
                                 case TaskType.EnterDepot:
                                     //更新任务状态
                                     task.Status = Entity.TaskStatus.WaitingToExecute;
-                                    switch (task.WarehouseCode)
+                                    task.Device = task.WarehouseCode switch
                                     {
-                                        case "1N":
-                                            task.Device = "SRM1";
-                                            break;
-                                    }
+                                        "1N" => "SRM1",
+                                        _ => task.Device
+                                    };
 
-                                    if (task.AddrFrom is "1666" or "1661")
+                                    task.Device = task.AddrFrom switch
                                     {
-                                        task.Device = "SRM1";
-                                    }
+                                        "1666" or "1661" => "SRM1",
+                                        "1681" or "1676" => "SRM2",
+                                        _ => task.Device
+                                    };
 
                                     //计算下一个地址
                                     var path1 = DevicePath.GetPath(task.AddrFrom, task.Device);

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

@@ -177,11 +177,16 @@ namespace WCS.WorkEngineering.Systems
 
             if (obj.Data2.SystemStatus != RGVSystemStatus.空闲) return;
 
-            if (obj.Data2.Status.HasFlag(RGVStatus.RES1))
+            if (obj.Data2.Status.HasFlag(RGVStatus.RES1)) //离开非安全区域
             {
                 obj.Data.TaskNumber = obj.Data.TaskNumber;
                 obj.Data.CmdType = RGVCmdType.Move;
-                obj.Data.DestPosition = 1668;
+                obj.Data.DestPosition = obj.Entity.Code switch
+                {
+                    "RGV1" => 1668,
+                    "RGV2" => 1683,
+                    _ => throw new ArgumentOutOfRangeException()
+                };
                 obj.Data.VoucherNo++;
                 return;
             }
@@ -252,7 +257,7 @@ namespace WCS.WorkEngineering.Systems
 
         public override bool Select(Device dev)
         {
-            return dev.Code == "RGV1";
+            return dev.Code is "RGV1" or "RGV2";
             //return dev.HasFlag(Extensions.DeviceFlags.RGV);
         }
     }

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

@@ -237,6 +237,18 @@ namespace WCS.WorkEngineering.Systems
 
                 //获取当前堆垛机所有的取货站台
                 var arrIn = PickUpDevices.First(v => v.Key == obj.Entity.Code).Value;
+
+                if (obj.Data2.Status.HasFlag(SrmStatus.Stopper_Mark))
+                {
+                    arrIn = obj.Entity.Code switch
+                    {
+                        "SRM1" or "SRM2" => PickUpDevices.Where(x => x.Key is "SRM1" or "SRM2")
+                            .SelectMany(x => x.Value)
+                            .ToList(),
+                        _ => arrIn
+                    };
+                }
+
                 if (!arrIn.Any()) throw new KnownException($"堆垛机{obj.Entity.Code}无取货路径点", LogLevelEnum.High);
 
                 //获取有货的设备
@@ -297,7 +309,16 @@ namespace WCS.WorkEngineering.Systems
 
                 //获取当前堆垛机所有的取货站台
                 var arrOut = PutDevices.First(v => v.Key == obj.Entity.Code).Value;
-
+                if (obj.Data2.Status.HasFlag(SrmStatus.Stopper_Mark))
+                {
+                    arrOut = obj.Entity.Code switch
+                    {
+                        "SRM1" or "SRM2" => PutDevices.Where(x => x.Key is "SRM1" or "SRM2")
+                            .SelectMany(x => x.Value)
+                            .ToList(),
+                        _ => arrOut
+                    };
+                }
                 if (!arrOut.Any()) throw new KnownException($"堆垛机{obj.Entity.Code}无放货路径点", LogLevelEnum.High);
 
                 //获取可以放货的设备集合

+ 83 - 0
业务工程/分拣库/WCS.WorkEngineering/Systems/UpLoadSystems.cs

@@ -0,0 +1,83 @@
+using ServiceCenter.SqlSugars;
+using System.ComponentModel;
+using System.Threading.Tasks;
+using WCS.Core;
+using WCS.Entity;
+using WCS.Entity.Protocol.Station;
+using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.WebApi.Controllers;
+using WCS.WorkEngineering.WebApi.Models.WMS.Response;
+using WCS.WorkEngineering.Worlds;
+using TaskStatus = WCS.Entity.TaskStatus;
+
+namespace WCS.WorkEngineering.Systems
+{
+    /// <summary>
+    ///  无交互系统
+    /// </summary>
+    [BelongTo(typeof(UpLoadWorld))]
+    [Description("UpLoadSystems")]
+    public class UpLoadSystems : DeviceSystem<Device<IStation520>>
+    {
+        protected override bool ParallelDo => true;
+
+        protected override bool SaveLogsToFile => true;
+
+        public override void Do(Device<IStation520> obj)
+        {
+            World.Log($"测试");
+            //更新机械臂出库完成状态
+            SqlSugarHelper.Do(_db =>
+            {
+                var db = _db.Default;
+                var taskList = db.Queryable<WCS_TaskInfo>().Where(x =>
+                    x.WarehouseCode.Contains("R") && x.Type == TaskType.OutDepot &&
+                    x.Status == TaskStatus.ConveyorExecution && x.Uploaded != TaskStatus.ConveyorExecution).ToList();
+                foreach (var task in taskList)
+                {
+                    var res = WmsApi.SrmPickOutCompleted(task.ID);
+                    if (res.ResCode == ResponseStatusCodeEnum.Sucess) //更新成功
+                    {
+                        task.Uploaded = TaskStatus.ConveyorExecution;
+                        task.EditTime = DateTime.Now;
+                        db.Updateable(task).ExecuteCommand();
+                        task.AddWCS_TASK_DTL(db, "", $"同步机械臂放货完成状态同步至WMS");
+                    }
+                    else
+                    {
+                        World.Log($"机械臂出库放货完成状态同步失败:{task.ID}[{res.ResMsg}]");
+                    }
+                }
+            });
+
+            //更新机械臂入库完成的任务
+            SqlSugarHelper.Do(_db =>
+            {
+                var db = _db.Default;
+                var taskList = db.Queryable<WCS_TaskOld>().SplitTable(x => x.Take(2)).Where(x =>
+                    x.WarehouseCode.Contains("R") && x.Type == TaskType.SetPlate &&
+                    x.Status == TaskStatus.Finish && x.Uploaded != TaskStatus.Finish).ToList();
+                foreach (var task in taskList)
+                {
+                    var res = WmsApi.CompleteTask(task.Id);
+                    if (res.ResCode == ResponseStatusCodeEnum.Sucess) //更新成功
+                    {
+                        task.Uploaded = TaskStatus.Finish;
+                        task.EditTime = DateTime.Now;
+                        db.Updateable(task).SplitTable(x => x.Take(2)).ExecuteCommand();
+                        task.AddWCS_TASK_DTL(db, "", $"同步机械臂入库完成状态同步至WMS");
+                    }
+                    else
+                    {
+                        World.Log($"机械臂组盘放货完成状态同步失败:{task.Id}[{res.ResMsg}]");
+                    }
+                }
+            });
+        }
+
+        public override bool Select(Device dev)
+        {
+            return dev.Code == nameof(UpLoadSystems);
+        }
+    }
+}

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

@@ -1,6 +1,8 @@
-using PlcSiemens.Core.Extension;
+using Newtonsoft.Json;
+using PlcSiemens.Core.Extension;
 using ServiceCenter.Extensions;
 using ServiceCenter.Logs;
+using ServiceCenter.Redis;
 using ServiceCenter.SqlSugars;
 using SqlSugar;
 using System.ComponentModel;
@@ -8,6 +10,7 @@ using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol.Station;
 using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.WebApi.Controllers;
 using WCS.WorkEngineering.Worlds;
 using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
 using TaskStatus = WCS.Entity.TaskStatus;
@@ -49,25 +52,19 @@ namespace WCS.WorkEngineering.Systems
             {
                 var db = _db.Default;
                 var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == TaskStatus.WaitingToExecute && !v.BarCode.Contains("Error"));
-                //if (obj.Data2.TaskNumber == 1)
-                //{
-                //    var type = obj.Data4.Length.ToInt().ToString();
-                //    var key = $"ErrorTasks:{obj.Entity.Code}:{type}";
-                //    //从redis获取最近的一条任务号
-                //    if (!RedisHub.WMS.Exists(key)) WmsApi.PalletizingCreateseErrorTasks(obj.Entity.Code, type);
-                //    var value = RedisHub.WMS.Get(key);
-                //    var task = JsonConvert.DeserializeObject<MainlineDiversion>(value);
-
-                //    //是异常任务,查询最近的一条异常任务
-                //    taskInfo = db.Queryable<WCS_TaskInfo>().First(x => x.ID == task.TaskId);
-                //    if (taskInfo == null || taskInfo.Status >= TaskStatus.FinishOfShunt && obj.Data2.TaskNumber != task.TaskId)
-                //    {
-                //        WmsApi.PalletizingCreateseErrorTasks(obj.Entity.Code, type);
-                //        return;
-                //    }
-                //    if (obj.Data2.TaskNumber == task.TaskId) return;
-                //}
-                //else
+                if (obj.Data2.TaskNumber == 1) //异常处理功能目前只在库二启用
+                {
+                    var type = obj.Data4.Length.ToInt().ToString();
+
+                    //找到一条起点是当前位置且状态小于2的任务
+                    taskInfo = db.Queryable<WCS_TaskInfo>().First(x => x.AddrFrom == obj.Entity.Code && x.Status == TaskStatus.WaitingToExecute && x.BarCode.Contains("Error"));
+                    if (taskInfo == null)
+                    {
+                        WmsApi.PalletizingCreateseErrorTasks(obj.Entity.Code, type);
+                        return;
+                    }
+                }
+                else
                 if (taskInfo == null) throw new KnownException($"未找到对应的WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
 
                 taskId = taskInfo.ID;

+ 12 - 17
业务工程/分拣库/WCS.WorkEngineering/Systems/环形库/机械臂cs.cs

@@ -11,7 +11,6 @@ using WCS.WorkEngineering.Extensions;
 using WCS.WorkEngineering.WebApi.Controllers;
 using WCS.WorkEngineering.Worlds;
 using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
-using TaskStatus = WCS.Entity.TaskStatus;
 
 namespace WCS.WorkEngineering.Systems
 {
@@ -100,20 +99,6 @@ namespace WCS.WorkEngineering.Systems
                     }
                 });
                 if (!tasks.Any()) throw new KnownException("数据库提交事务错误", LogLevelEnum.High);
-                foreach (var task in tasks)
-                {
-                    try
-                    {
-                        //通知WMS任务完成
-                        if (task.Status == TaskStatus.Finish) WmsApi.CompleteTask(task.ID);
-                        //如果是出库任务,上报放货完成
-                        if (task is { Type: TaskType.OutDepot, Status: TaskStatus.ConveyorExecution }) WmsApi.SrmPickOutCompleted(task.ID);
-                    }
-                    catch (Exception e)
-                    {
-                        World.Log(e.Message);
-                    }
-                }
 
                 // 写入信号
                 obj.Data.OkAck = 1;
@@ -185,6 +170,7 @@ namespace WCS.WorkEngineering.Systems
                                                                                                                          /*&& x.Data.Status1.HasFlag(StationStatus1.IsLock)*/)
                                                             .OrderByDescending(x => x.Entity.Code.ToShort())
                                                             .Take(2);
+                    if (!devGroup.Any()) throw new KnownException($"无有效入库取货位", LogLevelEnum.High);
                     foreach (var dev in devGroup)
                     {
                         var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.Type == TaskType.SetPlate && v.Status == Entity.TaskStatus.FinishOfShunt && dev.Data2.TaskNumber == v.ID);
@@ -287,6 +273,7 @@ namespace WCS.WorkEngineering.Systems
                     default:
                         throw new KnownException($"无法执行多个任务", LogLevelEnum.Mid);
                 }
+                World.Log($"机械臂任务处理:下发入库任务{obj.Data.TaskNumber1}--{obj.Data.TaskNumber2}--{obj.Data.VoucherNo}", LogLevelEnum.Mid);
             }
             else //出库任务
             {
@@ -311,11 +298,18 @@ namespace WCS.WorkEngineering.Systems
                         {
                             //所有出库点设备号,即
                             var allOutCode = arrOut.Select(v => v.Entity.Code).ToList();
-                            //TODO:两个工位同时码垛,并不会一个执行一次,只有一个托盘任务全部执行完毕,才会继续执行下一个,设备号较小的码垛工位会优先执行
+                            //两个工位同时码垛,并不会一个执行一次,只有一个托盘任务全部执行完毕,才会继续执行下一个,先生成任务的码垛工位会优先执行
                             var taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Type == TaskType.OutDepot && v.Status == Entity.TaskStatus.WaitingToExecute)
                                                                                                     .Where(v => allOutCode.Contains(v.SrmStation)).ToList();
                             var srmStation = taskInfos.OrderBy(x => x.AddTime).First().SrmStation;
-                            taskInfos = taskInfos.Where(x => x.SrmStation == srmStation).OrderBy(x => x.ProdLine).Take(2).ToList();
+                            taskInfos = taskInfos.Where(x => x.SrmStation == srmStation).OrderBy(x => x.ProdLine).ToList();
+
+                            if (taskInfos.FirstOrDefault().WarehouseCode.Contains("S")) //如果是南侧,翻转排序
+                            {
+                                taskInfos = taskInfos.OrderByDescending(x => x.ProdLine).ToList();
+                            }
+
+                            taskInfos = taskInfos.Take(2).ToList();
 
                             if (taskInfos.Count == 2) //有两个任务
                             {
@@ -421,6 +415,7 @@ namespace WCS.WorkEngineering.Systems
 
                         throw new KnownException($"无法执行多个任务", LogLevelEnum.Mid);
                 }
+                World.Log($"机械臂任务处理:下发出库任务{obj.Data.TaskNumber1}--{obj.Data.TaskNumber2}--{obj.Data.VoucherNo}", LogLevelEnum.Mid);
             }
         }
 

+ 1 - 8
业务工程/分拣库/WCS.WorkEngineering/WebApi/Controllers/WmsApi.cs

@@ -166,10 +166,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
             {
                 TaskNum = taskNum,
             });
-            if (res.ResCode != ResponseStatusCodeEnum.Sucess)
-            {
-                throw new KnownException(res.ResMsg, LogLevelEnum.High);
-            }
+
             return res;
         }
 
@@ -209,10 +206,6 @@ namespace WCS.WorkEngineering.WebApi.Controllers
                 OperationType = Models.WMS.Request.CompleteTask.自动完成,
                 WCSUpdateName = "WCS"
             });
-            if (res.ResCode != ResponseStatusCodeEnum.Sucess)
-            {
-                throw new KnownException(res.ResMsg, LogLevelEnum.High);
-            }
             return res;
         }
 

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

@@ -28,7 +28,7 @@ namespace WCS.WorkEngineering
         {
             #region 无交互触发设备
 
-            var devs = new List<string>() { nameof(分线计算09), nameof(桁架码垛区补空托盘任务生成), "出库AGV", "入库AGV", nameof(NoInteractionSystems) };
+            var devs = new List<string>() { nameof(分线计算09), nameof(桁架码垛区补空托盘任务生成), "出库AGV", "入库AGV", nameof(NoInteractionSystems), nameof(UpLoadSystems) };
             foreach (var conv in devs.Select(code => new Device(code)))
             {
                 conv.AddProtocol<IStation520>(0, 520, "1");
@@ -46,12 +46,12 @@ namespace WCS.WorkEngineering
 
             List<RgvSegmentInfo> RgvInfo = new List<RgvSegmentInfo>
             {
-                new RgvSegmentInfo( 1, "10.30.37.113"),
-                new RgvSegmentInfo( 2, "10.30.37.118"),
-                //new RgvSegmentInfo( 3, "10.30.37.123"),
-                //new RgvSegmentInfo( 4, "10.30.37.128"),
-                //new RgvSegmentInfo( 5, "10.30.37.133"),
-                //new RgvSegmentInfo( 6, "10.30.37.138")
+                new RgvSegmentInfo( 1, "10.30.37.113"), //库一北
+                new RgvSegmentInfo( 2, "10.30.37.118"), //库一南
+                new RgvSegmentInfo( 3, "10.30.37.123"), //库二北
+                new RgvSegmentInfo( 4, "10.30.37.128"), //库二南
+                new RgvSegmentInfo( 5, "10.30.37.133"), //库三北
+                new RgvSegmentInfo( 6, "10.30.37.138"), //库三南
             };
 
             foreach (var item in RgvInfo)
@@ -73,12 +73,29 @@ namespace WCS.WorkEngineering
 
             var tuples = new List<Tuple<string, List<Tuple<int, int>>>>
             {
+                //分拣库一
                 new("10.30.37.89",new List<Tuple<int, int>>()
                 {
                     new(1601, 1620),
                     new(2501, 2540),
                     new(2701, 2740),
                     new(1661, 1690),
+                }),
+                //分拣库二
+                new("10.30.37.97",new List<Tuple<int, int>>()
+                {
+                    new(1621, 1640),
+                    new(2901, 2940),
+                    new(3101, 3140),
+                    new(1691, 1720),
+                }),
+                //分拣库三
+                new("10.30.37.105",new List<Tuple<int, int>>()
+                {
+                    //new(1621, 1640),
+                    //new(2901, 2940),
+                    //new(3101, 3140),
+                    //new(1691, 1720)
                 })
             };
 
@@ -113,16 +130,21 @@ namespace WCS.WorkEngineering
 
             var mLtuples523 = new List<Tuple<string, List<Tuple<int, int>>>>()
             {
-                new("10.30.37.166",new List<Tuple<int, int>>()
+                new("10.30.37.166",new List<Tuple<int, int>>() //北侧满轮主线
                 {
                     new(1, 100),
-                    new(1001, 1010),
+                    new(9001, 9010),//暂用,无意义
                     new(401, 599),
+                    new(801,999),
+                    new(1201,1399),
                 }),
-                new("10.30.37.198",new List<Tuple<int, int>>()
+                new("10.30.37.198",new List<Tuple<int, int>>() //南侧满轮主线
                 {
                     new(101, 210),
                     new(601, 799),
+                    new(1001, 1199),
+                    new(1401,1599),
+                    new(341,379),
                 })
             };
 
@@ -152,8 +174,10 @@ namespace WCS.WorkEngineering
             //Item2表示线体号集合,Item1表示IP
             var mLTuples520 = new List<Tuple<string, List<int>>>()
             {
-                new("10.30.37.166",new List<int>(){1,22,41,61,418,426,435,444,455,466,480,494,508,522,536,550,564,578,591}),
-                new("10.30.37.198",new List<int>(){101,122,141,161,618,626,635,644,655,666,680,694,708,722,736,750,764,778,791})
+                //北侧
+                new("10.30.37.166",new List<int>() {1,22,41,61,418,426,435,444,455,466,480,494,508,522,536,550,564,578,591,818,826,835,844,855,866,880,894,908,922,936,950,964,978,991,1218,1226,1235,1244,1255,1266,1280,1294,1308,1322,1336,1350,1364,1378,1391}),
+                //南侧
+                new("10.30.37.198",new List<int>(){101,122,141,161,618,626,635,644,655,666,680,694,708,722,736,750,764,778,791,1018,1026,1035,1044,1055,1066,1080,1094,1108,1122,1136,1150,1164,1178,1191,1418,1426,1435,1444,1455,1466,1480,1494,1508,1522,1536,1550,1564,1578,1591})
             };
 
             foreach (var item in mLTuples520)
@@ -181,8 +205,8 @@ namespace WCS.WorkEngineering
             //Item2表示线体号集合,Item1表示IP
             var mLTuples83 = new List<Tuple<string, List<int>>>()
             {
-                new("10.30.37.166",new List<int>(){3,14,18,22,38,93,41,58,61}) ,
-                new("10.30.37.198",new List<int>(){101,114,118,122,138,})
+                new("10.30.37.166",new List<int>(){3,14,18,22,38,323,41,58,61}) ,
+                new("10.30.37.198",new List<int>(){101,114,118,122,138,363,141,158,161})
             };
 
             foreach (var item in mLTuples83)
@@ -204,8 +228,8 @@ namespace WCS.WorkEngineering
             //Item2表示线体号集合,Item1表示IP
             var mLTuples525 = new List<Tuple<string, List<int>>>()
             {
-                new("10.30.37.166",new List<int>(){18}),
-                new("10.30.37.198",new List<int>(){118}),
+                new("10.30.37.166",new List<int>(){18,38,58}),
+                new("10.30.37.198",new List<int>(){118,138,158}),
             };
 
             foreach (var item in mLTuples525)
@@ -226,8 +250,8 @@ namespace WCS.WorkEngineering
             //Item2表示线体号集合,Item1表示IP
             var mLTuples91 = new List<Tuple<string, List<int>>>()
             {
-                new("10.30.37.166",new List<int>(){418}),
-                new("10.30.37.166",new List<int>(){618})
+                new("10.30.37.166",new List<int>(){418,818,1218}),
+                new("10.30.37.166",new List<int>(){618,1018,1418})
             };
 
             foreach (var item in mLTuples91)
@@ -252,7 +276,14 @@ namespace WCS.WorkEngineering
             var bcrInfo = new List<BcrInfo>
             {
                 new(new [] { "2532", "2732" }, "10.30.37.89"),
-                new(new [] {"RGV1"},"10.30.37.113")
+                new(new [] { "2932", "3132" }, "10.30.37.97"),
+                //new(new [] { "2532", "2732" }, "10.30.37.105"),
+                new(new [] {"RGV1"},"10.30.37.113"),
+                new(new [] {"RGV2"},"10.30.37.118"),
+                new(new [] {"RGV3"},"10.30.37.123"),
+                new(new [] {"RGV4"},"10.30.37.128"),
+                new(new [] {"RGV5"},"10.30.37.133"),
+                new(new [] {"RGV6"},"10.30.37.138")
             };
 
             foreach (var item in bcrInfo)
@@ -272,7 +303,9 @@ namespace WCS.WorkEngineering
 
             List<ShapeInfo> shapeInfo = new List<ShapeInfo>
             {
-                new ShapeInfo(new int[] { 2732,2532 }, "10.30.37.89")
+                new ShapeInfo(new int[] { 2732,2532 }, "10.30.37.89"),
+                new ShapeInfo(new int[] { 2932, 3132 }, "10.30.37.97"),
+                //new ShapeInfo(new int[] { 2732,2532 }, "10.30.37.105")
             };
 
             foreach (var item in shapeInfo)
@@ -295,6 +328,8 @@ namespace WCS.WorkEngineering
             List<TrussSegmentInfo> TrussInfo = new List<TrussSegmentInfo>
             {
                 new TrussSegmentInfo( 1, "10.30.37.211"),
+                new TrussSegmentInfo( 1, "10.30.37.217"),
+                new TrussSegmentInfo( 1, "10.30.37.223")
             };
 
             foreach (var item in TrussInfo)
@@ -309,10 +344,16 @@ namespace WCS.WorkEngineering
             var tuples1 = new List<Tuple<string, List<int>>>
             {
                 //桁架
-                //new("10.30.37.211",new  List<int>(){1662,1663,1664,1665,1670,1671,1672,1673,1674,1675,1677,1678,1679,1680,1685,1686,1687,1688,1689,1690}),
-                new("10.30.37.211",new  List<int>(){1685,1686,1687,1688,1689,1690,1675,1674,1673,1672,1671,1670,1677,1678,1679,1680,1665,1664,1663,1662}),
+                new("10.30.37.211",new  List<int>(){1685,1686,1687,1688,1689,1690,1675,1674,1673,1672,1671,1670,1677,1678,1679,1680,1665,1664,1663,1662}), //分拣库一
+                new("10.30.37.217",new  List<int>(){1715,1716,1717,1718,1719,1720,1705,1704,1703,1702,1701,1700,1707,1708,1709,1710,1695,1694,1693,1692}), //分拣库二
+                //new("10.30.37.223",new  List<int>(){1685,1686,1687,1688,1689,1690,1675,1674,1673,1672,1671,1670,1677,1678,1679,1680,1665,1664,1663,1662}), //分拣库三
                 //机械臂
-                new("10.30.37.230",new  List<int>(){ 1666, 1661}),
+                new("10.30.37.230",new  List<int>(){ 1666, 1661}), //库一北
+                new("10.30.37.232",new  List<int>(){ 1681, 1676}), //库一南
+                new("10.30.37.234",new  List<int>(){ 1696, 1691}), //库二北
+                new("10.30.37.236",new  List<int>(){ 1711, 1706}), //库二南
+                //new("10.30.37.238",new  List<int>(){ 1666, 1661}), //库三北
+                //new("10.30.37.240",new  List<int>(){ 1681, 1676}), //库三南
             };
 
             foreach (var item in tuples1)
@@ -321,7 +362,7 @@ namespace WCS.WorkEngineering
                 var db531 = 0;
                 foreach (var conv in item.Item2.Select(item1 => Device.All.FirstOrDefault(x => x.Code == item1.ToString())))
                 {
-                    if (item.Item1 == "10.30.37.211")
+                    if (item.Item1 is "10.30.37.211" or "10.30.37.217" or "10.30.37.223")
                     {
                         conv!.AddProtocol<ITruss530>(db530, 530, item.Item1);
                         conv!.AddProtocol<ITruss531>(db531, 531, item.Item1);
@@ -345,7 +386,11 @@ namespace WCS.WorkEngineering
             List<TrussSegmentInfo> TrussInfo1 = new List<TrussSegmentInfo>
             {
                 new( 1, "10.30.37.230"),
-                new( 2, "10.30.37.232")
+                new( 2, "10.30.37.232"),
+                new( 3, "10.30.37.234"),
+                new( 4, "10.30.37.236"),
+                new( 5, "10.30.37.238"),
+                new( 6, "10.30.37.240"),
             };
 
             foreach (var item in TrussInfo1)
@@ -365,7 +410,7 @@ namespace WCS.WorkEngineering
 
             int ip = 41;
 
-            for (int i = 0; i <= 1; i++)
+            for (int i = 0; i <= 5; i++)
             {
                 var srm = new Device($"SRM{i + 1}");
                 srm.AddFlag(DeviceFlags.堆垛机);
@@ -410,11 +455,12 @@ namespace WCS.WorkEngineering
                 new RouteInfo("1615", new string[] { "1616" }),
                 //二楼拆盘机--RGV
                 new RouteInfo("1602", new string[] { "RGV1" }),//非09拆盘机
-                //new RouteInfo("1612", new string[] { "RGV2"}),
+                new RouteInfo("1612", new string[] { "RGV2"}),
                 new RouteInfo("1606", new string[] { "RGV1" }),//09拆盘机
-                //new RouteInfo("1616", new string[] { "RGV2" }),
+                new RouteInfo("1616", new string[] { "RGV2" }),
                 //RGV--码垛区域
                 new RouteInfo("RGV1", new string[] { "1661","1666" }),//北区机械臂码垛区
+                new RouteInfo("RGV2", new string[] { "1676","1681" }),
                 //new RouteInfo("RGV2", new string[] { }),//南区机械臂
                 new RouteInfo("RGV1", new string[] { "1662","1663","1664","1665", "1670","1671","1672","1673","1674","1675"}),//桁架北区码垛站台
                 //new RouteInfo("RGV2", new string[] { }),//南区桁架
@@ -422,19 +468,33 @@ namespace WCS.WorkEngineering
                 //Robot码垛工位
                 new RouteInfo("Robot1", new string[] { "1666" }),
                 new RouteInfo("Robot1", new string[] { "1661" }),
+                new RouteInfo("Robot2", new string[] { "1676" }),
+                new RouteInfo("Robot2", new string[] { "1681" }),
 
                 #endregion 出库路径
 
                 #region 入库
 
                 //一楼人工入库口-巷道
-                new RouteInfo("2532", new string[] { "TY1" }),
+                new RouteInfo("2532", new string[] { "TY1" }), //分拣库一
                 new RouteInfo("2732", new string[] { "TY2" }),
+                new RouteInfo("2932", new string[] { "TY3" }), //分拣库二
+                new RouteInfo("3132", new string[] { "TY4" }),
+                //new RouteInfo("2532", new string[] { "TY5" }), //分拣库三
+                //new RouteInfo("2732", new string[] { "TY6" }),
                 //一楼叠盘机(堆垛机入口)--巷道
-                new RouteInfo("2527", new string[] { "TY1" }),
+                new RouteInfo("2527", new string[] { "TY1" }), //分拣库一
                 new RouteInfo("2528", new string[] { "TY1" }),
                 new RouteInfo("2727", new string[] { "TY2" }),
                 new RouteInfo("2728", new string[] { "TY2" }),
+                //new RouteInfo("2527", new string[] { "TY3" }), //分拣库二
+                //new RouteInfo("2528", new string[] { "TY3" }),
+                //new RouteInfo("2727", new string[] { "TY4" }),
+                //new RouteInfo("2728", new string[] { "TY4" }),
+                //new RouteInfo("2527", new string[] { "TY5" }), //分拣库三
+                //new RouteInfo("2528", new string[] { "TY5" }),
+                //new RouteInfo("2727", new string[] { "TY6" }),
+                //new RouteInfo("2728", new string[] { "TY6" }),
                 //一楼AGV入口
                 //主线入口--预分配点
                 new RouteInfo("1", new string[] { "18" }),
@@ -503,14 +563,17 @@ namespace WCS.WorkEngineering
                 new RouteInfo("1673", new string[] { "RGV1" }),
                 new RouteInfo("1674", new string[] { "RGV1" }),
                 new RouteInfo("1675", new string[] { "RGV1" }),
-                //new RouteInfo("1675", new string[] { "RGV2" }),
+                new RouteInfo("1676", new string[] { "RGV2" }),
+                new RouteInfo("1681", new string[] { "RGV2" }),
                 //RGV--RGV放货点
                 new RouteInfo("RGV1", new string[] { "1604" }),
+                new RouteInfo("RGV2", new string[] { "1614" }),
                 //RGV放货点--堆垛机取货口
                 new RouteInfo("1604", new string[] { "1603" }),//北侧
+                new RouteInfo("1614", new string[] { "1613" }),//北侧
 
                 //二楼堆垛机入库--巷道
-                new RouteInfo("1603", new string[] { "TY1","TY2" }),//北侧
+                new RouteInfo("1603", new string[] { "TY1" }),//北侧
                 //new RouteInfo("1603", new string[] { "TY2" }),//北侧
                 new RouteInfo("1613", new string[] { "TY2" }),//南侧
 
@@ -553,9 +616,26 @@ namespace WCS.WorkEngineering
                 new("424",new List<string> {"424","425"}),
                 new("433",new List<string> {"433","434"}),
                 new("442",new List<string> {"442","443"}),
-                //new("624",new List<string> {"624","625"}),
-                //new("633",new List<string> {"633","634"}),
-                new("642",new List<string> {"642","643"})
+                //环形库一南侧侧机械手取货位
+                new("642",new List<string> {"642","643"}),
+                new("633",new List<string> {"633","634"}),
+                new("624",new List<string> {"624","625"}),
+                //环形库二北侧机械手取货位
+                new("824",new List<string> {"824","825"}),
+                new("833",new List<string> {"833","834"}),
+                new("842",new List<string> {"842","843"}),
+                //环形库二南侧侧机械手取货位
+                new("1042",new List<string> {"1042","1043"}),
+                new("1033",new List<string> {"1033","1034"}),
+                new("1024",new List<string> {"1024","1025"}),
+                //环形库三北侧机械手取货位
+                new("1224",new List<string> {"1224","1225"}),
+                new("1233",new List<string> {"1233","1234"}),
+                new("1242",new List<string> {"1242","1243"}),
+                //环形库三南侧侧机械手取货位
+                new("1442",new List<string> {"1442","1443"}),
+                new("1433",new List<string> {"1433","1434"}),
+                new("1424",new List<string> {"1424","1425"}),
             };
             foreach (var item in tuples2)
             {
@@ -580,12 +660,12 @@ namespace WCS.WorkEngineering
                 { DeviceFlags.满轮主线第一次扫码,new List<string>() { "1"} },
                 { DeviceFlags.环形库分流点,new List<string>(){ "418", "618" } },
                 { DeviceFlags.桁架分流点,new List<string>() { "455" } },
-                { DeviceFlags.桁架缓存放行点, new List<string>(){ "466", "480", "494", "508","522","536" } },
-                { DeviceFlags.桁架取货点, new List<string>(){ "461", "475", "489", "503","517","531" } },
-                { DeviceFlags.拆盘机09, new List<string>(){ "1606" } },
-                { DeviceFlags.拆盘机非09, new List<string>(){ "1602" } },
-                { DeviceFlags.桁架码垛位, new List<string>(){ "1670", "1671", "1672", "1673", "1674", "1675","1664","1662","1665" } },
-                { DeviceFlags.环形库码垛工位, new List<string>(){ "1666", "1661" } },
+                { DeviceFlags.桁架缓存放行点, new List<string>(){ "466", "480", "494", "508","522","536","666","680","694","708","736","750" } },
+                { DeviceFlags.桁架取货点, new List<string>(){ "461", "475", "489", "503","517","531", "661", "675", "689", "703", "717", "731" } },
+                { DeviceFlags.拆盘机09, new List<string>(){ "1606","1616" } },
+                { DeviceFlags.拆盘机非09, new List<string>(){ "1602","1612" } },
+                { DeviceFlags.桁架码垛位, new List<string>(){ "1670", "1671", "1672", "1673", "1674", "1675","1664","1662","1663","1665","1677","1678","1679","1680","1685","1686","1687","1688","1689","1690" } },
+                { DeviceFlags.环形库码垛工位, new List<string>(){ "1666", "1661","1676","1681" } },
                 { DeviceFlags.AGV取货站台口, new List<string>(){ "2533", "2534", "2734" } },
                 { DeviceFlags.Robot, new List<string>(){ "Robot1", "Robot2" } },
         };

+ 12 - 0
业务工程/分拣库/WCS.WorkEngineering/Worlds/UpLoadWorld.cs

@@ -0,0 +1,12 @@
+using System.ComponentModel;
+
+namespace WCS.WorkEngineering.Worlds
+{
+    /// <summary>
+    /// 状态同步世界
+    /// </summary>
+    [Description("状态同步世界")]
+    public class UpLoadWorld : MainWorld
+    {
+    }
+}