林豪 左 2 years ago
parent
commit
2a2ea7fe6c
38 changed files with 1743 additions and 4909 deletions
  1. 10 10
      WCS.Entity.Protocol/Protocol/DataStructure/SRMData.cs
  2. 78 78
      WCS.Entity.Protocol/Protocol/SRM/WCS_SRM520.cs
  3. 119 119
      WCS.Entity.Protocol/Protocol/SRM/WCS_SRM521.cs
  4. 125 54
      WCS.Entity.Protocol/SRM/SRM520.cs
  5. 533 88
      WCS.Entity.Protocol/SRM/SRM521.cs
  6. 1 1
      WCS.Service/Program.cs
  7. 1 1
      WCS.Service/appsettings.json
  8. 18 18
      WCS.WorkEngineering/Extensions/SRMExtension.cs
  9. 10 10
      WCS.WorkEngineering/Protocol/DataStructure/SRMData.cs
  10. 78 78
      WCS.WorkEngineering/Protocol/SRM/WCS_SRM520.cs
  11. 119 119
      WCS.WorkEngineering/Protocol/SRM/WCS_SRM521.cs
  12. 0 286
      WCS.WorkEngineering/Systems/AgvSystems.cs
  13. 0 154
      WCS.WorkEngineering/Systems/DataCollectionSysyem.cs
  14. 0 126
      WCS.WorkEngineering/Systems/DeviceWriteSystem.cs
  15. 0 65
      WCS.WorkEngineering/Systems/GetDeviceSystem.cs
  16. 0 191
      WCS.WorkEngineering/Systems/NoInteractionSystems.cs
  17. 0 240
      WCS.WorkEngineering/Systems/RGVSystems.cs
  18. 0 60
      WCS.WorkEngineering/Systems/SrmDebugSystem.cs
  19. 60 296
      WCS.WorkEngineering/Systems/SrmSystems.cs
  20. 0 104
      WCS.WorkEngineering/Systems/一楼叠盘机入库.cs
  21. 0 96
      WCS.WorkEngineering/Systems/一楼扫码入库.cs
  22. 0 49
      WCS.WorkEngineering/Systems/二楼拆盘机自动补空托盘组.cs
  23. 0 232
      WCS.WorkEngineering/Systems/分拣主线/分线计算09.cs
  24. 0 35
      WCS.WorkEngineering/Systems/分拣主线/湿拉满轮帘线芯股第一次扫码.cs
  25. 0 116
      WCS.WorkEngineering/Systems/分拣主线/满轮主线预写入目标地址.cs
  26. 0 47
      WCS.WorkEngineering/Systems/分拣支线/桁架分流点.cs
  27. 0 372
      WCS.WorkEngineering/Systems/分拣支线/环形库分流点.cs
  28. 0 62
      WCS.WorkEngineering/Systems/机台叫料生成AGV任务.cs
  29. 0 359
      WCS.WorkEngineering/Systems/桁架码垛/桁架.cs
  30. 0 65
      WCS.WorkEngineering/Systems/桁架码垛/桁架码垛区补空托盘任务生成.cs
  31. 0 91
      WCS.WorkEngineering/Systems/桁架码垛/桁架码垛工位任务结束处理.cs
  32. 0 124
      WCS.WorkEngineering/Systems/桁架码垛/桁架缓存放行点.cs
  33. 0 412
      WCS.WorkEngineering/Systems/环形库/机械臂cs.cs
  34. 0 80
      WCS.WorkEngineering/Systems/环形库/环形库码垛区补空托盘任务生成.cs
  35. 0 85
      WCS.WorkEngineering/Systems/环形库/环形库码垛结束.cs
  36. 61 61
      WCS.WorkEngineering/WebApi/Controllers/WcsController.cs
  37. 529 524
      WCS.WorkEngineering/WorkStart.cs
  38. 1 1
      WcsFramework.sln

+ 10 - 10
WCS.Entity.Protocol/Protocol/DataStructure/SRMData.cs

@@ -10,17 +10,17 @@ namespace WCS.Entity.Protocol.Protocol.DataStructure
     [DataContract]
     public class SRMData : DeviceData
     {
-        /// <summary>
-        ///  DB520
-        /// </summary>
-        [DataMember(Order = 3)]
-        public WCS_SRM520 D520 { get; set; } = null!;
+        ///// <summary>
+        /////  DB520
+        ///// </summary>
+        //[DataMember(Order = 3)]
+        //public WCS_SRM520 D520 { get; set; } = null!;
 
-        /// <summary>
-        ///  DB521
-        /// </summary>
-        [DataMember(Order = 4)]
-        public WCS_SRM521 D521 { get; set; } = null!;
+        ///// <summary>
+        /////  DB521
+        ///// </summary>
+        //[DataMember(Order = 4)]
+        //public WCS_SRM521 D521 { get; set; } = null!;
 
         /// <summary>
         ///  DB523

+ 78 - 78
WCS.Entity.Protocol/Protocol/SRM/WCS_SRM520.cs

@@ -2,82 +2,82 @@
 
 namespace WCS.Entity.Protocol.Protocol.SRM
 {
-    /// <summary>
-    ///  SRM520
-    /// </summary>
-    [DataContract]
-    public class WCS_SRM520 : ISRM520
-    {
-        /// <inheritdoc/>
-        [DataMember(Order = 0)]
-        public short Res1 { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 1)]
-        public short Res2 { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 2)]
-        public short Res3 { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 3)]
-        public short GoodsType { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 4)]
-        public SrmRunSpeed RunSpeed { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 5)]
-        public short SLine { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 6)]
-        public short SCol { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 7)]
-        public short SLayer { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 8)]
-        public SrmForkPosition SDepth { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 9)]
-        public short ELine { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 10)]
-        public short ECol { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 11)]
-        public short ELayer { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 12)]
-        public SrmForkPosition EDepth { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 13)]
-        public int TaskNumber { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 14)]
-        public short VoucherNo { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 15)]
-        public short OkAck { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 16)]
-        public SrmTaskType TaskType { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 17)]
-        public short Cmd { get; set; }
-    }
+    ///// <summary>
+    /////  SRM520
+    ///// </summary>
+    //[DataContract]
+    //public class WCS_SRM520 : ISRM520
+    //{
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 0)]
+    //    public short Res1 { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 1)]
+    //    public short Res2 { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 2)]
+    //    public short Res3 { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 3)]
+    //    public short GoodsType { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 4)]
+    //    public SrmRunSpeed RunSpeed { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 5)]
+    //    public short SLine { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 6)]
+    //    public short SCol { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 7)]
+    //    public short SLayer { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 8)]
+    //    public SrmForkPosition SDepth { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 9)]
+    //    public short ELine { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 10)]
+    //    public short ECol { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 11)]
+    //    public short ELayer { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 12)]
+    //    public SrmForkPosition EDepth { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 13)]
+    //    public int TaskNumber { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 14)]
+    //    public short VoucherNo { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 15)]
+    //    public short OkAck { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 16)]
+    //    public SrmTaskType TaskType { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 17)]
+    //    public short Cmd { get; set; }
+    //}
 }

+ 119 - 119
WCS.Entity.Protocol/Protocol/SRM/WCS_SRM521.cs

@@ -2,126 +2,126 @@
 
 namespace WCS.Entity.Protocol.Protocol.SRM
 {
-    /// <summary>
-    ///  SRM521
-    /// </summary>
-    [DataContract]
-    public class WCS_SRM521 : ISRM521
-    {
-        /// <inheritdoc/>
-        [DataMember(Order = 0)]
-        public SrmStatus Status { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 1)]
-        public SrmAutoStatus AutoStatus { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 2)]
-        public SrmRunStatus RunStatus { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 3)]
-        public short SLine { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 4)]
-        public short SCol { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 5)]
-        public short SLayer { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 6)]
-        public SrmForkPosition SDepth { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 7)]
-        public short ELine { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 8)]
-        public short ECol { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 9)]
-        public short ELayer { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 10)]
-        public SrmForkPosition EDepth { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 11)]
-        public int TaskNumber { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 12)]
-        public short VoucherNo { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 13)]
-        public short Line { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 14)]
-        public short Col { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 15)]
-        public short Layer { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 16)]
-        public int TaskFinishiId { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 17)]
-        public int TravelPos { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 18)]
-        public int LiftPos { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 19)]
-        public int ForkPos { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 20)]
-        public SrmRunSpeed RunSpeed { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 21)]
-        public SrmTaskType TaskType { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 22)]
-        public float TotalKm { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 23)]
-        public short GoodsType { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 24)]
-        public float RunTime { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 25)]
-        public int Res3 { get; set; }
+    ///// <summary>
+    /////  SRM521
+    ///// </summary>
+    //[DataContract]
+    //public class WCS_SRM521 : ISRM521
+    //{
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 0)]
+    //    public SrmStatus Status { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 1)]
+    //    public SrmAutoStatus AutoStatus { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 2)]
+    //    public SrmRunStatus RunStatus { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 3)]
+    //    public short SLine { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 4)]
+    //    public short SCol { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 5)]
+    //    public short SLayer { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 6)]
+    //    public SrmForkPosition SDepth { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 7)]
+    //    public short ELine { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 8)]
+    //    public short ECol { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 9)]
+    //    public short ELayer { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 10)]
+    //    public SrmForkPosition EDepth { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 11)]
+    //    public int TaskNumber { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 12)]
+    //    public short VoucherNo { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 13)]
+    //    public short Line { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 14)]
+    //    public short Col { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 15)]
+    //    public short Layer { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 16)]
+    //    public int TaskFinishiId { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 17)]
+    //    public int TravelPos { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 18)]
+    //    public int LiftPos { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 19)]
+    //    public int ForkPos { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 20)]
+    //    public SrmRunSpeed RunSpeed { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 21)]
+    //    public SrmTaskType TaskType { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 22)]
+    //    public float TotalKm { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 23)]
+    //    public short GoodsType { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 24)]
+    //    public float RunTime { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 25)]
+    //    public int Res3 { get; set; }
 
-        /// <inheritdoc/>
-        [DataMember(Order = 26)]
-        public int Res4 { get; set; }
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 26)]
+    //    public int Res4 { get; set; }
 
-        /// <inheritdoc/>
-        [DataMember(Order = 27)]
-        public int Res5 { get; set; }
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 27)]
+    //    public int Res5 { get; set; }
 
-        /// <inheritdoc/>
-        [DataMember(Order = 28)]
-        public int Res6 { get; set; }
-    }
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 28)]
+    //    public int Res6 { get; set; }
+    //}
 }

+ 125 - 54
WCS.Entity.Protocol/SRM/SRM520.cs

@@ -1,4 +1,5 @@
 using System.ComponentModel;
+using WCS.Entity.Protocol.Protocol.SRM;
 
 namespace WCS.Entity.Protocol.SRM
 {
@@ -10,112 +11,182 @@ namespace WCS.Entity.Protocol.SRM
     /// <typeparam name="taskType">任务类型</typeparam>
     public interface SRM520<runSpeed, depth, taskType> : IProtocol
     {
+        #region 工位一
+
+        /// <summary>
+        /// 任务 ID
+        /// </summary>
+        int TaskID_1 { get; set; }
+
+        /// <summary>
+        /// 任务起始行
+        /// </summary>
+        short RowPos1_1 { get; set; }
+
+        /// <summary>
+        /// 任务行走起始列
+        /// </summary>
+        short TravelPos1_1 { get; set; }
+
+        /// <summary>
+        /// 任务提升起始层
+        /// </summary>
+        short LiftPos1_1 { get; set; }
+
+        /// <summary>
+        /// 任务起始伸叉深度
+        /// </summary>
+        SRMForkPos ForkStartPos1_1 { get; set; }
+
+        /// <summary>
+        /// 任务目标行
+        /// </summary>
+        short RowPos2_1 { get; set; }
+
+        /// <summary>
+        /// 任务行走目标列
+        /// </summary>
+        short TravelPos2_1 { get; set; }
+
+        /// <summary>
+        /// 任务提升目标层
+        /// </summary>
+        short LiftPos2_1 { get; set; }
+
+        /// <summary>
+        /// 任务目标伸叉深度
+        /// </summary>
+        SRMForkPos ForkDestPos2_1 { get; set; }
+
+        /// <summary>
+        /// 货物类型 根据实际情况决定具体值含义
+        /// </summary>
+        short GoodsType_1 { get; set; }
+
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        SRMTaskType TaskType_1 { get; set; }
+
+        /// <summary>
+        /// 任务完成确认清除信号
+        /// </summary>
+        short OK_ACK_1 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        int RES_1_1 { get; set; }
+
         /// <summary>
-        ///  单堆垛机是否可以跑全程 ,0正常 1单机全程
+        ///备用
         /// </summary>
-        [Description("单堆垛机是否可以跑全程")]
-        short Res1 { get; set; }
+        short RES_1_2 { get; set; }
 
         /// <summary>
-        ///  备用
+        /// 备用
         /// </summary>
-        [Description("备用")]
-        short Res2 { get; set; }
+        short RES_1_3 { get; set; }
 
         /// <summary>
-        ///  备用
+        /// 备用
         /// </summary>
-        [Description("备用")]
-        short Res3 { get; set; }
+        short RES_1_4 { get; set; }
 
         /// <summary>
-        ///  货物类型
+        /// 备用
         /// </summary>
-        [Description("货物类型")]
-        short GoodsType { get; set; }
+        SRMStatus RES_1_5 { get; set; }
+
+        #endregion 工位一
+
+        #region 二工位
 
         /// <summary>
-        ///  运行速度
+        /// 任务 ID
         /// </summary>
-        [Description("运行速度")]
-        runSpeed RunSpeed { get; set; }
+        int TaskID_2 { get; set; }
 
         /// <summary>
-        ///  任务起始行
+        /// 任务起始行
         /// </summary>
-        [Description("任务起始行")]
-        short SLine { get; set; }
+        short RowPos1_2 { get; set; }
 
         /// <summary>
-        ///  任务起始列
+        /// 任务行走起始列
         /// </summary>
-        [Description("任务起始列")]
-        short SCol { get; set; }
+        short Travelpos1_2 { get; set; }
 
         /// <summary>
-        ///  任务起始层
+        /// 任务提升起始层
         /// </summary>
-        [Description("任务起始层")]
-        short SLayer { get; set; }
+        short Liftpos1_2 { get; set; }
 
         /// <summary>
-        ///  任务起始深度
+        /// 任务起始伸叉深度
         /// </summary>
-        [Description("任务起始深度")]
-        depth SDepth { get; set; }
+        SRMForkPos ForkStartPos1_2 { get; set; }
 
         /// <summary>
-        ///  任务目标行
+        /// 任务目标行
         /// </summary>
-        [Description("任务目标行")]
-        short ELine { get; set; }
+        short RowPos2_2 { get; set; }
 
         /// <summary>
-        ///  任务目标列
+        /// 任务行走目标列
         /// </summary>
-        [Description("任务目标列")]
-        short ECol { get; set; }
+        short Travelpos2_2 { get; set; }
 
         /// <summary>
-        ///  任务目标层
+        /// 任务提升目标层
         /// </summary>
-        [Description("任务目标层")]
-        short ELayer { get; set; }
+        short Liftpos2_2 { get; set; }
 
         /// <summary>
-        ///  任务目标深度
+        /// 任务目标伸叉深度
         /// </summary>
-        [Description("任务目标深度")]
-        depth EDepth { get; set; }
+        SRMForkPos ForkStartPos2_2 { get; set; }
 
         /// <summary>
-        ///  任务号
+        /// 货物类型 根据实际情况决定具体值含义
         /// </summary>
-        [Description("任务号")]
-        int TaskNumber { get; set; }
+        short Goodstype_2 { get; set; }
 
         /// <summary>
-        ///  凭证号
+        /// 任务类型
         /// </summary>
-        [Description("凭证号")]
-        short VoucherNo { get; set; }
+        SRMTaskType TaskType_2 { get; set; }
 
         /// <summary>
-        ///  完成任务确认清除信号
+        /// 任务完成确认清除信号
         /// </summary>
-        [Description("完成任务确认清除信号")]
-        short OkAck { get; set; }
+        short OK_ACK_2 { get; set; }
 
         /// <summary>
-        ///  任务类型
+        /// 任务数量
         /// </summary>
-        [Description("任务类型")]
-        taskType TaskType { get; set; }
+        short TaskSum_2 { get; set; }
 
         /// <summary>
-        ///  指令类型
+        /// 凭证号
         /// </summary>
-        [Description("指令类型")]
-        short Cmd { get; set; }
+        int VoucherNo_2 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES_2_1 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES_2_2 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        SRMStatus RES_2_3 { get; set; }
+
+        #endregion 二工位
     }
 }

+ 533 - 88
WCS.Entity.Protocol/SRM/SRM521.cs

@@ -1,4 +1,6 @@
-using System.ComponentModel;
+using System;
+using System.ComponentModel;
+using WCS.Entity.Protocol.Protocol.SRM;
 
 namespace WCS.Entity.Protocol.SRM
 {
@@ -13,178 +15,621 @@ namespace WCS.Entity.Protocol.SRM
     /// <typeparam name="taskType">任务类型</typeparam>
     public interface SRM521<status, autoStatus, runStatus, runSpeed, depth, taskType> : IProtocol
     {
+        #region 一工位
+
+        /// <summary>
+        /// 任务 ID
+        /// </summary>
+        int TaskID_1 { get; set; }
+
+        /// <summary>
+        /// 任务起始行
+        /// </summary>
+        short RowPos1_1 { get; set; }
+
+        /// <summary>
+        /// 任务行走起始列
+        /// </summary>
+        short TravelPos1_1 { get; set; }
+
+        /// <summary>
+        /// 任务提升起始层
+        /// </summary>
+        short LiftPos1_1 { get; set; }
+
+        /// <summary>
+        /// 任务起始伸叉深度
+        /// </summary>
+        SRMForkPos ForkStartPos1_1 { get; set; }
+
+        /// <summary>
+        /// 任务目标行
+        /// </summary>
+        short RowPos2_1 { get; set; }
+
+        /// <summary>
+        /// 任务行走目标列
+        /// </summary>
+        short TravelPos2_1 { get; set; }
+
+        /// <summary>
+        /// 任务提升目标层
+        /// </summary>
+        short LiftPos2_1 { get; set; }
+
+        /// <summary>
+        /// 任务目标伸叉深度
+        /// </summary>
+        SRMForkPos ForkDestPos2_1 { get; set; }
+
+        /// <summary>
+        /// 完成任务ID
+        /// </summary>
+        int TaskFinishiID_1 { get; set; }
+
+        /// <summary>
+        /// 货叉模式
+        /// </summary>
+        SRMAutoStatus AutoStatus_1 { get; set; }
+
+        /// <summary>
+        /// 货叉运行状态
+        /// </summary>
+        SRMForkRunStatus RunStatus_1 { get; set; }
+
+        /// <summary>
+        /// 当前行
+        /// </summary>
+        short Srm_Row_1 { get; set; }
+
+        /// <summary>
+        /// 当前列
+        /// </summary>
+        short Srm_Column_1 { get; set; }
+
+        /// <summary>
+        /// 当前层
+        /// </summary>
+        short Srm_Layer_1 { get; set; }
+
+        /// <summary>
+        /// 行走当前位置 MM
+        /// </summary>
+        [IgnoreChanging]
+        int TravelPos_1 { get; set; }
+
+        /// <summary>
+        /// 提升当前位置 MM
+        /// </summary>
+        [IgnoreChanging]
+        int LiftPos_1 { get; set; }
+
+        /// <summary>
+        /// 货叉当前位置 MM 往左为负值,往右为正
+        /// </summary>
+        [IgnoreChanging]
+        int ForkPos_1 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        [IgnoreChanging]
+        float RES_1_1 { get; set; }
+
+        /// <summary>
+        /// 货物类型
+        /// </summary>
+        short Goodstype_1 { get; set; }
+
+        /// <summary>
+        /// 运行时间(Real)(单位:小时,带小数)
+        /// </summary>
+        [IgnoreChanging]
+        float Runtime_1 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        int RES_1_2 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES_1_3 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES_1_5 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES_1_6 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES_1_7 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES_1_8 { get; set; }
+
+        /// <summary>
+        /// 货叉状态
+        /// </summary>
+        SRMForkStatus RES_1_9 { get; set; }
+
+        #endregion 一工位
+
+        #region 二工位
+
+        /// <summary>
+        /// 任务 ID
+        /// </summary>
+        int TaskID_2 { get; set; }
+
+        /// <summary>
+        /// 任务起始行
+        /// </summary>
+        short RowPos1_2 { get; set; }
+
+        /// <summary>
+        /// 任务行走起始列
+        /// </summary>
+        short TravelPos1_2 { get; set; }
+
+        /// <summary>
+        /// 任务提升起始层
+        /// </summary>
+        short LiftPos1_2 { get; set; }
+
+        /// <summary>
+        /// 任务起始伸叉深度
+        /// </summary>
+        SRMForkPos ForkStartPos1_2 { get; set; }
+
+        /// <summary>
+        /// 任务目标行
+        /// </summary>
+        short RowPos2_2 { get; set; }
+
+        /// <summary>
+        /// 任务行走目标列
+        /// </summary>
+        short TravelPos2_2 { get; set; }
+
+        /// <summary>
+        /// 任务提升目标层
+        /// </summary>
+        short LiftPos2_2 { get; set; }
+
+        /// <summary>
+        /// 任务目标伸叉深度
+        /// </summary>
+        SRMForkPos ForkDestPos2_2 { get; set; }
+
         /// <summary>
-        ///  状态
+        /// 完成任务ID
         /// </summary>
-        [Description("状态")]
-        status Status { get; set; }
+        int TaskFinishiID_2 { get; set; }
 
         /// <summary>
-        ///  自动状态
+        /// 货叉模式
         /// </summary>
-        [Description("自动状态")]
-        autoStatus AutoStatus { get; set; }
+        SRMAutoStatus AutoStatus_2 { get; set; }
 
         /// <summary>
-        ///  运行状态
+        /// 货叉运行状态
         /// </summary>
-        [Description("运行状态")]
-        runStatus RunStatus { get; set; }
+        SRMForkRunStatus RunStatus_2 { get; set; }
 
         /// <summary>
-        ///  任务起始行
+        /// 当前
         /// </summary>
-        [Description("任务起始行")]
-        short SLine { get; set; }
+        short Srm_Row_2 { get; set; }
 
         /// <summary>
-        ///  任务起始列
+        /// 当前
         /// </summary>
-        [Description("任务起始列")]
-        short SCol { get; set; }
+        short Srm_Column_2 { get; set; }
 
         /// <summary>
-        ///  任务起始层
+        /// 当前
         /// </summary>
-        [Description("任务起始层")]
-        short SLayer { get; set; }
+        short Srm_Layer_2 { get; set; }
 
         /// <summary>
-        ///  任务起始深度
+        /// 行走当前位置 MM
         /// </summary>
-        [Description("任务起始深度")]
-        depth SDepth { get; set; }
+        [IgnoreChanging]
+        int TravelPos_2 { get; set; }
 
         /// <summary>
-        ///  任务目标行
+        /// 提升当前位置 MM
         /// </summary>
-        [Description("任务目标行")]
-        short ELine { get; set; }
+        [IgnoreChanging]
+        int LiftPos_2 { get; set; }
 
         /// <summary>
-        ///  任务目标列
+        /// 货叉当前位置 MM 往左为负值,往右为正
         /// </summary>
-        [Description("任务目标列")]
-        short ECol { get; set; }
+        [IgnoreChanging]
+        int ForkPos_2 { get; set; }
 
         /// <summary>
-        ///  任务目标层
+        /// 备用
         /// </summary>
-        [Description("任务目标层")]
-        short ELayer { get; set; }
+        [IgnoreChanging]
+        float RES_2_1 { get; set; }
 
         /// <summary>
-        ///  任务目标深度
+        /// 货物类型
         /// </summary>
-        [Description("任务目标深度")]
-        depth EDepth { get; set; }
+        short Goodstype_2 { get; set; }
 
         /// <summary>
-        ///  任务号
+        /// 运行时间(Real)(单位:小时,带小数)
         /// </summary>
-        [Description("任务号")]
-        int TaskNumber { get; set; }
+        [IgnoreChanging]
+        float Runtime_2 { get; set; }
 
         /// <summary>
-        ///  凭证号
+        /// 凭证号
         /// </summary>
-        [Description("凭证号")]
-        short VoucherNo { get; set; }
+        int VoucherNo_2 { get; set; }
 
         /// <summary>
-        ///  当前行
+        /// 备用
         /// </summary>
-        [Description("当前行")]
-        short Line { get; set; }
+        int RES_2_2 { get; set; }
 
         /// <summary>
-        ///  当前列
+        /// 备用
         /// </summary>
-        [Description("当前列")]
-        short Col { get; set; }
+        short RES_2_3 { get; set; }
 
         /// <summary>
-        ///  当前层
+        /// 备用
         /// </summary>
-        [Description("当前层")]
-        short Layer { get; set; }
+        short RES_2_4 { get; set; }
 
         /// <summary>
-        ///  完成任务号
+        /// 备用
         /// </summary>
-        [Description("完成任务号")]
-        int TaskFinishiId { get; set; }
+        short RES_2_5 { get; set; }
 
         /// <summary>
-        ///  行走当前位置 MM
+        /// 货叉状态
         /// </summary>
-        [Description("行走当前位置 MM")]
-        int TravelPos { get; set; }
+        SRMForkStatus RES_2_6 { get; set; }
+
+        #endregion 二工位
+
+        #region 公用
 
         /// <summary>
-        ///  提升当前位置 MM
+        /// 堆垛机模式
         /// </summary>
-        [Description("提升当前位置 MM")]
-        int LiftPos { get; set; }
+        SRMAutoStatus SRMStatus { get; set; }
 
         /// <summary>
-        ///  货叉当前位置 MM
+        /// 堆垛机状态
         /// </summary>
-        [Description("货叉当前位置 MM")]
-        int ForkPos { get; set; }
+        SRMFRunStatus SrmRunStatus { get; set; }
 
         /// <summary>
-        ///  运行速度
+        /// 堆垛机运行里程数(单位:千米)
         /// </summary>
-        [Description("运行速度")]
-        runSpeed RunSpeed { get; set; }
+        [IgnoreChanging]
+        float TotalKM { get; set; }
 
         /// <summary>
-        ///  任务类型
+        /// 运行时间(Real)(单位:小时,带小数)
         /// </summary>
-        [Description("任务类型")]
-        taskType TaskType { get; set; }
+        [IgnoreChanging]
+        float Runtime { get; set; }
 
         /// <summary>
-        ///  运行总里程
+        /// 堆垛机是否异常 1:异常 0:正常
         /// </summary>
-        [Description("运行总里程")]
-        float TotalKm { get; set; }
+        short Alarm { get; set; }
 
         /// <summary>
-        ///  货物类型
+        /// 备用
         /// </summary>
-        [Description("货物类型")]
-        short GoodsType { get; set; }
+        int RES1 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES2 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES3 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        int RES4 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES5 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES6 { get; set; }
+
+        #endregion 公用
+    }
+
+    /// <summary>
+    /// 货叉深度
+    /// </summary>
+    public enum SRMForkPos : short
+    {
+        中位 = 0,
+        深度1 = 1,
+        深度2 = 2
+    }
+
+    /// <summary>
+    /// 任务类型
+    /// </summary>
+    public enum SRMTaskType : short
+    {
+        完成任务 = 1,
+        删除任务 = 2,
+        移动任务 = 3,
+        取放货任务 = 4
+    }
+
+    /// <summary>
+    /// SRM状态
+    /// </summary>
+    [Flags]
+    public enum SRMStatus : ushort
+    {
+        RES_1_5 = 1 << 0,
+        RES_1_6 = 1 << 1,
+        RES_1_7 = 1 << 2,
+        RES_1_8 = 1 << 3,
+        RES_1_9 = 1 << 4,
+        RES_1_10 = 1 << 5,
+        RES_1_11 = 1 << 6,
+        RES_1_12 = 1 << 7,
+        RES_1_13 = 1 << 8,
+        RES_1_14 = 1 << 9,
+        RES_1_15 = 1 << 10,
+        RES_1_16 = 1 << 11,
+        RES_1_17 = 1 << 12,
+        RES_1_18 = 1 << 13,
+        RES_1_19 = 1 << 14,
+        RES_1_20 = 1 << 15,
+    }
 
+    /// <summary>
+    /// 速度模式
+    /// </summary>
+    public enum SCSpeedMode : short
+    {
+        正常 = 0,
+        低速 = 1
+    }
+
+    /// <summary>
+    /// 货叉运行状态
+    /// </summary>
+    public enum SRMForkRunStatus : short
+    {
+        空闲 = 1,
+        取货伸叉 = 2,
+        取货抬叉 = 3,
+        取货收叉 = 4,
+        放货伸叉 = 5,
+        取货降叉 = 6,
+        放货收叉 = 7,
+        维护 = 99
+    }
+
+    /// <summary>
+    /// 堆垛机运行状态
+    /// </summary>
+    public enum SRMFRunStatus : short
+    {
         /// <summary>
-        ///  运行总时长
+        ///
         /// </summary>
-        [Description("运行总时长")]
-        float RunTime { get; set; }
+        空闲 = 1,
 
         /// <summary>
-        ///  备用
+        ///
         /// </summary>
-        [Description("备用")]
-        int Res3 { get; set; }
+        取货行走 = 2,
 
         /// <summary>
-        ///  备用
+        ///
         /// </summary>
-        [Description("备用")]
-        int Res4 { get; set; }
+        取货伸叉 = 3,
 
         /// <summary>
-        ///  备用
+        ///
         /// </summary>
-        [Description("备用")]
-        int Res5 { get; set; }
+        取货抬叉 = 4,
 
         /// <summary>
-        ///  备用
+        ///
         /// </summary>
-        [Description("备用")]
-        int Res6 { get; set; }
+        取货收叉 = 5,
+
+        /// <summary>
+        ///
+        /// </summary>
+        放货行走 = 6,
+
+        /// <summary>
+        ///
+        /// </summary>
+        放货伸叉 = 7,
+
+        /// <summary>
+        ///
+        /// </summary>
+        取货降叉 = 8,
+
+        /// <summary>
+        ///
+        /// </summary>
+        放货收叉 = 9,
+
+        /// <summary>
+        ///
+        /// </summary>
+        维护 = 99
+    }
+
+    /// <summary>
+    /// 运行模式
+    /// </summary>
+    public enum SRMAutoStatus : short
+    {
+        远程 = 1,
+        半自动 = 2,
+        手动 = 3,
+        维修 = 4
+    }
+
+    /// <summary>
+    /// 货叉状态
+    /// </summary>
+    [Flags]
+    public enum SRMForkStatus : ushort
+    {
+        /// <summary>
+        /// 完成取货信号
+        /// </summary>
+        Get_Finishi = 1 << 0,
+
+        /// <summary>
+        /// 完成放货信号
+        /// </summary>
+        Put_Finishi = 1 << 1,
+
+        /// <summary>
+        /// 设备故障状态
+        /// </summary>
+        Alarm = 1 << 2,
+
+        /// <summary>
+        /// 当前任务完成
+        /// </summary>
+        Task_Finishi = 1 << 3,
+
+        /// <summary>
+        /// 设备上有货
+        /// </summary>
+        Loaded = 1 << 4,
+
+        /// <summary>
+        /// 货叉在原位
+        /// </summary>
+        Fork_Center = 1 << 5,
+
+        /// <summary>
+        /// 反馈WCS能否发任务
+        /// </summary>
+        IssueTask = 1 << 6,
+
+        RES_1_9 = 1 << 7,
+        RES_1_10 = 1 << 8,
+        RES_1_11 = 1 << 9,
+        RES_1_12 = 1 << 10,
+        RES_1_13 = 1 << 11,
+        RES_1_14 = 1 << 12,
+        RES_1_15 = 1 << 13,
+        RES_1_16 = 1 << 14,
+        RES_1_17 = 1 << 15,
+    }
+
+    /// <summary>
+    /// 堆垛机报警
+    /// </summary>
+    [Flags]
+    public enum SCAlarm : ulong
+    {
+        无 = 0,
+        主柜急停 = 1L << 0,
+        分柜急停 = 1L << 1,
+        取货点异常 = 1L << 2,
+        放货点有货 = 1L << 3,
+        货叉取货完成后无货 = 1L << 4,
+        货叉无任务有货异常 = 1L << 5,
+        货叉运行超时 = 1L << 6,
+        货叉左侧超行程 = 1L << 7,
+        货物左前坍塌 = 1L << 8,
+        货物右前坍塌 = 1L << 9,
+        前限位触发 = 1L << 10,
+        后限位触发 = 1L << 11,
+        上限位触发 = 1L << 12,
+        下限位触发 = 1L << 13,
+        超载限位触发 = 1L << 14,
+        松绳限位触发1 = 1L << 15,
+        行走运动超行程 = 1L << 16,
+        起升运动超行程 = 1L << 17,
+        行走变频器报警 = 1L << 18,
+        提升变频器报警 = 1L << 19,
+        货叉变频器报警 = 1L << 20,
+        提升超速报警 = 1L << 21,
+        风扇, 灯, 插座空开 = 1L << 22,
+        触摸屏, 光通讯, 激光测距空开 = 1L << 23,
+        行走马达保护器 = 1L << 24,
+        行走抱闸空开 = 1L << 25,
+        起升马达保护器 = 1L << 26,
+        起升抱闸空开 = 1L << 27,
+        货叉马达保护器 = 1L << 28,
+        货叉抱闸空开 = 1L << 29,
+        安全门打开 = 1L << 30,
+        安全继电器报警 = 1L << 31,
+        当前货位已禁用 = 1L << 32,
+        组态中断报警 = 1L << 33,
+        货物左前超出 = 1L << 34,
+        货物左后超出 = 1L << 35,
+        货物右前超出 = 1L << 36,
+        货物右后超出 = 1L << 37,
+        相序保护 = 1L << 38,
+        货物右超高1M5 = 1L << 39,
+        安全门1报警 = 1L << 40,
+        安全门2报警 = 1L << 41,
+        行走测距信号丢失报警 = 1L << 42,
+        提升测距信号丢失报警 = 1L << 43,
+        行走定位失败 = 1L << 44,
+        提升定位失败 = 1L << 45,
+        回中定位失败 = 1L << 46,
+
+        //根据堆垛机通讯协议定义 下述报警暂时不存在
+        堆垛机巷道有人进入, 光通讯中断 = 1L << 47,
+
+        货叉位置错误 = 1L << 48,
+        货叉编码器报警 = 1L << 49,
+        货叉编码器报警中间位 = 1L << 50,
+        货叉中位光电异常 = 1L << 51,
+        载货台电源空开 = 1L << 52,
+        按钮, 安全回路空开 = 1L << 53,
+        货物左后坍塌 = 1L << 54,
+        货物右后坍塌 = 1L << 55,
+        登梯口急停 = 1L << 56,
+        货物左超高1M9 = 1L << 57,
+        货物右超高1M9 = 1L << 58,
+        松绳限位触发2 = 1L << 59,
+        货叉右侧超行程 = 1L << 60,
+        取放货托盘总数超限 = 1L << 61,
+        安全门急停 = 1L << 62,
     }
 }

+ 1 - 1
WCS.Service/Program.cs

@@ -19,7 +19,7 @@ namespace WCS.Service
             //互斥锁检测
             var mutexName = RedisHub.Default.Check("Mutex") ?? throw new Exception("请在Redis中配置互斥量值");
 
-            using var mt = new Mutex(true, mutexName);
+            using var mt = new Mutex(true, "5555");
             if (mt.WaitOne())
             {
                 CreateHostBuilder(args).Build().Run(); mt.ReleaseMutex();

+ 1 - 1
WCS.Service/appsettings.json

@@ -7,6 +7,6 @@
     }
   },
   "ConnectionStrings": {
-    "Redis": "10.30.37.1,database=0,prefix=Sorting:"
+    "Redis": "127.0.0.1,database=0,prefix=Sorting:"
   }
 }

+ 18 - 18
WCS.WorkEngineering/Extensions/SRMExtension.cs

@@ -37,24 +37,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))
+            //        {
+            //        }
+            //    }
+            //}
         }
     }
 }

+ 10 - 10
WCS.WorkEngineering/Protocol/DataStructure/SRMData.cs

@@ -10,17 +10,17 @@ namespace WCS.WorkEngineering.Protocol.DataStructure
     [DataContract]
     public class SRMData : DeviceData
     {
-        /// <summary>
-        ///  DB520
-        /// </summary>
-        [DataMember(Order = 3)]
-        public WCS_SRM520 D520 { get; set; } = null!;
+        ///// <summary>
+        /////  DB520
+        ///// </summary>
+        //[DataMember(Order = 3)]
+        //public WCS_SRM520 D520 { get; set; } = null!;
 
-        /// <summary>
-        ///  DB521
-        /// </summary>
-        [DataMember(Order = 4)]
-        public WCS_SRM521 D521 { get; set; } = null!;
+        ///// <summary>
+        /////  DB521
+        ///// </summary>
+        //[DataMember(Order = 4)]
+        //public WCS_SRM521 D521 { get; set; } = null!;
 
         /// <summary>
         ///  DB523

+ 78 - 78
WCS.WorkEngineering/Protocol/SRM/WCS_SRM520.cs

@@ -2,82 +2,82 @@
 
 namespace WCS.WorkEngineering.Protocol.SRM
 {
-    /// <summary>
-    ///  SRM520
-    /// </summary>
-    [DataContract]
-    public class WCS_SRM520 : ISRM520
-    {
-        /// <inheritdoc/>
-        [DataMember(Order = 0)]
-        public short Res1 { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 1)]
-        public short Res2 { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 2)]
-        public short Res3 { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 3)]
-        public short GoodsType { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 4)]
-        public SrmRunSpeed RunSpeed { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 5)]
-        public short SLine { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 6)]
-        public short SCol { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 7)]
-        public short SLayer { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 8)]
-        public SrmForkPosition SDepth { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 9)]
-        public short ELine { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 10)]
-        public short ECol { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 11)]
-        public short ELayer { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 12)]
-        public SrmForkPosition EDepth { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 13)]
-        public int TaskNumber { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 14)]
-        public short VoucherNo { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 15)]
-        public short OkAck { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 16)]
-        public SrmTaskType TaskType { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 17)]
-        public short Cmd { get; set; }
-    }
+    ///// <summary>
+    /////  SRM520
+    ///// </summary>
+    //[DataContract]
+    //public class WCS_SRM520 : ISRM520
+    //{
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 0)]
+    //    public short Res1 { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 1)]
+    //    public short Res2 { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 2)]
+    //    public short Res3 { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 3)]
+    //    public short GoodsType { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 4)]
+    //    public SrmRunSpeed RunSpeed { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 5)]
+    //    public short SLine { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 6)]
+    //    public short SCol { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 7)]
+    //    public short SLayer { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 8)]
+    //    public SrmForkPosition SDepth { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 9)]
+    //    public short ELine { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 10)]
+    //    public short ECol { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 11)]
+    //    public short ELayer { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 12)]
+    //    public SrmForkPosition EDepth { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 13)]
+    //    public int TaskNumber { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 14)]
+    //    public short VoucherNo { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 15)]
+    //    public short OkAck { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 16)]
+    //    public SrmTaskType TaskType { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 17)]
+    //    public short Cmd { get; set; }
+    //}
 }

+ 119 - 119
WCS.WorkEngineering/Protocol/SRM/WCS_SRM521.cs

@@ -3,126 +3,126 @@ using WCS.WorkEngineering.Protocol.SRM;
 
 namespace WCS.Entity.Protocol.SRM
 {
-    /// <summary>
-    ///  SRM521
-    /// </summary>
-    [DataContract]
-    public class WCS_SRM521 : ISRM521
-    {
-        /// <inheritdoc/>
-        [DataMember(Order = 0)]
-        public SrmStatus Status { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 1)]
-        public SrmAutoStatus AutoStatus { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 2)]
-        public SrmRunStatus RunStatus { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 3)]
-        public short SLine { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 4)]
-        public short SCol { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 5)]
-        public short SLayer { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 6)]
-        public SrmForkPosition SDepth { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 7)]
-        public short ELine { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 8)]
-        public short ECol { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 9)]
-        public short ELayer { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 10)]
-        public SrmForkPosition EDepth { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 11)]
-        public int TaskNumber { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 12)]
-        public short VoucherNo { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 13)]
-        public short Line { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 14)]
-        public short Col { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 15)]
-        public short Layer { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 16)]
-        public int TaskFinishiId { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 17)]
-        public int TravelPos { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 18)]
-        public int LiftPos { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 19)]
-        public int ForkPos { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 20)]
-        public SrmRunSpeed RunSpeed { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 21)]
-        public SrmTaskType TaskType { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 22)]
-        public float TotalKm { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 23)]
-        public short GoodsType { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 24)]
-        public float RunTime { get; set; }
-
-        /// <inheritdoc/>
-        [DataMember(Order = 25)]
-        public int Res3 { get; set; }
+    ///// <summary>
+    /////  SRM521
+    ///// </summary>
+    //[DataContract]
+    //public class WCS_SRM521 : ISRM521
+    //{
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 0)]
+    //    public SrmStatus Status { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 1)]
+    //    public SrmAutoStatus AutoStatus { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 2)]
+    //    public SrmRunStatus RunStatus { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 3)]
+    //    public short SLine { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 4)]
+    //    public short SCol { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 5)]
+    //    public short SLayer { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 6)]
+    //    public SrmForkPosition SDepth { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 7)]
+    //    public short ELine { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 8)]
+    //    public short ECol { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 9)]
+    //    public short ELayer { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 10)]
+    //    public SrmForkPosition EDepth { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 11)]
+    //    public int TaskNumber { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 12)]
+    //    public short VoucherNo { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 13)]
+    //    public short Line { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 14)]
+    //    public short Col { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 15)]
+    //    public short Layer { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 16)]
+    //    public int TaskFinishiId { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 17)]
+    //    public int TravelPos { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 18)]
+    //    public int LiftPos { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 19)]
+    //    public int ForkPos { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 20)]
+    //    public SrmRunSpeed RunSpeed { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 21)]
+    //    public SrmTaskType TaskType { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 22)]
+    //    public float TotalKm { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 23)]
+    //    public short GoodsType { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 24)]
+    //    public float RunTime { get; set; }
+
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 25)]
+    //    public int Res3 { get; set; }
 
-        /// <inheritdoc/>
-        [DataMember(Order = 26)]
-        public int Res4 { get; set; }
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 26)]
+    //    public int Res4 { get; set; }
 
-        /// <inheritdoc/>
-        [DataMember(Order = 27)]
-        public int Res5 { get; set; }
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 27)]
+    //    public int Res5 { get; set; }
 
-        /// <inheritdoc/>
-        [DataMember(Order = 28)]
-        public int Res6 { get; set; }
-    }
+    //    /// <inheritdoc/>
+    //    [DataMember(Order = 28)]
+    //    public int Res6 { get; set; }
+    //}
 }

+ 0 - 286
WCS.WorkEngineering/Systems/AgvSystems.cs

@@ -1,286 +0,0 @@
-using PlcSiemens.Core.Extension;
-using ServiceCenter.Logs;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.SRM;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.WebApi.Controllers;
-using WCS.WorkEngineering.Worlds;
-using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  Agv交互系统
-    /// </summary>
-    [BelongTo(typeof(MainWorld))]
-    [Description("Agv交互系统")]
-    public class AgvSystems : DeviceSystem<Device<IStation520>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        private List<Station> devs = new List<Station>();
-        private List<SRM> srms = new List<SRM>();
-
-        public AgvSystems()
-        {
-            devs = Device.All.Where(v => v.HasFlag(DeviceFlags.入库, 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> obj)
-        {
-            if (obj.Entity.Code == "出库AGV")
-            {
-                var agvTaskInfos = new List<WCS_AgvTaskInfo>();
-                //获取所有未结束的叫料及背负式补空AGV任务
-                SqlSugarHelper.Do(db =>
-                {
-                    agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.TaskType == AGVTaskType.CallMaterial)
-                                                                         .Where(v => v.Status < AGVTaskStatus.MissionCompleted)
-                                                                         .SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.AddTime).ToList();
-                });
-                //有需要处理的AGV任务
-                if (agvTaskInfos.Any())
-                {
-                    this.ExRecord(obj.Entity.Code, "可用出库AGV任务列表", agvTaskInfos.Select(v => v.ID).ToList());
-                    var taskInfos = new List<WCS_TaskInfo>();
-
-                    foreach (var agv in agvTaskInfos)
-                    {
-                        try
-                        {
-                            SqlSugarHelper.Do(db =>
-                            {
-                                switch (agv.AgvStatus)
-                                {
-                                    //取货点安全交互
-                                    case AGVTaskStatus.RequestOrPermission2 when agv.Status != AGVTaskStatus.RequestOrPermission2:
-                                        {
-                                            var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == agv.TaskId);
-                                            agv.Status = AGVTaskStatus.RequestOrPermission2;
-                                            db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                            taskInfo.AddWCS_TASK_DTL(db.Default, "agv", $"允许AGV任务{agv.ID}在站台{agv.Station}取货");
-                                            AgvApi.ContinueTask(agv.AgvID, agv.Station);
-                                            break;
-                                        }
-                                    case AGVTaskStatus.PutRequestOrPermission when agv.Status != AGVTaskStatus.PutRequestOrPermission:
-                                        {
-                                            agv.Status = AGVTaskStatus.PutRequestOrPermission;
-                                            db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                            AgvApi.ContinueTask(agv.AgvID, agv.Station);
-                                            break;
-                                        }
-                                    //完成任务
-                                    case AGVTaskStatus.MissionCompleted when agv.Status != AGVTaskStatus.MissionCompleted:
-                                        {
-                                            if (agv.TaskType is AGVTaskType.CallForMaterial or AGVTaskType.ForkliftFilling or AGVTaskType.CallMaterial)
-                                            {
-                                                var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.AgvTaskID == agv.ID);
-                                                if (taskInfo == null) throw new Exception($"未找到AGV任务{agv.ID}对应WCS任务");
-                                                //更新AGV任务状态
-                                                agv.Status = AGVTaskStatus.MissionCompleted;
-                                                db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                                //更新WCS任务状态
-                                                taskInfo.Status = Entity.TaskStatus.Finish;
-                                                taskInfo.EedTime = DateTime.Now;
-                                                db.Default.Updateable(taskInfo).ExecuteCommand();
-                                                taskInfo.AddWCS_TASK_DTL(db.Default, "agv", "任务完成");
-                                                taskInfos.Add(taskInfo);
-                                            }
-                                            else
-                                            {
-                                                agv.Status = AGVTaskStatus.MissionCompleted;
-                                                db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                            }
-
-                                            break;
-                                        }
-                                }
-                            });
-                        }
-                        catch (Exception ex)
-                        {
-                            World.Log(ex.Message, LogLevelEnum.Mid);
-                            this.ExRecord(obj.Entity.Code, ex.Message);
-                        }
-                    }
-
-                    foreach (var taskInfo in taskInfos.Where(taskInfo => taskInfo.Status == TaskStatus.Finish))
-                    {
-                        WmsApi.CompleteTask(taskInfo.ID);
-                    }
-                }
-            }
-            else if (obj.Entity.Code == "入库AGV")
-            {
-                List<WCS_AgvTaskInfo> agvTaskInfos = new List<WCS_AgvTaskInfo>();
-                //获取所有未结束的入库AGV任务
-                SqlSugarHelper.Do(db =>
-                {
-                    agvTaskInfos = db.Default.Queryable<WCS_AgvTaskInfo>()
-                                             .Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.TaskType == AGVTaskType.EnterDepot)
-                                             .SplitTable(tabs => tabs.Take(2)).OrderBy(v => v.EditTime).ToList();
-                });
-
-                if (agvTaskInfos.Any())
-                {
-                    this.ExRecord(obj.Entity.Code, "可用入库AGV任务列表", agvTaskInfos.Select(v => v.ID).ToList());
-                    foreach (var agv in agvTaskInfos)
-                    {
-                        try
-                        {
-                            SqlSugarHelper.Do(db =>
-                            {
-                                #region 开始跟据AGV状态做出处理
-
-                                switch (agv.AgvStatus)
-                                {
-                                    case AGVTaskStatus.NewBuild when agv.Status == AGVTaskStatus.NewBuild:
-                                        AgvApi.托盘回库("1NC318", agv.ID.ToString());
-                                        agv.AgvID = agv.ID.ToString();
-                                        agv.Status = AGVTaskStatus.Confirm;
-                                        agv.AgvStatus = AGVTaskStatus.Confirm;
-                                        db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                        break;
-                                    //巷道分配
-                                    case AGVTaskStatus.RequestOrPermission1 when agv.Status != AGVTaskStatus.Complete1:
-                                        {
-                                            //if (agv.TaskType == AGVTaskType.EnterDepot)
-                                            //{
-                                            //    //找到对应WCS任务
-                                            //    var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == agv.TaskId);
-                                            //    if (task == null) throw new Exception($"AGV任务{agv.ID}未找到对应WCS任务");
-                                            //    //向WMS获取巷道优先级
-                                            //    var res = WmsApi.GetTunnelPriorityList(task.ID);
-                                            //    var tunnelNo = res.ResData.Split(",").Select(v => "SRM" + v).ToList();
-
-                                            //    //开始获取堆垛机与可用站台信息
-                                            //    SRM srm = null;
-                                            //    var stations = new List<Station>();
-
-                                            //    //一楼三个入库口
-                                            //    stations = devs.Where(v => v.Entity.Code is "1021" or "1023" or "1025").ToList();
-                                            //    //筛选出可用站台
-                                            //    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(); // 筛选出可用站台
-                                            //    //可用堆垛机
-                                            //    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))) //筛选出堆垛机
-                                            //        .Select(v => new SRM(v, this.World)) //转换为SRM
-                                            //        .Where(v => !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($"agv任务{agv.ID}无可用堆垛机");
-
-                                            //    //筛选出堆垛机的放货站台
-                                            //    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));
-
-                                            //    var flag = false;
-                                            //    if ((task.BusType is "二楼湿拉线退料回立库" or "二楼湿拉线余料回立库" && task.Floor == 2))
-                                            //    {
-                                            //        flag = true;
-                                            //        nextPos.Entity.Code = "1025";
-                                            //    }
-                                            //    var agvs = db.Default.Queryable<WCS_AgvTaskInfo>().Where(v => v.Status < AGVTaskStatus.MissionCompleted && v.Position == nextPos.Entity.Code).SplitTable(v => v.Take(2)).ToList();
-                                            //    if (agvs.Any())
-                                            //    {
-                                            //        var msg = agvs.Aggregate("已无可用放货站台,任务正在执行中:", (current, ag) => current + $"[任务号:{ag.ID},目标地址:{ag.Position}]");
-                                            //        throw new Exception(msg);
-                                            //    }
-
-                                            //    //更新AGV任务状态
-                                            //    agv.Status = AGVTaskStatus.Complete1;
-                                            //    agv.Position = flag == true ? "1025" : nextPos.Entity.Code;
-                                            //    db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                            //    //更新WCS任务状态
-                                            //    if (flag)
-                                            //    {
-                                            //        srm.Entity.Code = "SRM3";
-                                            //        task.Device = srm.Entity.Code;
-                                            //        task.Tunnel = "3";
-                                            //        task.AddrNext = "1025";
-                                            //    }
-                                            //    else
-                                            //    {
-                                            //        task.Device = srm.Entity.Code;
-                                            //        task.Tunnel = task.Device.GetLastDigit().ToString();
-                                            //        task.AddrNext = agv.Position;
-                                            //    }
-                                            //    db.Default.Updateable(task).ExecuteCommand();
-                                            //    task.AddWCS_TASK_DTL(db.Default, "AGV巷道分配点", nextPos.Entity.Code, $"任务分配至堆垛机:{srm.Entity.Code}");
-                                            //    this.ExRecord(obj.Entity.Code, $"AGV任务{agv.ID}分配至堆垛机:{srm.Entity.Code}");
-                                            //    //调继续执行任务接口
-                                            //    AgvApi.ContinueTask(agv.AgvID, nextPos.Entity.Code);
-                                            //}
-                                            //else if (agv.TaskType == AGVTaskType.Transport)
-                                            //{
-                                            //更新AGV任务状态
-                                            agv.Status = AGVTaskStatus.Complete1;
-                                            agv.Position = "2501";
-                                            db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-
-                                            //task.Status = TaskStatus.Finish;
-                                            //db.Default.Updateable(task).ExecuteCommand();
-                                            //task.AddWCS_TASK_DTL(db.Default, "AGV搬运任务分配放货点", agv.Position, $"任务分配至:{agv.Position}");
-                                            //调继续执行任务接口
-                                            AgvApi.ContinueTask(agv.AgvID, agv.Position);
-                                            //}
-                                            break;
-                                        }
-                                    //放货站点安全交互
-                                    case AGVTaskStatus.RequestOrPermission2 when agv.Status != AGVTaskStatus.RequestOrPermission2:
-                                        {
-                                            if (agv.Position.IsNullOrEmpty()) throw new Exception($"无有效放货地址");
-                                            var dev = Device.All.First(x => x.Code == agv.Position);
-
-                                            //if (dev.Data.VoucherNo != dev.Data2.VoucherNo) throw new Exception($"AGV请求放货,但{dev.Entity.Code}凭证号不一致");
-                                            //if (!dev.Data3.Status.HasFlag(StationStatus.Auto)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}不在自动状态");
-                                            //if (dev.Data3.Status.HasFlag(StationStatus.PH_Status)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}光电有货");
-                                            //if (dev.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}任务有货");
-                                            //if (dev.Data3.Status.HasFlag(StationStatus.Run)) throw new Exception($"AGV请求放货,但{dev.Entity.Code}在运行状态");
-                                            //agv.Status = AGVTaskStatus.RequestOrPermission2;
-                                            //db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-
-                                            //调继续执行任务接口
-                                            AgvApi.ContinueTask(agv.AgvID, dev.Code);
-                                            break;
-                                        }
-                                    //完成任务
-                                    case AGVTaskStatus.MissionCompleted when agv.Status != AGVTaskStatus.MissionCompleted:
-                                        if (agv.TaskType == AGVTaskType.EnterDepot)
-                                        {
-                                            agv.Status = AGVTaskStatus.MissionCompleted;
-                                            db.Default.Updateable(agv).SplitTable().ExecuteCommand();
-                                        }
-                                        break;
-                                }
-
-                                #endregion 开始跟据AGV状态做出处理
-                            });
-                        }
-                        catch (Exception ex)
-                        {
-                            World.Log(ex.Message, LogLevelEnum.Mid);
-                            this.ExRecord(obj.Entity.Code, ex.Message);
-                        }
-                    }
-                }
-            }
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.Code is "出库AGV" or "入库AGV";
-        }
-    }
-}

+ 0 - 154
WCS.WorkEngineering/Systems/DataCollectionSysyem.cs

@@ -1,154 +0,0 @@
-using Newtonsoft.Json;
-using ServiceCenter.Extensions;
-using ServiceCenter.Redis;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity.Protocol.SRM;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.BCR;
-using WCS.WorkEngineering.Protocol.DataStructure;
-using WCS.WorkEngineering.Protocol.SRM;
-using WCS.WorkEngineering.Protocol.Station;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  数据采集系统
-    /// </summary>
-    //[BelongTo(typeof(DataCollectionWorld))]
-    [Description("数据采集系统")]
-    public class DataCollectionSysyem : DeviceSystem<SRM>
-    {
-        public List<Station> ConvList;
-        public List<Device<IStation91>> Conv91List;
-        public List<Device<IBCR81>> Bcrs;
-        public List<SRM> Srms;
-
-        public DataCollectionSysyem()
-        {
-            ConvList = Device.All.Where(v => v.HasProtocol(typeof(IStation523))).Select(v => new Station(v, this.World)).ToList();
-            Conv91List = Device.All.Where(v => v.HasProtocol(typeof(IStation91))).Select(v => new Device<IStation91>(v, this.World)).ToList();
-            Bcrs = Device.All.Where(v => v.HasProtocol(typeof(IBCR81))).Select(v => new Device<IBCR81>(v, this.World)).ToList();
-            Srms = Device.All.Where(v => v.HasProtocol(typeof(ISRM520))).Select(v => new SRM(v, this.World)).ToList();
-        }
-
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override bool Select(Device dev)
-        {
-            return dev.Code == "SRM1";
-        }
-
-        public override void Do(SRM obj)
-        {
-            try
-            {
-                DeviceDataPack pack = new DeviceDataPack();
-
-                //处理输送线
-                List<StationData> DevList = new List<StationData>();
-                foreach (var item in ConvList)
-                {
-                    var dev = new StationData()
-                    {
-                        Code = item.Entity.Code,
-                        Frame = DateTime.Now,
-                        D520 = TypeExtension.Mapper<WCS_Station520, IStation520>(item.Data),
-                        D521 = TypeExtension.Mapper<WCS_Station521, IStation521>(item.Data2),
-                        D523 = TypeExtension.Mapper<WCS_Station523, IStation523>(item.Data3),
-                        D90 = new WCS_Station90(),
-                        D91 = new WCS_Station91(),
-                        D80 = new WCS_BCR80(),
-                        D81 = new WCS_BCR81()
-                    };
-                    if (Conv91List.Any(v => v.Entity.Code == item.Entity.Code))
-                    {
-                        var d91 = Conv91List.First(v => v.Entity.Code == item.Entity.Code);
-                        dev.D91 = TypeExtension.Mapper<WCS_Station91, IStation91>(d91.Data);
-                    }
-                    if (Bcrs.Any(v => v.Entity.Code == item.Entity.Code))
-                    {
-                        var d81 = Bcrs.First(v => v.Entity.Code == item.Entity.Code);
-                        dev.D81 = TypeExtension.Mapper<WCS_BCR81, IBCR81>(d81.Data);
-                    }
-                    //保存报警
-                    RedisHub.WMS.Set($"{nameof(EquipmentAlarm)}:{item.Entity.Code}", JsonConvert.SerializeObject(new EquipmentAlarm()
-                    {
-                        Code = item.Entity.Code,
-                        Msg = item.Data3.Alarm.ToString(),
-                        Time = DateTime.Now
-                    }));
-
-                    DevList.Add(dev);
-                }
-                //保存模式
-                var status = ConvList.Select(v => new Tuple<string, string>(v.Entity.Code, v.Data2.Mode.ToString()));
-                RedisHub.WMS.Set($"ConvStatus", JsonConvert.SerializeObject(status));
-                pack.StationDatas = new DeviceDataCollection<StationData>(DateTime.Now, DevList.ToArray());
-
-                //处理堆垛机
-                List<SRMData> srmList = new List<SRMData>();
-                foreach (var item in Srms)
-                {
-                    var dev = new SRMData()
-                    {
-                        Code = item.Entity.Code,
-                        Frame = DateTime.Now,
-                        D520 = TypeExtension.Mapper<WCS_SRM520, ISRM520>(item.Data),
-                        D521 = TypeExtension.Mapper<WCS_SRM521, ISRM521>(item.Data2),
-                        D537 = TypeExtension.Mapper<WCS_SRM537, ISRM537>(item.Data3),
-                    };
-
-                    //保存报警
-                    RedisHub.WMS.Set($"{nameof(EquipmentAlarm)}:{item.Entity.Code}", JsonConvert.SerializeObject(new EquipmentAlarm()
-                    {
-                        Code = item.Entity.Code,
-                        Msg = item.Data3.Alarm.ToString(),
-                        Time = DateTime.Now
-                    }));
-                    srmList.Add(dev);
-                }
-                //保存模式
-                var status1 = Srms.Select(v => new Tuple<string, string>(v.Entity.Code, v.Data2.AutoStatus.ToString()));
-                RedisHub.WMS.Set($"SrmStatus", JsonConvert.SerializeObject(status1));
-                pack.SRMDatas = new DeviceDataCollection<SRMData>(DateTime.Now, srmList.ToArray());
-                pack.Frame = DateTime.Now;
-
-                //保存到Redis
-                RedisHub.Monitor.RPush("Packs", pack);
-                RedisHub.Monitor.Set(nameof(DeviceDataPack), pack);
-                if (RedisHub.Monitor.LLen("Packs") > 500000)
-                {
-                    RedisHub.Monitor.LTrim("Packs", 5000, -1);
-                }
-            }
-            catch (Exception ex)
-            {
-                World.Log(ex.StackTrace, ServiceCenter.Logs.LogLevelEnum.Mid);
-            }
-        }
-    }
-
-    /// <summary>
-    ///  设备报警
-    /// </summary>
-    public class EquipmentAlarm
-    {
-        /// <summary>
-        ///  设备号
-        /// </summary>
-        public string Code { get; set; }
-
-        /// <summary>
-        ///  内容
-        /// </summary>
-        public string Msg { get; set; }
-
-        /// <summary>
-        ///  时间
-        /// </summary>
-        public DateTime Time { get; set; }
-    }
-}

+ 0 - 126
WCS.WorkEngineering/Systems/DeviceWriteSystem.cs

@@ -1,126 +0,0 @@
-using WCS.Core;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.SRM;
-using WCS.WorkEngineering.Protocol.Station;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  设备信息写入接口
-    /// </summary>
-    //[BelongTo(typeof(MainWorld))]
-    public class DeviceWriteSystem : ServiceSystem<DeviceWriteInfo>
-    {
-        /// <summary>
-        /// 所有的站台
-        /// </summary>
-        private Dictionary<string, Station> Convs;
-
-        private Dictionary<string, SRM> Srms;
-
-        /// <summary>
-        ///  构造函数
-        /// </summary>
-        public DeviceWriteSystem()
-        {
-            Convs = Device.All.Where(v => v.HasProtocol<IStation523>()).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);
-        }
-
-        protected override void Do(DeviceWriteInfo info)
-        {
-            Type? type = null;
-            object? obj = null;
-            switch (info.DeviceType)
-            {
-                case DeviceTypeEnum.SRM:
-                    var srm = Srms[info.Code];
-                    type = typeof(ISRM520).Assembly.GetTypes().Where(v => v.Name == info.Protocol).First();
-                    obj = srm.Entity.Protocol(type, this.World);
-
-                    break;
-
-                case DeviceTypeEnum.DEV:
-                    var conv = Convs[info.Code];
-                    type = typeof(IStation523).Assembly.GetTypes().Where(v => v.Name == info.Protocol).First();
-                    obj = conv.Entity.Protocol(type, this.World);
-
-                    break;
-
-                case DeviceTypeEnum.BCR:
-                    break;
-
-                case DeviceTypeEnum.RGV:
-                    break;
-            }
-            var p = type.GetProperty(info.Property);
-            if (p.PropertyType.IsEnum)
-            {
-                var value = Enum.Parse(p.PropertyType, info.Value);
-                p.SetValue(obj, value);
-            }
-            else
-            {
-                var value = Convert.ChangeType(info.Value, p.PropertyType);
-                p.SetValue(obj, value);
-            }
-        }
-    }
-
-    /// <summary>
-    /// 设备写入信息
-    /// </summary>
-    public class DeviceWriteInfo
-    {
-        /// <summary>
-        ///  设备类型
-        /// </summary>
-        public DeviceTypeEnum DeviceType { get; set; }
-
-        /// <summary>
-        /// 设备号
-        /// </summary>
-        public string Code { get; set; }
-
-        /// <summary>
-        ///  协议
-        /// </summary>
-        public string Protocol { get; set; }
-
-        /// <summary>
-        /// 字段明
-        /// </summary>
-        public string Property { get; set; }
-
-        /// <summary>
-        ///  值
-        /// </summary>
-        public string Value { get; set; }
-    }
-
-    /// <summary>
-    ///  设备类型接口
-    /// </summary>
-    public enum DeviceTypeEnum
-    {
-        /// <summary>
-        ///  堆垛机
-        /// </summary>
-        SRM = 1,
-
-        /// <summary>
-        ///  输送线
-        /// </summary>
-        DEV = 2,
-
-        /// <summary>
-        ///  扫码器
-        /// </summary>
-        BCR = 3,
-
-        /// <summary>
-        /// RGV小车
-        /// </summary>
-        RGV = 4,
-    }
-}

+ 0 - 65
WCS.WorkEngineering/Systems/GetDeviceSystem.cs

@@ -1,65 +0,0 @@
-using WCS.Core;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.BCR;
-using WCS.WorkEngineering.Protocol.SRM;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.Worlds;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  设备信息读取接口
-    /// </summary>
-    [BelongTo(typeof(MainWorld))]
-    public class GetDeviceSystem : ServiceSystem<Tuple<string, string>, object>
-    {
-        /// <summary>
-        /// 所有的站台
-        /// </summary>
-        private List<Station> Convs;
-
-        private List<SRM> Srms;
-
-        private List<BCR> Bcrs;
-
-        private List<Device<IStation523>> Device91;
-
-        /// <summary>
-        ///  构造函数
-        /// </summary>
-        public GetDeviceSystem()
-        {
-            //Convs = Device.All.Where(v => v.HasProtocol<IStation523>()).Select(v => new Station(v, this.World)).ToList();
-            Srms = Device.All.Where(v => v.HasProtocol<ISRM520>()).Select(v => new SRM(v, this.World)).ToList();
-            Bcrs = Device.All.Where(v => v.HasProtocol<IBCR81>()).Select(v => new BCR(v, this.World)).ToList();
-            Device91 = Device.All.Where(v => v.HasProtocol<IStation523>()).Select(v => new Device<IStation523>(v, this.World)).ToList();
-        }
-
-        protected override object Do(Tuple<string, string> tuple)
-        {
-            switch (tuple.Item1)
-            {
-                case "堆垛机":
-                    return Srms;
-
-                case "输送机":
-                    return Convs;
-
-                case "读码器":
-                    var b = Bcrs.FirstOrDefault(v => v.Entity.Code == tuple.Item2).Data.Content;
-                    var a = Bcrs.FirstOrDefault(v => v.Entity.Code == tuple.Item2).GetBCRCode();
-                    return Bcrs.FirstOrDefault(v => v.Entity.Code == tuple.Item2).GetBCRCode();
-
-                case "外检":
-                    return Device91;
-
-                default: return "未知设备类型";
-            }
-
-            //if (code.Contains("SRM")) return Device.All.Where(v => v.Code == code).Select(v => new SRM(v, this.World)).ToList();
-            //else if (code.Contains("BCR")) return Device.All.Where(v => v.Code == code).Select(v => new BCR(v, this.World)).ToList();
-            //else if (code.Contains("D91")) return Device.All.Where(v => v.Code == code).Select(v => new Device<IStation523>(v, this.World)).ToList();
-            //return Device.All.Where(v => v.Code == code).Select(v => new Station(v, this.World)).ToList();
-        }
-    }
-}

+ 0 - 191
WCS.WorkEngineering/Systems/NoInteractionSystems.cs

@@ -1,191 +0,0 @@
-using PlcSiemens.Core.Extension;
-using ServiceCenter.Extensions;
-using ServiceCenter.Logs;
-using ServiceCenter.Redis;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Worlds;
-using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  无交互系统
-    /// </summary>
-    [BelongTo(typeof(MainWorld))]
-    [Description("无交互系统")]
-    public class NoInteractionSystems : DeviceSystem<Station>
-    {
-        public NoInteractionSystems()
-        {
-        }
-
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Station obj)
-        {
-            var key = $"WCS:Lock:无交互系统{obj.Entity.Code}";
-            try
-            {
-                if (RedisHub.Default.Get(key) != null)
-                {
-                    throw new KnownException($"[{obj.Entity.Code}]--触发并发管控", LogLevelEnum.High);
-                }
-                RedisHub.Default.Set(key, obj.Entity.Code);
-
-                #region 处理所有的新增任务
-
-                try
-                {
-                    List<WCS_TaskInfo> taskInfos = new List<WCS_TaskInfo>();
-                    SqlSugarHelper.Do(db =>
-                    {
-                        taskInfos = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.Status == Entity.TaskStatus.NewBuild).ToList();
-                    });
-                    if (taskInfos.Any())
-                    {
-                        foreach (var item in taskInfos)
-                        {
-                            try
-                            {
-                                SqlSugarHelper.Do(db =>
-                                {
-                                    var task = db.Default.Queryable<WCS_TaskInfo>().Where(t => t.ID == item.ID).First() ?? throw new Exception($"未找到对应的WCS任务[{item.ID}]");
-                                    switch (task.Type)
-                                    {
-                                        case TaskType.SetPlate:
-                                            if (task.AddrFrom != "Robot")
-                                            {
-                                                //更新任务状态
-                                                task.Status = TaskStatus.WaitingToExecute;
-                                                db.Default.Updateable(task).ExecuteCommand();
-                                                task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
-                                            }
-                                            break;
-
-                                        case TaskType.EnterDepot:
-                                            //更新任务状态
-                                            task.Status = Entity.TaskStatus.WaitingToExecute;
-                                            switch (task.WarehouseCode)
-                                            {
-                                                case "1N":
-                                                    task.Device = "SRM1";
-                                                    break;
-                                            }
-
-                                            if (task.AddrFrom is "1666")
-                                            {
-                                                task.Device = "SRM1";
-                                            }
-
-                                            //计算下一个地址
-                                            var path1 = DevicePath.GetPath(task.AddrFrom, task.Device);
-                                            task.AddrNext = path1.Points[1].Code;
-                                            task.SrmStation = task.BarCode == "TPA" ? task.AddrFrom : path1.Points[2].Code;
-
-                                            db.Default.Updateable(task).ExecuteCommand();
-                                            task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化入库任务信息");
-                                            break;
-
-                                        case TaskType.OutDepot:
-                                            {
-                                                if (task.Device.Contains("Robot"))
-                                                {
-                                                    var pos = task.AddrFrom.Split("-");
-                                                    task.Status = Entity.TaskStatus.WaitingToExecute;
-                                                    task.Line = pos[0].ToShort();
-                                                    task.Col = pos[1].ToShort();
-                                                    task.Layer = pos[2].ToShort();
-                                                    task.Depth = pos[3].ToShort();
-                                                    db.Default.Updateable(task).ExecuteCommand();
-                                                    task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
-                                                }
-                                                else
-                                                {
-                                                    if (task.SrmStation.IsNullOrEmpty()) //如果没有指定放货站台
-                                                    {
-                                                        if (task.Device.IsNullOrEmpty())
-                                                        {
-                                                            task.Device = "SRM" + task.Tunnel.GetLastDigit();
-                                                        }
-                                                        //获取堆垛机到目标地址的路径信息
-                                                        var path = DevicePath.GetPath(task.Device, task.AddrTo);
-                                                        task.SrmStation = path.Points[1].Code;
-                                                    }
-
-                                                    var devs = Device.All.Where(x => x.HasFlag(DeviceFlags.AGV取货站台口)).Select(x => x.Code);
-                                                    if (devs.Contains(task.SrmStation))
-                                                    {
-                                                        //开始处理车间叫料AGV任务任务
-                                                        db.Default.Insertable(new WCS_AgvTaskInfo()
-                                                        {
-                                                            ID = db.GetAgvTaskId(),
-                                                            TaskType = AGVTaskType.CallMaterial,
-                                                            Status = AGVTaskStatus.NewBuild,
-                                                            TaskId = task.ID,
-                                                            Position = task.WorkBench,
-                                                            Station = obj.Entity.Code,
-                                                            AddWho = "WCS",
-                                                            AddTime = DateTime.Now
-                                                        }).SplitTable().ExecuteCommand();
-
-                                                        db.Default.Insertable(new WCS_AgvTaskInfo()
-                                                        {
-                                                            ID = db.GetAgvTaskId(),
-                                                            TaskType = AGVTaskType.EnterDepot,
-                                                            Status = AGVTaskStatus.NewBuild,
-                                                            TaskId = task.ID,
-                                                            Position = task.WorkBench,
-                                                            Station = obj.Entity.Code,
-                                                            AddWho = "WCS",
-                                                            AddTime = DateTime.Now
-                                                        }).SplitTable().ExecuteCommand();
-                                                    }
-                                                    //更新任务状态
-                                                    task.Status = Entity.TaskStatus.WaitingToExecute;
-                                                    db.Default.Updateable(task).ExecuteCommand();
-                                                    task.AddWCS_TASK_DTL(db.Default, task.Device, $"初始化出库任务信息,放货站台:{task.SrmStation}");
-                                                }
-                                                break;
-                                            }
-                                        case TaskType.Delivery:
-                                            break;
-
-                                        case TaskType.EmptyInit:
-                                            break;
-                                    }
-                                });
-                            }
-                            catch (Exception ex)
-                            {
-                                World.Log(ex.Message, LogLevelEnum.Mid);
-                                continue;
-                            }
-                        }
-                    }
-                }
-                catch (Exception ex)
-                {
-                    World.Log(ex.Message, LogLevelEnum.Mid);
-                }
-
-                #endregion 处理所有的新增任务
-            }
-            finally
-            {
-                RedisHub.Default.Del(key);
-            }
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.Code == "2532";
-        }
-    }
-}

+ 0 - 240
WCS.WorkEngineering/Systems/RGVSystems.cs

@@ -1,240 +0,0 @@
-using ServiceCenter.Extensions;
-using ServiceCenter.Logs;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.BCR;
-using WCS.WorkEngineering.Protocol.RGV;
-using WCS.WorkEngineering.Protocol.Robot;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.Protocol.Truss;
-using WCS.WorkEngineering.Worlds;
-using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  Agv交互系统
-    /// </summary>
-    [BelongTo(typeof(MainWorld))]
-    [Description("RGV交互系统")]
-    public class RGVSystems : DeviceSystem<Device<IRGV520, IRGV521, IBCR81>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        /// <summary>
-        /// 取货点设备集合
-        /// </summary>
-        private readonly Dictionary<string, List<Device<IStation520, IStation521, IStation523>>> _pickUpDevices = new();
-
-        public RGVSystems()
-        {
-            //获取所有的巷道集合
-            var rgvList = Device.All.Where(v => v.HasFlag(DeviceFlags.RGV));
-            foreach (var rgv in rgvList)
-            {
-                _pickUpDevices.Add(rgv.Code, rgv.Sources.Where(v => v.HasFlag(DeviceFlags.输送机)).Select(v => new Device<IStation520, IStation521, IStation523>(v, this.World)).ToList());
-            }
-        }
-
-        public override void Do(Device<IRGV520, IRGV521, IBCR81> 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 != RGVWorkMode.Automatic) return;
-
-            if (obj.Data.RES1 == 1) return; //wcs任务完成确认信号未清除
-
-            if (obj.Data2.Status.HasFlag(RGVStatus.Taskfinishi))
-            {
-                switch (obj.Data2.CmdType)
-                {
-                    case RGVCmdType.PickGoods: //单独取货任务完成,默认只有空托盘才会下发单独取货任务
-                        //开始申请读码信息
-                        var bcrCode = obj.Data3.GetBCRCode();
-                        int taskNumber = 0;
-                        SqlSugarHelper.Do(_db =>
-                        {
-                            var db = _db.Default;
-                            var dev = Device.All.First(x => x.Code == obj.Data2.StartPosition.ToString());
-                            if (dev.HasFlag(DeviceFlags.拆盘机09))
-                            {
-                                //开始绑定任务,并下发新的任务信息到小车
-                                WCS_Palletizing palletizingInfo = db.Queryable<WCS_Palletizing>().Single(x => x.Id == obj.Data2.TaskNumber);
-                                if (palletizingInfo == null) return;
-                                palletizingInfo.PalleCode = bcrCode;
-                                db.Updateable(palletizingInfo).ExecuteCommand();
-                                taskNumber = palletizingInfo.Id;
-                            }
-                            else if (dev.HasFlag(DeviceFlags.拆盘机非09))
-                            {
-                                //开始处理对应的搬运任务信息
-                                var task = db.Queryable<WCS_TaskInfo>().First(x => x.Type == TaskType.Delivery && x.ID == obj.Data2.TaskNumber && x.AddrTo == obj.Data2.DestPosition.ToString());
-                                task.BarCode = bcrCode;
-                                db.Updateable(task).ExecuteCommand();
-                                task.AddWCS_TASK_DTL(db, obj.Entity.Code, obj.Data2.DestPosition.ToString(), $"环形库码垛位{obj.Data2.DestPosition}搬运任务绑定条码信息{bcrCode}");
-                                taskNumber = task.ID;
-                            }
-                        });
-                        if (taskNumber == 0) return;
-                        //清空起始点信息
-                        var staDev = new Device<IStation520>(Device.All.FirstOrDefault(x => x.Code == obj.Data2.DestPosition.ToString())!, World);
-                        staDev.Data.TaskNumber = 0;
-                        staDev.Data.GoodsStart = 0;
-                        staDev.Data.GoodsEnd = 0;
-                        obj.Data2.TaskNumber = taskNumber;
-                        obj.Data.RES1 = 1;
-                        break;
-
-                    case RGVCmdType.PutGoods:
-                        WCS_TaskInfo finishiTask = null;
-                        var startPosition = Device.All.Where(x => x.Code == obj.Data2.StartPosition.ToString()).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).FirstOrDefault();
-                        var destPosition = Device.All.FirstOrDefault(x => x.Code == obj.Data2.DestPosition.ToString());
-                        var isPalletizing = destPosition!.HasFlag(DeviceFlags.桁架码垛位, DeviceFlags.环形库码垛工位);
-                        short countQty = 0;
-                        short shortCode = 0;
-                        SqlSugarHelper.Do(_db =>
-                        {
-                            var db = _db.Default;
-                            if (isPalletizing)
-                            {
-                                if (destPosition.HasFlag(DeviceFlags.桁架码垛位))
-                                {
-                                    var palletizingInfo = db.Queryable<WCS_Palletizing>().First(x => x.Id == obj.Data.TaskNumber);
-                                    countQty = palletizingInfo.CountQty.ToShort();
-                                    shortCode = palletizingInfo.ShortCode;
-                                }
-                                else if (destPosition.HasFlag(DeviceFlags.环形库码垛工位))
-                                {
-                                    var deliveryTask = db.Queryable<WCS_TaskInfo>().First(x => x.ID == obj.Data.TaskNumber);
-                                    countQty = deliveryTask.FullQty;
-                                    shortCode = deliveryTask.PalletType;
-                                    deliveryTask.Status = TaskStatus.RgvCompleted;
-                                    deliveryTask.EditTime = DateTime.Now;
-                                    deliveryTask.LastInteractionPoint = obj.Entity.Code;
-                                    db.Updateable(deliveryTask).ExecuteCommand();
-                                    deliveryTask.AddWCS_TASK_DTL(db, deliveryTask.AddrTo, $"RGV任务执行结束");
-                                }
-                            }
-                        });
-
-                        //初始化起始点信息
-                        startPosition.Data.TaskNumber = 0;
-                        startPosition.Data.GoodsEnd = 0;
-                        //目标地址是码垛工位
-                        if (isPalletizing)
-                        {
-                            if (destPosition.HasFlag(DeviceFlags.桁架码垛位))
-                            {
-                                var dest = new Device<ITruss530>(destPosition!, World);
-                                dest.Data.MaxQuantity = countQty;
-                                dest.Data.Type = shortCode;
-                                dest.Data.VoucherNo++;
-                            }
-                            else if (destPosition.HasFlag(DeviceFlags.环形库码垛工位))
-                            {
-                                var dest = new Device<IRobot530>(destPosition!, World);
-                                dest.Data.MaxQuantity = countQty;
-                                dest.Data.Type = shortCode;
-                                dest.Data.VoucherNo++;
-                            }
-                        }
-                        obj.Data.RES1 = 1;
-                        break;
-
-                    case RGVCmdType.Move:
-                        break;
-
-                    case RGVCmdType.ChangePutGoods:
-                        break;
-
-                    case RGVCmdType.ChangePickGoods:
-                        break;
-
-                    case RGVCmdType.PickPutGoods:
-                        staDev = new Device<IStation520, IStation521>(Device.All.FirstOrDefault(x => x.Code == obj.Data.DestPosition.ToString())!, World);
-                        staDev.Data.TaskNumber = 0;
-                        staDev.Data.GoodsStart = 0;
-                        staDev.Data.GoodsEnd = 0;
-                        obj.Data.RES1 = 1;
-                        break;
-
-                    default:
-                        throw new ArgumentOutOfRangeException();
-                }
-                return;
-            }
-
-            if (obj.Data2.SystemStatus != RGVSystemStatus.空闲) return;
-
-            if (obj.Data2.CmdType == RGVCmdType.PickGoods && !obj.Data2.Status.HasFlag(RGVStatus.Taskfinishi))
-            {
-                if (obj.Data2.Status.HasFlag(RGVStatus.PH_Status))
-                {
-                    obj.Data.TaskNumber = obj.Data.TaskNumber;
-                    obj.Data.CmdType = RGVCmdType.PutGoods;
-                    obj.Data.StartPosition = obj.Data2.StartPosition;
-                    obj.Data.DestPosition = obj.Data2.DestPosition;
-                    obj.Data.VoucherNo++;
-                    return;
-                }
-            }
-            var pickUpDevices = _pickUpDevices.FirstOrDefault(x => x.Key == obj.Entity.Code).Value;
-
-            //有货且需要搬运货物的站台
-            var devs = pickUpDevices.Where(v => v.Data3.Status.HasFlag(StationStatus.PH_Status) && v.Data.TaskNumber != 0)
-                                                  .Where(v => v.Entity.Code.ToShort() != v.Data.GoodsEnd && v.Data.GoodsEnd != 0)
-                                                  .ToList();
-            //筛选出目标站台无货的站台
-            var putDev = obj.Entity.Targets.Where(x => x.HasFlag(DeviceFlags.输送机))
-                .Select(x => new Device<IStation520, IStation521, IStation523>(x, World))
-                .Where(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status))
-                .Select(x => x.Entity.Code.ToShort());
-            var dev = devs.OrderBy(x => x.Entity.Code).FirstOrDefault(x => putDev.Contains(x.Data.GoodsEnd));
-            if (dev == null) return;
-            //区分任务是拆盘机到码垛工位,还是码垛工位到拆盘机
-            if (dev.Entity.HasFlag(DeviceFlags.拆盘机09, DeviceFlags.拆盘机非09))
-            {
-                obj.Data.TaskNumber = dev.Data.TaskNumber;
-                obj.Data.CmdType = RGVCmdType.PickGoods;
-                obj.Data.StartPosition = dev.Entity.Code.ToShort();
-                obj.Data.DestPosition = dev.Data.GoodsEnd;
-                obj.Data.VoucherNo++;
-            }
-            else //非拆盘机起始任务
-            {
-                //站台中的任务号
-                WCS_TaskInfo task = null;
-                SqlSugarHelper.Do(_db =>
-                {
-                    var db = _db.Default;
-                    var taskInfo = db.Queryable<WCS_TaskInfo>().First(p => p.ID == dev.Data.TaskNumber && p.Status == TaskStatus.WaitingToExecute);
-                    if (taskInfo == null) return;
-                    taskInfo.Status = TaskStatus.RgvExecution;
-                    taskInfo.AddrNext = obj.Entity.Code;
-                    taskInfo.EditWho = "WCS";
-                    taskInfo.EditTime = DateTime.Now; ;
-                    db.Updateable(taskInfo).ExecuteCommand();
-                    taskInfo.AddWCS_TASK_DTL(db, dev.Entity.Code, obj.Entity.Code, $"任务分配至{obj.Entity.Code}");
-                    task = taskInfo;
-                });
-                if (task == null) return;
-                obj.Data.TaskNumber = task.ID;
-                obj.Data.CmdType = RGVCmdType.PickPutGoods;
-                obj.Data.StartPosition = dev.Entity.Code.ToShort();
-                obj.Data.DestPosition = dev.Data.GoodsEnd;
-                obj.Data.VoucherNo++;
-            }
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.Code == "RGV1";
-            //return dev.HasFlag(Extensions.DeviceFlags.RGV);
-        }
-    }
-}

+ 0 - 60
WCS.WorkEngineering/Systems/SrmDebugSystem.cs

@@ -1,60 +0,0 @@
-using WCS.Core;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.RGV;
-using WCS.WorkEngineering.Protocol.SRM;
-using WCS.WorkEngineering.Worlds;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  设备信息写入接口
-    /// </summary>
-    [BelongTo(typeof(MainWorld))]
-    public class SrmDebugSystem : ServiceSystem<SrmDebugInfo>
-    {
-        private List<SRM> Srms;
-
-        /// <summary>
-        ///  构造函数
-        /// </summary>
-        public SrmDebugSystem()
-        {
-            Srms = Device.All.Where(v => v.HasProtocol<ISRM520>()).Select(v => new SRM(v, this.World)).ToList();
-        }
-
-        protected override void Do(SrmDebugInfo info)
-        {
-            var srm = Srms.FirstOrDefault(v => v.Entity.Code == info.SrmCode);
-            srm.Data.TaskType = info.srmTaskType;
-            srm.Data.SLine = info.SLine;
-            srm.Data.SCol = info.SCol;
-            srm.Data.SLayer = info.SLayer;
-            srm.Data.ELine = info.ELine;
-            srm.Data.ECol = info.ECol;
-            srm.Data.ELayer = info.ELayer;
-            srm.Data.VoucherNo++;
-        }
-    }
-
-    /// <summary>
-    /// 设备写入信息
-    /// </summary>
-    public class SrmDebugInfo
-    {
-        public string SrmCode { get; set; }
-
-        public SrmTaskType srmTaskType { get; set; }
-
-        public short SLine { get; set; }
-
-        public short SCol { get; set; }
-
-        public short SLayer { get; set; }
-
-        public short ELine { get; set; }
-
-        public short ECol { get; set; }
-
-        public short ELayer { get; set; }
-    }
-}

+ 60 - 296
WCS.WorkEngineering/Systems/SrmSystems.cs

@@ -21,7 +21,7 @@ namespace WCS.WorkEngineering.Systems
     /// </summary>
     [BelongTo(typeof(MainWorld))]
     [Description("堆垛机系统")]
-    public class SrmSystems : DeviceSystem<SRM>
+    public class SrmSystems : DeviceSystem<Device<ISRM520, ISRM521>>
     {
         /// <summary>
         /// 取货点设备集合
@@ -35,321 +35,85 @@ namespace WCS.WorkEngineering.Systems
 
         public SrmSystems()
         {
-            //获取所有的巷道集合
-            var devices = Device.All.Where(v => v.HasFlag(DeviceFlags.巷道));
-
-            //开始分配
-            foreach (var item in devices)
-            {
-                //取货设备
-                var srm = item.Targets.FirstOrDefault(v => v.HasFlag(DeviceFlags.堆垛机));
-                PickUpDevices.Add(srm.Code, item.Sources.Where(v => v.HasFlag(DeviceFlags.输送机)).Select(v => new Station(v, this.World)).ToList());
-                //放货设备
-                srm = item.Sources.FirstOrDefault(v => v.HasFlag(DeviceFlags.堆垛机));
-                PutDevices.Add(srm.Code, item.Targets.Where(v => v.HasFlag(DeviceFlags.输送机)).Select(v => new Station(v, this.World)).ToList());
-            }
         }
 
         protected override bool ParallelDo => true;
 
         protected override bool SaveLogsToFile => true;
 
-        public override void Do(SRM obj)
+        public override void Do(Device<ISRM520, ISRM521> obj)
         {
-            #region 处理完成任务
-
-            //判断DB520 完成任务确认清除信号 是否为1
-            if (obj.Data.OkAck == 1) throw new KnownException($"WCS任务完成确认信号[DB520.OkAck]未清除,请检查堆垛机处理异常原因", LogLevelEnum.Mid);
-
-            if (obj.Data2.TaskFinishiId > 0)
-            {
-                //处理完成的任务信息
-                WCS_TaskInfo taskInfo = null;
-                //开始处理
-                SqlSugarHelper.Do(db =>
-                {
-                    World.Log($"堆垛机任务处理:开始--完成任务{obj.Data2.TaskFinishiId}", LogLevelEnum.Low);
-
-                    #region 获取完成任务
-
-                    //根据DB521任务号获取对应任务
-                    var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskFinishiId) ?? throw new KnownException($"堆垛机完成任务号{obj.Data2.TaskFinishiId},在WCS当前任务信息中未找到对应任务。", LogLevelEnum.High);
-                    if (task.Status != Entity.TaskStatus.StackerExecution) throw new KnownException($"任务{task.ID}状态是{task.Status.GetDescription()}.堆垛机完成任务需要对应任务状态处于堆垛机执行中", LogLevelEnum.High);
-
-                    #endregion 获取完成任务
-
-                    //根据任务类型做不同的处理
-                    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.Default, task.AddrTo, "入库任务结束");
-                            break;
-
-                        case TaskType.OutDepot:
-                            switch (task.OutType)
-                            {
-                                case OutTypeEnum.自动出库任务 or OutTypeEnum.全自动手动出库任务:
-
-                                    if (task.SrmStation is "1601" or "1605" or "1611" or "1615")
-                                    {
-                                        task.Status = Entity.TaskStatus.Finish;
-                                        var dev = new Station(Device.All.FirstOrDefault(v => v.Code == task.SrmStation) ?? throw new KnownException($"未找到{task.SrmStation}信息", LogLevelEnum.High), this.World);
-                                        db.Default.Updateable(task).ExecuteCommand();
-                                        task.AddWCS_TASK_DTL(db.Default, task.SrmStation, "出库任务到达放货站台");
-                                    }
-                                    else
-                                    {
-                                        task.Status = Entity.TaskStatus.ConveyorExecution;
-                                        var dev = new Station(Device.All.FirstOrDefault(v => v.Code == task.SrmStation) ?? throw new KnownException($"未找到{task.SrmStation}信息", LogLevelEnum.High), this.World);
-                                        dev.Data.TaskNumber = task.ID;
-                                        db.Default.Updateable(task).ExecuteCommand();
-                                        task.AddWCS_TASK_DTL(db.Default, task.SrmStation, "出库任务到达放货站台");
-                                    }
-
-                                    break;
-
-                                case OutTypeEnum.半自动手动出库任务:
-                                    task.Status = Entity.TaskStatus.Finish;
-                                    task.EditTime = DateTime.Now;
-                                    db.Default.Updateable(task).ExecuteCommand();
-                                    task.AddWCS_TASK_DTL(db.Default, task.SrmStation, "半自动手动出库任务结束");
-                                    break;
-                            }
-
-                            break;
-
-                        case TaskType.TransferDepot:
-                            task.Status = Entity.TaskStatus.Finish;
-                            task.EedTime = DateTime.Now;
-                            db.Default.Updateable(task).ExecuteCommand();
-                            task.AddWCS_TASK_DTL(db.Default, 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.Default, task.AddrTo, "空轮初始化任务结束");
-                            break;
-                    }
-                    taskInfo = task;
-                });
-                if (taskInfo == null) throw new KnownException("数据库提交事务错误", LogLevelEnum.High);
-                // 写入信号
-                obj.Data.OkAck = 1;
-                //通知WMS任务完成
-                if (taskInfo.Status == TaskStatus.Finish) WmsApi.CompleteTask(taskInfo.ID);
-                if (taskInfo is { Type: TaskType.OutDepot, Status: TaskStatus.ConveyorExecution }) WmsApi.SrmPickOutCompleted(taskInfo.ID);
-
-                World.Log($"堆垛机任务处理:结束--完成任务{obj.Data2.TaskFinishiId}", LogLevelEnum.Mid);
-            }
-
-            #endregion 处理完成任务
-
-            //堆垛机是否可以下发任务
-            if (obj.Data2.VoucherNo != obj.Data.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo},DB521:{obj.Data2.VoucherNo}", LogLevelEnum.Mid);
-            if (obj.Data2.AutoStatus != SrmAutoStatus.Automatic) throw new KnownException($"堆垛机处于{obj.Data2.AutoStatus.GetDescription()}模式", LogLevelEnum.Low);
-            if (obj.Data2.RunStatus != SrmRunStatus.Idle) throw new KnownException($"堆垛机处于{obj.Data2.RunStatus.GetDescription()}状态", LogLevelEnum.High);
-
-            //默认没有移库任务
-            var isTransfer = false;
-
-            //出入库优先级任务 1:无优先 2:入库 3:出库
-            var enterOrOut = 1;
-
-            //再检查是否有等待执行的货物
-            SqlSugarHelper.Do(db =>
+            if (obj.Data.VoucherNo_2 != obj.Data2.VoucherNo_2) throw new Exception("凭证号不一致");
+            if (obj.Data2.TaskFinishiID_1 != 0 || obj.Data2.TaskFinishiID_2 != 0)
             {
-                //获取当前堆垛机的所有未完成任务
-                var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Status < Entity.TaskStatus.Finish && (v.Device == obj.Entity.Code));
-                //任务集合是否有处于堆垛机执行状态的任务
-                if (tasks.Any(v => v.Status == Entity.TaskStatus.StackerExecution)) throw new KnownException($"有任务处于堆垛机执行状态", LogLevelEnum.High);
-
-                //不存在调整优先级任务,判断是否存在移库任务
-                isTransfer = tasks.Any(v => v.Type == TaskType.TransferDepot && v.Status == Entity.TaskStatus.NewBuild);
-                if (isTransfer) return; //存在调整优先级任务
-                //获取出库任务中新建状态最大优先级
-                var outPriorityNewBuild = tasks.Where(v => v.Type == TaskType.OutDepot && v.Status == Entity.TaskStatus.WaitingToExecute).Max(v => v.Priority);
-                //获取入库任务中最大优先级
-                var enterPriority = tasks.Where(v => v.Type == TaskType.EnterDepot && v.Status < Entity.TaskStatus.StackerExecution).Max(v => v.Priority);
-                //出入库最大优先级相加大于零
-                if (outPriorityNewBuild + enterPriority > 0)
+                obj.Data.OK_ACK_1 = 1;
+                obj.Data.OK_ACK_2 = 1;
+
+                obj.Data.TaskID_1 = 123456;
+                obj.Data.RowPos1_1 = 3;
+                obj.Data.TravelPos1_1 = 9;
+                obj.Data.LiftPos1_1 = 1;
+                obj.Data.ForkStartPos1_1 = WCS.Entity.Protocol.SRM.SRMForkPos.深度1;
+                obj.Data.RowPos2_1 = 3;
+                obj.Data.TravelPos2_1 = 1;
+                obj.Data.LiftPos2_1 = 1;
+                obj.Data.ForkDestPos2_1 = WCS.Entity.Protocol.SRM.SRMForkPos.深度1;
+                obj.Data.TaskType_1 = WCS.Entity.Protocol.SRM.SRMTaskType.取放货任务;
+                obj.Data.TaskSum_2 = 1;
+                var b = true;
+                if (b)
                 {
-                    //出入库优先级任务 1:无优先 2:入库 3:出库
-                    enterOrOut = enterPriority > outPriorityNewBuild ? 2 : 3;
+                    obj.Data.TaskID_2 = 123456;
+                    obj.Data.RowPos1_2 = 3;
+                    obj.Data.Travelpos1_2 = 10;
+                    obj.Data.Liftpos1_2 = 1;
+                    obj.Data.ForkStartPos1_2 = WCS.Entity.Protocol.SRM.SRMForkPos.深度1;
+                    obj.Data.RowPos2_2 = 3;
+                    obj.Data.Travelpos2_2 = 2;
+                    obj.Data.Liftpos2_2 = 1;
+                    obj.Data.ForkStartPos2_2 = WCS.Entity.Protocol.SRM.SRMForkPos.深度1;
+                    obj.Data.TaskType_2 = WCS.Entity.Protocol.SRM.SRMTaskType.取放货任务;
                 }
-            });
 
-            #region 移库
-
-            if (isTransfer)
-            {
-                WCS_TaskInfo taskInfo = null;
-                SqlSugarHelper.Do(db =>
-                   {
-                       //获取一条当前堆垛机优先级最高的新建移库任务
-                       var task = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Device == obj.Entity.Code && v.Type == TaskType.TransferDepot && v.Status == Entity.TaskStatus.NewBuild)
-                                                                      .OrderByDescending(v => v.Priority)
-                                                                      .First() ?? throw new KnownException("未找到移库任务", LogLevelEnum.High);
-                       //任务状态改为堆垛机执行中
-                       task.Status = Entity.TaskStatus.StackerExecution;
-                       task.StartTime = DateTime.Now;
-                       db.Default.Updateable(task).ExecuteCommand();
-                       task.AddWCS_TASK_DTL(db.Default, task.AddrFrom, task.Device, $"堆垛机{obj.Entity.Code}开始执行任务");
-                       taskInfo = task;
-                   });
-                if (taskInfo == null) throw new KnownException("数据更新错误", LogLevelEnum.High);
-                var addrFrom = taskInfo.AddrFrom.Split("-");
-                var addrTo = taskInfo.AddrTo.Split("-");
-                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);
-                //下发任务
-                obj.Data.TaskNumber = taskInfo.ID;
-                obj.Data.SLine = addrFrom[0].ToShort();
-                obj.Data.SCol = addrFrom[1].ToShort();
-                obj.Data.SLayer = addrFrom[2].ToShort();
-                obj.Data.ELine = addrTo[0].ToShort();
-                obj.Data.ECol = addrTo[1].ToShort();
-                obj.Data.ELayer = addrTo[2].ToShort();
-                obj.Data.TaskType = SrmTaskType.MoveGoods;
-                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);
+                obj.Data.VoucherNo_2++;
+                return;
             }
 
-            #endregion 移库
-
-            #region 出入库
-
-            //上一个周期是不是出库任务 第一次获取返回结果会是false
-            var lastIsOut = obj.Entity.GetFlag<bool>("LastIsOut");
-            obj.Entity.SetFlag("LastIsOut", !lastIsOut);
-
-            //入库任务优先 或 上一个周期是出库任务并且出库任务无优先
-            if (enterOrOut == 2 || (lastIsOut && enterOrOut == 1)) //入库任务
+            if (obj.Data2.SrmRunStatus != WCS.Entity.Protocol.SRM.SRMFRunStatus.空闲) throw new Exception("任务执行中");
+
+
+            obj.Data.TaskID_1 = 123456;
+            obj.Data.RowPos1_1 = 3;
+            obj.Data.TravelPos1_1 = 1;
+            obj.Data.LiftPos1_1 = 1;
+            obj.Data.ForkStartPos1_1 = WCS.Entity.Protocol.SRM.SRMForkPos.深度1;
+            obj.Data.RowPos2_1 = 3;
+            obj.Data.TravelPos2_1 = 9;
+            obj.Data.LiftPos2_1 = 1;
+            obj.Data.ForkDestPos2_1 = WCS.Entity.Protocol.SRM.SRMForkPos.深度1;
+            obj.Data.TaskType_1 = WCS.Entity.Protocol.SRM.SRMTaskType.取放货任务;
+            obj.Data.TaskSum_2 = 1;
+            var a = true;
+            if (a)
             {
-                //判断本次优先执行楼层,并设置下次执行时优先楼层
-                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.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)
-                                                                              && (v.Status == TaskStatus.ConveyorExecution || v.Status == TaskStatus.RgvExecution || v.Status == TaskStatus.RgvCompleted)
-                                                                              && (arrIn.Select(p => p.Data.TaskNumber).Contains(v.ID) || arrIn.Select(p => p.Data2.TaskNumber).Contains(v.ID))).ToList();
-                    //按条件先后排序获取一条排序后第一条结果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);
-
-                    //获取任务所有设备
-                    station = arrIn.First(v => (v.Data.TaskNumber == task.ID) || (v.Data2.TaskNumber == task.ID));
-                    //获取当前货物巷道
-                    var res = WmsApi.GetLocalIn(task.ID, task.Device, station.Entity.Code, task.Height);
-                    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();
-                    task.AddWCS_TASK_DTL(db.Default, station.Entity.Code, task.AddrTo, "任务下发堆垛机执行");
-
-                    taskInfo = task;
-                });
-
-                if (taskInfo == null) throw new KnownException("数据更新错误", LogLevelEnum.High);
-                var addrTo = taskInfo.AddrTo.Split("-");
-                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);
-                //下发任务
-                obj.Data.TaskNumber = taskInfo.ID;
-                obj.Data.TaskType = SrmTaskType.Default;
-                obj.Data.SLine = station.Entity.Code.ToShort();
-                obj.Data.SCol = 0;
-                obj.Data.SLayer = 0;
-                obj.Data.ELine = addrTo[0].ToShort();
-                obj.Data.ECol = addrTo[1].ToShort();
-
-                obj.Data.ELayer = addrTo[2].ToShort();
-                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);
-            }
-            else if (enterOrOut == 3 || !lastIsOut) //出库任务
-            {
-                //判断本次优先执行楼层,并设置下次执行时优先楼层
-
-                var floor = obj.Entity.GetFlag<int>("FloorOut");
-
-                floor = floor % 2 + 1;
-                obj.Entity.SetFlag("FloorOut", floor);
-
-                //获取当前堆垛机所有的取货站台
-                var arrOut = PutDevices.First(v => v.Key == obj.Entity.Code).Value;
-
-                if (!arrOut.Any()) throw new KnownException($"堆垛机{obj.Entity.Code}无放货路径点", LogLevelEnum.High);
-
-                //获取可以放货的设备集合
-                arrOut = arrOut.Where(v => !v.Data3.Status.HasFlag(StationStatus.PH_Status) //无光电
-                                                && !v.Data3.Status.HasFlag(StationStatus.Run) //未运行
-                                                && !v.Data3.Status.HasFlag(StationStatus.OT_Status) //无任务
-                                                && !v.Data3.Status.HasFlag(StationStatus.UnassignedTask) //未分配任务
-                                                && v.Data3.Status.HasFlag(StationStatus.Auto)).ToList(); //自动
-
-                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();
-
-                   //按条件先后排序获取一条排序后第一条结果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() ?? throw new KnownException($"{obj.Entity.Code}未找到出库任务", LogLevelEnum.High);
-                   task.Status = TaskStatus.StackerExecution;
-                   task.LastInteractionPoint = task.Device;
-                   task.EditWho = "WCS";
-                   db.Default.Updateable(task).ExecuteCommand();
-                   task.AddWCS_TASK_DTL(db.Default, task.Device, task.SrmStation, "任务下发堆垛机执行");
-                   taskInfo = task;
-               });
-
-                if (taskInfo == null) throw new KnownException("数据更新错误", LogLevelEnum.High);
-
-                var addrFrom = taskInfo.AddrFrom.Split("-");
-                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);
-                obj.Data.TaskNumber = taskInfo.ID;
-                obj.Data.SLine = addrFrom[0].ToShort();
-                obj.Data.SCol = addrFrom[1].ToShort();
-                obj.Data.SLayer = addrFrom[2].ToShort();
-                obj.Data.ELine = taskInfo.SrmStation.ToShort();
-                obj.Data.ECol = 0;
-                obj.Data.ELayer = 0;
-                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);
+                obj.Data.TaskID_2 = 123456;
+                obj.Data.RowPos1_2 = 3;
+                obj.Data.Travelpos1_2 = 2;
+                obj.Data.Liftpos1_2 = 1;
+                obj.Data.ForkStartPos1_2 = WCS.Entity.Protocol.SRM.SRMForkPos.深度1;
+                obj.Data.RowPos2_2 = 3;
+                obj.Data.Travelpos2_2 = 10;
+                obj.Data.Liftpos2_2 = 1;
+                obj.Data.ForkStartPos2_2 = WCS.Entity.Protocol.SRM.SRMForkPos.深度1;
+                obj.Data.TaskType_2 = WCS.Entity.Protocol.SRM.SRMTaskType.取放货任务;
             }
 
-            #endregion 出入库
+            obj.Data.VoucherNo_2++;
         }
 
         public override bool Select(Device dev)
         {
-            return dev.HasProtocol(typeof(ISRM520));
+            return true;
         }
     }
 }

+ 0 - 104
WCS.WorkEngineering/Systems/一楼叠盘机入库.cs

@@ -1,104 +0,0 @@
-using ServiceCenter.Logs;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.WebApi.Controllers;
-using WCS.WorkEngineering.WebApi.Models.WMS.Request;
-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;
-
-        public override void Do(Device<IStation520, IStation521, IStation523> obj)
-        {
-            obj.入库站点是否被禁止();
-            obj.入库站点是否满足执行条件();
-
-            WCS_TaskInfo task = null;//处理完成的任务
-            try
-            {
-                string barcode = "TPB";
-                var palletType = PalletType.PalletNo09;
-                if (obj.Entity.Code is "2527" or "2727")
-                {
-                    palletType = PalletType.Pallet09;
-                    barcode = "TPA";
-                }
-
-                SqlSugarHelper.Do(_db =>
-                {
-                    var db = _db.Default;
-
-                    //验证是否有对应的任务
-                    if (!db.Queryable<WCS_TaskInfo>().Any(v => v.BarCode == barcode))
-                    {
-                        var res = WmsApi.OneFloorWorkerBuildEmptyPalletsStock(new OneFloorWorkerBuildEmptyPalletsStockRequest()
-                        {
-                            PalletCode = barcode,
-                            StartLoc = obj.Entity.Code,
-                            PalletType = palletType,
-                            Height = 2
-                        });
-                        if (res.ResCode == WebApi.Models.WMS.Response.ResponseStatusCodeEnum.Sucess) return;
-                    }
-                    //找到对应的任务
-                    var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.BarCode == barcode);
-                    if (taskInfo.Status == Entity.TaskStatus.WaitingToExecute)
-                    {
-                        var tunnel = obj.Entity.Targets.FirstOrDefault(v => v.HasFlag(DeviceFlags.巷道));
-                        //开始对任务进行处理
-                        taskInfo.Status = Entity.TaskStatus.ConveyorExecution;
-                        taskInfo.StartTime = DateTime.Now;
-                        taskInfo.SrmStation = taskInfo.AddrFrom;
-                        taskInfo.LastInteractionPoint = obj.Entity.Code;
-                        taskInfo.Tunnel = tunnel.Code;
-                        taskInfo.Height = 2;
-                        taskInfo.Device = obj.Entity.Code switch
-                        {
-                            "2527" => "SRM1",
-                            "2727" => "SRM2",
-                            "2528" => "SRM1",
-                            "2728" => "SRM2",
-                            _ => taskInfo.Device
-                        };
-                        ;
-                        taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, "开始执行入库任务");
-                        db.Updateable(taskInfo).ExecuteCommand();
-
-                        task = taskInfo;
-                    }
-                    else return;
-                });
-            }
-            catch (Exception ex)
-            {
-                throw new KnownException(ex.Message, LogLevelEnum.High);
-            }
-            if (task == null) return;
-
-            World.Log($"任务处理:开始-DB520[{obj.Data.TaskNumber}]-[{obj.Data.VoucherNo}]-DB521[{obj.Data2.TaskNumber}]-[{obj.Data2.VoucherNo}]");
-            obj.Data.TaskNumber = task.ID;
-            obj.Data.VoucherNo++;
-            World.Log($"任务处理:结束-DB520[{obj.Data.TaskNumber}]-[{obj.Data.VoucherNo}]-DB521[{obj.Data2.TaskNumber}]-[{obj.Data2.VoucherNo}]");
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(Extensions.DeviceFlags.一楼叠盘机);
-        }
-    }
-}

+ 0 - 96
WCS.WorkEngineering/Systems/一楼扫码入库.cs

@@ -1,96 +0,0 @@
-using ServiceCenter.Logs;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.BCR;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.WebApi.Controllers;
-using WCS.WorkEngineering.WebApi.Models.WMS.Request;
-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, IStation91, IBCR81>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation520, IStation521, IStation523, IStation91, IBCR81> obj)
-        {
-            obj.入库站点是否被禁止();
-            obj.入库站点是否满足执行条件();
-
-            WCS_TaskInfo task = null;//处理完成的任务
-            try
-            {
-                SqlSugarHelper.Do(_db =>
-                {
-                    var db = _db.Default;
-                    //获取托盘条码
-                    var barcode = obj.Data5.GetBCRCode();
-                    //var barcode = "TAP00001";
-                    //验证是否有对应的任务
-                    if (!db.Queryable<WCS_TaskInfo>().Any(v => v.BarCode == barcode))
-                    {
-                        var res = WmsApi.OneFloorWorkerBuildEmptyPalletsStock(new OneFloorWorkerBuildEmptyPalletsStockRequest()
-                        {
-                            PalletCode = barcode,
-                            StartLoc = obj.Entity.Code,
-                            Height = 1
-                        });
-                        if (res.ResCode == WebApi.Models.WMS.Response.ResponseStatusCodeEnum.Sucess) return;
-                    }
-                    //找到对应的任务
-                    var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.BarCode == barcode);
-                    if (taskInfo.Status == Entity.TaskStatus.WaitingToExecute)
-                    {
-                        var tunnel = obj.Entity.Targets.FirstOrDefault(v => v.HasFlag(DeviceFlags.巷道));
-                        //开始对任务进行处理
-                        taskInfo.Status = Entity.TaskStatus.ConveyorExecution;
-                        taskInfo.StartTime = DateTime.Now;
-                        taskInfo.SrmStation = taskInfo.AddrFrom;
-                        taskInfo.LastInteractionPoint = obj.Entity.Code;
-                        taskInfo.Tunnel = tunnel.Code;
-                        taskInfo.Height = 1;
-                        taskInfo.Device = obj.Entity.Code switch
-                        {
-                            "2532" => "SRM1",
-                            "2732" => "SRM2",
-                            _ => taskInfo.Device
-                        };
-                        ;
-                        taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, "开始执行入库任务");
-                        db.Updateable(taskInfo).ExecuteCommand();
-                        task = taskInfo;
-                    }
-                    else return;
-                });
-            }
-            catch (Exception ex)
-            {
-                throw new KnownException(ex.Message, LogLevelEnum.High);
-            }
-            if (task == null) return;
-
-            World.Log($"任务处理:开始-DB520[{obj.Data.TaskNumber}]-[{obj.Data.VoucherNo}]-DB521[{obj.Data2.TaskNumber}]-[{obj.Data2.VoucherNo}]-[{obj.Data2.Request}]");
-            obj.Data.TaskNumber = task.ID;
-            obj.Data.VoucherNo++;
-            World.Log($"任务处理:结束-DB520[{obj.Data.TaskNumber}]-[{obj.Data.VoucherNo}]-DB521[{obj.Data2.TaskNumber}]-[{obj.Data2.VoucherNo}]");
-        }
-
-        public override bool Select(Device dev)
-        {
-            //return dev.Code == "2532";
-            return dev.HasFlag(Extensions.DeviceFlags.一楼扫码);
-        }
-    }
-}

+ 0 - 49
WCS.WorkEngineering/Systems/二楼拆盘机自动补空托盘组.cs

@@ -1,49 +0,0 @@
-using ServiceCenter.Extensions;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.WebApi.Controllers;
-using WCS.WorkEngineering.WebApi.Models.WMS.Request;
-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;
-
-        public override void Do(Device<IStation520, IStation521, IStation523> obj)
-        {
-            // 拆盘机没有光电
-            if (obj.Data3.Status1.HasFlag(StationStatus1.RES14)) return;
-            var tunnel = obj.Entity.Sources.Where(x => x.HasFlag(DeviceFlags.输送机)) //堆垛机取货点设备
-                .SelectMany(x => x.Sources)
-                .FirstOrDefault(x => x.HasFlag(DeviceFlags.巷道));
-            SqlSugarHelper.Do(_db =>
-            {
-                var db = _db.Default;
-
-                //验证是否有对应的任务
-                if (!db.Queryable<WCS_TaskInfo>().Any(v => v.AddrTo == obj.Entity.Code))
-                {
-                    var res = WmsApi.ApplyEmptyPalletGroupOutStorage(obj.Entity.Code, tunnel.Code.GetLastDigit(), obj.Entity.HasFlag(DeviceFlags.拆盘机09) ? PalletType.Pallet09 : PalletType.PalletNo09);
-                }
-            });
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(DeviceFlags.拆盘机09) || dev.HasFlag(DeviceFlags.拆盘机非09);
-        }
-    }
-}

+ 0 - 232
WCS.WorkEngineering/Systems/分拣主线/分线计算09.cs

@@ -1,232 +0,0 @@
-using ServiceCenter.Extensions;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.Station;
-using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  分线计算09
-    /// </summary>
-    //[BelongTo(typeof(NoInteractionWorld))]
-    [Description("分线计算09")]
-    public class 分线计算09 : DeviceSystem<Device<IStation520>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation520> obj)
-        {
-            //SqlSugarHelper.Do(_db =>
-            //{
-            //    //获取所有待执行的任务
-            //    var db = _db.Default;
-            //    var taskList = db.Queryable<WCS_TaskInfo>().Where(x => x.Status == TaskStatus.WaitingToExecute && x.Type == TaskType.SetPlate && x.AddrFrom == "Robot").Take(1).ToList();
-            //    //开始对任务进行处理
-            //    foreach (var taskInfo in taskList)
-            //    {
-            //        //TODO:暂时不来考虑动态计算可前往的目标
-            //        var nextAdd = taskInfo.WarehouseCode switch
-            //        {
-            //            "1N" => "455",
-            //            "1S" => "455",
-            //            "2N" => "455",
-            //            "2S" => "455",
-            //            "3N" => "455",
-            //            "3S" => "455",
-            //            _ => "0"
-            //        };
-            //        //获取这个地址的下一个地址集合
-            //        var cacheLineDevList = Device.All.First(x => x.Code == nextAdd).Targets.Where(x => x.HasFlag(DeviceFlags.桁架缓存放行点));
-            //        var cacheLineCodes = cacheLineDevList.Select(x => x.Code.ToShort());
-            //        var cacheLineList = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).ToList();
-
-            //        #region 跟据缓存信息寻找可以到达的缓存点
-
-            //        //找到当前任务可用的缓存线信息
-            //        var cacheLine = cacheLineList.Where(x => x.Locations.Any(l => l is { InStock: false, IsEmpty: false })).FirstOrDefault(x => cacheLineCodes.Contains(x.LocationNo) && x.MatCodeList.Contains(taskInfo.MatCode) && !x.InStock);
-
-            //        if (cacheLine != null)//这个任务可以直接去一条线体,不需要新建缓存信息
-            //        {
-            //            //找到这条线体中序号最小的一条位信息 非空置且无货
-            //            var cacheLoc = cacheLine.Locations.Where(x => x is { InStock: false, IsEmpty: false }).MinBy(x => x.XYNo);
-            //            if (cacheLoc != null)
-            //            {
-            //                cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
-            //                cacheLoc.InStock = true;
-            //                cacheLoc.TaskId = taskInfo.ID;
-            //                cacheLoc.EditTime = DateTime.Now;
-            //                db.Updateable(cacheLoc).ExecuteCommand();
-
-            //                //WCS任务相关信息
-            //                taskInfo.Status = TaskStatus.FinishOfShunt;
-            //                taskInfo.AddrNext = cacheLine.LocationNo.ToString();
-            //                taskInfo.EditWho = "WCS";
-            //                taskInfo.EditTime = DateTime.Now;
-            //                taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
-            //                db.Updateable(taskInfo).ExecuteCommand();
-            //                taskInfo.UpdateRedisHash();
-            //                return;
-            //            }
-            //        }
-
-            //        #endregion 跟据缓存信息寻找可以到达的缓存点
-
-            //        #region 初始化一个信息的缓存信息
-
-            //        //找到所有当前轮子可以去的垛形
-            //        var palletizingList = db.Queryable<WCS_Palletizing>()
-            //            .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
-            //            .Where(x => x.MatCodeList.Contains(taskInfo.MatCode) && !x.Finish).ToList().Where(x => x.Layers.SelectMany(x => x.Rows).Any(r => r.LineCode == null)).OrderBy(x => x.AddTime).ToList();
-            //        //如果没有对应的垛形信息就初始化一个垛形信息
-            //        if (palletizingList.Count <= 0)
-            //        {
-            //            taskInfo.InitStackStructure();
-            //            return;
-            //        }
-            //        foreach (var palletizing in palletizingList)
-            //        {
-            //            //TODO:当前不考虑不按顺序码垛的情况
-            //            //按码垛顺序找到一个最近的没有码垛成功的行,
-            //            //先找层:未空置、未结束 TODO:暂不考虑所有层全部结束,但是垛形信息未清除的情况
-            //            var palletizingLayer = palletizing.Layers
-            //                .Where(x => !x.IsEmpty)
-            //                .Where(x => !x.Finish)
-            //                .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
-            //                .Where(x => x.Rows.Any(r => r.CacheLineId == 0))
-            //                .MinBy(x => x.LayerNo);
-            //            //如果没有哪一层需要这个物料号,就初始化一个新的垛形信息
-            //            if (palletizingLayer == null)
-            //            {
-            //                taskInfo.InitStackStructure();
-            //                return;
-            //            }
-
-            //            //再找行:未空置、未结束
-            //            var palletizingRow = palletizingLayer.Rows.Where(x => x is { IsEmpty: false, Finish: false } && x.MatCodeList.Contains(taskInfo.MatCode) && x.CacheLineId == 0)
-            //                .MinBy(x => x.RowNo);
-            //            //如果没有哪一行需要这个物料号,就初始化一个新的垛形信息
-            //            if (palletizingRow == null)
-            //            {
-            //                taskInfo.InitStackStructure();
-            //                return;
-            //            }
-            //            //走到这一步就表示没有哪一段线体缓存了当前物料,需要选一段新的线体进行缓存
-
-            //            //TODO:暂时不处理就近分线的逻辑
-            //            //获取一个当前可以使用的分配锁
-            //            var devCode = cacheLineDevList.Select(x => x.Code.ToShort()).FirstOrDefault(x => !cacheLineList.Select(s => s.LocationNo).Contains(x));
-            //            if (devCode == 0)
-            //            {
-            //                World.Log($"无可用线体:{taskInfo.ID}");
-            //                return;
-            //            }
-
-            //            //开始初始化缓存位信息
-            //            cacheLine = new WCS_CacheLine()
-            //            {
-            //                LocationNo = devCode,
-            //                AddTime = DateTime.Now,
-            //                PalletizingRowId = palletizingRow.Id,
-            //                InStock = false,
-            //                Put = false,
-            //                MatCodeList = palletizingRow.MatCodeList
-            //            };
-
-            //            var res = db.Insertable(cacheLine).ExecuteReturnEntity();
-            //            palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
-            //            palletizingRow.Locs = palletizingRow.Locs.OrderBy(x => x.XYNo).ToList();
-            //            palletizingRow.CacheLineId = res.Id;
-            //            palletizingRow.EditTime = DateTime.Now;
-            //            db.Updateable(palletizingRow).ExecuteCommand();
-
-            //            for (var i = 0; i < palletizingRow.Locs.Count; i++)
-            //            {
-            //                var loc = new WCS_CacheLineLoc()
-            //                {
-            //                    XYNo = palletizingRow.Locs[i].XYNo,
-            //                    InStock = i == 0,
-            //                    IsEmpty = palletizingRow.Locs[i].IsEmpty,
-            //                    MatCode = palletizingRow.Locs[i].MatCode,
-            //                    TaskId = i == 0 ? taskInfo.ID : 0,
-            //                    CacheLineId = res.Id
-            //                };
-            //                db.Insertable(loc).ExecuteCommand();
-            //            }
-
-            //            taskInfo.Status = TaskStatus.FinishOfShunt;
-            //            taskInfo.AddrNext = devCode.ToString();
-            //            taskInfo.EditWho = "WCS";
-            //            taskInfo.EditTime = DateTime.Now;
-            //            taskInfo.AddWCS_TASK_DTL(_db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
-            //            db.Updateable(taskInfo).ExecuteCommand();
-            //            taskInfo.UpdateRedisHash();
-            //            return;
-            //        }
-
-            //        #endregion 初始化一个信息的缓存信息
-            //    }
-            //});
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.Code == nameof(分线计算09);
-        }
-    }
-
-    public class LineCache
-    {
-        /// <summary>
-        ///  位置
-        /// </summary>
-        public string Location { get; set; }
-
-        /// <summary>
-        /// 是否放行
-        /// </summary>
-        public bool IsPut { get; set; }
-
-        /// <summary>
-        ///  具体缓存信息
-        /// </summary>
-        public List<LineCacheInfo> LineInfos { get; set; }
-    }
-
-    /// <summary>
-    ///  线体缓存组员
-    /// </summary>
-    public class LineCacheInfo
-    {
-        /// <summary>
-        ///  序号
-        /// </summary>
-        public string Index { get; set; }
-
-        /// <summary>
-        /// 物料号
-        /// </summary>
-        public string MatCode { get; set; }
-
-        /// <summary>
-        ///  任务号
-        /// </summary>
-        public int TaskNumber { get; set; }
-
-        /// <summary>
-        ///  是否有货
-        /// </summary>
-        public bool InStock { get; set; }
-
-        /// <summary>
-        ///  是否空置
-        /// </summary>
-        public bool IsEmpty { get; set; }
-    }
-}

+ 0 - 35
WCS.WorkEngineering/Systems/分拣主线/湿拉满轮帘线芯股第一次扫码.cs

@@ -1,35 +0,0 @@
-using System.ComponentModel;
-using WCS.Core;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.BCR;
-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(SortingMainLineWorld))]
-    [Description("湿拉满轮帘线芯股第一次扫码")]
-    public class 湿拉满轮帘线芯股第一次扫码 : DeviceSystem<Device<IStation520, IStation521, IStation523, IBCR83>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation520, IStation521, IStation523, IBCR83> obj)
-        {
-            var bcrCodeList = obj.Data4.GetBcrCodeList();
-            //获取当前站台对应的编码信息
-            //WmsApi.EnteMainLine(bcrCodeList, obj.Entity.Code);
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(DeviceFlags.满轮主线第一次扫码);
-        }
-    }
-}

+ 0 - 116
WCS.WorkEngineering/Systems/分拣主线/满轮主线预写入目标地址.cs

@@ -1,116 +0,0 @@
-using Castle.Core.Internal;
-using Newtonsoft.Json;
-using ServiceCenter.Extensions;
-using ServiceCenter.Logs;
-using ServiceCenter.Redis;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.BCR;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.Worlds;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  满轮主线预写入目标地址
-    /// </summary>
-    [BelongTo(typeof(SortingMainLineWorld))]
-    [Description("满轮主线预写入目标地址")]
-    public class 满轮主线预写入目标地址 : DeviceSystem<Device<IStation523, IBCR83, IStation525>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation523, IBCR83, IStation525> obj)
-        {
-            //待处理条码组
-            var pendingBcrList = obj.Data2.GetBcrCodeList().Where(x => !x.IsNullOrEmpty());
-            //缓存条码组
-            var cacheBcrList = obj.Data3.GetBcrCodeList();
-            var codes = pendingBcrList.Where(x => !cacheBcrList.Contains(x));
-            World.Log($"预分配点:{JsonConvert.SerializeObject(cacheBcrList)}");
-            //循环处理所有缓存条码组中没有的条码
-            foreach (var bcrCode in codes)
-            {
-                //取出预分配地址,并计算相关信息
-                var key = $"AllocationWarehouseSort:{bcrCode}";
-                var value = RedisHub.WMS.Get(key);
-                if (value == null)
-                {
-                    World.Log($"{bcrCode}:找不到分库记录", LogLevelEnum.High);
-                    continue;
-                }
-                var mainlineDiversion = JsonConvert.DeserializeObject<MainlineDiversion>(value);
-                var srmCode = mainlineDiversion.WarehouseCode.WarehouseToSrm();
-                var next = DevicePath.GetPath(obj.Entity.Code, srmCode).Points[1].Code;
-
-                //开始检查任务信息
-                var db = new SqlSugarHelper();
-                var task = db.Default.Queryable<WCS_TaskInfo>().Single(x => x.BarCode == bcrCode && x.ID == mainlineDiversion.TaskId && x.Status == TaskStatus.NewBuild);
-                if (task == null)
-                {
-                    World.Log($"{bcrCode}-{mainlineDiversion}:找不到匹配任务", LogLevelEnum.High);
-                    continue;
-                }
-
-                try
-                {
-                    db.Connect.BeginTran();
-                    task.Status = TaskStatus.WaitingToExecute;
-                    task.EditWho = "WCS";
-                    task.EditTime = DateTime.Now;
-                    db.Default.Updateable(task).ExecuteCommand();
-                    task.AddWCS_TASK_DTL(db.Default, obj.Entity.Code, next.ToString(), "任务完成预分流");
-                    db.Connect.CommitTran();
-                }
-                catch (Exception e)
-                {
-                    db.Connect.RollbackTran();
-                    World.Log($"{bcrCode}-{mainlineDiversion}:----{e.Message}", LogLevelEnum.High);
-                    continue;
-                }
-
-                //开始赋值
-                obj.Data3.GetType().GetProperty($"BcrCode{obj.Data3.NextIndex}").SetValue(obj.Data3, bcrCode);
-                obj.Data3.GetType().GetProperty($"TaskNumber{obj.Data3.NextIndex}").SetValue(obj.Data3, task.ID);
-                obj.Data3.GetType().GetProperty($"GoodsEnd{obj.Data3.NextIndex}").SetValue(obj.Data3, next.ToShort());
-                if (obj.Data3.NextIndex >= 49)
-                {
-                    obj.Data3.NextIndex = 0;
-                }
-                else
-                {
-                    obj.Data3.NextIndex++;
-                }
-            }
-
-            World.Log($"预分配信息:{JsonConvert.SerializeObject(obj.Data3.GetBcrCodeList())}");
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.Code == "18";
-        }
-    }
-
-    /// <summary>
-    ///  主线分流
-    /// </summary>
-    public class MainlineDiversion
-    {
-        /// <summary>
-        ///  任务号
-        /// </summary>
-        public int TaskId { get; set; }
-
-        /// <summary>
-        ///  仓库号
-        /// </summary>
-        public string WarehouseCode { get; set; }
-    }
-}

+ 0 - 47
WCS.WorkEngineering/Systems/分拣支线/桁架分流点.cs

@@ -1,47 +0,0 @@
-using ServiceCenter.Extensions;
-using ServiceCenter.Logs;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.Worlds;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  桁架分流点
-    /// </summary>
-    [BelongTo(typeof(SortingBranchWorld))]
-    [Description("桁架分流点")]
-    public class 桁架分流点 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation520, IStation521, IStation523> obj)
-        {
-            if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
-            if (obj.Data3.Status.HasFlag(StationStatus.Run)) throw new KnownException("设备运行中", LogLevelEnum.Low);
-            if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low);
-            if (obj.Data2.Request != 1) throw new KnownException("无请求", LogLevelEnum.Mid);
-
-            var db = new SqlSugarHelper();
-            var taskInfo = db.Default.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == TaskStatus.FinishOfShunt) ?? throw new KnownException("未找到对应的WCS任务", LogLevelEnum.Mid);
-
-            obj.Data.TaskNumber = obj.Data2.TaskNumber;
-            obj.Data.GoodsStart = obj.Entity.Code.ToShort();
-            obj.Data.GoodsEnd = taskInfo.AddrNext.ToShort();
-            obj.Data.VoucherNo++;
-            World.Log($"执行记录:任务号[{obj.Data2.TaskNumber}][{obj.Data.VoucherNo}]");
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(Extensions.DeviceFlags.桁架分流点);
-        }
-    }
-}

+ 0 - 372
WCS.WorkEngineering/Systems/分拣支线/环形库分流点.cs

@@ -1,372 +0,0 @@
-using PlcSiemens.Core.Extension;
-using ServiceCenter.Extensions;
-using ServiceCenter.Logs;
-using ServiceCenter.SqlSugars;
-using SqlSugar;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.Worlds;
-using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  分流点
-    /// </summary>
-    [BelongTo(typeof(SortingBranchWorld))]
-    [Description("环形库分流点")]
-    public class 环形库分流点 : DeviceSystem<Device<IStation520, IStation521, IStation523, IStation91>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation520, IStation521, IStation523, IStation91> obj)
-        {
-            if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
-            if (obj.Data3.Status.HasFlag(StationStatus.Run)) throw new KnownException("设备运行中", LogLevelEnum.Low);
-            if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low);
-            if (obj.Data2.Request != 1) throw new KnownException("无请求", LogLevelEnum.Mid);
-
-            //处理异常任务
-            if (obj.Data2.TaskNumber == 1)
-            {
-                obj.Data.TaskNumber = 591;
-                obj.Data.GoodsStart = obj.Entity.Code.ToShort();
-                obj.Data.GoodsEnd = 591;
-                obj.Data.VoucherNo++;
-                World.Log($"执行记录:任务号[{591}]-[{obj.Data.VoucherNo}]");
-            }
-
-            var isPut = false;
-            short nextAdd = 0;
-            SqlSugarHelper.Do(_db =>
-            {
-                var db = _db.Default;
-                var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == TaskStatus.WaitingToExecute) ?? throw new KnownException($"未找到对应的WCS任务{obj.Data2.TaskNumber}", LogLevelEnum.Mid);
-                switch (obj.Data4.Length)
-                {
-                    case 9:
-                        isPut = Allot09Or18(db, taskInfo, obj);
-                        nextAdd = 455;
-                        break;
-
-                    case 18:
-                        nextAdd = 442;
-                        taskInfo.AddrNext = nextAdd.ToString();
-                        taskInfo.Status = TaskStatus.FinishOfShunt;
-                        taskInfo.EditTime = DateTime.Now;
-                        taskInfo.WarehouseCode += "R";
-                        taskInfo.AddrTo = "Robot";
-                        taskInfo.GoodsType = obj.Data4.Length.ToInt();
-                        db.Updateable(taskInfo).ExecuteCommand();
-                        taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, nextAdd.ToString(), "环形库分流");
-                        isPut = true;
-                        obj.Data.CmdType = StationCmd.Res6;
-                        break;
-
-                    case 50:
-                        nextAdd = 424;
-                        taskInfo.AddrNext = nextAdd.ToString();
-                        taskInfo.Status = TaskStatus.FinishOfShunt;
-                        taskInfo.EditTime = DateTime.Now;
-                        taskInfo.WarehouseCode += "R";
-                        taskInfo.AddrTo = "Robot";
-                        taskInfo.GoodsType = obj.Data4.Length.ToInt();
-                        db.Updateable(taskInfo).ExecuteCommand();
-                        taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, nextAdd.ToString(), "环形库分流");
-                        isPut = true;
-                        break;
-
-                    case 34:
-                        nextAdd = 433;
-                        taskInfo.AddrNext = nextAdd.ToString();
-                        taskInfo.Status = TaskStatus.FinishOfShunt;
-                        taskInfo.EditTime = DateTime.Now;
-                        taskInfo.WarehouseCode += "R";
-                        taskInfo.AddrTo = "Robot";
-                        taskInfo.GoodsType = obj.Data4.Length.ToInt();
-                        db.Updateable(taskInfo).ExecuteCommand();
-                        taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, nextAdd.ToString(), "环形库分流");
-                        isPut = true;
-                        break;
-                }
-            });
-            if (!isPut) return;
-            obj.Data.TaskNumber = obj.Data2.TaskNumber;
-            obj.Data.GoodsStart = obj.Entity.Code.ToShort();
-            obj.Data.GoodsEnd = nextAdd;
-            obj.Data.VoucherNo++;
-            World.Log($"执行记录:任务号[{obj.Data2.TaskNumber}]-[{obj.Data.VoucherNo}]");
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(DeviceFlags.环形库分流点);
-        }
-
-        /// <summary>
-        ///  计算非零九或18的去向
-        /// </summary>
-        /// <param name="db"></param>
-        /// <param name="taskInfo"></param>
-        /// <param name="obj"></param>
-        /// <returns></returns>
-        public bool AllotNot09Or18(SqlSugarScopeProvider db, WCS_TaskInfo taskInfo, Device<IStation520, IStation521, IStation523, IStation91> obj)
-        {
-            return false;
-        }
-
-        /// <summary>
-        ///  计算09/18去向
-        /// </summary>
-        /// <param name="db"></param>
-        /// <param name="taskInfo"></param>
-        /// <param name="obj"></param>
-        /// <returns></returns>
-        public bool Allot09Or18(SqlSugarScopeProvider db, WCS_TaskInfo taskInfo, Device<IStation520, IStation521, IStation523, IStation91> obj)
-        {
-            //TODO:暂时不来考虑动态计算可前往的目标
-            var nextAdd = taskInfo.WarehouseCode switch
-            {
-                "1N" => "455",
-                "1S" => "455",
-                "2N" => "455",
-                "2S" => "455",
-                "3N" => "455",
-                "3S" => "455",
-                _ => "0"
-            };
-            //获取这个地址的下一个地址集合
-            var cacheLineDevList = Device.All.First(x => x.Code == nextAdd).Targets.Where(x => x.HasFlag(DeviceFlags.桁架缓存放行点));
-            var cacheLineCodes = cacheLineDevList.Select(x => x.Code.ToShort());
-            var cacheLineList = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).ToList();
-
-            #region 跟据缓存信息寻找可以到达的缓存点
-
-            //找到当前任务可用的缓存线信息
-            var cacheLine = cacheLineList.Where(x => x.Locations.Any(l => l is { InStock: false, IsEmpty: false })).FirstOrDefault(x => cacheLineCodes.Contains(x.LocationNo) && x.MatCodeList.Contains(taskInfo.MatCode) && !x.InStock);
-
-            if (cacheLine != null)//这个任务可以直接去一条线体,不需要新建缓存信息
-            {
-                //找到这条线体中序号最小的一条位信息 非空置且无货
-                var cacheLoc = cacheLine.Locations.Where(x => x is { InStock: false, IsEmpty: false }).MinBy(x => x.XYNo);
-                if (cacheLoc != null)
-                {
-                    cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
-                    cacheLoc.InStock = true;
-                    cacheLoc.TaskId = taskInfo.ID;
-                    cacheLoc.EditTime = DateTime.Now;
-                    db.Updateable(cacheLoc).ExecuteCommand();
-
-                    //WCS任务相关信息
-                    taskInfo.Status = TaskStatus.FinishOfShunt;
-                    taskInfo.AddrNext = cacheLine.LocationNo.ToString();
-                    taskInfo.EditWho = "WCS";
-                    taskInfo.EditTime = DateTime.Now;
-                    taskInfo.GoodsType = obj.Data4.Length.ToInt();
-                    db.Updateable(taskInfo).ExecuteCommand();
-                    taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
-
-                    return true;
-                }
-            }
-
-            #endregion 跟据缓存信息寻找可以到达的缓存点
-
-            #region 初始化一个信息的缓存信息
-
-            //TODO:暂时不处理就近分线的逻辑
-            var devCode = cacheLineDevList.Select(x => x.Code.ToShort()).FirstOrDefault(x => !cacheLineList.Select(s => s.LocationNo).Contains(x));
-            if (devCode == 0)
-            {
-                World.Log($"无可用线体:{taskInfo.ID}");
-                return false;
-            }
-            var result = false;
-
-            //未结束且包含当前物料编号的垛形,按时间排序,创建时间早的优先分配
-            var palletizingList = db.Queryable<WCS_Palletizing>()
-                .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
-                .Where(x => !x.Finish)
-                .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
-                .OrderBy(x => x.AddTime)
-                .ToList();
-
-            foreach (var palletizing in palletizingList)
-            {
-                //当前任务已经分配结束,进入下一次迭代
-                if (result) continue;
-
-                //未结束且包含当前物料编号的层,按层号排序,层号小的优先分配
-                var layers = palletizing.Layers.Where(x => x is { IsEmpty: false, Finish: false })
-                    .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
-                    .OrderBy(x => x.LayerNo)
-                    .ToList();
-
-                //未找到可用层,进入下一次迭代
-                if (!layers.Any()) continue;
-                foreach (var layer in layers)
-                {
-                    //当前任务已经分配结束,进入下一次迭代
-                    if (result) continue;
-
-                    //未结束,未预分配缓存线信息且包含当前物料编号的行,行号小的优先分配
-                    var rows = layer.Rows.Where(x => x is { IsEmpty: false, Finish: false })
-                        .Where(x => x.CacheLineId == 0)
-                        .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
-                        .ToList();
-                    //未找到可用行,进入下一次迭代
-                    if (!rows.Any()) continue;
-                    var palletizingRow = rows.MinBy(x => x.RowNo);
-
-                    //开始初始化缓存位信息
-                    cacheLine = new WCS_CacheLine()
-                    {
-                        LocationNo = devCode,
-                        AddTime = DateTime.Now,
-                        PalletizingRowId = palletizingRow.Id,
-                        InStock = false,
-                        Put = false,
-                        IsTruss = false,
-                        MatCodeList = palletizingRow.MatCodeList
-                    };
-
-                    var res = db.Insertable(cacheLine).ExecuteReturnEntity();
-                    palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
-                    palletizingRow.Locs = palletizingRow.Locs.OrderBy(x => x.XYNo).ToList();
-                    palletizingRow.CacheLineId = res.Id;
-                    palletizingRow.EditTime = DateTime.Now;
-                    db.Updateable(palletizingRow).ExecuteCommand();
-
-                    for (var i = 0; i < palletizingRow.Locs.Count; i++)
-                    {
-                        var loc = new WCS_CacheLineLoc()
-                        {
-                            XYNo = palletizingRow.Locs[i].XYNo,
-                            InStock = i == 0,
-                            IsEmpty = palletizingRow.Locs[i].IsEmpty,
-                            MatCode = palletizingRow.Locs[i].MatCode,
-                            TaskId = i == 0 ? taskInfo.ID : 0,
-                            CacheLineId = res.Id
-                        };
-                        db.Insertable(loc).ExecuteCommand();
-                    }
-
-                    taskInfo.Status = TaskStatus.FinishOfShunt;
-                    taskInfo.AddrNext = devCode.ToString();
-                    taskInfo.EditWho = "WCS";
-                    taskInfo.EditTime = DateTime.Now;
-                    taskInfo.GoodsType = obj.Data4.Length.ToInt();
-                    db.Updateable(taskInfo).ExecuteCommand();
-                    taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
-                    result = true;
-                }
-            }
-
-            if (!result)
-            {
-                taskInfo.InitStackStructure(db);
-            }
-            return result;
-            ////找到所有当前轮子可以去的垛形
-            //var palletizingList = db.Queryable<WCS_Palletizing>()
-            //    .Includes(x => x.Layers, r => r.Rows, l => l.Locs)
-            //    .Where(x => x.MatCodeList.Contains(taskInfo.MatCode) && !x.Finish).ToList()
-            //    .Where(x => x.Layers.SelectMany(x => x.Rows).Any(r => r.LineCode == null))
-            //    .OrderBy(x => x.AddTime).ToList();
-            ////如果没有对应的垛形信息就初始化一个垛形信息
-            //if (palletizingList.Count <= 0)
-            //{
-            //    taskInfo.InitStackStructure(db);
-            //    return false;
-            //}
-
-            //var b = palletizingList.Select(palletizing => palletizing.Layers
-            //        .Where(x => !x.IsEmpty)
-            //        .Where(x => !x.Finish)
-            //        .Where(x => x.MatCodeList.Contains(taskInfo.MatCode))
-            //        .Where(x => x.Rows.Any(r => r is { IsEmpty: false, Finish: false } && r.MatCodeList.Contains(taskInfo.MatCode) && r.CacheLineId == 0))
-            //        .MinBy(x => x.LayerNo)).Where(x => x != null);
-
-            //foreach (var palletizingLayer in b)
-            //{
-            //    //如果没有哪一层需要这个物料号,就初始化一个新的垛形信息
-            //    if (palletizingLayer == null)
-            //    {
-            //        taskInfo.InitStackStructure(db);
-            //        return false;
-            //    }
-
-            //    //再找行:未空置、未结束
-            //    var palletizingRow = palletizingLayer.Rows.Where(x => x is { IsEmpty: false, Finish: false } && x.MatCodeList.Contains(taskInfo.MatCode) && x.CacheLineId == 0)
-            //        .MinBy(x => x.RowNo);
-            //    //如果没有哪一行需要这个物料号,就初始化一个新的垛形信息
-            //    if (palletizingRow == null)
-            //    {
-            //        taskInfo.InitStackStructure(db);
-            //        return false;
-            //    }
-            //    //走到这一步就表示没有哪一段线体缓存了当前物料,需要选一段新的线体进行缓存
-
-            //    //TODO:暂时不处理就近分线的逻辑
-            //    //获取一个当前可以使用的分配锁
-            //    var devCode = cacheLineDevList.Select(x => x.Code.ToShort()).FirstOrDefault(x => !cacheLineList.Select(s => s.LocationNo).Contains(x));
-            //    if (devCode == 0)
-            //    {
-            //        World.Log($"无可用线体:{taskInfo.ID}");
-            //        return false;
-            //    }
-
-            //    //开始初始化缓存位信息
-            //    cacheLine = new WCS_CacheLine()
-            //    {
-            //        LocationNo = devCode,
-            //        AddTime = DateTime.Now,
-            //        PalletizingRowId = palletizingRow.Id,
-            //        InStock = false,
-            //        Put = false,
-            //        IsTruss = false,
-            //        MatCodeList = palletizingRow.MatCodeList
-            //    };
-
-            //    var res = db.Insertable(cacheLine).ExecuteReturnEntity();
-            //    palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.Locs).Single(x => x.Id == palletizingRow.Id);
-            //    palletizingRow.Locs = palletizingRow.Locs.OrderBy(x => x.XYNo).ToList();
-            //    palletizingRow.CacheLineId = res.Id;
-            //    palletizingRow.EditTime = DateTime.Now;
-            //    db.Updateable(palletizingRow).ExecuteCommand();
-
-            //    for (var i = 0; i < palletizingRow.Locs.Count; i++)
-            //    {
-            //        var loc = new WCS_CacheLineLoc()
-            //        {
-            //            XYNo = palletizingRow.Locs[i].XYNo,
-            //            InStock = i == 0,
-            //            IsEmpty = palletizingRow.Locs[i].IsEmpty,
-            //            MatCode = palletizingRow.Locs[i].MatCode,
-            //            TaskId = i == 0 ? taskInfo.ID : 0,
-            //            CacheLineId = res.Id
-            //        };
-            //        db.Insertable(loc).ExecuteCommand();
-            //    }
-
-            //    taskInfo.Status = TaskStatus.FinishOfShunt;
-            //    taskInfo.AddrNext = devCode.ToString();
-            //    taskInfo.EditWho = "WCS";
-            //    taskInfo.EditTime = DateTime.Now;
-            //    taskInfo.GoodsType = obj.Data4.Length.ToInt();
-            //    db.Updateable(taskInfo).ExecuteCommand();
-            //    taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, $"完成分库计算,目标地址:{cacheLine.LocationNo}");
-
-            //    return true;
-            //}
-
-            #endregion 初始化一个信息的缓存信息
-        }
-    }
-}

+ 0 - 62
WCS.WorkEngineering/Systems/机台叫料生成AGV任务.cs

@@ -1,62 +0,0 @@
-using ServiceCenter.Extensions;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-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;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    [BelongTo(typeof(MainWorld))]
-    [Description("机台叫料生成AGV任务")]
-    public class 机台叫料生成AGV任务 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation520, IStation521, IStation523> obj)
-        {
-            //var res = AgvApi.测试路径("2533", "12346");
-            //var res = AgvApi.机台叫料("2534", "LX32", Guid.NewGuid().ToString().Replace("-", ""));
-            //var res = AgvApi.托盘回库("LX32", Guid.NewGuid().ToString().Replace("-",""));
-
-            if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status)) return;
-            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;
-                //开始创建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;
-                var agvId = DateTime.Now.GetFormat(GetFormatterEnum.only) /*SnowFlakeSingle.instance.getID()*/;
-
-                var res = AgvApi.机台叫料(obj.Entity.Code, "1NC318", agvId);
-                agvTask.AgvID = agvId;
-                agvTask.Status = AGVTaskStatus.Confirm;
-                agvTask.AgvStatus = AGVTaskStatus.Confirm;
-                db.Updateable(agvTask).SplitTable().ExecuteCommand();
-                task.Status = TaskStatus.AGVExecution;
-                task.AgvTaskID = agvTask.ID;
-                task.Updateable(db);
-                task.AddWCS_TASK_DTL(db, obj.Entity.Code, "AGV", $"任务下发至AGV{agvId}");
-            });
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(DeviceFlags.AGV取货站台口);
-        }
-    }
-}

+ 0 - 359
WCS.WorkEngineering/Systems/桁架码垛/桁架.cs

@@ -1,359 +0,0 @@
-using ServiceCenter.Extensions;
-using ServiceCenter.Logs;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.Protocol.Truss;
-using WCS.WorkEngineering.Worlds;
-using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  桁架
-    /// </summary>
-    [BelongTo(typeof(SortingPalletizingWorld))]
-    [Description("桁架")]
-    public class 桁架 : DeviceSystem<Truss>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        /// <summary>
-        ///  取货点设备集合
-        /// </summary>
-        private readonly Dictionary<Device<IStation524, IStation523>, List<Device<IStation524, IStation523>>> _pickUpDevices = new();
-
-        public override void Do(Truss obj)
-        {
-            if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
-            if (obj.Data2.CmdType == 1)
-            {
-                SqlSugarHelper.Do(_db =>
-                {
-                    var db = _db.Default;
-                    List<int> ids = new List<int>() { obj.Data2.PalletizingRowId1, obj.Data2.PalletizingRowId2 };
-                    var palletizingRow = db.Queryable<WCS_PalletizingRow>().Includes(x => x.CacheLine, c => c.Locations).Includes(x => x.Locs).Where(x => ids.Contains(x.Id)).ToList();
-                    //更新行数据
-                    foreach (var pr in palletizingRow)
-                    {
-                        var cacheLine = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.Id == pr.CacheLine.Id);
-                        //先更新对应的位信息
-                        try
-                        {
-                            foreach (var loc in pr.Locs)
-                            {
-                                var cacheLoc = cacheLine.Locations.Single(x => x.XYNo == loc.XYNo);
-                                cacheLoc = db.Queryable<WCS_CacheLineLoc>().Single(x => x.Id == cacheLoc.Id);
-                                loc.TaskId = cacheLoc.TaskId;
-                                loc.Finish = true;
-                                db.Updateable(loc).ExecuteCommand();
-                                db.Deleteable(cacheLoc);
-                            }
-                        }
-                        catch (Exception a)
-                        {
-                            Console.WriteLine(a);
-                            throw;
-                        }
-                        pr.Finish = true;
-                        db.Updateable(pr).ExecuteCommand();
-                        db.Deleteable(cacheLine).ExecuteCommand();
-                    }
-                    //更新层数据
-                    var layerId = palletizingRow.FirstOrDefault().PalletizingLayerId;
-                    var layer = db.Queryable<WCS_PalletizingLayer>().Includes(x => x.Rows).Single(x => x.Id == layerId);
-                    if (!layer.Rows.All(x => x.Finish)) return;
-                    layer.Finish = true;
-                    db.Updateable(layer).ExecuteCommand();
-                });
-
-                obj.Data.CmdType = 1;
-
-                obj.Data.DestPosition_1 = 0;
-                obj.Data.TargetPallte1 = 0;
-                obj.Data.Task1_1 = 0;
-                obj.Data.Dest1_1 = 0;
-                obj.Data.Task1_2 = 0;
-                obj.Data.Dest1_2 = 0;
-                obj.Data.Task1_3 = 0;
-                obj.Data.Dest1_3 = 0;
-                obj.Data.Task1_4 = 0;
-                obj.Data.Dest1_4 = 0;
-                obj.Data.Task1_5 = 0;
-                obj.Data.Dest1_5 = 0;
-                obj.Data.TaskSum1 = 0;
-                obj.Data.PalletizingRowId1 = 0;
-                obj.Data.DestPosition_2 = 0;
-                obj.Data.TargetPallte2 = 0;
-                obj.Data.Task2_1 = 0;
-                obj.Data.Dest2_1 = 0;
-                obj.Data.Task2_2 = 0;
-                obj.Data.Dest2_2 = 0;
-                obj.Data.Task2_3 = 0;
-                obj.Data.Dest2_3 = 0;
-                obj.Data.Task2_4 = 0;
-                obj.Data.Dest2_4 = 0;
-                obj.Data.Task2_5 = 0;
-                obj.Data.Dest2_5 = 0;
-                obj.Data.TaskSum2 = 0;
-                obj.Data.PalletizingRowId2 = 0;
-            }
-            if (obj.Data2.CmdType == 0) obj.Data.CmdType = 0;
-            if (obj.Data2.CmdType != 0 || obj.Data.CmdType != 0) return;
-            if (obj.Data2.Status != TrussStatus.Idle) return;
-
-            //查找所有的可用开始搬运的线体
-            var pickUpDevices = _pickUpDevices.Where(x => x.Key.Data2.Status1.HasFlag(StationStatus1.IsLock)).ToList();
-
-            List<WCS_PalletizingRow> palletizingRowList = null;
-            WCS_Palletizing palletizing = null;
-            SqlSugarHelper.Do(_db =>
-            {
-                var db = _db.Default;
-                //找到有还有层没结束的码垛记录信息,有对应托盘
-                var palletizingLsit = db.Queryable<WCS_Palletizing>().Includes(x => x.Layers, r => r.Rows, l => l.Locs)
-                    .Where(x => !x.Finish)
-                    .Where(x => x.Layers.Any(l => !l.Finish) && x.PalletizingStation != null).ToList();
-                //筛选出目标位置有光电的码垛记录信息
-                var devCode = palletizingLsit.Select(x => x.PalletizingStation);
-                var devList = Device.All.Where(x => devCode.Contains(x.Code)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).ToList();
-                devList = devList.Where(x => x.Data3.Status.HasFlag(StationStatus.PH_Status)).ToList();
-                devCode = devList.Select(x => x.Entity.Code);
-                palletizingLsit = palletizingLsit.Where(x => devCode.Contains(x.PalletizingStation)).ToList(); //可以放货的目标托盘
-                //可以取货的码垛信息
-                var pickUpCode = _pickUpDevices.Select(x => x.Key.Entity.Code);
-                palletizingLsit = palletizingLsit.Where(x => x.Layers
-                    .Where(w => !w.Finish)
-                    .SelectMany(w => w.Rows)
-                    .Where(v => !v.Finish).Any(w => pickUpCode.Contains(w.LineCode))).ToList();
-
-                //var palletizingInfo = palletizingLsit.FirstOrDefault();
-                //if (palletizingInfo == null) return;
-                ////筛选出已经预锁的行
-                //var palletizingRow = palletizingInfo.Layers.SelectMany(x => x.Rows).Where(x => x is { Finish: false, IsEmpty: false, LineCode: not null }).Where(x => pickUpDevices.Select(p => p.Key.Entity.Code).Contains(x.LineCode)).OrderBy(x => x.RowNo).Take(2).ToList();
-                //if (palletizingRow.Count == 2 && palletizingRow[0].LineCode == palletizingRow[1].LineCode) palletizingRow = palletizingRow!.Take(1).ToList();
-                //if (palletizingRow.Count == 2 && palletizingRow[0].RowNo + 1 != palletizingRow[1].RowNo) palletizingRow = palletizingRow!.Take(1).ToList();
-
-                ////对行对应的缓存信息进行预释放处理
-                //foreach (var cacheLine in palletizingRow.Select(wcsPalletizingRow => db.Queryable<WCS_CacheLine>().Single(x => x.Id == wcsPalletizingRow.CacheLineId)))
-                //{
-                //    cacheLine.IsTruss = true;
-                //    db.Updateable(cacheLine).ExecuteCommand();
-                //}
-
-                //palletizingRowList = palletizingRow;
-                //palletizing = palletizingInfo;
-
-                foreach (var palletizingInfo in palletizingLsit)
-                {
-                    //已分配完成,或无信息。进入下一次迭代
-                    if (palletizingInfo == null || (palletizingRowList != null && palletizing != null)) continue;
-
-                    //筛选出已经预锁的行
-                    var palletizingRow = palletizingInfo.Layers.Where(x => !x.Finish)
-                        .MinBy(x => x.LayerNo)
-                        .Rows
-                        .Where(x => x is { Finish: false, IsEmpty: false, LineCode: not null })
-                        .Where(x => pickUpDevices.Select(p => p.Key.Entity.Code).Contains(x.LineCode))
-                        .OrderBy(x => x.RowNo)
-                        .Take(2)
-                        .ToList();
-
-                    //无可用行,进入下一次迭代
-                    if (!palletizingRow.Any()) continue;
-
-                    //两个任务取货线体号相同时,只执行一个任务
-                    if (palletizingRow.Count == 2 && palletizingRow[0].LineCode == palletizingRow[1].LineCode) palletizingRow = palletizingRow!.Take(1).ToList();
-                    //两个行号,差值大于一时,只执行一个任务
-                    if (palletizingRow.Count == 2 && palletizingRow[0].RowNo + 1 != palletizingRow[1].RowNo) palletizingRow = palletizingRow!.Take(1).ToList();
-
-                    //对行对应的缓存信息进行预释放处理
-                    foreach (var cacheLine in palletizingRow.Select(wcsPalletizingRow => db.Queryable<WCS_CacheLine>().Single(x => x.Id == wcsPalletizingRow.CacheLineId)))
-                    {
-                        cacheLine.IsTruss = true;
-                        db.Updateable(cacheLine).ExecuteCommand();
-                    }
-
-                    palletizingRowList = palletizingRow;
-                    palletizing = palletizingInfo;
-                }
-            });
-
-            if (palletizingRowList == null) return;
-            if (!palletizingRowList.Any()) return;
-
-            for (var i = 0; i < palletizingRowList.Count; i++)
-            {
-                var palletizingRow = palletizingRowList[i];
-                var locs = palletizingRow.Locs.OrderBy(x => x.XYNo.ToInt()).ToArray();
-                var devs = pickUpDevices.FirstOrDefault(x => x.Key.Entity.Code == palletizingRow.LineCode).Value
-                    .OrderBy(x => x.Entity.Code).ToArray();
-
-                switch (i)
-                {
-                    case 0:
-                        obj.Data.DestPosition_1 = palletizingRow.LineCode!.ToShort();
-                        obj.Data.TargetPallte1 = palletizing.PalletizingStation!.ToShort();
-                        if (locs.Length >= 1)
-                        {
-                            obj.Data.Task1_1 = devs[0].Data.TaskNumber;
-                            obj.Data.Dest1_1 = locs[0].XYNo.ToShort();
-                        }
-                        if (locs.Length >= 2)
-                        {
-                            obj.Data.Task1_2 = devs[1].Data.TaskNumber;
-                            obj.Data.Dest1_2 = locs[1].XYNo.ToShort();
-                        }
-                        if (locs.Length >= 3)
-                        {
-                            obj.Data.Task1_3 = devs[2].Data.TaskNumber;
-                            obj.Data.Dest1_3 = locs[2].XYNo.ToShort();
-                        }
-                        if (locs.Length >= 4)
-                        {
-                            obj.Data.Task1_4 = devs[3].Data.TaskNumber;
-                            obj.Data.Dest1_4 = locs[3].XYNo.ToShort();
-                        }
-                        if (locs.Length == 5)
-                        {
-                            obj.Data.Task1_5 = devs[4].Data.TaskNumber;
-                            obj.Data.Dest1_5 = locs[4].XYNo.ToShort();
-                        }
-
-                        obj.Data.TaskSum1 = palletizingRow.QtyMaxCount.ToShort();
-                        obj.Data.PalletizingRowId1 = palletizingRow.Id;
-                        break;
-
-                    case 1:
-                        obj.Data.DestPosition_2 = palletizingRow.LineCode!.ToShort();
-                        obj.Data.TargetPallte2 = palletizing.PalletizingStation!.ToShort();
-
-                        if (locs.Length >= 1)
-                        {
-                            obj.Data.Task2_1 = devs[0].Data.TaskNumber;
-                            obj.Data.Dest2_1 = locs[0].XYNo.ToShort();
-                        }
-                        if (locs.Length >= 2)
-                        {
-                            obj.Data.Task2_2 = devs[1].Data.TaskNumber;
-                            obj.Data.Dest2_2 = locs[1].XYNo.ToShort();
-                        }
-                        if (locs.Length >= 3)
-                        {
-                            obj.Data.Task2_3 = devs[2].Data.TaskNumber;
-                            obj.Data.Dest2_3 = locs[2].XYNo.ToShort();
-                        }
-                        if (locs.Length >= 4)
-                        {
-                            obj.Data.Task2_4 = devs[3].Data.TaskNumber;
-                            obj.Data.Dest2_4 = locs[3].XYNo.ToShort();
-                        }
-                        if (locs.Length == 5)
-                        {
-                            obj.Data.Task2_5 = devs[4].Data.TaskNumber;
-                            obj.Data.Dest2_5 = locs[4].XYNo.ToShort();
-                        }
-
-                        obj.Data.TaskSum2 = palletizingRow.QtyMaxCount.ToShort();
-                        obj.Data.PalletizingRowId2 = palletizingRow.Id;
-                        break;
-                }
-            }
-
-            if (palletizingRowList.Count == 1)
-            {
-            }
-
-            obj.Data.VoucherNo++;
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(DeviceFlags.桁架);
-        }
-
-        public 桁架()
-        {
-            var trussList = Device.All.Where(x => x.HasFlag(DeviceFlags.桁架));
-            foreach (var truss in trussList)
-            {
-                switch (truss.Code)
-                {
-                    case "Truss1":
-                        _pickUpDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "461"), World), Device.All.Where(x => x.Code is "461" or "462" or "463" or "464" or "465").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-                        _pickUpDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "475"), World), Device.All.Where(x => x.Code is "475" or "476" or "477" or "478" or "479").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-                        _pickUpDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "489"), World), Device.All.Where(x => x.Code is "490" or "491" or "492" or "493" or "489").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-                        _pickUpDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "503"), World), Device.All.Where(x => x.Code is "503" or "504" or "505" or "506" or "507").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-                        _pickUpDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "517"), World), Device.All.Where(x => x.Code is "517" or "518" or "519" or "520" or "521").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-                        _pickUpDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "531"), World), Device.All.Where(x => x.Code is "532" or "533" or "534" or "535" or "531").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-                        _pickUpDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "545"), World), Device.All.Where(x => x.Code is "546" or "547" or "548" or "549" or "545").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-                        _pickUpDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "559"), World), Device.All.Where(x => x.Code is "559" or "560" or "561" or "562" or "563").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-                        _pickUpDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "573"), World), Device.All.Where(x => x.Code is "573" or "574" or "575" or "576" or "577").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-                        _pickUpDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "586"), World), Device.All.Where(x => x.Code is "586" or "587" or "588" or "589" or "590").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        break;
-
-                    case "Truss2":
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        break;
-
-                    case "Truss3":
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        //_pickUpDevices.Add(Device.All.First(x => x.Code == ""), Device.All.Where(x => x.Code is "" or "" or "" or "" or "").Select(x => new Device<IStation524,  IStation523>(x, World)).ToList());
-                        break;
-                }
-            }
-        }
-    }
-}

+ 0 - 65
WCS.WorkEngineering/Systems/桁架码垛/桁架码垛区补空托盘任务生成.cs

@@ -1,65 +0,0 @@
-using PlcSiemens.Core.Extension;
-using ServiceCenter.Extensions;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.Worlds;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  桁架码垛区补空托盘任务生成
-    /// </summary>
-    [BelongTo(typeof(MainWorld))]
-    [Description("桁架码垛区补空托盘任务生成")]
-    public class 桁架码垛区补空托盘任务生成 : DeviceSystem<Device<IStation520>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation520> obj)
-        {
-            WCS_Palletizing palletizing = null;
-            SqlSugarHelper.Do(_db =>
-            {
-                var db = _db.Default;
-                //取一个时间最靠前的,没有绑定码垛工位的码垛记录
-                var palletizingInfo = db.Queryable<WCS_Palletizing>().First(x => x.PalletizingStation == null);
-                if (palletizingInfo == null) return;
-                var palleTask = db.Queryable<WCS_TaskInfo>().First(x => x.ID == palletizingInfo.TaskId && (x.Status == TaskStatus.FinishOfShunt || x.Status == TaskStatus.ConveyorExecution));
-                if (palleTask == null) return;
-                //获取可以使用的放货站台信息
-                var taskAddNext = Device.All.FirstOrDefault(x => x.Code == palleTask.AddrNext).Targets.FirstOrDefault().Targets.FirstOrDefault().Targets;
-                if (taskAddNext == null) return;
-                var devs = Device.All.Where(x => taskAddNext.Contains(x)).Select(x => new Device<IStation520, IStation521, IStation523>(x, World)).ToList();
-
-                //获取所有的未结束且有码垛工位的码垛记录
-                var palletizingStation = db.Queryable<WCS_Palletizing>().Where(x => !x.Finish && x.PalletizingStation != null).Select(x => x.PalletizingStation).ToList();
-
-                //取一个可用用于码垛的地方
-                var dev = devs.Where(x => !palletizingStation.Contains(x.Entity.Code)).FirstOrDefault(x => !x.Data3.Status.HasFlag(StationStatus.PH_Status));
-                if (dev == null) return;
-                var endDev = Device.All.Where(x => x.Code == "1606").Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
-                if (endDev.Data.TaskNumber != 0 || endDev.Data.GoodsEnd != 0) return;
-
-                palletizingInfo.PalletizingStation = dev.Entity.Code;
-                db.Updateable(palletizingInfo).ExecuteCommand();
-                palletizing = palletizingInfo;
-            });
-            if (palletizing == null) return;
-            //TODO:取货地址暂时写死,后续依靠任务进行计算
-            var dev = Device.All.Where(x => x.Code == "1606").Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
-            dev.Data.TaskNumber = palletizing.Id;
-            dev.Data.GoodsEnd = palletizing.PalletizingStation!.ToShort();
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.Code == nameof(桁架码垛区补空托盘任务生成);
-        }
-    }
-}

+ 0 - 91
WCS.WorkEngineering/Systems/桁架码垛/桁架码垛工位任务结束处理.cs

@@ -1,91 +0,0 @@
-using ServiceCenter.Extensions;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.Protocol.Truss;
-using WCS.WorkEngineering.WebApi.Controllers;
-using WCS.WorkEngineering.Worlds;
-using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  码垛工位处理
-    /// </summary>
-    [BelongTo(typeof(SortingPalletizingWorld))]
-    [Description("码垛工位任务结束处理09")]
-    public class 桁架码垛工位任务结束处理 : DeviceSystem<Device<IStation520, IStation521, IStation523, ITruss530, ITruss531>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation520, IStation521, IStation523, ITruss530, ITruss531> obj)
-        {
-            if (!obj.Data5.CmdType.HasFlag(TrussCmdType.End)) obj.Data4.CmdType = 0;
-            if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status)) return;
-            if (!obj.Data5.CmdType.HasFlag(TrussCmdType.End)) return;
-            if (!obj.Data5.CmdType.HasFlag(TrussCmdType.End1))
-            {
-                if (obj.Data5.MaxQuantity != obj.Data5.Quantity || obj.Data5.Quantity == 0 || obj.Data5.MaxQuantity == 0) return;
-            }
-            WCS_TaskInfo task = null;
-            //找到对应的码垛数据
-            SqlSugarHelper.Do(_db =>
-            {
-                var db = _db.Default;
-                var palletizing = db.Queryable<WCS_Palletizing>().Single(x => x.PalletizingStation == obj.Entity.Code && !x.Finish);
-
-                var TaskNoList = obj.Data5.GetTaskNoList().Where(x => x > 0).ToList();
-                var taskList = db.Queryable<WCS_TaskInfo>().Where(x => TaskNoList.Contains(x.ID)).ToList();
-                var taskCodes = taskList.Select(x => x.BarCode).ToList();
-                if (!obj.Data5.CmdType.HasFlag(TrussCmdType.End1))
-                {
-                    if (taskList.Count != TaskNoList.Count) return;
-                }
-                var taskInfo = db.Queryable<WCS_TaskInfo>().Single(x => x.BarCode == palletizing.PalleCode && x.Type == TaskType.EnterDepot && x.Status == TaskStatus.WaitingToExecute);
-                if (taskInfo == null)
-                {
-                    if (obj.Data5.CmdType.HasFlag(TrussCmdType.End1))
-                    {
-                        //开始绑盘
-                        WmsApi.BingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code, true, "强制码垛结束");
-                    }
-                    else
-                    {
-                        //开始绑盘
-                        WmsApi.BingPallet(palletizing.PalleCode, taskCodes, taskList.FirstOrDefault().WarehouseCode, obj.Entity.Code);
-                    }
-                    return;
-                }
-                if (taskInfo.Status != TaskStatus.WaitingToExecute) return;
-
-                foreach (var item in taskList)
-                {
-                    item.Status = TaskStatus.Finish;
-                    item.EditTime = DateTime.Now;
-                    db.Updateable(item).ExecuteCommand();
-                    item.AddWCS_TASK_DTL(db, obj.Entity.Code, "任务结束");
-                }
-
-                palletizing.Finish = true;
-                db.Updateable(palletizing).ExecuteCommand();
-                task = taskInfo;
-            });
-            if (task == null) return;
-            obj.Data.TaskNumber = task.ID;
-            obj.Data.GoodsStart = obj.Entity.Code.ToShort();
-            obj.Data.GoodsEnd = task.AddrNext.ToShort();
-            obj.Data4.CmdType = TrussCmdType.End;
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(DeviceFlags.桁架码垛位);
-        }
-    }
-}

+ 0 - 124
WCS.WorkEngineering/Systems/桁架码垛/桁架缓存放行点.cs

@@ -1,124 +0,0 @@
-using ServiceCenter.Extensions;
-using ServiceCenter.Logs;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.Worlds;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  桁架缓存放行点
-    /// </summary>
-    [BelongTo(typeof(SortingPalletizingWorld))]
-    [Description("桁架缓存放行点")]
-    public class 桁架缓存放行点 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        /// <summary>
-        ///  取货点设备集合
-        /// </summary>
-        private readonly Dictionary<Device<IStation524, IStation523>, List<Device<IStation524, IStation523>>> _cacheDevices = new();
-
-        public override void Do(Device<IStation520, IStation521, IStation523> obj)
-        {
-            if (obj.Data.VoucherNo != obj.Data2.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo}-DB521:{obj.Data2.VoucherNo}", LogLevelEnum.High);
-            if (obj.Data3.Status.HasFlag(StationStatus.Run)) throw new KnownException("设备运行中", LogLevelEnum.Low);
-            if (obj.Data3.Status.HasFlag(StationStatus.PH_Status) && obj.Data2.Request == 0) throw new KnownException("有光电无请求", LogLevelEnum.Mid);
-            if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status) && obj.Data2.Request == 1) throw new KnownException("无光电有请求", LogLevelEnum.Mid);
-            if (!obj.Data3.Status.HasFlag(StationStatus.OT_Status)) throw new KnownException("站台货物信息与实际占用不一致", LogLevelEnum.Low);
-            if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status)) throw new KnownException("无光电", LogLevelEnum.Mid);
-            if (obj.Data2.Request != 1) throw new KnownException("无请求", LogLevelEnum.Mid);
-            var nextDev = new Device<IStation524, IStation523>(obj.Entity.Targets.FirstOrDefault()!, World);
-            if (nextDev.Data2.Status1.HasFlag(StationStatus1.IsLock)) throw new KnownException($"{nextDev.Entity.Code}桁架未取货完成,线体锁定中", LogLevelEnum.Mid);
-
-            //获取当前缓存线信息对应设备号的下一个地址
-            var devCode = Device.All.Single(x => x.Code == obj.Entity.Code).Targets.FirstOrDefault();
-            var nextCode = obj.Entity.Targets.FirstOrDefault().Code.ToShort();
-
-            #region 计算当前缓存线是否已全部分配任务
-
-            SqlSugarHelper.Do(_db =>
-            {
-                var db = _db.Default;
-                var cacheLine = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.LocationNo == obj.Entity.Code.ToShort());
-                //是否所有的位已全部分配位置
-                if (cacheLine != null && cacheLine.Locations.All(x => x is { IsEmpty: false, InStock: true }))
-                {
-                    //判断下一个地址当前是否有对应的任务
-                    if (db.Queryable<WCS_CacheLine>().Any(x => x.LocationNo == nextCode && x.IsTruss == false)) return;
-                    //没有对应的任务,开始释放缓存
-                    cacheLine.InStock = true;
-                    cacheLine.LocationNo = devCode.Code.ToShort();
-                    cacheLine.EditTime = DateTime.Now;
-                    db.Updateable(cacheLine).ExecuteCommand();
-                }
-            });
-
-            #endregion 计算当前缓存线是否已全部分配任务
-
-            WCS_TaskInfo task = null;
-            SqlSugarHelper.Do(_db =>
-            {
-                var db = _db.Default;
-                //先找到下一个地址对应的缓存信息
-                var lineCache = db.Queryable<WCS_CacheLine>().Includes(x => x.Locations).Single(x => x.LocationNo == nextCode && x.Locations.Any(s => s.TaskId == obj.Data2.TaskNumber));
-                if (lineCache == null) return; //找不到表示当前线体的任务组没有凑齐
-
-                //检测实物数量与有货总数是否相等
-                if (!lineCache.Put)
-                {
-                    var qty = lineCache.Locations.Count(x => x is { IsEmpty: false, InStock: true });
-                    var devQty = _cacheDevices.FirstOrDefault(x => x.Key.Entity.Code == obj.Entity.Code).Value
-                        .Count(x => x.Data2.Status.HasFlag(StationStatus.PH_Status));
-                    if (qty != devQty) return; //表示当前货物未全部到位
-                    lineCache.Put = true;
-                    db.Updateable(lineCache).ExecuteCommand();
-
-                    var pr = db.Queryable<WCS_PalletizingRow>().Single(x => x.Id == lineCache.PalletizingRowId);
-                    pr.LineCode = lineCache.LocationNo.ToString();
-                    db.Updateable(pr).ExecuteCommand();
-                }
-
-                var taskInfo = db.Queryable<WCS_TaskInfo>().First(v => v.ID == obj.Data2.TaskNumber && v.Status == Entity.TaskStatus.FinishOfShunt) ?? throw new KnownException("未找到对应的WCS任务", LogLevelEnum.Mid);
-                taskInfo.Status = Entity.TaskStatus.ConveyorExecution;
-                taskInfo.AddrNext = obj.Entity.Targets.FirstOrDefault().Code;
-                taskInfo.EditWho = "WCS";
-                taskInfo.EditTime = DateTime.Now;
-                db.Updateable(taskInfo).ExecuteCommand();
-                taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, taskInfo.AddrNext, "桁架缓存放行");
-                task = taskInfo;
-            });
-            if (task == null) return;
-            obj.Data.TaskNumber = obj.Data2.TaskNumber;
-            obj.Data.GoodsStart = obj.Entity.Code.ToShort();
-            obj.Data.GoodsEnd = task.AddrNext.ToShort();
-            obj.Data.VoucherNo++;
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(Extensions.DeviceFlags.桁架缓存放行点);
-        }
-
-        public 桁架缓存放行点()
-        {
-            _cacheDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "466"), World), Device.All.Where(x => x.Code is "466" or "467" or "468" or "469" or "470").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-            _cacheDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "480"), World), Device.All.Where(x => x.Code is "481" or "482" or "483" or "484" or "480").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-            _cacheDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "494"), World), Device.All.Where(x => x.Code is "494" or "495" or "496" or "497" or "498").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-            _cacheDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "508"), World), Device.All.Where(x => x.Code is "508" or "509" or "510" or "511" or "512").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-            _cacheDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "522"), World), Device.All.Where(x => x.Code is "522" or "523" or "524" or "525" or "526").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-            _cacheDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "536"), World), Device.All.Where(x => x.Code is "536" or "537" or "538" or "539" or "540").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-            //_cacheDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "545"), World), Device.All.Where(x => x.Code is "546" or "547" or "548" or "549" or "545").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-            //_cacheDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "559"), World), Device.All.Where(x => x.Code is "559" or "560" or "561" or "562" or "563").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-            //_cacheDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "573"), World), Device.All.Where(x => x.Code is "573" or "574" or "575" or "576" or "577").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-            //_cacheDevices.Add(new Device<IStation524, IStation523>(Device.All.First(x => x.Code == "586"), World), Device.All.Where(x => x.Code is "586" or "587" or "588" or "589" or "590").Select(x => new Device<IStation524, IStation523>(x, World)).ToList());
-        }
-    }
-}

+ 0 - 412
WCS.WorkEngineering/Systems/环形库/机械臂cs.cs

@@ -1,412 +0,0 @@
-using ServiceCenter.Extensions;
-using ServiceCenter.Logs;
-using ServiceCenter.SqlSugars;
-using SqlSugar;
-using System.ComponentModel;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.Robot;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.WebApi.Controllers;
-using WCS.WorkEngineering.Worlds;
-using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///   机械臂
-    /// </summary>
-    [BelongTo(typeof(RingWorld))]
-    [Description("机械臂")]
-    public class 机械臂 : DeviceSystem<Device<IRobot520, IRobot521, IRobot522>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        /// <summary>
-        /// 取货点设备集合
-        /// </summary>
-        private Dictionary<string, List<Device>> PickUpDevices = new();
-
-        /// <summary>
-        /// 放货设备
-        /// </summary>
-        private Dictionary<string, List<Device<IStation520, IStation521, IStation523>>> PutDevices = new();
-
-        public 机械臂()
-        {
-            //获取所有的机械臂 集合
-            var devices = Device.All.Where(v => v.HasFlag(DeviceFlags.Robot));
-
-            //开始分配
-            foreach (var robot in devices)
-            {
-                //取货设备
-                PickUpDevices.Add(robot.Code, robot.Sources.Where(v => v.HasFlag(DeviceFlags.输送机)).Select(v => v).ToList());
-                PutDevices.Add(robot.Code, robot.Targets.Where(v => v.HasFlag(DeviceFlags.输送机)).Select(v => new Device<IStation520, IStation521, IStation523>(v, World)).ToList());
-            }
-        }
-
-        public override void Do(Device<IRobot520, IRobot521, IRobot522> obj)
-        {
-            #region 处理完成任务
-
-            //判断DB520 完成任务确认清除信号 是否为1
-            if (obj.Data.OkAck == 1 && obj.Data2.TaskFinishId1 == 0 || obj.Data2.TaskFinishId2 == 0) obj.Data.OkAck = 0;
-
-            if (obj.Data2.TaskFinishId1 > 0 || obj.Data2.TaskFinishId2 > 0)
-            {
-                //处理完成的任务信息
-                var tasks = new List<WCS_TaskInfo>();
-                //开始处理
-                SqlSugarHelper.Do(db =>
-                {
-                    World.Log($"机械臂任务处理:开始--完成任务{obj.Data2.TaskFinishId1}--{obj.Data2.TaskFinishId2}", LogLevelEnum.Low);
-
-                    //根据DB521任务号获取对应任务
-                    var taskInfoList = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.ID == obj.Data2.TaskFinishId1 || v.ID == obj.Data2.TaskFinishId2).ToList();
-                    foreach (var task in taskInfoList.Where(task => task.Status == Entity.TaskStatus.StackerExecution))
-                    {
-                        //根据任务类型做不同的处理
-                        switch (task.Type)
-                        {
-                            case TaskType.SetPlate: //工字轮入库
-                                //完成任务
-                                task.Status = Entity.TaskStatus.Finish;
-                                task.EedTime = DateTime.Now;
-                                db.Default.Updateable(task).ExecuteCommand();
-                                task.AddWCS_TASK_DTL(db.Default, task.AddrTo, "入库任务结束");
-                                break;
-
-                            case TaskType.OutDepot:
-                                task.Status = Entity.TaskStatus.ConveyorExecution;
-                                task.EedTime = DateTime.Now;
-                                db.Default.Updateable(task).ExecuteCommand();
-                                task.AddWCS_TASK_DTL(db.Default, task.AddrTo, "出库任务结束");
-
-                                break;
-
-                            case TaskType.TransferDepot:
-                                task.Status = Entity.TaskStatus.Finish;
-                                task.EedTime = DateTime.Now;
-                                db.Default.Updateable(task).ExecuteCommand();
-                                task.AddWCS_TASK_DTL(db.Default, task.AddrTo, "移库任务结束");
-                                break;
-                        }
-                        tasks.Add(task);
-                    }
-                });
-                if (!tasks.Any()) throw new KnownException("数据库提交事务错误", LogLevelEnum.High);
-                foreach (var task in tasks)
-                {
-                    //通知WMS任务完成
-                    if (task.Status == TaskStatus.Finish) WmsApi.CompleteTask(task.ID);
-                    //如果是出库任务,上报放货完成
-                    if (task is { Type: TaskType.OutDepot, Status: TaskStatus.ConveyorExecution }) WmsApi.SrmPickOutCompleted(task.ID);
-                }
-
-                // 写入信号
-                obj.Data.OkAck = 1;
-
-                World.Log($"机械臂任务处理:结束--完成任务{obj.Data2.TaskFinishId1}--{obj.Data2.TaskFinishId2}", LogLevelEnum.Mid);
-            }
-
-            #endregion 处理完成任务
-
-            //robot是否可以下发任务
-            if (obj.Data2.VoucherNo != obj.Data.VoucherNo) throw new KnownException($"凭证号不一致,DB520:{obj.Data.VoucherNo},DB521:{obj.Data2.VoucherNo}", LogLevelEnum.Mid);
-            if (obj.Data2.RobotMode != RobotMode.Automatic) throw new KnownException($"robot处于{obj.Data2.RobotMode.GetDescription()}模式", LogLevelEnum.Low);
-            if (obj.Data2.RunStatus != RobotRunStatus.Idle) throw new KnownException($"robot处于{obj.Data2.RunStatus.GetDescription()}状态", LogLevelEnum.High);
-
-            //上一个周期是不是出库任务 第一次获取返回结果会是false
-            var lastIsOut = obj.Entity.GetFlag<bool>("LastIsOut");
-            obj.Entity.SetFlag("LastIsOut", !lastIsOut);
-
-            //判断是否有任务是机器人执行中
-            //再检查是否有等待执行的货物
-            SqlSugarHelper.Do(db =>
-            {
-                //获取当前堆垛机的所有未完成任务
-                var tasks = db.Default.Queryable<WCS_TaskInfo>().Where(v => v.Status < Entity.TaskStatus.Finish && v.Device == obj.Entity.Code);
-                //任务集合是否有处于堆垛机执行状态的任务
-                if (tasks.Any(v => v.Status == Entity.TaskStatus.StackerExecution)) throw new KnownException($"有任务处于堆垛机执行状态", LogLevelEnum.High);
-            });
-
-            //入库任务优先 或 上一个周期是出库任务并且出库任务无优先
-            if (lastIsOut) //入库任务
-            {
-                //判断本次优先执行楼层,并设置下次执行时优先楼层
-                var floor = obj.Entity.GetFlag<int>("FloorIn");
-                floor = floor % 2 + 1;
-                obj.Entity.SetFlag("FloorIn", floor);
-
-                //获取当前机械臂所有的取货站台
-                var pickUpDevices = obj.Entity.Sources.Where(x => x.HasFlag(DeviceFlags.输送机)).Where(x => x.DeviceGroup.Any()).Select(
-                    x =>
-                    {
-                        var group = x.DeviceGroup.Select(s => new Device<IStation523, IStation524>(s, World)).ToList();
-                        return new Tuple<Device<IStation523, IStation524>, List<Device<IStation523, IStation524>>>(new Device<IStation523, IStation524>(x, World), group);
-                    }).ToList();
-
-                if (!pickUpDevices.Any()) throw new KnownException($"机械臂{obj.Entity.Code}无取货路径点", LogLevelEnum.High);
-
-                //获取取货设备的设备组中都是停止运行的
-                var arrIn = pickUpDevices.Where(x => x.Item2.All(a => !a.Data.Status.HasFlag(StationStatus.Run)))
-                                                      .Where(x => x.Item2.OrderBy(o => o.Entity.Code.ToShort()) //前两个设备中有取货任务的
-                                                                                               .Take(2)
-                                                                                               .Any(a => a.Data2.TaskNumber > 0 && a.Data.Status.HasFlag(StationStatus.PH_Status)))
-                                                      .ToList();
-
-                if (!arrIn.Any()) throw new KnownException($"[{obj.Entity.Code}]等待入库任务输送到位", LogLevelEnum.Mid);
-                //等待下发的任务信息
-                var taskList = new List<Tuple<WCS_TaskInfo, Device<IStation523, IStation524>>>();
-                SqlSugarHelper.Do(db =>
-                {
-                    //跟据设备组中第一个设备任务号最小的一个先执行
-                    var devGroup = arrIn.MinBy(x => x.Item2.OrderBy(o => o.Data2.TaskNumber).FirstOrDefault().Data2.TaskNumber);
-                    foreach (var dev in devGroup.Item2.OrderByDescending(x => x.Entity.Code.ToShort()).Take(2))
-                    {
-                        var task = db.Default.Queryable<WCS_TaskInfo>().First(v => v.Type == TaskType.SetPlate && v.Status == Entity.TaskStatus.FinishOfShunt && dev.Data2.TaskNumber == v.ID);
-                        if (task == null) continue;
-                        var res = WmsApi.RingApplyStockInLoc(task.ID, task.Device, dev.Entity.Code, task.GoodsType);
-                        task.Status = Entity.TaskStatus.StackerExecution;
-                        task.AddrTo = res.ResData.CellNo;
-                        task.Line = res.ResData.Row;
-                        task.Col = res.ResData.Colomn;
-                        task.Layer = res.ResData.Layer;
-                        task.Depth = res.ResData.Row;
-                        task.LastInteractionPoint = dev.Entity.Code;
-                        task.SrmStation = dev.Entity.Code;
-                        task.Device = obj.Entity.Code;
-                        task.EditWho = "WCS";
-                        db.Default.Updateable(task).ExecuteCommand();
-                        task.AddWCS_TASK_DTL(db.Default, dev.Entity.Code, task.AddrTo, "任务下发机械臂执行");
-                        taskList.Add(new(task, dev));
-                    }
-                });
-
-                if (!taskList.Any()) return;
-
-                switch (taskList.Count)
-                {
-                    case 1:
-                        var task = taskList.FirstOrDefault().Item1;
-                        var dev = taskList.FirstOrDefault().Item2;
-                        //下发任务
-                        obj.Data.TaskNumber1 = task.ID;
-                        obj.Data.SLine1 = dev.Entity.Code.ToShort();
-                        obj.Data.SCol1 = 0;
-                        obj.Data.SLayer1 = 0;
-                        obj.Data.SDepth1 = 0;
-                        obj.Data.ELine1 = task.Line.ToShort();
-                        obj.Data.ECol1 = task.Col.ToShort();
-                        obj.Data.ELayer1 = task.Layer.ToShort();
-                        obj.Data.EDepth1 = task.Depth.ToShort();
-                        obj.Data.TaskNumber2 = 0;
-                        obj.Data.SLine2 = 0;
-                        obj.Data.SCol2 = 0;
-                        obj.Data.SLayer2 = 0;
-                        obj.Data.SDepth2 = 0;
-                        obj.Data.ELine2 = 0;
-                        obj.Data.ECol2 = 0;
-                        obj.Data.ELayer2 = 0;
-                        obj.Data.EDepth2 = 0;
-                        obj.Data.TaskSum = taskList.Count.ToShort();
-                        obj.Data.GoodsType = task.GoodsType switch
-                        {
-                            18 => 1,
-                            34 => 2,
-                            50 => 3,
-                            _ => 0
-                        };
-                        obj.Data.TaskType = 3;
-                        obj.Data.VoucherNo++;
-                        break;
-
-                    case 2:
-                        taskList = taskList.OrderBy(x => x.Item1.Depth).ToList();
-                        //一工位取深度较大的任务
-                        var taskInfo = taskList[1];
-                        task = taskInfo.Item1;
-                        dev = taskInfo.Item2;
-                        obj.Data.TaskNumber1 = task.ID;
-                        obj.Data.SLine1 = dev.Entity.Code.ToShort();
-                        obj.Data.SCol1 = 0;
-                        obj.Data.SLayer1 = 0;
-                        obj.Data.SDepth1 = 0;
-                        obj.Data.ELine1 = task.Line.ToShort();
-                        obj.Data.ECol1 = task.Col.ToShort();
-                        obj.Data.ELayer1 = task.Layer.ToShort();
-                        obj.Data.EDepth1 = task.Depth.ToShort();
-                        //二工位取深度较少的值
-                        taskInfo = taskList[0];
-                        task = taskInfo.Item1;
-                        dev = taskInfo.Item2;
-                        obj.Data.TaskNumber2 = task.ID;
-                        obj.Data.SLine2 = dev.Entity.Code.ToShort();
-                        obj.Data.SCol2 = 0;
-                        obj.Data.SLayer2 = 0;
-                        obj.Data.SDepth2 = 0;
-                        obj.Data.ELine2 = task.Line.ToShort();
-                        obj.Data.ECol2 = task.Col.ToShort();
-                        obj.Data.ELayer2 = task.Layer.ToShort();
-                        obj.Data.EDepth2 = task.Depth.ToShort();
-                        obj.Data.TaskSum = taskList.Count.ToShort();
-                        obj.Data.GoodsType = task.GoodsType switch
-                        {
-                            18 => 1,
-                            34 => 2,
-                            50 => 3,
-                            _ => 0
-                        };
-                        obj.Data.TaskType = 3;
-                        obj.Data.VoucherNo++;
-                        break;
-
-                    default:
-                        throw new KnownException($"无法执行多个任务", LogLevelEnum.Mid);
-                }
-            }
-            else if (!lastIsOut) //出库任务
-            {
-                //判断本次优先执行楼层,并设置下次执行时优先楼层
-                var floor = obj.Entity.GetFlag<int>("FloorOut");
-                floor = floor % 2 + 1;
-                obj.Entity.SetFlag("FloorOut", floor);
-
-                //获取当前堆垛机所有的取货站台
-                var arrOut = PutDevices.First(v => v.Key == obj.Entity.Code).Value;
-                if (!arrOut.Any()) throw new KnownException($"机械臂{obj.Entity.Code}无放货路径点", LogLevelEnum.High);
-
-                //获取可以放货的设备集合
-                arrOut = arrOut.Where(v => v.Data3.Status.HasFlag(StationStatus.PH_Status)).ToList();//无光电
-                if (!arrOut.Any()) throw new KnownException($"[{obj.Entity.Code}]等待出库任务输送到位", LogLevelEnum.Mid);
-
-                var taskInfoList = new List<WCS_TaskInfo>();
-                var nextAdd = "";
-
-                SqlSugarHelper.Do(db =>
-                        {
-                            //所有出库点设备号,即
-                            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()
-                                                                                                    .OrderBy(x => x.SrmStation.ToInt()) //按照码垛站台号进行一次排序
-                                                                                                    .ThenBy(x => x.ProdLine) //码垛从小到大
-                                                                                                    .ThenBy(x => x.AddTime)//任务生成时间从早到晚
-                                                                                                    .Take(2).ToList();
-                            if (taskInfos.Count == 2) //有两个任务
-                            {
-                                var minDepth = taskInfos!.MinBy(x => x.Depth);
-                                var maxDepth = taskInfos.MaxBy(x => x.Depth);
-                                //物料号不同时只执行一个任务 不同的轮子物料号也不同
-                                if (minDepth.MatCode != maxDepth.MatCode) taskInfos = taskInfos.OrderBy(x => x.ProdLine).Take(1).ToList();
-                                //深度之和等于6(机械臂当前无法同时执行两个三深度的取货任务)
-                                else if (taskInfos.Sum(x => x.Depth) == 6) taskInfos = taskInfos.OrderBy(x => x.ProdLine).Take(1).ToList();
-                            }
-
-                            foreach (var task in taskInfos)
-                            {
-                                task.Status = Entity.TaskStatus.StackerExecution;
-                                task.LastInteractionPoint = task.Device;
-                                task.EditWho = "WCS";
-                                nextAdd = task.SrmStation;
-                                db.Default.Updateable(task).ExecuteCommand();
-                                task.AddWCS_TASK_DTL(db.Default, task.Device, task.SrmStation, "任务下发机械臂执行");
-                                taskInfoList.Add(task);
-                            }
-                        });
-
-                if (!taskInfoList.Any()) return;
-
-                switch (taskInfoList.Count)
-                {
-                    case 1:
-                        var task = taskInfoList.FirstOrDefault();
-
-                        //下发任务
-                        obj.Data.TaskNumber1 = task.ID;
-                        obj.Data.SLine1 = task.Line.ToShort();
-                        obj.Data.SCol1 = task.Col.ToShort();
-                        obj.Data.SLayer1 = task.Layer.ToShort();
-                        obj.Data.SDepth1 = task.Depth.ToShort();
-                        obj.Data.ELine1 = nextAdd.ToShort();
-                        obj.Data.ECol1 = task.ProdLine;
-                        obj.Data.ELayer1 = 0;
-                        obj.Data.EDepth1 = 0;
-                        obj.Data.TaskNumber2 = 0;
-                        obj.Data.SLine2 = 0;
-                        obj.Data.SCol2 = 0;
-                        obj.Data.SLayer2 = 0;
-                        obj.Data.SDepth2 = 0;
-                        obj.Data.ELine2 = 0;
-                        obj.Data.ECol2 = 0;
-                        obj.Data.ELayer2 = 0;
-                        obj.Data.EDepth2 = 0;
-                        obj.Data.TaskSum = taskInfoList.Count.ToShort();
-                        obj.Data.GoodsType = task.GoodsType switch
-                        {
-                            18 => 1,
-                            34 => 2,
-                            50 => 3,
-                            _ => 0
-                        };
-                        obj.Data.TaskType = 4;
-                        obj.Data.VoucherNo++;
-                        break;
-
-                    case 2:
-
-                        taskInfoList = taskInfoList.OrderBy(x => x.Depth).ToList();
-
-                        //一工位取深度较大的任务
-                        var taskInfo = taskInfoList[1];
-                        obj.Data.TaskNumber1 = taskInfo.ID;
-                        obj.Data.SLine1 = taskInfo.Line.ToShort();
-                        obj.Data.SCol1 = taskInfo.Col.ToShort();
-                        obj.Data.SLayer1 = taskInfo.Layer.ToShort();
-                        obj.Data.SDepth1 = taskInfo.Depth.ToShort();
-                        obj.Data.ELine1 = nextAdd.ToShort();
-                        obj.Data.ECol1 = taskInfoList.Min(x => x.ProdLine);
-                        obj.Data.ELayer1 = 0;
-                        obj.Data.EDepth1 = 0;
-                        //二工位取深度较少的值
-                        taskInfo = taskInfoList[0];
-                        obj.Data.TaskNumber2 = taskInfo.ID;
-                        obj.Data.SLine2 = taskInfo.Line.ToShort();
-                        obj.Data.SCol2 = taskInfo.Col.ToShort();
-                        obj.Data.SLayer2 = taskInfo.Layer.ToShort();
-                        obj.Data.SDepth2 = taskInfo.Depth.ToShort();
-                        obj.Data.ELine2 = nextAdd.ToShort();
-                        obj.Data.ECol2 = taskInfoList.Max(x => x.ProdLine);
-                        obj.Data.ELayer2 = 0;
-                        obj.Data.EDepth2 = 0;
-                        obj.Data.TaskSum = taskInfoList.Count.ToShort();
-                        obj.Data.GoodsType = taskInfo.GoodsType switch
-                        {
-                            18 => 1,
-                            34 => 2,
-                            50 => 3,
-                            _ => 0
-                        };
-                        obj.Data.TaskType = 4;
-                        obj.Data.VoucherNo++;
-                        break;
-
-                    default:
-
-                        throw new KnownException($"无法执行多个任务", LogLevelEnum.Mid);
-                }
-            }
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(DeviceFlags.Robot);
-        }
-    }
-}

+ 0 - 80
WCS.WorkEngineering/Systems/环形库/环形库码垛区补空托盘任务生成.cs

@@ -1,80 +0,0 @@
-using ServiceCenter.Extensions;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-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;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems
-{
-    /// <summary>
-    ///  环形库码垛区补空托盘任务生成
-    /// </summary>
-    [BelongTo(typeof(RingWorld))]
-    [Description("环形库码垛区补空托盘任务生成")]
-    public class 环形库码垛区补空托盘任务生成 : DeviceSystem<Device<IStation520, IStation521, IStation523>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation520, IStation521, IStation523> obj)
-        {
-            if (obj.Data3.Status.HasFlag(StationStatus.PH_Status)) return;
-            WCS_TaskInfo deliveryTask = null;
-            SqlSugarHelper.Do(_db =>
-            {
-                var db = _db.Default;
-                //检查是否有待执行状态放货点是自己的出库任务
-                var ringTask = db.Queryable<WCS_TaskInfo>().First(x => x.Type == TaskType.OutDepot && x.Status == TaskStatus.WaitingToExecute && x.SrmStation == obj.Entity.Code);
-                if (ringTask == null)
-                {
-                    //开始申请码垛任务
-                    WmsApi.ApplyPalletizingStockOut(obj.Entity.Code, obj.Entity.Sources.Single(x => x.HasFlag(DeviceFlags.Robot)).Code);
-                    return;
-                }
-                var task = db.Queryable<WCS_TaskInfo>().First(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code);
-                if (task != null) return;
-                //开始获取当前地址上个设备的上一个设备中的非零九托盘拆机
-                var addrFrom = obj.Entity.Sources.SelectMany(x => x.Sources).Single(x => x.HasFlag(DeviceFlags.拆盘机非09));
-                var dev = Device.All.Where(x => x.Code == addrFrom.Code).Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
-                if (dev.Data.TaskNumber != 0 || dev.Data.GoodsEnd != 0) return;
-                //开始创建搬运任务
-                task = new WCS_TaskInfo()
-                {
-                    AddrFrom = addrFrom.Code,
-                    AddrTo = obj.Entity.Code,
-                    BarCode = "码垛托盘搬运-" + obj.Entity.Code,
-                    Status = Entity.TaskStatus.NewBuild,
-                    PalletType = ringTask.PalletType,
-                    FullQty = ringTask.FullQty,
-                    Type = TaskType.Delivery,
-                    AddWho = "WCS",
-                    AddTime = DateTime.Now
-                };
-                var res = db.Insertable(task).ExecuteReturnEntity();
-                var taskOld = res.Mapper<WCS_TaskOld, WCS_TaskInfo>();
-                taskOld.Id = res.ID;
-                taskOld.AddTime = DateTime.Now; ;
-                db.Insertable(taskOld).SplitTable().ExecuteCommand();
-                res.AddWCS_TASK_DTL(db, obj.Entity.Code, task.AddrTo, "初始化码垛托盘搬运任务");
-                deliveryTask = res;
-            });
-
-            if (deliveryTask == null) return;
-            var dev = Device.All.Where(x => x.Code == deliveryTask.AddrFrom).Select(x => new Device<IStation520>(x, World)).FirstOrDefault();
-            dev.Data.TaskNumber = deliveryTask.ID;
-            dev.Data.GoodsEnd = obj.Entity.Code.ToShort();
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(DeviceFlags.环形库码垛工位);
-        }
-    }
-}

+ 0 - 85
WCS.WorkEngineering/Systems/环形库/环形库码垛结束.cs

@@ -1,85 +0,0 @@
-using ServiceCenter.Extensions;
-using ServiceCenter.Logs;
-using ServiceCenter.SqlSugars;
-using System.ComponentModel;
-using SqlSugar;
-using WCS.Core;
-using WCS.Entity;
-using WCS.WorkEngineering.Extensions;
-using WCS.WorkEngineering.Protocol.Robot;
-using WCS.WorkEngineering.Protocol.Station;
-using WCS.WorkEngineering.WebApi.Controllers;
-using WCS.WorkEngineering.Worlds;
-using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
-using TaskStatus = WCS.Entity.TaskStatus;
-
-namespace WCS.WorkEngineering.Systems.环形库
-{
-    /// <summary>
-    ///  环形库码垛结束
-    /// </summary>
-    [BelongTo(typeof(RingWorld))]
-    [Description("环形库码垛结束")]
-    public class 环形库码垛结束 : DeviceSystem<Device<IStation520, IStation521, IStation523, IRobot530, IRobot531>>
-    {
-        protected override bool ParallelDo => true;
-
-        protected override bool SaveLogsToFile => true;
-
-        public override void Do(Device<IStation520, IStation521, IStation523, IRobot530, IRobot531> obj)
-        {
-            if (!obj.Data5.CmdType.HasFlag(RobotCmdType.End)) obj.Data4.CmdType = 0;
-            if (!obj.Data3.Status.HasFlag(StationStatus.PH_Status)) return;
-            if (!obj.Data5.CmdType.HasFlag(RobotCmdType.End)) return;
-            if (obj.Data5.MaxQuantity != obj.Data5.Quantity || obj.Data5.Quantity == 0 || obj.Data5.MaxQuantity == 0) throw new KnownException($"码垛数量异常:最大码垛数量[{obj.Data5.MaxQuantity}]已码数量{obj.Data5.Quantity}", LogLevelEnum.High);
-            WCS_TaskInfo task = null;
-            //找到对应的码垛数据
-            SqlSugarHelper.Do(_db =>
-            {
-                var db = _db.Default;
-                var taskNoList = obj.Data5.GetTaskNoList().ToList();
-                var tasks = db.Queryable<WCS_TaskInfo>().Where(x => taskNoList.Contains(x.ID) && x.Status == TaskStatus.ConveyorExecution).ToList();
-                var deliveryTask = db.Queryable<WCS_TaskInfo>().Single(x => x.Type == TaskType.Delivery && x.AddrTo == obj.Entity.Code) ?? throw new KnownException($"未找到当前站台对应的托盘搬运任务", LogLevelEnum.High);
-                var taskInfo = db.Queryable<WCS_TaskInfo>().Single(x => x.AddrFrom == obj.Entity.Code && x.Status == TaskStatus.WaitingToExecute && x.Type == TaskType.EnterDepot);
-                if (deliveryTask.Status != Entity.TaskStatus.RgvCompleted) throw new KnownException($"搬运任务状态异常:{deliveryTask.ID}", LogLevelEnum.High);
-                if (taskInfo == null)
-                {
-                    //开始获取当前位置的空托盘搬运任务信息
-                    var cbrCode = db.Queryable<WCS_TaskInfo>().First(x => x.Status == TaskStatus.RgvCompleted && x.ID == obj.Data2.TaskNumber);
-                    //开始绑盘
-                    WmsApi.BingPallet(cbrCode.BarCode, tasks.Select(x => x.BarCode).ToList(), obj.Entity.Code.GetWareCode(), obj.Entity.Code);
-                    return;
-                }
-
-                foreach (var item in tasks)
-                {
-                    item.Status = TaskStatus.Finish;
-                    item.EditTime = DateTime.Now;
-                    db.Updateable(item).ExecuteCommand();
-                    item.AddWCS_TASK_DTL(db, obj.Entity.Code, "任务结束");
-                }
-
-                deliveryTask.Status = TaskStatus.Finish;
-                deliveryTask.EedTime = DateTime.Now;
-                db.Updateable(deliveryTask).ExecuteCommand();
-                deliveryTask.AddWCS_TASK_DTL(db, obj.Entity.Code, $"任务结束");
-                var dev = DevicePath.GetPath(obj.Entity.Code, "SRM").Points.Last();
-                taskInfo.WarehouseCode = dev.Code.GetWareCode();
-                db.Updateable(taskInfo).ExecuteCommand();
-                taskInfo.AddWCS_TASK_DTL(db, obj.Entity.Code, $"更新任务对应仓库信息{taskInfo.WarehouseCode}");
-
-                task = taskInfo;
-            });
-            if (task == null) return;
-            obj.Data.TaskNumber = task.ID;
-            obj.Data.GoodsStart = obj.Entity.Code.ToShort();
-            obj.Data.GoodsEnd = task.AddrNext.ToShort();
-            obj.Data4.CmdType = RobotCmdType.End;
-        }
-
-        public override bool Select(Device dev)
-        {
-            return dev.HasFlag(DeviceFlags.环形库码垛工位);
-        }
-    }
-}

+ 61 - 61
WCS.WorkEngineering/WebApi/Controllers/WcsController.cs

@@ -22,8 +22,8 @@ namespace WCS.WorkEngineering.WebApi.Controllers
 {
     public interface IDeviceWriter
     {
-        [HttpPost]
-        void Write(DeviceTypeEnum deviceType, string devCode, string protocol, string propName, string value);
+        //[HttpPost]
+        //void Write(DeviceTypeEnum deviceType, string devCode, string protocol, string propName, string value);
     }
 
     /// <summary>
@@ -43,18 +43,18 @@ namespace WCS.WorkEngineering.WebApi.Controllers
     [Route("api/[controller]/[action]")]
     public class WcsController : ControllerBase, IDeviceWriter
     {
-        /// <summary>
-        ///  获取设备信息
-        /// </summary>
-        /// <param name="type"></param>
-        /// <param name="name">设备名称</param>
-        /// <returns></returns>
-        [HttpGet]
-        public object GetDeviceInfo(string type, string name)
-        {
-            var obj = World.GetSystemInstance<GetDeviceSystem>().Invoke(new Tuple<string, string>(type, name));
-            return obj;
-        }
+        ///// <summary>
+        /////  获取设备信息
+        ///// </summary>
+        ///// <param name="type"></param>
+        ///// <param name="name">设备名称</param>
+        ///// <returns></returns>
+        //[HttpGet]
+        //public object GetDeviceInfo(string type, string name)
+        //{
+        //    var obj = World.GetSystemInstance<GetDeviceSystem>().Invoke(new Tuple<string, string>(type, name));
+        //    return obj;
+        //}
 
         /// <summary>
         ///  获取设备配置信息接口
@@ -487,53 +487,53 @@ namespace WCS.WorkEngineering.WebApi.Controllers
             return response;
         }
 
-        /// <summary>
-        ///  堆垛机测试
-        /// </summary>
-        /// <param name="srmcod">堆垛机编号</param>
-        /// <param name="typeEnum">任务类型</param>
-        /// <param name="value1">起始行</param>
-        /// <param name="value2">起始列</param>
-        /// <param name="value3">起始层</param>
-        /// <param name="value4">目标行</param>
-        /// <param name="value5">目标列</param>
-        /// <param name="value6">目标层</param>
-        [HttpPost]
-        public void SrmDeBug(string srmcod, SrmTaskType typeEnum, short value1, short value2, short value3, short value4, short value5, short value6)
-        {
-            World.GetSystemInstance<SrmDebugSystem>().Invoke(new SrmDebugInfo
-            {
-                SrmCode = srmcod,
-                srmTaskType = typeEnum,
-                SLine = value1,
-                SCol = value2,
-                SLayer = value3,
-                ELine = value4,
-                ECol = value5,
-                ELayer = value6
-            });
-        }
-
-        /// <summary>
-        ///  设备信息写入接口
-        /// </summary>
-        /// <param name="deviceType">需要写入信息的设备类型</param>
-        /// <param name="devCode">设备编号</param>
-        /// <param name="protocol">设备协议类名</param>
-        /// <param name="propName">写入字段名</param>
-        /// <param name="value">值</param>
-        [HttpPost]
-        public void Write(DeviceTypeEnum deviceType, string devCode, string protocol, string propName, string value)
-        {
-            World.GetSystemInstance<DeviceWriteSystem>().Invoke(new DeviceWriteInfo
-            {
-                DeviceType = deviceType,
-                Code = devCode,
-                Protocol = protocol,
-                Property = propName,
-                Value = value
-            });
-        }
+        ///// <summary>
+        /////  堆垛机测试
+        ///// </summary>
+        ///// <param name="srmcod">堆垛机编号</param>
+        ///// <param name="typeEnum">任务类型</param>
+        ///// <param name="value1">起始行</param>
+        ///// <param name="value2">起始列</param>
+        ///// <param name="value3">起始层</param>
+        ///// <param name="value4">目标行</param>
+        ///// <param name="value5">目标列</param>
+        ///// <param name="value6">目标层</param>
+        //[HttpPost]
+        //public void SrmDeBug(string srmcod, SrmTaskType typeEnum, short value1, short value2, short value3, short value4, short value5, short value6)
+        //{
+        //    World.GetSystemInstance<SrmDebugSystem>().Invoke(new SrmDebugInfo
+        //    {
+        //        SrmCode = srmcod,
+        //        srmTaskType = typeEnum,
+        //        SLine = value1,
+        //        SCol = value2,
+        //        SLayer = value3,
+        //        ELine = value4,
+        //        ECol = value5,
+        //        ELayer = value6
+        //    });
+        //}
+
+        ///// <summary>
+        /////  设备信息写入接口
+        ///// </summary>
+        ///// <param name="deviceType">需要写入信息的设备类型</param>
+        ///// <param name="devCode">设备编号</param>
+        ///// <param name="protocol">设备协议类名</param>
+        ///// <param name="propName">写入字段名</param>
+        ///// <param name="value">值</param>
+        //[HttpPost]
+        //public void Write(DeviceTypeEnum deviceType, string devCode, string protocol, string propName, string value)
+        //{
+        //    World.GetSystemInstance<DeviceWriteSystem>().Invoke(new DeviceWriteInfo
+        //    {
+        //        DeviceType = deviceType,
+        //        Code = devCode,
+        //        Protocol = protocol,
+        //        Property = propName,
+        //        Value = value
+        //    });
+        //}
 
         #region 设备IP相关
 

File diff suppressed because it is too large
+ 529 - 524
WCS.WorkEngineering/WorkStart.cs


+ 1 - 1
WcsFramework.sln

@@ -72,7 +72,7 @@ Global
 		{A869A35B-8811-4660-90E8-A143D168D894} = {C783651F-7EB6-40BA-8E68-525F93B8FCED}
 		{99AB1CD4-1242-4A1B-AE90-ADD7674848B2} = {C783651F-7EB6-40BA-8E68-525F93B8FCED}
 		{1E0F2030-48C6-4C09-8D4D-0C7F02761C3B} = {FD3B782A-4A24-458C-B77F-6F46106AE2B4}
-		{B87B1360-D8D2-4416-83BE-C6BC27679EA3} = {C783651F-7EB6-40BA-8E68-525F93B8FCED}
+		{B87B1360-D8D2-4416-83BE-C6BC27679EA3} = {FD3B782A-4A24-458C-B77F-6F46106AE2B4}
 		{977B3F9A-1CB4-4CF2-A0A2-B95A6011933A} = {C783651F-7EB6-40BA-8E68-525F93B8FCED}
 		{DB454F36-DE7B-4A9B-9A8B-8E2C3C4F81B7} = {C783651F-7EB6-40BA-8E68-525F93B8FCED}
 		{584F95DC-6D93-440A-AD69-F88F90A53DB4} = {C783651F-7EB6-40BA-8E68-525F93B8FCED}

Some files were not shown because too many files changed in this diff