فهرست منبع

成品库前部分

xu.lu 2 سال پیش
والد
کامیت
1730db7d0e

+ 3 - 3
成品库/WCS.WorkEngineering/Extensions/DeviceExtension.cs

@@ -126,7 +126,7 @@ namespace WCS.WorkEngineering.Extensions
             if (device.Data3.Status.HasFlag(StationStatus.PH_Status) && device.Data2.Request == 0) throw new KnownException("有光电无请求", LogLevelEnum.Mid);
             if (!device.Data3.Status.HasFlag(StationStatus.PH_Status) && device.Data2.Request == 1) throw new KnownException("无光电有请求", LogLevelEnum.Mid);
             if (!device.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low);
-            if (!device.Data3.Status.HasFlag(StationStatus.PH_Status)) throw new KnownException("无光电", LogLevelEnum.Mid);
+            //if (!device.Data3.Status.HasFlag(StationStatus.PH_Status)) throw new KnownException("无光电", LogLevelEnum.Mid);
             if (device.Data2.Request != 1) throw new KnownException("无请求", LogLevelEnum.Mid);
         }
 
@@ -233,8 +233,8 @@ namespace WCS.WorkEngineering.Extensions
         AGV口 = 1L << 10,
 
         直轨 = 1L << 11,
-        弯轨 = 1L << 12,
-        环轨 = 1L << 13,
+        出库口 = 1L << 12,
+        RGV = 1L << 13,
 
         巷道 = 1L << 14,
         堆垛机 = 1L << 15,

+ 18 - 18
成品库/WCS.WorkEngineering/Extensions/SRMExtension.cs

@@ -38,24 +38,24 @@ namespace WCS.WorkEngineering.Extensions
                 case TaskType.EmptyInit: return;
                 default: return;
             }
-            if (Entity.HasFlag(DeviceFlags.一列堆垛机))
-            {
-                if (col > 10)// 跑全程
-                {
-                    if (Data2.Status.HasFlag(SrmStatus.Stopper_Mark))
-                    {
-                    }
-                }
-            }
-            else if (Entity.HasFlag(DeviceFlags.二列堆垛机))
-            {
-                if (col < 11)// 跑全程
-                {
-                    if (Data2.Status.HasFlag(SrmStatus.Stopper_Mark))
-                    {
-                    }
-                }
-            }
+            //if (Entity.HasFlag(DeviceFlags.一列堆垛机))
+            //{
+            //    if (col > 10)// 跑全程
+            //    {
+            //        if (Data2.Status.HasFlag(SrmStatus.Stopper_Mark))
+            //        {
+            //        }
+            //    }
+            //}
+            //else if (Entity.HasFlag(DeviceFlags.二列堆垛机))
+            //{
+            //    if (col < 11)// 跑全程
+            //    {
+            //        if (Data2.Status.HasFlag(SrmStatus.Stopper_Mark))
+            //        {
+            //        }
+            //    }
+            //}
         }
     }
 }

+ 1 - 1
成品库/WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -105,7 +105,7 @@ namespace WCS.WorkEngineering.Systems
 
         public override bool Select(Device dev)
         {
-            return dev.Code == "2532";
+            return dev.Code == "8271";
         }
     }
 }

+ 27 - 27
成品库/WCS.WorkEngineering/Systems/RGVSystems.cs

@@ -10,35 +10,35 @@ namespace WCS.WorkEngineering.Systems
     /// <summary>
     ///  Agv交互系统
     /// </summary>
-    [BelongTo(typeof(MainWorld))]
-    [Description("RGV交互系统")]
-    public class RGVSystems : DeviceSystem<RGV>
-    {
-        protected override bool ParallelDo => true;
+    //[BelongTo(typeof(MainWorld))]
+    //[Description("RGV交互系统")]
+    //public class RGVSystems : DeviceSystem<RGV>
+    //{
+    //    protected override bool ParallelDo => true;
 
-        protected override bool SaveLogsToFile => true;
+    //    protected override bool SaveLogsToFile => true;
 
-        public RGVSystems()
-        {
-        }
+    //    public RGVSystems()
+    //    {
+    //    }
 
-        public override void Do(RGV obj)
-        {
-            //if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
-            //if (!obj.Data2.WorkMode.HasFlag(RGVWorkMode.Automatic)) return;
-            //if (!obj.Data2.SystemStatus.HasFlag(RGVSystemStatus.空闲)) return;
-            //if (obj.Data2.Status.HasFlag(RGVStatus.PH_Status)) throw new KnownException($"有光电", LogLevelEnum.High);
-            //obj.Data.TaskNumber = 12345;
-            //obj.Data.CmdType = RGVCmdType.PickPutGoods;
-            //obj.Data.StartPosition = 1663;
-            //obj.Data.DestPosition = 1672;
-            //obj.Data.VoucherNo++;
-        }
+    //    public override void Do(RGV obj)
+    //    {
+    //        //if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
+    //        //if (!obj.Data2.WorkMode.HasFlag(RGVWorkMode.Automatic)) return;
+    //        //if (!obj.Data2.SystemStatus.HasFlag(RGVSystemStatus.空闲)) return;
+    //        //if (obj.Data2.Status.HasFlag(RGVStatus.PH_Status)) throw new KnownException($"有光电", LogLevelEnum.High);
+    //        //obj.Data.TaskNumber = 12345;
+    //        //obj.Data.CmdType = RGVCmdType.PickPutGoods;
+    //        //obj.Data.StartPosition = 1663;
+    //        //obj.Data.DestPosition = 1672;
+    //        //obj.Data.VoucherNo++;
+    //    }
 
-        public override bool Select(Device dev)
-        {
-            return dev.Code == "RGV1";
-            //return dev.HasFlag(Extensions.DeviceFlags.RGV);
-        }
-    }
+    //    public override bool Select(Device dev)
+    //    {
+    //        //return dev.Code == "RGV1";
+    //        //return dev.HasFlag(Extensions.DeviceFlags.RGV);
+    //    }
+    //}
 }

+ 81 - 0
成品库/WCS.WorkEngineering/Systems/出库分配目标地址.cs

@@ -0,0 +1,81 @@
+using ServiceCenter.Extensions;
+using ServiceCenter.SqlSugars;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WCS.Core;
+using WCS.Entity;
+using WCS.WorkEngineering.Extensions;
+using WCS.WorkEngineering.Protocol.Station;
+using WCS.WorkEngineering.WebApi.Controllers;
+using WCS.WorkEngineering.Worlds;
+using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
+
+namespace WCS.WorkEngineering.Systems
+{
+    /// <summary>
+    ///  出库分配目标地址
+    /// </summary>
+    [BelongTo(typeof(MainWorld))]
+    [Description("出库分配目标地址")]
+    public class 出库分配目标地址 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
+    {
+        protected override bool ParallelDo => true;
+
+        protected override bool SaveLogsToFile => true;
+        List<Station> devs = new List<Station>();
+        public 出库分配目标地址()
+        {
+            devs = Device.All.Where(v => v.HasFlag(DeviceFlags.出库口)).Select(v => new Station(v, this.World)).ToList();            
+        }
+
+        public override void Do(Device<IStation520, IStation521, IStation523> obj)
+        {
+
+            //if (obj.Entity.Code == "8273" && obj.Data2.Request == 1 && obj.Data.GoodsEnd != 8271)
+            //{
+            //    obj.Data.TaskNumber = obj.Data2.TaskNumber;
+            //    obj.Data.GoodsEnd = 8271;
+            //    obj.Data.VoucherNo ++;
+            //}
+
+            //return;
+
+            //if (obj.Data2.TaskNumber <= 0)
+            //    return;
+            //if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status))
+            //    return;
+            ////if (obj.Data2.GoodsEnd.ToString() != obj.Entity.Code)
+            ////    return;            
+            //SqlSugarHelper.Do(_db =>
+            //{
+            //    var db = _db.Default;
+            //    //找到对应任务
+            //    var taskInfo = db.Queryable<WCS_TaskOld>().SplitTable(tabs => tabs.Take(2)).Where(v => v.ID == obj.Data2.TaskNumber && v.Type == TaskType.OutDepot && v.WorkBench == "8278").First();
+            //    //taskInfo.WorkBench = "8278";
+            //    //db.Default.Updateable(taskInfo).SplitTable().ExecuteCommand();
+
+            //    //未找到对应任务
+            //    if (taskInfo == null)
+            //    {
+            //        throw new Exception($"未找到可用任务");
+            //    }
+
+            //    obj.Data.TaskNumber = obj.Data2.TaskNumber;
+            //    obj.Data.GoodsEnd = 8278;
+            //    obj.Data.VoucherNo++;
+            //});
+            
+
+            
+        }
+
+        public override bool Select(Device dev)
+        {
+            return new string[] { "8271", "8272", "8273", "8274", "8275" }.Contains(dev.Code);
+        }
+    }
+}

+ 70 - 32
成品库/WCS.WorkEngineering/Systems/堆垛机.cs

@@ -1,8 +1,10 @@
-using PlcSiemens.Core.Extension;
+using Newtonsoft.Json;
+using PlcSiemens.Core.Extension;
 using ServiceCenter.Extensions;
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
+using System.Threading.Tasks;
 using WCS.Core;
 using WCS.Entity;
 using WCS.WorkEngineering.Extensions;
@@ -80,30 +82,45 @@ namespace WCS.WorkEngineering.Systems
 
                     #endregion 获取完成任务
 
+                    if (task.Type == TaskType.EnterDepot)
+                    {
+                        
+                    }
+
                     //根据任务类型做不同的处理
                     switch (task.Type)
-                    {
+                    {                        
                         case TaskType.EnterDepot:
-                            //完成任务
                             task.Status = Entity.TaskStatus.Finish;
                             task.EedTime = DateTime.Now;
                             db.Default.Updateable(task).ExecuteCommand();
                             task.AddWCS_TASK_DTL(db, task.AddrTo, "入库任务结束");
+                            //完成任务
                             break;
 
                         case TaskType.OutDepot:
                             switch (task.OutType)
                             {
                                 case OutTypeEnum.自动出库任务:
-                                    task.Status = Entity.TaskStatus.ConveyorExecution;
+                                    task.Status = Entity.TaskStatus.Finish;
                                     var dev = new Station(Device.All.FirstOrDefault(v => v.Code == task.SrmStation), this.World);
                                     dev.Data.TaskNumber = task.ID;
+                                    dev.Data.GoodsEnd = 8278;
+                                    dev.Data.VoucherNo++;
                                     db.Default.Updateable(task).ExecuteCommand();
                                     task.AddWCS_TASK_DTL(db, task.SrmStation, "出库任务到达放货站台");
+                                    WmsApi.SrmPickOutCompleted(task.ID);
                                     break;
 
                                 case OutTypeEnum.全自动手动出库任务:
-
+                                    task.Status = Entity.TaskStatus.Finish;
+                                    var dev1 = new Station(Device.All.FirstOrDefault(v => v.Code == task.SrmStation), this.World);
+                                    dev1.Data.TaskNumber = task.ID;
+                                    dev1.Data.GoodsEnd = 8278;
+                                    dev1.Data.VoucherNo++;
+                                    db.Default.Updateable(task).ExecuteCommand();
+                                    task.AddWCS_TASK_DTL(db, task.SrmStation, "手动出库任务到达放货站台");
+                                    WmsApi.SrmPickOutCompleted(task.ID);
                                     break;
 
                                 case OutTypeEnum.半自动手动出库任务:
@@ -126,24 +143,27 @@ namespace WCS.WorkEngineering.Systems
                             task.AddWCS_TASK_DTL(db, task.AddrTo, "移库任务结束");
                             break;
 
-                        case TaskType.EmptyInit:
-                            task.Status = Entity.TaskStatus.Finish;
-                            task.EedTime = DateTime.Now;
-                            db.Default.Updateable(task).ExecuteCommand();
-                            task.AddWCS_TASK_DTL(db, task.AddrTo, "空轮初始化任务结束");
-                            break;
                     }
 
+                   
+                    taskInfo = task;
+                    
+
                     if (task.Status >= TaskStatus.Finish) task.CompleteOrCancelTasks(db);
 
-                    taskInfo = task;
+                    
+
+
                 });
                 if (taskInfo == null) throw new KnownException("数据库提交事务错误", LogLevelEnum.High);
                 // 写入信号
+                if (taskInfo.Status == TaskStatus.Finish)
+                {
+                    WmsApi.CompleteTask(taskInfo.ID);
+                }
                 obj.Data.OkAck = 1;
                 //通知WMS任务完成
-                if (taskInfo.Status == TaskStatus.Finish) WmsApi.CompleteTask(taskInfo.ID);
-                if (taskInfo.Type == TaskType.OutDepot && taskInfo.Status == TaskStatus.ConveyorExecution) WmsApi.SrmPickOutCompleted(taskInfo.ID);
+                               
 
                 World.Log($"堆垛机任务处理:结束--完成任务{obj.Data2.TaskFinishiId}", LogLevelEnum.Mid);
             }
@@ -171,7 +191,6 @@ namespace WCS.WorkEngineering.Systems
 
                 //不存在调整优先级任务,判断是否存在移库任务
                 isTransfer = tasks.Any(v => v.Type == TaskType.TransferDepot && v.Status == Entity.TaskStatus.NewBuild);
-                //}
                 if (!isTransfer) //存在调整优先级任务
                 {
                     //获取出库任务中新建状态最大优先级
@@ -230,42 +249,55 @@ namespace WCS.WorkEngineering.Systems
             var lastIsOut = obj.Entity.GetFlag<bool>("LastIsOut");
             obj.Entity.SetFlag("LastIsOut", !lastIsOut);
 
+
             //入库任务优先 或 上一个周期是出库任务并且出库任务无优先
             if (enterOrOut == 2 || (lastIsOut && enterOrOut == 1)) //入库任务
             {
+
                 //判断本次优先执行楼层,并设置下次执行时优先楼层
-                var floor = obj.Entity.GetFlag<int>("FloorIn");
-                floor = floor % 2 + 1;
-                obj.Entity.SetFlag("FloorIn", floor);
+                //var floor = obj.Entity.GetFlag<int>("FloorIn");
+                //floor = floor % 2 + 1;
+                //obj.Entity.SetFlag("FloorIn", floor);
 
                 //获取当前堆垛机所有的取货站台
                 var arrIn = PickUpDevices.First(v => v.Key == obj.Entity.Code).Value;
                 if (!arrIn.Any()) throw new KnownException($"堆垛机{obj.Entity.Code}无取货路径点", LogLevelEnum.High);
 
-                //获取有货的设备
-                arrIn = arrIn.Where(v => v.Data.TaskNumber > 0 && v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.Run)).ToList();
+                ////获取有货的设备
+                arrIn = arrIn.Where(v => v.Data2.TaskNumber > 0 && v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.Run)).ToList();
                 if (!arrIn.Any()) throw new KnownException($"[{obj.Entity.Code}]等待入库任务输送到位", LogLevelEnum.Mid);
                 WCS_TaskInfo taskInfo = null;
                 Station station = null;
                 SqlSugarHelper.Do(db =>
                 {
                     //根据有货设备的任务号获取所有类型为入库状态为输送机执行中的任务
-                    var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => (v.Type == TaskType.EnterDepot || v.Type == TaskType.EmptyInit)
+                    var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => (v.Type == TaskType.EnterDepot)
                                                                               && v.Status == TaskStatus.ConveyorExecution
-                                                                              && arrIn.Select(p => p.Data.TaskNumber).Contains(v.ID));
+                                                                              && arrIn.Select(p => p.Data2.TaskNumber).Contains(v.ID)).ToList();
+                    //World.Log("可用任务集合:" + JsonConvert.SerializeObject(tasks));
                     //按条件先后排序获取一条排序后第一条结果1.优先级2.所在楼层与本次优先执行楼层 TODO:待验证排序结果
-                    var task = tasks.OrderByDescending(v => v.Priority).OrderByDescending(v => v.Floor == floor ? 1 : 0).First() ?? throw new KnownException($"{obj.Entity.Code}未找到入库任务", LogLevelEnum.High);
+                    var task = tasks.OrderByDescending(v => v.Priority).First() ?? throw new KnownException($"{obj.Entity.Code}未找到入库任务", LogLevelEnum.High);
 
                     //获取任务所有设备
-                    station = arrIn.First(v => v.Data.TaskNumber == task.ID);
+                    station = arrIn.First(v => v.Data2.TaskNumber == task.ID);
+                    if(station == null) throw new KnownException($"{obj.Entity.Code}未找到满足条件的入库任务", LogLevelEnum.High);
                     //获取当前货物巷道
-                    var res = WmsApi.GetLocalIn(task.ID, task.Device, station.Entity.Code, task.Height);
+                    var res = WmsApi.GetLocalIn(task.ID, task.Device, station.Entity.Code);
                     var loc = res.ResData.CellNo.Split("-");
                     task.Status = TaskStatus.StackerExecution;
                     task.AddrTo = $"{loc[0]}-{loc[1]}-{loc[2]}";
                     task.LastInteractionPoint = station.Entity.Code;
                     task.EditWho = "WCS";
-                    db.Default.Updateable(task).ExecuteCommand();
+                    if (db.Default.Updateable(task).ExecuteCommand() > 1)
+                    {
+                        World.Log($"更新成功", LogLevelEnum.Mid);
+                    }
+                    else
+                    {
+                        World.Log($"更新失败", LogLevelEnum.Mid);
+                        db.Connect.Updateable<WCS_TaskInfo>().SetColumns(p => new WCS_TaskInfo() { AddrTo = task.AddrTo }).Where(p => p.ID == task.ID);
+                    }
+
                     task.AddWCS_TASK_DTL(db, station.Entity.Code, task.AddrTo, "任务下发堆垛机执行");
 
                     taskInfo = task;
@@ -291,10 +323,10 @@ namespace WCS.WorkEngineering.Systems
             {
                 //判断本次优先执行楼层,并设置下次执行时优先楼层
 
-                var floor = obj.Entity.GetFlag<int>("FloorOut");
+                //var floor = obj.Entity.GetFlag<int>("FloorOut");
 
-                floor = floor % 2 + 1;
-                obj.Entity.SetFlag("FloorOut", floor);
+                //floor = floor % 2 + 1;
+                //obj.Entity.SetFlag("FloorOut", floor);
 
                 //获取当前堆垛机所有的取货站台
                 var arrOut = PutDevices.First(v => v.Key == obj.Entity.Code).Value;
@@ -308,22 +340,27 @@ namespace WCS.WorkEngineering.Systems
                                                 && !v.Data3.Status.HasFlag(StationStatus.UnassignedTask) //未分配任务
                                                 && v.Data3.Status.HasFlag(StationStatus.Auto)).ToList(); //自动
 
-                if (!arrOut.Any()) throw new KnownException($"[{obj.Entity.Code}]等待出库任务输送到位", LogLevelEnum.Mid);
+                if (!arrOut.Any()) throw new KnownException($"[{obj.Entity.Code}]无可用放货站台", LogLevelEnum.Mid);
 
                 WCS_TaskInfo taskInfo = null;
 
                 SqlSugarHelper.Do(db =>
                {
                    var allOutCode = arrOut.Select(v => v.Entity.Code).ToList();
+                   //var taskIn = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Type == TaskType.EnterDepot && v.Status > TaskStatus.WaitingToExecute);
 
                    //按条件先后排序获取一条排序后第一条结果1.优先级2.所在楼层与本次优先执行楼层
                    var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Type == TaskType.OutDepot && v.Status == TaskStatus.WaitingToExecute)
                                                                   .Where(v => allOutCode.Contains(v.SrmStation))
                                                                   .OrderByDescending(v => v.Priority)
-                                                                  .OrderByDescending(v => v.Floor == floor ? 1 : 0)
                                                                   .OrderBy(v => v.AddTime)
                                                                   .First();
                    if (task == null) throw new KnownException($"{obj.Entity.Code}未找到出库任务", LogLevelEnum.High);
+
+                   //if (taskIn.Any(v => v.AddrNext == task.SrmStation))
+                   //{
+                   //    throw new KnownException($"等待入库任务执行", LogLevelEnum.High);
+                   //}
                    var taskId = task.ID;
 
                    //判断是否是二深位任务
@@ -343,7 +380,7 @@ namespace WCS.WorkEngineering.Systems
                                task = db.Default.Queryable<WCS_TaskInfo>()
                                                 .Where(v => v.Type == TaskType.OutDepot && v.Status == TaskStatus.WaitingToExecute)
                                                 .Where(v => allOutCode.Contains(v.SrmStation) && v.AddrFrom == res.ResData.CellNo)
-                                                .First() ?? throw new KnownException($"请尽快搬离{obj.Entity.Code}二楼出库口满轮,当前堆垛机出库任务呗阻塞", LogLevelEnum.Mid);
+                                                .First() ?? throw new KnownException($"一深位有出库任务,等待一深位任务执行完成", LogLevelEnum.Mid);
                                break;
                        };
                        if (res.ResData.ResType == WmsApiMoveTask.执行移库任务) return;
@@ -372,6 +409,7 @@ namespace WCS.WorkEngineering.Systems
                 obj.Data.TaskType = SrmTaskType.Default;
                 obj.Data.VoucherNo++;
                 World.Log($"堆垛机任务处理:结束---下发出库任务[{obj.Data.TaskNumber}][{obj.Data.SLine}][{obj.Data.SCol}][{obj.Data.SLayer}][{obj.Data.ELine}][{obj.Data.ECol}][{obj.Data.ELayer}][{obj.Data.TaskType}][{obj.Data.VoucherNo}]", LogLevelEnum.Mid);
+
             }
 
             #endregion 出入库

+ 64 - 12
成品库/WCS.WorkEngineering/Systems/扫码入库.cs

@@ -1,6 +1,9 @@
-using ServiceCenter.Extensions;
+using Newtonsoft.Json;
+using ServiceCenter.Extensions;
+using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
 using System.ComponentModel;
+using System.Threading.Tasks;
 using WCS.Core;
 using WCS.Entity;
 using WCS.WorkEngineering.Extensions;
@@ -29,15 +32,21 @@ namespace WCS.WorkEngineering.Systems
 
         public 扫码入库()
         {
-            devs = Device.All.Where(v => v.HasFlag(DeviceFlags.入库, DeviceFlags.巷道口)).Select(v => new Station(v, this.World)).ToList();
+            devs = Device.All.Where(v => v.HasFlag(DeviceFlags.入库)).Select(v => new Station(v, this.World)).ToList();
             srms = Device.All.Where(v => v.HasProtocol(typeof(ISRM520))).Select(v => new SRM(v, this.World)).ToList();
         }
 
         public override void Do(Device<IStation520, IStation521, IStation523, IStation91, IBCR81> obj)
         {
+
+
             obj.入库站点是否被禁止();
             obj.入库站点是否满足执行条件();
 
+            if (obj.Data2.Request != 1.ToShort()) throw new KnownException("无请求", LogLevelEnum.Mid);
+            if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("无光电", LogLevelEnum.Mid);
+
+
             //开始读取条码
             var bcr = obj.Data5.GetBCRCode();
             WCS_TaskInfo task = null;
@@ -45,7 +54,9 @@ namespace WCS.WorkEngineering.Systems
             {
                 var db = _db.Default;
                 //找到对应任务
-                var taskInfo = db.Queryable<WCS_TaskInfo>().First(x => x.BarCode == bcr);
+                var taskInfo = db.Queryable<WCS_TaskInfo>().First(x => x.BarCode == bcr);                          
+                //var taskInfo = db.Queryable<WCS_TaskInfo>().First(x => x.AddrFrom == "8277");
+                
                 //未找到对应任务
                 if (taskInfo == null)
                 {
@@ -55,19 +66,37 @@ namespace WCS.WorkEngineering.Systems
                 }
 
                 //任务生成
-                if (taskInfo.Status == Entity.TaskStatus.NewBuild)
+                if (taskInfo.Status == Entity.TaskStatus.WaitingToExecute)
                 {
                     //开始获取堆垛机与可用站台信息
-                    var res = WmsApi.GetTunnelPriorityList(task.ID);
+                    var res = WmsApi.GetTunnelPriorityList(taskInfo.ID);
+                    if (res == null) throw new Exception($"未返回巷道");
+
+                    
                     var tunnelNo = res.ResData.Split(",").Select(v => "SRM" + v).ToList();
                     SRM srm = null;
                     List<Station> stations = new List<Station>();
                     //成品库背面堆垛机取货点
-                    stations = devs.Where(v => v.Entity.Code is "" or "" or "").ToList();
+                    stations = devs.Where(v => v.Entity.Code is "8271" or "8272" or "8273" or "8274" or "8275").ToList();
                     //筛选出可用站台c
                     stations = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StationStatus.Auto))
                                        .Where(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status))
                                        .Where(v => !v.Data3.Status.HasFlag(StationStatus.Run)).ToList(); // 筛选出可用站台
+                    var count = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StationStatus.Auto))
+                                       .Where(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status))
+                                       .Where(v => !v.Data3.Status.HasFlag(StationStatus.Run)).Count();
+                    var count1 = stations.Where(v => v.Data.VoucherNo == v.Data2.VoucherNo && v.Data3.Status.HasFlag(StationStatus.Auto))
+                                       .Where(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) && !v.Data3.Status.HasFlag(StationStatus.OT_Status))
+                                       .Where(v => !v.Data3.Status.HasFlag(StationStatus.Run)).ToArray();
+
+
+
+                    if (stations == null)
+                    {
+                        throw new KnownException($"{obj.Entity.Code}无可用放货站台", LogLevelEnum.High);
+                    }
+
+                    //World.Log($"可用站台信息[{count}]" + JsonConvert.SerializeObject(stations));
                     //可用堆垛机
                     srm = stations.Select(v => v.Entity.Sources).SelectMany(v => v).Where(v => v.IsTunnel()) //上一个地址是巷道的
                                   .Select(v => v.Sources).SelectMany(v => v).Where(v => v.HasProtocol(typeof(ISRM520))) //筛选出堆垛机
@@ -75,17 +104,36 @@ namespace WCS.WorkEngineering.Systems
                                   .Where(v => v != null && !v.Data2.Status.HasFlag(SrmStatus.Alarm) && v.Data2.AutoStatus == SrmAutoStatus.Automatic) //筛选出可用堆垛机
                                   .Where(v => tunnelNo.Contains(v.Entity.Code)) //筛选出巷道优先级最高的堆垛机
                                   .MinBy(v => tunnelNo.IndexOf(v.Entity.Code)); //按照巷道优先级排序
-                    if (srm == null) throw new Exception($"任务{taskInfo.ID}无可用堆垛机");
+                    if (srm == null)
+                    {
+                        
+                        throw new Exception($"任务{taskInfo.ID}无可用堆垛机{count}{count1[0].Entity.Code}");
+                    }
+                        
 
                     //筛选出堆垛机的取货站台
                     var nextPos = stations.FirstOrDefault(v => v.Entity.Sources.Where(t => t.IsTunnel()).Select(t => t.Sources).SelectMany(v => v) //获取所有巷道
                                                                                .Where(t => t.HasProtocol(typeof(ISRM520)))//筛选出堆垛机
                                                                                .SelectMany(v => v.Sources).Any(t => t.Code == srm.Entity.Parent.Code));
+                    if (nextPos == null)
+                    {
+                        throw new KnownException($"{obj.Entity.Code}没有可用的放货站台", LogLevelEnum.High);
+                    }
+
+                    var dev = devs.Find(v => v.Entity.Code == nextPos.Entity.Code);
+                    var nextCode = nextPos.Entity.Code;
+                    if (dev == null) throw new Exception($"找不到放货点");
+                    //放货点有光电或任务号不下发任务
+                    //if (obj.Data3.Status.HasFlag(StationStatus.OT_Status) || obj.Data2.TaskNumber > 0 || obj.Data3.Status.HasFlag(StationStatus.PH_Status))
+                    //{
+                    //    throw new KnownException($"{obj.Entity.Code}有任务或光电", LogLevelEnum.High);
+                    //}
+
                     //堆垛机的可用取货站台
                     taskInfo.SrmStation = nextPos.Entity.Code;
                     taskInfo.AddrNext = nextPos.Entity.Sources.First().Code;
                     taskInfo.Device = srm.Entity.Code;
-                    taskInfo.Tunnel = taskInfo.SrmStation.GetLastDigit().ToString();
+                    taskInfo.Tunnel = taskInfo.Device.GetLastDigit().ToString();
                     taskInfo.Status = Entity.TaskStatus.ConveyorExecution;
                     taskInfo.EditWho = "WCS";
                     taskInfo.EditTime = DateTime.Now;
@@ -93,16 +141,20 @@ namespace WCS.WorkEngineering.Systems
                     taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"完成巷道分配,分配至{taskInfo.Device}");
                     taskInfo.updateRedisHash();
                     task = taskInfo;
-                }
-                else return;
+
+                    if (task == null) return;
+                    
+                }               
+
+                
             });
 
-            if (task == null) return;
 
             obj.Data.TaskNumber = task.ID;
             obj.Data.GoodsStart = obj.Entity.Code.ToShort();
-            obj.Data.GoodsEnd = task.AddrNext.ToShort();
+            obj.Data.GoodsEnd = task.SrmStation.ToShort();
             obj.Data.VoucherNo++;
+
         }
 
         public override bool Select(Device dev)

+ 24 - 18
成品库/WCS.WorkEngineering/WebApi/Controllers/WmsApi.cs

@@ -18,7 +18,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
     {
         private static string _WMSUrl = null!;
         private static string _wareHouseId = null!;
-
+        private static string wmsUrl = "http://10.30.43.158:8089/api/Cp/WCS_InTaskInfo";
         /// <summary>
         ///  WMS URL
         /// </summary>
@@ -87,7 +87,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// <exception cref="Exception"></exception>
         public static SRes<string> GetTunnelPriorityList(int wcsTaskNum)
         {
-            var res = APICaller.CallApi2<SRes<string>>(WMSUrl + "/api/Hj/GetTunnelPriorityList", new GetTunnelPriorityListRequest
+            var res = APICaller.CallApi2<SRes<string>>("http://10.30.43.158:8089/api/Cp/GetTunnelPriorityList", new GetTunnelPriorityListRequest
             {
                 TaskNum = wcsTaskNum,
             });
@@ -107,14 +107,13 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// <param name="size"></param>
         /// <returns></returns>
         /// <exception cref="Exception"></exception>
-        public static SRes<ApplyStockInLocResponse> GetLocalIn(int wcsTaskNum, string tunnel, string device, int size)
+        public static SRes<ApplyStockInLocResponse> GetLocalIn(int wcsTaskNum, string tunnel, string device)
         {
-            var res = APICaller.CallApi2<SRes<ApplyStockInLocResponse>>(WMSUrl + "/api/FJ/ApplyStockInLoc", new ApplyStockInLocRequest
+            var res = APICaller.CallApi2<SRes<ApplyStockInLocResponse>>("http://10.30.43.158:8089/api/Cp/ApplyStockInLoc", new ApplyStockInLocRequest
             {
                 TaskNum = wcsTaskNum,
                 TunnelNum = tunnel.GetLastDigit(),
                 PickUpEquipmentNo = device.ToString(),
-                Height = size
             });
             if (res.ResCode != ResponseStatusCodeEnum.Sucess)
             {
@@ -131,7 +130,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// <exception cref="KnownException"></exception>
         public static SRes<int> SrmPickOutCompleted(int taskNum)
         {
-            var res = APICaller.CallApi2<SRes<int>>(WMSUrl + "/api/Hj/SrmPickOutCompleted", new SrmPickOutCompletedRequest
+            var res = APICaller.CallApi2<SRes<int>>("http://10.30.43.158:8089/api/Cp/SrmPickOutCompleted", new SrmPickOutCompletedRequest
             {
                 TaskNum = taskNum,
             });
@@ -209,7 +208,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// <exception cref="KnownException"></exception>
         public static SRes<int> CompleteTask(int taskNo)
         {
-            var res = APICaller.CallApi2<SRes<int>>(WMSUrl + "/api/fj/CompleteTask", new CompleteTaskRequest
+            var res = APICaller.CallApi2<SRes<int>>("http://10.30.43.158:8089/api/Cp/CompleteTask", new CompleteTaskRequest
             {
                 TaskNum = taskNo,
                 OperationType = Models.WMS.Request.CompleteTask.自动完成,
@@ -230,7 +229,7 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// <exception cref="KnownException"></exception>
         public static SRes<AddWcsMoveTaskResponse> AddWcsMoveTask(int taskNo)
         {
-            var res = APICaller.CallApi2<SRes<AddWcsMoveTaskResponse>>(WMSUrl + "/api/Hj/AddWcsMoveTask", new CompleteTaskRequest
+            var res = APICaller.CallApi2<SRes<AddWcsMoveTaskResponse>>("http://10.30.43.158:8089/api/Cp/AddWcsMoveTask", new CompleteTaskRequest
             {
                 TaskNum = taskNo,
             });
@@ -251,21 +250,28 @@ namespace WCS.WorkEngineering.WebApi.Controllers
         /// <exception cref="Exception"></exception>
         public static SRes I_WCS_GetInTask(string barcode, string devCode, bool getTunnel = false)
         {
-            var res = APICaller.CallApi<SRes>(WMSUrl + "/api/Task/I_WCS_GetInTask", new List<I_WCS_GetInTaskRequest>()
+            try
             {
-                new I_WCS_GetInTaskRequest(){
-                     ContainerBarCode = barcode,
-                     WareHouseId = wareHouseId,
-                     EquipmentNo = devCode,
-                     Memo1 = getTunnel ? "1" : "" //1:分巷道  2:分货位
+                var res = APICaller.CallApi<SRes>("http://10.30.43.158:8089/api/Cp/WCS_InTaskInfo", new GetInTaskInfoRequest()
+                {
+                    Code = barcode,
+                    Equip = devCode,
+                    WareHouse = "cphouse"
+
+                });
+                if (res.ResCode != ResponseStatusCodeEnum.Sucess)
+                {
+                    throw new KnownException(res.ResMsg, LogLevelEnum.High);
                 }
-            });
-            if (res.ResCode != ResponseStatusCodeEnum.Sucess)
+                return res;
+            }
+            catch (Exception ex)
             {
-                throw new KnownException(res.ResMsg, LogLevelEnum.High);
+                throw new KnownException(ex.Message, LogLevelEnum.High)
+;
             }
 
-            return res;
+
         }
 
         /// <summary>

+ 9 - 31
成品库/WCS.WorkEngineering/WebApi/Models/WMS/Request/I_WCS_GetInTaskRequest.cs

@@ -5,50 +5,28 @@ namespace WCS.WorkEngineering.WebApi.Models.WMS.Request
     /// <summary>
     /// 获取入库任务请求实体
     /// </summary>
-    public class I_WCS_GetInTaskRequest
+    public class GetInTaskInfoRequest
     {
         /// <summary>
-        /// 容器编号
+        /// 位置码
         /// </summary>
         [Required(ErrorMessage = "{0} 不可为空")]
-        public string ContainerBarCode { get; set; }
+        public string Equip { get; set; }
 
         /// <summary>
-        /// 容器类型
+        /// 托盘编码
         /// </summary>
         [Required(ErrorMessage = "{0} 不可为空")]
-        public int ContainerType { get; set; }
-
-        /// <summary>
-        /// 物料条码
-        /// </summary>
-        public string MatBarCode { get; set; }
+        public string Code { get; set; }
 
         /// <summary>
         /// 仓库编码
         /// </summary>
         [Required(ErrorMessage = "{0} 不可为空")]
-        public string WareHouseId { get; set; }
-
-        /// <summary>
-        /// 设备编号
-        /// </summary>
-        [Required(ErrorMessage = "{0} 不可为空")]
-        public string EquipmentNo { get; set; }
-
-        /// <summary>
-        /// 目标位置
-        /// </summary>
-        public string EndPostion { get; set; }
-
-        /// <summary>
-        /// 货叉(直接申请货位使用)
-        /// </summary>
-        public int ForkNum { get; set; }
+        public string WareHouse { get; set; }
 
-        public string Memo1 { get; set; }
-        public string Memo2 { get; set; }
-        public string Memo3 { get; set; }
-        public string Memo4 { get; set; }
+        public string Memo1 { get; set; } = "";
+        public string Memo2 { get; set; } = "";
+        public string Memo3 { get; set; } = "";
     }
 }

+ 56 - 88
成品库/WCS.WorkEngineering/WorkStart.cs

@@ -24,7 +24,7 @@ namespace WCS.WorkEngineering
         {
             #region 设置设备IP集合
 
-            ServiceHub.DeviceIPList = new List<string>() { };
+            ServiceHub.DeviceIPList = new List<string>() { "10.30.43.90" };
 
             #endregion 设置设备IP集合
 
@@ -32,43 +32,26 @@ namespace WCS.WorkEngineering
 
             #region 基本信息
 
-            #region 托盘线输送线
+            #region 库尾输送线
 
-            List<Tuple<string, List<Tuple<int, int>>>> tuples = new List<Tuple<string, List<Tuple<int, int>>>>()
+            List<StationSegmentInfo> segmentInfo = new List<StationSegmentInfo>
             {
-                //new Tuple<string, List<Tuple<int, int>>>("10.30.37.89",new List<Tuple<int, int>>()
-                //{
-                //    new Tuple<int, int>(1601, 1620),
-                //    new Tuple<int, int>(2501, 2540),
-
-                //    new Tuple<int, int>(2701, 2740),
-                //})
+                new StationSegmentInfo(8271, 8279, "10.30.43.90")
             };
 
-            foreach (var item in tuples)
+            foreach (var item in segmentInfo)
             {
-                var db520 = 0;
-                var db521 = 0;
-                var db523 = 0;
-                foreach (var item1 in item.Item2)
+                for (int i = item.Start; i <= item.End; i++)
                 {
-                    for (int i = item1.Item1; i <= item1.Item2; i++)
-                    {
-                        var conv = new Device(i.ToString());
-                        conv.AddFlag(DeviceFlags.输送机);
-
-                        conv.AddProtocol<IStation520>(db520, 520, item.Item1);
-                        conv.AddProtocol<IStation521>(db521, 521, item.Item1);
-                        conv.AddProtocol<IStation523>(db523, 523, item.Item1);
-
-                        db520 = db520 + 14;
-                        db521 = db521 + 16;
-                        db523 = db523 + 12;
-                    }
+                    var conv = new Device(i.ToString());
+                    conv.AddFlag(DeviceFlags.输送机);
+                    conv.AddProtocol<IStation520>((i - item.Start) * 14, 520, item.IP);
+                    conv.AddProtocol<IStation521>((i - item.Start) * 16, 521, item.IP);
+                    conv.AddProtocol<IStation523>((i - item.Start) * 12, 523, item.IP);
                 }
             }
 
-            #endregion 托盘线输送线
+            #endregion 库尾输送线
 
             #endregion 基本信息
 
@@ -76,7 +59,7 @@ namespace WCS.WorkEngineering
 
             List<BcrInfo> bcrInfo = new List<BcrInfo>
             {
-                //new BcrInfo(new int[] {2532, 2732 }, "10.30.37.89")
+                new BcrInfo(new int[] {8277}, "10.30.43.90")
             };
 
             foreach (var item in bcrInfo)
@@ -93,10 +76,10 @@ namespace WCS.WorkEngineering
             #endregion 托盘线扫码器
 
             #region 外检信息
-
+            //要按先后顺序,后面添加外检要注意
             List<ShapeInfo> shapeInfo = new List<ShapeInfo>
             {
-                //new ShapeInfo(new int[] { 2732,2532 }, "10.30.37.89")
+                new ShapeInfo(new int[] {8277}, "10.30.43.90")
             };
 
             foreach (var item in shapeInfo)
@@ -135,41 +118,20 @@ namespace WCS.WorkEngineering
                 //conv.AddProtocol<IStation523>(, 523, item.IP);
             }
 
-            #endregion 初始化RGV相关信息
-
-            #region 初始化桁架相关信息
-
-            List<TrussSegmentInfo> TrussInfo = new List<TrussSegmentInfo>
-            {
-                //new TrussSegmentInfo( 1, "10.30.37.211"),
-            };
-
-            foreach (var item in TrussInfo)
-            {
-                var conv = new Device($"Truss{item.Code}");
-                conv.AddFlag(DeviceFlags.桁架);
-                conv.AddProtocol<ITruss520>(0, 520, item.IP);
-                conv.AddProtocol<ITruss521>(0, 521, item.IP);
-                conv.AddProtocol<ITruss523>(0, 523, item.IP);
-                conv.AddProtocol<ITruss530>(0, 530, item.IP);
-                conv.AddProtocol<ITruss531>(0, 531, item.IP);
-            }
-
-            #endregion 初始化桁架相关信息
+            #endregion 初始化RGV相关信息            
 
             #region 初始化堆垛机相关信息
 
-            int ip = 41;
+            int ip = 21;
 
             for (int i = 0; i <= 1; i++)
             {
                 var srm = new Device($"SRM{i + 1}");
                 srm.AddFlag(DeviceFlags.堆垛机);
-                ip = i == 0 ? ip : ip + 8;
-                //三台堆垛机IP主机位分别是 41、49、57、65、73、81
-                srm.AddProtocol<ISRM520>(0, 520, $"10.30.37.{ip}");
-                srm.AddProtocol<ISRM521>(0, 521, $"10.30.37.{ip}");
-                srm.AddProtocol<ISRM537>(0, 537, $"10.30.37.{ip}");
+                ip = i == 0 ? ip : ip + 10;
+                srm.AddProtocol<ISRM520>(0, 520, $"10.30.43.{ip}");
+                srm.AddProtocol<ISRM521>(0, 521, $"10.30.43.{ip}");
+                srm.AddProtocol<ISRM537>(0, 537, $"10.30.43.{ip}");
 
                 //增加巷道
                 var tunnel = new Device($"TY{i + 1}");
@@ -182,22 +144,37 @@ namespace WCS.WorkEngineering
 
             List<RouteInfo> routeInfos = new List<RouteInfo>
             {
-                //    new RouteInfo("SRM1", new string[] { "TY1" }),
-                //    new RouteInfo("SRM2", new string[] { "TY2" }),
-                //    //巷道对应堆垛机 及 一楼出库点
-                //    new RouteInfo("TY1", new string[] { "SRM1","2532"}),
-                //    new RouteInfo("TY2", new string[] { "SRM2","2732" }),
-
-                //    //一楼入库点
-                //    new RouteInfo("2532", new string[] { "TY1" }),
-                //    new RouteInfo("2732", new string[] { "TY2" }),
-                //    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("455", new string[] { "466", "480", "494", "508","522","536"}),
+                    new RouteInfo("SRM1", new string[] { "TY1" }),
+                    new RouteInfo("SRM2", new string[] { "TY2" }),
+                    //new RouteInfo("SRM3", new string[] { "TY3" }),
+                    //new RouteInfo("SRM4", new string[] { "TY4" }),
+                    //new RouteInfo("SRM5", new string[] { "TY5" }),
+                    new RouteInfo("TY1", new string[] { "SRM1" }),
+                    new RouteInfo("TY2", new string[] { "SRM2" }),
+                    //new RouteInfo("TY3", new string[] { "SRM3" }),
+                    //new RouteInfo("TY4", new string[] { "SRM4" }),
+                    //new RouteInfo("TY5", new string[] { "SRM5" }),
+
+                    //入
+                    new RouteInfo("TY1", new string[] { "8271" }),
+                    new RouteInfo("TY2", new string[] { "8272" }),
+                    //new RouteInfo("TY3", new string[] { "8273" }),
+                    //new RouteInfo("TY4", new string[] { "8274" }),
+                    //new RouteInfo("TY5", new string[] { "8275" }),
+                    //出
+                    new RouteInfo("8271", new string[] { "TY1" }),
+                    new RouteInfo("8272", new string[] { "TY2" }),
+                    //new RouteInfo("8273", new string[] { "TY3" }),
+                    //new RouteInfo("8274", new string[] { "TY4" }),
+                    //new RouteInfo("8275", new string[] { "TY5" }),
+
+                    //new RouteInfo("8271", new string[] { "8278" }),
+                    //new RouteInfo("8272", new string[] { "8278" }),
+                    //new RouteInfo("8273", new string[] { "8278" }),
+                    //new RouteInfo("8274", new string[] { "8278" }),
+                    //new RouteInfo("8275", new string[] { "8278" }),
+
+
             };
 
             foreach (var item in routeInfos)
@@ -218,19 +195,10 @@ namespace WCS.WorkEngineering
 
             Dictionary<DeviceFlags, List<string>> devices = new Dictionary<DeviceFlags, List<string>>
             {
-                //{ DeviceFlags.入库, new List<string>() { "2532", "2533", "2534", "2732", "2733", "2734" } },
-                //{ DeviceFlags.出库, new List<string>() { "2532", "2533", "2534", "2732", "2733", "2734" } },
-                //{ DeviceFlags.扫码, new List<string>() { "2532", "2732" } },
-                //{ DeviceFlags.一列堆垛机, new List<string>() { "SRM1"/*, "SRM3", "SRM5"*/} },
-                //{ DeviceFlags.二列堆垛机, new List<string>() { "SRM2"/*, "SRM4", "SRM6"*/ } },
-                //{ DeviceFlags.一楼扫码,new List<string>(){ "2532","2732"} },
-                //{ DeviceFlags.一楼叠盘机,new List<string>() { "2527","2528","2727","2728"} },
-                //{ DeviceFlags.主线分流点,new List<string>() { "22","41","61"} },
-                //{ DeviceFlags.满轮主线第一次扫码,new List<string>() { "1"} },
-                //{ DeviceFlags.环形库分流点,new List<string>(){ "418"} },
-                //{ 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.入库, new List<string>() { "8271", "8272", "8273", "8274", "8275" } },
+                { DeviceFlags.出库, new List<string>() { "8271", "8272", "8273", "8274", "8275" } },
+                { DeviceFlags.扫码, new List<string>() {"8277"} },
+                { DeviceFlags.出库口, new List<string>() { "8271","8272", "8273", "8274", "8275" } }
             };
 
             devices.ForEach(item =>