林豪 左 2 năm trước cách đây
mục cha
commit
826d712f4e
37 tập tin đã thay đổi với 3160 bổ sung225 xóa
  1. 1 0
      VirtualPlc.Service/DeviceExtentions.cs
  2. 150 0
      VirtualPlc.Service/Extensions/DeviceExtension.cs
  3. 0 179
      VirtualPlc.Service/Handlers/Device.cs
  4. 2 2
      VirtualPlc.Service/Helpers/LogHelper.cs
  5. 3 3
      VirtualPlc.Service/VirtualPlc.Service.csproj
  6. 26 34
      VirtualPlc.Service/Worker.cs
  7. 1 0
      VirtualPlc.Service/Works/SRM/SRMWork.cs
  8. 2 2
      VirtualPlc.Service/Works/Station/一楼入库.cs
  9. 19 0
      WCS.Entity.Protocol/BCR/IBCR80.cs
  10. 20 0
      WCS.Entity.Protocol/BCR/WCS_BCR80.cs
  11. 124 0
      WCS.Entity.Protocol/DeviceData.cs
  12. 100 0
      WCS.Entity.Protocol/RGV/IRGV520.cs
  13. 166 0
      WCS.Entity.Protocol/RGV/IRGV521.cs
  14. 40 0
      WCS.Entity.Protocol/RGV/IRGV523.cs
  15. 141 0
      WCS.Entity.Protocol/RGV/RGVEnum.cs
  16. 78 0
      WCS.Entity.Protocol/RGV/WCS_RGV520.cs
  17. 110 0
      WCS.Entity.Protocol/RGV/WCS_RGV521.cs
  18. 38 0
      WCS.Entity.Protocol/RGV/WCS_RGV523.cs
  19. 198 0
      WCS.Entity.Protocol/SRM/ISRM520.cs
  20. 343 0
      WCS.Entity.Protocol/SRM/ISRM521.cs
  21. 17 0
      WCS.Entity.Protocol/SRM/ISRM537.cs
  22. 140 0
      WCS.Entity.Protocol/SRM/SRMEnum.cs
  23. 158 0
      WCS.Entity.Protocol/SRM/WCS_SRM520.cs
  24. 266 0
      WCS.Entity.Protocol/SRM/WCS_SRM521.cs
  25. 18 0
      WCS.Entity.Protocol/SRM/WCS_SRM537.cs
  26. 58 0
      WCS.Entity.Protocol/Station/IStation520.cs
  27. 108 0
      WCS.Entity.Protocol/Station/IStation521.cs
  28. 79 0
      WCS.Entity.Protocol/Station/IStation523.cs
  29. 53 0
      WCS.Entity.Protocol/Station/WCS_Station520.cs
  30. 50 0
      WCS.Entity.Protocol/Station/WCS_Station521.cs
  31. 29 0
      WCS.Entity.Protocol/Station/WCS_Station523.cs
  32. 11 0
      WCS.Entity.Protocol/WCS.Entity.Protocol.csproj
  33. 129 0
      WCS.Entity.Protocol/WCS_AGVTask.cs
  34. 47 0
      WCS.Entity.Protocol/WCS_StatusLog.cs
  35. 53 0
      WCS.Entity.Protocol/WCS_SystemConfig.cs
  36. 365 0
      WCS.Entity.Protocol/WCS_TASK.cs
  37. 17 5
      测试.sln

+ 1 - 0
VirtualPlc.Service/DeviceExtentions.cs

@@ -3,6 +3,7 @@ using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Entity.Protocol.Station;
+using WCS.Service.Extensions;
 
 namespace WCS.Service
 {

+ 150 - 0
VirtualPlc.Service/Extensions/DeviceExtension.cs

@@ -1,6 +1,7 @@
 using DBHelper_SqlSugar;
 using Logs;
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Linq;
 using System.Threading.Tasks;
@@ -14,6 +15,129 @@ using TaskStatus = WCS.Entity.TaskStatus;
 
 namespace WCS.Service.Extensions
 {
+    public static class WCS_DEVICEExtension
+    {
+        private static ConcurrentDictionary<string, object> DeviceValues = new ConcurrentDictionary<string, object>();
+
+        public static void AddFlag(this WCS_DEVICE source, DF flag)
+        {
+            var df = source.Get<DF>("DeviceFlag");
+            df = df | flag;
+            source.Set("DeviceFlag", df);
+        }
+
+        public static bool Is(this WCS_DEVICE source, DF flag)
+        {
+            var df = source.Get<DF>("DeviceFlag");
+            return (df & flag) == flag;
+        }
+
+        public static void Set<T>(this WCS_DEVICE source, string key, T value)
+        {
+            DeviceValues[source.CODE + key] = value;
+        }
+
+        public static T Get<T>(this WCS_DEVICE source, string key)
+        {
+            if (!DeviceValues.ContainsKey(source.CODE + key))
+                return default(T);
+            return (T)DeviceValues[source.CODE + key];
+        }
+
+        public static short Code(this WCS_DEVICE source)
+        {
+            return short.Parse(source.CODE);
+        }
+
+        public static string Tunnel(this WCS_DEVICE source)
+        {
+            return source.Get<string>("Tunnel");
+        }
+
+        public static int TunnelNum(this WCS_DEVICE source)
+        {
+            return int.Parse(source.Tunnel().Last().ToString());
+        }
+
+        public static int Floor(this WCS_DEVICE source)
+        {
+            return source.Get<int>("Floor");
+        }
+
+        public static WCS_DEVICE SC(this WCS_DEVICE source)
+        {
+            return source.Get<WCS_DEVICE>("SC");
+        }
+
+        public static WCS_DEVICE RGV(this WCS_DEVICE source)
+        {
+            return source.Get<WCS_DEVICE>("RGV");
+        }
+
+        public static LocInfo LocInfo(this WCS_DEVICE source)
+        {
+            return source.Get<LocInfo>("LocInfo");
+        }
+
+        public static bool WakeupOn(this WCS_DEVICE source, int sec, string key)
+        {
+            var str = "WakeupOn" + key;
+            var last = source.Get<DateTime>(str);
+            if ((DateTime.Now - last).TotalMilliseconds > sec)
+            {
+                source.Set(str, DateTime.Now);
+                return true;
+            }
+            else
+            {
+                Ltc.Log("OnSleep");
+                return false;
+            }
+        }
+
+        public static bool WakeupOn(this WCS_DEVICE source, int sec)
+        {
+            return source.WakeupOn(sec, "");
+        }
+
+        public static void AddFlag(DF flag, params string[] devices)
+        {
+            var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
+            Parallel.ForEach(arr, v =>
+            {
+                v.AddFlag(flag);
+            });
+        }
+
+        public static void AddFlag(DF flag, Action<WCS_DEVICE> callbck, params string[] devices)
+        {
+            var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
+            Parallel.ForEach(arr, v =>
+            {
+                v.AddFlag(flag);
+                callbck?.Invoke(v);
+            });
+        }
+
+        public static void Set<T>(string key, T value, params string[] devices)
+        {
+            var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
+            Parallel.ForEach(arr, v =>
+            {
+                v.Set(key, value);
+            });
+        }
+
+        public static void Set<T>(string key, T value, Func<WCS_DEVICE, bool> func)
+        {
+            var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(func).ToArray();
+            Parallel.ForEach(arr, v =>
+            {
+                v.Set(key, value);
+            });
+        }
+    }
+
     /// <summary>
     /// 输送机设备组
     /// </summary>
@@ -1124,4 +1248,30 @@ namespace WCS.Service.Extensions
         public WCS_DEVICE taskIN;
         public Device<ISRM520, ISRM521, ISRM537> SRM;
     }
+
+    /// <summary>
+    /// 设备配置
+    /// </summary>
+    [Flags]
+    public enum DF
+    {
+        无 = 0,
+        SRM = 1 << 0,
+        SRM二级品取货 = 1 << 1,
+        SRM涂布取货 = 1 << 2,
+        SRM月台放货 = 1 << 3,
+        一楼RGV放货 = 1 << 4,
+        月台 = 1 << 5,
+        涂布RGV = 1 << 6,
+        BOPPRGV = 1 << 7,
+        涂布RGV取货设备组 = 1 << 8,
+        涂布RGV放货设备组 = 1 << 9,
+        涂布出库RGV取货站台 = 1 << 10,
+        涂布入库RGV取货站台 = 1 << 11,
+        SRM涂布放货 = 1 << 12,
+        涂布RGV取货站台 = 1 << 13,
+        BOPPRGV取货设备组 = 1 << 14,
+        BOPPRGV放货设备组 = 1 << 15,
+        SRMBOPP取货 = 1 << 16,
+    }
 }

+ 0 - 179
VirtualPlc.Service/Handlers/Device.cs

@@ -1,179 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using System.Linq;
-using System.Threading.Tasks;
-using WCS.Core;
-using WCS.Entity;
-
-public static class Device
-{
-    #region WCS_DEVICE扩展数据
-
-    private static ConcurrentDictionary<string, object> DeviceValues = new ConcurrentDictionary<string, object>();
-
-    public static void AddFlag(this WCS_DEVICE source, DF flag)
-    {
-        var df = source.Get<DF>("DeviceFlag");
-        df = df | flag;
-        source.Set("DeviceFlag", df);
-    }
-
-    public static bool Is(this WCS_DEVICE source, DF flag)
-    {
-        var df = source.Get<DF>("DeviceFlag");
-        return (df & flag) == flag;
-    }
-
-    public static void Set<T>(this WCS_DEVICE source, string key, T value)
-    {
-        DeviceValues[source.CODE + key] = value;
-    }
-
-    public static T Get<T>(this WCS_DEVICE source, string key)
-    {
-        if (!DeviceValues.ContainsKey(source.CODE + key))
-            return default(T);
-        return (T)DeviceValues[source.CODE + key];
-    }
-
-    public static short Code(this WCS_DEVICE source)
-    {
-        return short.Parse(source.CODE);
-    }
-
-    public static string Tunnel(this WCS_DEVICE source)
-    {
-        return source.Get<string>("Tunnel");
-    }
-
-    public static int TunnelNum(this WCS_DEVICE source)
-    {
-        return int.Parse(source.Tunnel().Last().ToString());
-    }
-
-    public static int Floor(this WCS_DEVICE source)
-    {
-        return source.Get<int>("Floor");
-    }
-
-    public static WCS_DEVICE SC(this WCS_DEVICE source)
-    {
-        return source.Get<WCS_DEVICE>("SC");
-    }
-
-    public static WCS_DEVICE RGV(this WCS_DEVICE source)
-    {
-        return source.Get<WCS_DEVICE>("RGV");
-    }
-
-    public static LocInfo LocInfo(this WCS_DEVICE source)
-    {
-        return source.Get<LocInfo>("LocInfo");
-    }
-
-    public static bool WakeupOn(this WCS_DEVICE source, int sec, string key)
-    {
-        var str = "WakeupOn" + key;
-        var last = source.Get<DateTime>(str);
-        if ((DateTime.Now - last).TotalMilliseconds > sec)
-        {
-            source.Set(str, DateTime.Now);
-            return true;
-        }
-        else
-        {
-            Ltc.Log("OnSleep");
-            return false;
-        }
-    }
-
-    public static bool WakeupOn(this WCS_DEVICE source, int sec)
-    {
-        return source.WakeupOn(sec, "");
-    }
-
-    #endregion WCS_DEVICE扩展数据
-
-    #region 静态方法
-
-    public static WCS_DEVICE[] Where(Func<WCS_DEVICE, bool> func)
-    {
-        var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(func).ToArray();
-        return arr;
-    }
-
-    public static WCS_DEVICE Find(string code)
-    {
-        return Where(v => v.CODE == code).Single();
-    }
-
-    public static WCS_DEVICE[] Find(params string[] codes)
-    {
-        return Where(v => codes.Contains(v.CODE)).ToArray();
-    }
-
-    public static void Set<T>(string key, T value, params string[] devices)
-    {
-        var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
-        Parallel.ForEach(arr, v =>
-        {
-            v.Set(key, value);
-        });
-    }
-
-    public static void Set<T>(string key, T value, Func<WCS_DEVICE, bool> func)
-    {
-        var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(func).ToArray();
-        Parallel.ForEach(arr, v =>
-        {
-            v.Set(key, value);
-        });
-    }
-
-    public static void AddFlag(DF flag, params string[] devices)
-    {
-        var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
-        Parallel.ForEach(arr, v =>
-        {
-            v.AddFlag(flag);
-        });
-    }
-
-    public static void AddFlag(DF flag, Action<WCS_DEVICE> callbck, params string[] devices)
-    {
-        var arr = LogicHandler.AllObjects.OfType<WCS_DEVICE>().Where(v => devices.Contains(v.CODE)).ToArray();
-        Parallel.ForEach(arr, v =>
-        {
-            v.AddFlag(flag);
-            callbck?.Invoke(v);
-        });
-    }
-
-    #endregion 静态方法
-}
-
-/// <summary>
-/// 设备配置
-/// </summary>
-[Flags]
-public enum DF
-{
-    无 = 0,
-    SRM = 1 << 0,
-    SRM二级品取货 = 1 << 1,
-    SRM涂布取货 = 1 << 2,
-    SRM月台放货 = 1 << 3,
-    一楼RGV放货 = 1 << 4,
-    月台 = 1 << 5,
-    涂布RGV = 1 << 6,
-    BOPPRGV = 1 << 7,
-    涂布RGV取货设备组 = 1 << 8,
-    涂布RGV放货设备组 = 1 << 9,
-    涂布出库RGV取货站台 = 1 << 10,
-    涂布入库RGV取货站台 = 1 << 11,
-    SRM涂布放货 = 1 << 12,
-    涂布RGV取货站台 = 1 << 13,
-    BOPPRGV取货设备组 = 1 << 14,
-    BOPPRGV放货设备组 = 1 << 15,
-    SRMBOPP取货 = 1 << 16,
-}

+ 2 - 2
VirtualPlc.Service/Helpers/LogHelper.cs

@@ -1,6 +1,6 @@
 using DBHelper_SqlSugar;
 using Logs;
-using System;
+using SqlSugar;
 using WCS.Entity;
 
 namespace WCS.Service.Helpers
@@ -18,7 +18,7 @@ namespace WCS.Service.Helpers
             Db.Do(db =>
             {
                 var exp = db.Default.Queryable<WCS_EXCEPTION>()
-                    .Where("TIMESTAMPDIFF(SECOND, UPDATETIME, '@now') < 5", new { now = DateTime.Now })
+                    .Where(v => SqlFunc.DateDiff(DateType.Second, v.UPDATETIME, DateTime.Now) < 5)
                     .Where(v => v.MSG == msg)
                     .OrderByDescending(v => v.ID)
                     .First() ?? new WCS_EXCEPTION

+ 3 - 3
VirtualPlc.Service/VirtualPlc.Service.csproj

@@ -33,11 +33,11 @@
     <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
     <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.8" />
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.4.0" />
-    <PackageReference Include="Virtual_PLC" Version="1.0.0" />
-    <PackageReference Include="WCS.Core" Version="1.0.1" />
+    <PackageReference Include="WCS.Core" Version="1.0.2" />
   </ItemGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\Projects\永冠OPP\WCS.Entity.Protocol\WCS.Entity.Protocol.csproj" />
+    <ProjectReference Include="..\..\WCS\项目框架\Virtual_PLC\Virtual_PLC.csproj" />
+    <ProjectReference Include="..\WCS.Entity.Protocol\WCS.Entity.Protocol.csproj" />
   </ItemGroup>
 </Project>

+ 26 - 34
VirtualPlc.Service/Worker.cs

@@ -1,18 +1,9 @@
 using DBHelper_SqlSugar;
 using Logs;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.Hosting;
-using Microsoft.Extensions.Logging;
 using Newtonsoft.Json;
 using SqlSugar;
-using System;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
 using System.Reflection;
 using System.Text;
-using System.Threading;
-using System.Threading.Tasks;
 using Virtual_PLC;
 using WCS.Core;
 using WCS.Core.DataTrans;
@@ -20,6 +11,7 @@ using WCS.Entity;
 using WCS.Entity.Protocol;
 using WCS.Entity.Protocol.BCR;
 using WCS.Entity.Protocol.Station;
+using WCS.Service.Extensions;
 
 namespace WCS.Service
 {
@@ -32,7 +24,7 @@ namespace WCS.Service
             _logger = logger;
         }
 
-        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+        protected override async System.Threading.Tasks.Task ExecuteAsync(CancellationToken stoppingToken)
         {
             if (stoppingToken.IsCancellationRequested)
                 return;
@@ -157,29 +149,29 @@ namespace WCS.Service
 
                 #region 设备扩展数据配置
 
-                Device.AddFlag(DF.一楼RGV放货, "G1035", "G1044", "G1053", "G1062");
-                Device.AddFlag(DF.SRM, "SRM1", "SRM2", "SRM3", "SRM4", "SRM5", "SRM6", "SRM7", "SRM8");
-                Device.AddFlag(DF.月台, "G1469", "G1561", "G1538", "G1574", "G1509");
-                Device.AddFlag(DF.SRM二级品取货, "1040", "1041", "1042", "1043", "1049", "1050", "1051", "1052");
-                Device.AddFlag(DF.SRM二级品取货, "1058", "1059", "1060", "1061", "1067", "1068");
-                Device.AddFlag(DF.SRMBOPP取货, "1195", "1194", "1193", "1192", "1204", "1203", "1202", "1201");
-                Device.AddFlag(DF.SRMBOPP取货, "1213", "1212", "1210", "1211", "1220", "1219", "1230", "1228");
-                Device.AddFlag(DF.SRM月台放货, "1473", "1476", "1474", "1475", "1491", "1492", "1493", "1494");
-                Device.AddFlag(DF.SRM月台放货, "1520", "1521", "1522", "1523", "1545", "1546", "1451", "1453");
-                Device.AddFlag(DF.SRM涂布取货, "1431", "1432", "1422", "1423", "1424", "1425", "1415", "1416");
-                Device.AddFlag(DF.SRM涂布取货, "1605", "1606", "1406", "1407", "1408", "1409");
-                Device.AddFlag(DF.SRM涂布放货, "1283", "1284", "1290", "1291", "1292", "1293", "1299", "1300");
-                Device.AddFlag(DF.SRM涂布放货, "1301", "1302", "1308", "1309", "1310", "1311");
-                Device.AddFlag(DF.涂布RGV, "RGV9", "RGV10", "RGV11", "RGV12", "RGV13", "RGV14");
-                Device.AddFlag(DF.涂布RGV取货设备组, "G2", "G3", "G5", "G7", "G9", "G11");
-                Device.AddFlag(DF.涂布RGV放货设备组, "G1", "G4", "G6", "G8", "G10");
-                Device.AddFlag(DF.涂布出库RGV取货站台, "1285", "1286", "1294", "1295", "1303", "1304", "1312", "1313");
-                Device.AddFlag(DF.涂布入库RGV取货站台, "1391", "1392", "1399", "1400");
-                Device.AddFlag(DF.涂布RGV取货站台, "1285", "1286", "1294", "1295", "1303", "1304", "1312", "1313");
-                Device.AddFlag(DF.涂布RGV取货站台, "1391", "1392", "1399", "1400");
-                Device.AddFlag(DF.BOPPRGV, "RGV1", "RGV2", "RGV3", "RGV4", "RGV5", "RGV6", "RGV7");
-                Device.AddFlag(DF.BOPPRGV取货设备组, "G19", "G23");
-                Device.AddFlag(DF.BOPPRGV放货设备组, "G12", "G13", "G14", "G15", "G16");
+                WCS_DEVICEExtension.AddFlag(DF.一楼RGV放货, "G1035", "G1044", "G1053", "G1062");
+                WCS_DEVICEExtension.AddFlag(DF.SRM, "SRM1", "SRM2", "SRM3", "SRM4", "SRM5", "SRM6", "SRM7", "SRM8");
+                WCS_DEVICEExtension.AddFlag(DF.月台, "G1469", "G1561", "G1538", "G1574", "G1509");
+                WCS_DEVICEExtension.AddFlag(DF.SRM二级品取货, "1040", "1041", "1042", "1043", "1049", "1050", "1051", "1052");
+                WCS_DEVICEExtension.AddFlag(DF.SRM二级品取货, "1058", "1059", "1060", "1061", "1067", "1068");
+                WCS_DEVICEExtension.AddFlag(DF.SRMBOPP取货, "1195", "1194", "1193", "1192", "1204", "1203", "1202", "1201");
+                WCS_DEVICEExtension.AddFlag(DF.SRMBOPP取货, "1213", "1212", "1210", "1211", "1220", "1219", "1230", "1228");
+                WCS_DEVICEExtension.AddFlag(DF.SRM月台放货, "1473", "1476", "1474", "1475", "1491", "1492", "1493", "1494");
+                WCS_DEVICEExtension.AddFlag(DF.SRM月台放货, "1520", "1521", "1522", "1523", "1545", "1546", "1451", "1453");
+                WCS_DEVICEExtension.AddFlag(DF.SRM涂布取货, "1431", "1432", "1422", "1423", "1424", "1425", "1415", "1416");
+                WCS_DEVICEExtension.AddFlag(DF.SRM涂布取货, "1605", "1606", "1406", "1407", "1408", "1409");
+                WCS_DEVICEExtension.AddFlag(DF.SRM涂布放货, "1283", "1284", "1290", "1291", "1292", "1293", "1299", "1300");
+                WCS_DEVICEExtension.AddFlag(DF.SRM涂布放货, "1301", "1302", "1308", "1309", "1310", "1311");
+                WCS_DEVICEExtension.AddFlag(DF.涂布RGV, "RGV9", "RGV10", "RGV11", "RGV12", "RGV13", "RGV14");
+                WCS_DEVICEExtension.AddFlag(DF.涂布RGV取货设备组, "G2", "G3", "G5", "G7", "G9", "G11");
+                WCS_DEVICEExtension.AddFlag(DF.涂布RGV放货设备组, "G1", "G4", "G6", "G8", "G10");
+                WCS_DEVICEExtension.AddFlag(DF.涂布出库RGV取货站台, "1285", "1286", "1294", "1295", "1303", "1304", "1312", "1313");
+                WCS_DEVICEExtension.AddFlag(DF.涂布入库RGV取货站台, "1391", "1392", "1399", "1400");
+                WCS_DEVICEExtension.AddFlag(DF.涂布RGV取货站台, "1285", "1286", "1294", "1295", "1303", "1304", "1312", "1313");
+                WCS_DEVICEExtension.AddFlag(DF.涂布RGV取货站台, "1391", "1392", "1399", "1400");
+                WCS_DEVICEExtension.AddFlag(DF.BOPPRGV, "RGV1", "RGV2", "RGV3", "RGV4", "RGV5", "RGV6", "RGV7");
+                WCS_DEVICEExtension.AddFlag(DF.BOPPRGV取货设备组, "G19", "G23");
+                WCS_DEVICEExtension.AddFlag(DF.BOPPRGV放货设备组, "G12", "G13", "G14", "G15", "G16");
 
                 #endregion 设备扩展数据配置
 
@@ -206,7 +198,7 @@ namespace WCS.Service
             }
         }
 
-        public override Task StopAsync(CancellationToken cancellationToken)
+        public override System.Threading.Tasks.Task StopAsync(CancellationToken cancellationToken)
         {
             _logger.LogError("WCS关闭");
             //InfoLog.INFO_INIT("WCS关闭");

+ 1 - 0
VirtualPlc.Service/Works/SRM/SRMWork.cs

@@ -1,6 +1,7 @@
 using WCS.Core;
 using WCS.Entity;
 using WCS.Entity.Protocol;
+using WCS.Service.Extensions;
 using WCS.Service.Handlers;
 
 namespace WCS.Service.Works.SRM

+ 2 - 2
VirtualPlc.Service/Works/Station/一楼入库.cs

@@ -73,8 +73,8 @@ namespace WCS.Service.Works.Station
                         //var task = db.Default.Queryable<WCS_TASK>().First(v => v.WMSTASK == finishTask.FinishCode);
                         //if (task == null) continue;
 
-                        finishTask.Station.Data2.Status = IstationStatus.光电状态;
-                        //finishTask.Station.Data.Goodsstart = task.ADDRFROM.ToShort();
+                        finishTask.Station.Data2.Status = finishTask.Station.Data2.Status | IstationStatus.光电状态;
+                        //finishTask.Station.Data.Goodsstart = 2222;
                         //finishTask.Station.Data.Goodsend = task.ADDRNEXT.ToShort();
                         //finishTask.Station.Data.Goodsnum = finishTaskList.Count.ToShort();
                         //finishTask.Station.Data.CmdType = IstationCmdType.扫码入库;

+ 19 - 0
WCS.Entity.Protocol/BCR/IBCR80.cs

@@ -0,0 +1,19 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Text;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// 扫码头协议20
+    /// </summary>
+    public interface IBCR80 : IProtocol
+    {
+        /// <summary>
+        /// 内容
+        /// </summary>
+        [StringLength(130)]
+        string Content { get; set; }
+    }
+}

+ 20 - 0
WCS.Entity.Protocol/BCR/WCS_BCR80.cs

@@ -0,0 +1,20 @@
+using SqlSugar;
+using System.Runtime.Serialization;
+
+namespace WCS.Entity.Protocol.BCR
+{
+    /// <summary>
+    /// 读码器读取协议
+    /// </summary>
+    [SugarTable(nameof(WCS_BCR80), "读码器读取协议")]
+    [DataContract]
+    public class WCS_BCR80 : WCS_PROTOCOLDATA, IBCR80
+    {
+        /// <summary>
+        /// 内容
+        /// </summary>
+        [SugarColumn(ColumnDescription = "内容", Length = 130)]
+        [DataMember(Order = 0)]
+        public string Content { get; set; }
+    }
+}

+ 124 - 0
WCS.Entity.Protocol/DeviceData.cs

@@ -0,0 +1,124 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Runtime.Serialization;
+using WCS.Entity.Protocol.Station;
+
+namespace WCS.Entity.Protocol
+{
+    [DataContract]
+    public class ProdLineData : DeviceData
+    {
+        [DataMember(Order = 3)]
+        public List<WCS_AGVTask> TaskList { get; set; } = new List<WCS_AGVTask>();
+    }
+
+    [DataContract]
+    public class StationData : DeviceData
+    {
+        [DataMember(Order = 3)]
+        public WCS_Station520 D520 { get; set; }
+
+        [DataMember(Order = 4)]
+        public WCS_Station521 D521 { get; set; }
+
+        [DataMember(Order = 5)]
+        public WCS_Station523 D523 { get; set; }
+
+        //[DataMember(Order = 4)]
+        //public WCS_RobotStation RobotStation { get; set; }
+    }
+
+    [DataContract]
+    public class RGVData : DeviceData
+    {
+        [DataMember(Order = 5)]
+        public WCS_RGV520 D520 { get; set; }
+
+        [DataMember(Order = 3)]
+        public WCS_RGV521 D521 { get; set; }
+
+        [DataMember(Order = 4)]
+        public WCS_RGV523 D523 { get; set; }
+    }
+
+    [DataContract]
+    public class SCData : DeviceData
+    {
+        [DataMember(Order = 5)]
+        public WCS_SRM520 D520 { get; set; }
+
+        [DataMember(Order = 3)]
+        public WCS_SRM521 D521 { get; set; }
+
+        [DataMember(Order = 4)]
+        public WCS_SRM537 D537 { get; set; }
+    }
+
+    [DataContract]
+    public class RobotData : DeviceData
+    {
+        //[DataMember(Order = 3)]
+        //public WCS_Robot Data { get; set; }
+    }
+
+    [DataContract]
+    public class DeviceData
+    {
+        [DataMember(Order = 0)]
+        public string Code { get; set; }
+
+        [DataMember(Order = 1)]
+        public DateTime Frame { get; set; }
+
+        [DataMember(Order = 2)]
+        public string Info { get; set; } = "";
+    }
+
+    [DataContract]
+    public class DeviceDataCollection<T> where T : DeviceData
+    {
+        [DataMember(Order = 0)]
+        public DateTime Frame { get; set; }
+
+        [DataMember(Order = 1)]
+        public T[] Datas { get; set; }
+
+        public DeviceDataCollection()
+        { }
+
+        public DeviceDataCollection(DateTime frame, object[] datas)
+        {
+            this.Frame = frame;
+            this.Datas = datas.OfType<T>().ToArray();
+        }
+    }
+
+    [DataContract]
+    public class DeviceDataPack
+    {
+        [DataMember(Order = 0)]
+        public DeviceDataCollection<SCData> SCDatas { get; set; }
+
+        [DataMember(Order = 1)]
+        public DeviceDataCollection<RGVData> RGVDatas { get; set; }
+
+        [DataMember(Order = 2)]
+        public DeviceDataCollection<StationData> StationDatas { get; set; }
+
+        [DataMember(Order = 3)]
+        public DeviceDataCollection<RobotData> RobotData { get; set; }
+
+        [DataMember(Order = 4)]
+        public DeviceDataCollection<ProdLineData> ProdLineData { get; set; }
+
+        [DataMember(Order = 5)]
+        public DateTime Frame { get; set; }
+
+        /// <summary>
+        /// 回放最早时间
+        /// </summary>
+        [DataMember(Order = 6)]
+        public int PlaybackSeconds { get; set; }
+    }
+}

+ 100 - 0
WCS.Entity.Protocol/RGV/IRGV520.cs

@@ -0,0 +1,100 @@
+using WCS.Entity.Protocol.RGV;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// RGV 写入协议 后缀 _1=1工位 _2=2工位
+    /// </summary>
+    public interface IRGV520 : IProtocol
+    {
+        #region 一工位
+
+        /// <summary>
+        /// WCS任务号1
+        /// </summary>
+        int TaskID_1 { get; set; }
+
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        RGVTaskType TaskType_1 { get; set; }
+
+        /// <summary>
+        /// 起始地址
+        /// 环穿RGV无起始地址,只有目标地址
+        /// </summary>
+        short StartPosition_1 { get; set; }
+
+        /// <summary>
+        /// 目标地址
+        /// </summary>
+        short DestPosition_1 { get; set; }
+
+        /// <summary>
+        /// 优先
+        /// </summary>
+        short Priority_1 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES1_1 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES2_1 { get; set; }
+
+        /// <summary>
+        /// 触发信号 在通讯协议中为VoucherNo_1
+        /// </summary>
+        int Trigger_1 { get; set; }
+
+        #endregion 一工位
+
+        #region 二工位
+
+        /// <summary>
+        /// WCS任务号
+        /// </summary>
+        int TaskID_2 { get; set; }
+
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        RGVTaskType TaskType_2 { get; set; }
+
+        /// <summary>
+        /// 起始地址
+        /// 环穿RGV无起始地址,只有目标地址
+        /// </summary>
+        short StartPosition_2 { get; set; }
+
+        /// <summary>
+        /// 目标地址
+        /// </summary>
+        short DestPosition_2 { get; set; }
+
+        /// <summary>
+        /// 优先
+        /// </summary>
+        short Priority_2 { get; set; }
+
+        /// <summary>
+        /// WCS处理完任务时写入的反馈信号
+        /// </summary>
+        short RES1_2 { get; set; }
+
+        /// <summary>
+        /// WCS处理完任务时写入的反馈信号
+        /// </summary>
+        short RES2_2 { get; set; }
+
+        /// <summary>
+        /// 触发信号 在通讯协议中为VoucherNo_2
+        /// </summary>
+        int Trigger_2 { get; set; }
+
+        #endregion 二工位
+    }
+}

+ 166 - 0
WCS.Entity.Protocol/RGV/IRGV521.cs

@@ -0,0 +1,166 @@
+using System;
+using WCS.Entity.Protocol.RGV;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// RGV 读取协议 后缀 _1=1工位 _2=2工位 无=共用
+    /// </summary>
+    public interface IRGV521 : IProtocol
+    {
+        #region 一工位
+
+        /// <summary>
+        /// 任务号
+        /// </summary>
+        int TaskID_1 { get; set; }
+
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        RGVTaskType TaskType_1 { get; set; }
+
+        /// <summary>
+        /// 起始站台
+        /// </summary>
+        short StartPosition_1 { get; set; }
+
+        /// <summary>
+        /// 目标站台
+        /// </summary>
+        short DestPosition_1 { get; set; }
+
+        /// <summary>
+        /// 优先级
+        /// </summary>
+        short PRIORITY_1 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES1_1 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES2_1 { get; set; }
+
+        /// <summary>
+        /// 一工位状态
+        /// </summary>
+        RGVStatus Status_1 { get; set; }
+
+        /// <summary>
+        /// 触发信号 在通讯协议中为VoucherNo_1
+        /// </summary>
+        int Trigger_1 { get; set; }
+
+        #endregion 一工位
+
+        #region 二工位
+
+        /// <summary>
+        /// 任务号
+        /// </summary>
+        int TaskID_2 { get; set; }
+
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        RGVTaskType TaskType_2 { get; set; }
+
+        /// <summary>
+        /// 起始站台
+        /// </summary>
+        short StartPosition_2 { get; set; }
+
+        /// <summary>
+        /// 目标站台
+        /// </summary>
+        short DestPosition_2 { get; set; }
+
+        /// <summary>
+        /// 优先级
+        /// </summary>
+        short PRIORITY_2 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES1_2 { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES2_2 { get; set; }
+
+        /// <summary>
+        /// 一工位状态
+        /// </summary>
+        RGVStatus Status_2 { get; set; }
+
+        /// <summary>
+        /// 触发信号 在通讯协议中为VoucherNo_1
+        /// </summary>
+        int Trigger_2 { get; set; }
+
+        #endregion 二工位
+
+        #region 共用
+
+        /// <summary>
+        /// RGV运行状态
+        /// </summary>
+        RGVRunStatus SystemStatus { get; set; }
+
+        /// <summary>
+        /// RGV运行模式
+        /// </summary>
+        RGVMode WorkMode { get; set; }
+
+        /// <summary>
+        /// 备用6
+        /// </summary>
+        short RES6 { get; set; }
+
+        /// <summary>
+        /// 位置
+        /// </summary>
+        float Position { get; set; }
+
+        /// <summary>
+        /// 里程
+        /// </summary>
+        [IgnoreChanging]
+        float Mileage { get; set; }
+
+        /// <summary>
+        /// 运行时长 (单位:小时,带小数)
+        /// </summary>
+        [IgnoreChanging]
+        float Runtime { get; set; }
+
+        #endregion 共用
+    }
+
+    [Flags]
+    public enum RGVStatus : ushort
+    {
+        光电 = 1 << 0,
+        RGV到站 = 1 << 1,
+        任务完成 = 1 << 2,
+        备用 = 1 << 3,
+        备用9 = 1 << 4,
+        备用10 = 1 << 5,
+        备用11 = 1 << 6,
+        备用12 = 1 << 7,
+        备用1 = 1 << 8,
+        备用2 = 1 << 9,
+        备用3 = 1 << 10,
+        备用4 = 1 << 11,
+        备用5 = 1 << 12,
+        备用6 = 1 << 13,
+        备用7 = 1 << 14,
+        备用8 = 1 << 15,
+    }
+}

+ 40 - 0
WCS.Entity.Protocol/RGV/IRGV523.cs

@@ -0,0 +1,40 @@
+using WCS.Entity.Protocol.RGV;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// RGV状态协议
+    /// </summary>
+    public interface IRGV523 : IProtocol
+    {
+        /// <summary>
+        /// 环形穿梭车故障
+        /// </summary>
+         RGVFault Fault { get; set; }
+
+        /// <summary>
+        /// 环形穿梭车工位1故障
+        /// </summary>
+         RGVPlatformFault Fault1 { get; set; }
+
+        /// <summary>
+        /// 工位2故障
+        /// </summary>
+         RGVPlatformFault Fault2 { get; set; }
+
+        /// <summary>
+        /// 环穿状态
+        /// </summary>
+         RGVStatus Status { get; set; }
+
+        /// <summary>
+        /// 工位1状态
+        /// </summary>
+         RGVPlatformStatus Status1 { get; set; }
+
+        /// <summary>
+        /// 工位2状态
+        /// </summary>
+         RGVPlatformStatus Status2 { get; set; }
+    }
+}

+ 141 - 0
WCS.Entity.Protocol/RGV/RGVEnum.cs

@@ -0,0 +1,141 @@
+using System;
+
+namespace WCS.Entity.Protocol.RGV
+{
+    /// <summary>
+    /// RGV运行状态
+    /// </summary>
+    public enum RGVRunStatus : short
+    {
+        空闲 = 1,
+        取货移动 = 2,
+        取货 = 3,
+        放货移动 = 4,
+        放货 = 5
+    }
+
+    /// <summary>
+    /// RGV运行模式
+    /// </summary>
+    public enum RGVMode : short
+    {
+        自动 = 1,
+        半自动 = 2,
+        手动 = 3,
+        维护 = 4
+    }
+
+    /// <summary>
+    /// RGV任务类型
+    /// </summary>
+    public enum RGVTaskType : short
+    {
+        取货 = 1,
+        放货 = 2,
+        移动 = 3,
+        码盘 = 4,
+        拆盘 = 5,
+        变更放货站台 = 6,
+
+        /// <summary>
+        /// 环穿、双工位使用
+        /// </summary>
+        变更取货站台 = 7,
+    }
+
+    /// <summary>
+    /// RGV故障
+    /// </summary>
+    [Flags]
+    public enum RGVFault : ushort
+    {
+        RGV前后防撞条故障 = 1 << 0,
+        RGV载货极限光电故障 = 1 << 1,
+        RGV输送线变频器故障 = 1 << 2,
+        RGV行走变频器故障 = 1 << 3,
+        RGV扫码器故障 = 1 << 4,
+        RGV位置值故障 = 1 << 5,
+        RGV定位失败 = 1 << 6,
+        RGV取放货时位置偏差过大 = 1 << 7,
+        RGV急停按下 = 1 << 8,
+        主柜急停按下 = 1 << 9,
+        站台货物超出 = 1 << 10,
+        RGV输送线超时 = 1 << 11,
+        RGV输送线光电异常 = 1 << 12,
+        RGV任务号与站台任务号不匹配 = 1 << 13,
+        RGV不支持此任务类型 = 1 << 14,
+        RGV目标站台与交互站台号不一致 = 1 << 15,
+    }
+
+    /// <summary>
+    /// RGV工位故障
+    /// </summary>
+    [Flags]
+    public enum RGVPlatformFault : ushort
+    {
+        RGV站台号错误 = 1 << 0,
+        RGV任务类型错误 = 1 << 1,
+        RGV任务号错误 = 1 << 2,
+        RGV货物超出故障 = 1 << 3,
+        RGV输送线变频器故障2 = 1 << 4,
+        RGV输送线传感器异常 = 1 << 5,
+        RGV输送线运行超时 = 1 << 6,
+        RGV输送线总故障 = 1 << 7,
+        RGV硬极限故障 = 1 << 8,
+        RGV软极限故障 = 1 << 9,
+        RGV货物超出故障2 = 1 << 10,
+        RGV行走测距信号丢失 = 1 << 11,
+        RGV行走变频器故障 = 1 << 12,
+        RGV = 1 << 13,
+        RGV2 = 1 << 14,
+        RGV急停按下 = 1 << 15,
+    }
+
+    /// <summary>
+    /// RGV状态
+    /// </summary>
+    [Flags]
+    public enum RGVStatus : ushort
+    {
+        RGV与站台交互完成 = 1 << 0,
+        RGV前方有障暂停运行 = 1 << 1,
+        RGV = 1 << 2,
+        RGV2 = 1 << 3,
+        RGV3 = 1 << 4,
+        RGV4 = 1 << 5,
+        RGV5 = 1 << 6,
+        RGV6 = 1 << 7,
+        RGV运行 = 1 << 8,
+        RGV移动中 = 1 << 9,
+        RGV取货中 = 1 << 10,
+        RGV放货中 = 1 << 11,
+        RGV变址运行 = 1 << 12,
+        RGV定位完成 = 1 << 13,
+        RGV有货光电 = 1 << 14,
+        RGV与站台交互中 = 1 << 15,
+    }
+
+    /// <summary>
+    /// RGV工位状态
+    /// </summary>
+    [Flags]
+    public enum RGVPlatformStatus : ushort
+    {
+        RGV任务挂起 = 1 << 0,
+        RGV移动中 = 1 << 1,
+        RGV取货中 = 1 << 2,
+        RGV放货中 = 1 << 3,
+        RGV定位完全 = 1 << 4,
+        RGV有货光电 = 1 << 5,
+        RGV与站台交互中 = 1 << 6,
+        RGV与站台交互完 = 1 << 7,
+        RGV = 1 << 8,
+        RGV2 = 1 << 9,
+        RGV3 = 1 << 10,
+        RGV4 = 1 << 11,
+        RGV5 = 1 << 12,
+        RGV6 = 1 << 13,
+        RGV7 = 1 << 14,
+        RGV8 = 1 << 15,
+    }
+}

+ 78 - 0
WCS.Entity.Protocol/RGV/WCS_RGV520.cs

@@ -0,0 +1,78 @@
+using SqlSugar;
+using System.Runtime.Serialization;
+using WCS.Entity.Protocol.RGV;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// RGV 读取记录表 后缀 _1=1工位 _2=2工位
+    /// </summary>
+    [SugarTable(nameof(WCS_RGV520), "RGV 读取记录表 后缀 _1=1工位 _2=2工位 ")]
+    [DataContract]
+    public class WCS_RGV520 : WCS_PROTOCOLDATA, IRGV520
+    {
+        [SugarColumn(ColumnDescription = "WCS任务号")]
+        [DataMember(Order = 0)]
+        public int TaskID_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "任务类型")]
+        [DataMember(Order = 1)]
+        public RGVTaskType TaskType_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始地址环穿RGV无起始地址,只有目标地址")]
+        [DataMember(Order = 2)]
+        public short StartPosition_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标地址")]
+        [DataMember(Order = 3)]
+        public short DestPosition_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "优先")]
+        [DataMember(Order = 4)]
+        public short Priority_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用")]
+        [DataMember(Order = 5)]
+        public short RES1_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用")]
+        [DataMember(Order = 6)]
+        public short RES2_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "触发")]
+        [DataMember(Order = 7)]
+        public int Trigger_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "WCS任务号")]
+        [DataMember(Order = 8)]
+        public int TaskID_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "任务类型")]
+        [DataMember(Order = 9)]
+        public RGVTaskType TaskType_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始地址环穿RGV无起始地址,只有目标地址")]
+        [DataMember(Order = 10)]
+        public short StartPosition_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标地址")]
+        [DataMember(Order = 11)]
+        public short DestPosition_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "优先")]
+        [DataMember(Order = 12)]
+        public short Priority_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用")]
+        [DataMember(Order = 13)]
+        public short RES1_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用")]
+        [DataMember(Order = 14)]
+        public short RES2_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "触发")]
+        [DataMember(Order = 15)]
+        public int Trigger_2 { get; set; }
+    }
+}

+ 110 - 0
WCS.Entity.Protocol/RGV/WCS_RGV521.cs

@@ -0,0 +1,110 @@
+using SqlSugar;
+using System.Runtime.Serialization;
+using WCS.Entity.Protocol.RGV;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// RGV 读取协议 后缀 _1=1工位 _2=2工位 无=共用
+    /// </summary>
+    [SugarTable(nameof(WCS_RGV521), "RGV 读取协议 后缀 _1=1工位 _2=2工位 无=共用")]
+    [DataContract]
+    public class WCS_RGV521 : WCS_PROTOCOLDATA, IRGV521
+    {
+        [SugarColumn(ColumnDescription = "任务号")]
+        [DataMember(Order = 0)]
+        public int TaskID_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "任务类型")]
+        [DataMember(Order = 1)]
+        public RGVTaskType TaskType_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始站台")]
+        [DataMember(Order = 2)]
+        public short StartPosition_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标站台")]
+        [DataMember(Order = 3)]
+        public short DestPosition_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "优先级")]
+        [DataMember(Order = 4)]
+        public short PRIORITY_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用1")]
+        [DataMember(Order = 5)]
+        public short RES1_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用2")]
+        [DataMember(Order = 6)]
+        public short RES2_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "状态")]
+        [DataMember(Order = 7)]
+        public RGVStatus Status_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "凭证号")]
+        [DataMember(Order = 8)]
+        public int Trigger_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "任务号")]
+        [DataMember(Order = 9)]
+        public int TaskID_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "任务类型")]
+        [DataMember(Order = 10)]
+        public RGVTaskType TaskType_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始站点")]
+        [DataMember(Order = 11)]
+        public short StartPosition_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标站点")]
+        [DataMember(Order = 12)]
+        public short DestPosition_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "优先级")]
+        [DataMember(Order = 13)]
+        public short PRIORITY_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用1")]
+        [DataMember(Order = 14)]
+        public short RES1_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用2")]
+        [DataMember(Order = 15)]
+        public short RES2_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "状态")]
+        [DataMember(Order = 16)]
+        public RGVStatus Status_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "凭证号")]
+        [DataMember(Order = 17)]
+        public int Trigger_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "运行状态")]
+        [DataMember(Order = 18)]
+        public RGVRunStatus SystemStatus { get; set; }
+
+        [SugarColumn(ColumnDescription = "运行模式")]
+        [DataMember(Order = 19)]
+        public RGVMode WorkMode { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用6")]
+        [DataMember(Order = 20)]
+        public short RES6 { get; set; }
+
+        [SugarColumn(ColumnDescription = "位置")]
+        [DataMember(Order = 21)]
+        public float Position { get; set; }
+
+        [SugarColumn(ColumnDescription = "里程")]
+        [DataMember(Order = 22)]
+        public float Mileage { get; set; }
+
+        [SugarColumn(ColumnDescription = "运行时长")]
+        [DataMember(Order = 23)]
+        public float Runtime { get; set; }
+    }
+}

+ 38 - 0
WCS.Entity.Protocol/RGV/WCS_RGV523.cs

@@ -0,0 +1,38 @@
+using SqlSugar;
+using System.Runtime.Serialization;
+using WCS.Entity.Protocol.RGV;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// RGV状态记录
+    /// </summary>
+    [SugarTable(nameof(WCS_RGV523), "RGV状态记录")]
+    [DataContract]
+    public class WCS_RGV523 : WCS_PROTOCOLDATA, IRGV523
+    {
+        [SugarColumn(ColumnDescription = "环形穿梭车故障")]
+        [DataMember(Order = 0)]
+        public RGVFault Fault { get; set; }
+
+        [SugarColumn(ColumnDescription = "工位1故障")]
+        [DataMember(Order = 1)]
+        public RGVPlatformFault Fault1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "工位2故障")]
+        [DataMember(Order = 2)]
+        public RGVPlatformFault Fault2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "环穿状态")]
+        [DataMember(Order = 3)]
+        public RGVStatus Status { get; set; }
+
+        [SugarColumn(ColumnDescription = "工位1状态")]
+        [DataMember(Order = 4)]
+        public RGVPlatformStatus Status1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "工位2状态")]
+        [DataMember(Order = 5)]
+        public RGVPlatformStatus Status2 { get; set; }
+    }
+}

+ 198 - 0
WCS.Entity.Protocol/SRM/ISRM520.cs

@@ -0,0 +1,198 @@
+using WCS.Entity.Protocol.SRM;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// 堆垛机协议,WCS写入
+    /// </summary>
+    public interface ISRM520 : IProtocol
+    {
+        #region 工位一
+
+        /// <summary>
+        /// WCS心跳信号
+        /// </summary>
+        short Handshake_1 { get; set; }
+
+        /// <summary>
+        /// 货物数量
+        /// </summary>
+        short RES1_1 { get; set; }
+
+        /// <summary>
+        /// 备用2
+        /// </summary>
+        short RES2_1 { get; set; }
+
+        /// <summary>
+        /// 货物类型
+        /// </summary>
+        short GoodsType_1 { get; set; }
+
+        /// <summary>
+        /// 行驶速度
+        /// </summary>
+        SCSpeedMode SpeedMode_1 { get; set; }
+
+        /// <summary>
+        /// 起始行
+        /// </summary>
+        short SLine_1 { get; set; }
+
+        /// <summary>
+        /// 起始列
+        /// </summary>
+        short SCol_1 { get; set; }
+
+        /// <summary>
+        /// 起始层
+        /// </summary>
+        short SLayer_1 { get; set; }
+
+        /// <summary>
+        /// 起始深度
+        /// </summary>
+        short SDepth_1 { get; set; }
+
+        /// <summary>
+        /// 目标行
+        /// </summary>
+        short ELine_1 { get; set; }
+
+        /// <summary>
+        /// 目标列
+        /// </summary>
+        short ECol_1 { get; set; }
+
+        /// <summary>
+        /// 目标层
+        /// </summary>
+        short ELayer_1 { get; set; }
+
+        /// <summary>
+        /// 目标深度
+        /// </summary>
+        short EDepth_1 { get; set; }
+
+        /// <summary>
+        ///任务号
+        /// </summary>
+        int TaskID_1 { get; set; }
+
+        /// <summary>
+        /// 触发
+        /// </summary>
+        short VoucherNo_1 { get; set; }
+
+        /// <summary>
+        /// 完成任务触发
+        /// </summary>
+        short FinishedACK_1 { get; set; }
+
+        /// <summary>
+        /// 备用3
+        /// </summary>
+        short RES3_1 { get; set; }
+
+        /// <summary>
+        /// 备用4
+        /// </summary>
+        short RES4_1 { get; set; }
+
+        #endregion 工位一
+
+        #region 二工位
+
+        /// <summary>
+        /// WCS心跳信号
+        /// </summary>
+        short Handshake_2 { get; set; }
+
+        /// <summary>
+        /// 货物数量
+        /// </summary>
+        short RES1_2 { get; set; }
+
+        /// <summary>
+        /// 备用2
+        /// </summary>
+        short RES2_2 { get; set; }
+
+        /// <summary>
+        /// 货物类型
+        /// </summary>
+        short GoodsType_2 { get; set; }
+
+        /// <summary>
+        /// 行驶速度
+        /// </summary>
+        SCSpeedMode SCSpeedMode_2 { get; set; }
+
+        /// <summary>
+        /// 起始行
+        /// </summary>
+        short SLine_2 { get; set; }
+
+        /// <summary>
+        /// 起始列
+        /// </summary>
+        short SCol_2 { get; set; }
+
+        /// <summary>
+        /// 起始层
+        /// </summary>
+        short SLayer_2 { get; set; }
+
+        /// <summary>
+        /// 起始深度
+        /// </summary>
+        short SDepth_2 { get; set; }
+
+        /// <summary>
+        /// 目标行
+        /// </summary>
+        short ELine_2 { get; set; }
+
+        /// <summary>
+        /// 目标列
+        /// </summary>
+        short ECol_2 { get; set; }
+
+        /// <summary>
+        /// 目标层
+        /// </summary>
+        short ELayer_2 { get; set; }
+
+        /// <summary>
+        /// 目标深度
+        /// </summary>
+        short EDepth_2 { get; set; }
+
+        /// <summary>
+        ///任务号
+        /// </summary>
+        int TaskID_2 { get; set; }
+
+        /// <summary>
+        /// 触发
+        /// </summary>
+        short VoucherNo_2 { get; set; }
+
+        /// <summary>
+        /// 完成任务触发
+        /// </summary>
+        short FinishedACK_2 { get; set; }
+
+        /// <summary>
+        /// 备用3
+        /// </summary>
+        short RES3_2 { get; set; }
+
+        /// <summary>
+        /// 备用4
+        /// </summary>
+        short RES4_2 { get; set; }
+
+        #endregion 二工位
+    }
+}

+ 343 - 0
WCS.Entity.Protocol/SRM/ISRM521.cs

@@ -0,0 +1,343 @@
+using WCS.Entity.Protocol.SRM;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// 堆垛机协议,WCS只读
+    /// </summary>
+    public interface ISRM521 : IProtocol
+    {
+        #region 一工位
+
+        SRMForkStatus ForkStatus_1 { get; set; }
+
+        /// <summary>
+        /// 模式
+        /// </summary>
+        SCMode Mode_1 { get; set; }
+
+        /// <summary>
+        /// 运行状态
+        /// </summary>
+        SCRunStatus Status_1 { get; set; }
+
+        /// <summary>
+        /// 起始行
+        /// </summary>
+        short SLine_1 { get; set; }
+
+        /// <summary>
+        /// 起始列
+        /// </summary>
+        short SCol_1 { get; set; }
+
+        /// <summary>
+        /// 起始层
+        /// </summary>
+        short SLayer_1 { get; set; }
+
+        /// <summary>
+        /// 起始深度
+        /// </summary>
+        short SDepth_1 { get; set; }
+
+        /// <summary>
+        /// 目标行
+        /// </summary>
+        short ELine_1 { get; set; }
+
+        /// <summary>
+        /// 目标列
+        /// </summary>
+        short ECol_1 { get; set; }
+
+        /// <summary>
+        /// 目标层
+        /// </summary>
+        short ELayer_1 { get; set; }
+
+        /// <summary>
+        /// 目标深度
+        /// </summary>
+        short EDepth_1 { get; set; }
+
+        /// <summary>
+        /// 任务号
+        /// </summary>
+        int TaskID_1 { get; set; }
+
+        /// <summary>
+        /// 触发信号
+        /// </summary>
+        short VoucherNo_1 { get; set; }
+
+        /// <summary>
+        /// 当前行
+        /// </summary>
+        short Line_1 { get; set; }
+
+        /// <summary>
+        /// 当前列
+        /// </summary>
+        short Col_1 { get; set; }
+
+        /// <summary>
+        /// 当前层
+        /// </summary>
+        short Layer_1 { get; set; }
+
+        /// <summary>
+        /// 已完成任务号
+        /// </summary>
+        int FinishedTask_1 { get; set; }
+
+        /// <summary>
+        /// X轴位置(0.1毫米) 行走
+        /// </summary>
+        [IgnoreChanging]
+        int TravelPos_1 { get; set; }
+
+        /// <summary>
+        /// Y轴位置 提升
+        /// </summary>
+        [IgnoreChanging]
+        int LiftPos_1 { get; set; }
+
+        /// <summary>
+        /// Z轴位置 货叉
+        /// </summary>
+        [IgnoreChanging]
+        int ForkPos_1 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=Start_number1
+        /// </summary>
+        short RES9_1 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=End_number2
+        /// </summary>
+        short RES10_1 { get; set; }
+
+        /// <summary>
+        /// 总里程
+        /// </summary>
+        [IgnoreChanging]
+        float TotalKM_1 { get; set; }
+
+        /// <summary>
+        /// 货物类型
+        /// </summary>
+        short GoodsType_1 { get; set; }
+
+        /// <summary>
+        /// 运行时长
+        /// </summary>
+        [IgnoreChanging]
+        float Runtime_1 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=ForkPos2
+        /// </summary>
+        int RES11_1 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=Dest_Xmm
+        /// </summary>
+        int RES12_1 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=Dest_Ymm
+        /// </summary>
+        int RES13_1 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=Dest_Zmm
+        /// </summary>
+        int RES14_1 { get; set; }
+
+        #endregion 一工位
+
+        #region 二工位
+
+        SRMForkStatus ForkStatus_2 { get; set; }
+
+        /// <summary>
+        /// 模式
+        /// </summary>
+        SCMode Mode_2 { get; set; }
+
+        /// <summary>
+        /// 运行状态
+        /// </summary>
+        SCRunStatus Status_2 { get; set; }
+
+        /// <summary>
+        /// 起始行
+        /// </summary>
+        short SLine_2 { get; set; }
+
+        /// <summary>
+        /// 起始列
+        /// </summary>
+        short SCol_2 { get; set; }
+
+        /// <summary>
+        /// 起始层
+        /// </summary>
+        short SLayer_2 { get; set; }
+
+        /// <summary>
+        /// 起始深度
+        /// </summary>
+        short SDepth_2 { get; set; }
+
+        /// <summary>
+        /// 目标行
+        /// </summary>
+        short ELine_2 { get; set; }
+
+        /// <summary>
+        /// 目标列
+        /// </summary>
+        short ECol_2 { get; set; }
+
+        /// <summary>
+        /// 目标层
+        /// </summary>
+        short ELayer_2 { get; set; }
+
+        /// <summary>
+        /// 目标深度
+        /// </summary>
+        short EDepth_2 { get; set; }
+
+        /// <summary>
+        /// 任务号
+        /// </summary>
+        int TaskID_2 { get; set; }
+
+        /// <summary>
+        /// 触发信号
+        /// </summary>
+        short VoucherNo_2 { get; set; }
+
+        /// <summary>
+        /// 当前行
+        /// </summary>
+        short Line_2 { get; set; }
+
+        /// <summary>
+        /// 当前列
+        /// </summary>
+        short Col_2 { get; set; }
+
+        /// <summary>
+        /// 当前层
+        /// </summary>
+        short Layer_2 { get; set; }
+
+        /// <summary>
+        /// 已完成任务号
+        /// </summary>
+        int FinishedTask_2 { get; set; }
+
+        /// <summary>
+        /// X轴位置(0.1毫米) 行走
+        /// </summary>
+        [IgnoreChanging]
+        int TravelPos_2 { get; set; }
+
+        /// <summary>
+        /// Y轴位置 提升
+        /// </summary>
+        [IgnoreChanging]
+        int LiftPos_2 { get; set; }
+
+        /// <summary>
+        /// Z轴位置 货叉
+        /// </summary>
+        [IgnoreChanging]
+        int ForkPos_2 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=Start_number1
+        /// </summary>
+        short RES9_2 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=End_number2
+        /// </summary>
+        short RES10_2 { get; set; }
+
+        /// <summary>
+        /// 总里程
+        /// </summary>
+        [IgnoreChanging]
+        float TotalKM_2 { get; set; }
+
+        /// <summary>
+        /// 货物类型
+        /// </summary>
+        short GoodsType_2 { get; set; }
+
+        /// <summary>
+        /// 运行时长
+        /// </summary>
+        [IgnoreChanging]
+        float Runtime_2 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=ForkPos2
+        /// </summary>
+        int RES11_2 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=Dest_Xmm
+        /// </summary>
+        int RES12_2 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=Dest_Ymm
+        /// </summary>
+        int RES13_2 { get; set; }
+
+        /// <summary>
+        /// 备用 PLCname=Dest_Zmm
+        /// </summary>
+        int RES14_2 { get; set; }
+
+        #endregion 二工位
+
+        #region 公用
+
+        /// <summary>
+        /// 堆垛机模式
+        /// </summary>
+        SCMode SRMMode { get; set; }
+
+        /// <summary>
+        /// 堆垛机状态
+        /// </summary>
+        SCRunStatus SRMStatus { get; set; }
+
+        /// <summary>
+        /// 总里程
+        /// </summary>
+        [IgnoreChanging]
+        float TotalKM { get; set; }
+
+        /// <summary>
+        /// 运行时长
+        /// </summary>
+        [IgnoreChanging]
+        float Runtime { get; set; }
+
+        /// <summary>
+        /// 堆垛机是否异常 1:异常 0:正常
+        /// </summary>
+        short Alarm { get; set; }
+
+        #endregion 公用
+    }
+}

+ 17 - 0
WCS.Entity.Protocol/SRM/ISRM537.cs

@@ -0,0 +1,17 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using WCS.Entity.Protocol.SRM;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// 堆垛机异常读取
+    /// </summary>
+    public interface ISRM537 : IProtocol
+    {
+        SCAlarm SCAlarm { get; set; }
+    }
+}

+ 140 - 0
WCS.Entity.Protocol/SRM/SRMEnum.cs

@@ -0,0 +1,140 @@
+using System;
+
+namespace WCS.Entity.Protocol.SRM
+{
+    /// <summary>
+    /// 速度模式
+    /// </summary>
+    public enum SCSpeedMode : short
+    {
+        正常 = 0,
+        低速 = 1
+    }
+
+    /// <summary>
+    /// 运行状态
+    /// </summary>
+    public enum SCRunStatus : short
+    {
+        空闲 = 1,
+        取货行走 = 2,
+        取货伸叉 = 3,
+        取货抬叉 = 4,
+        取货收叉 = 5,
+        放货行走 = 6,
+        放货伸叉 = 7,
+        取货降叉 = 8,
+        放货收叉 = 9,
+        维护 = 99
+    }
+
+    /// <summary>
+    /// 运行模式
+    /// </summary>
+    public enum SCMode : short
+    {
+        远程 = 1,
+        半自动 = 2,
+        手动 = 3,
+        维修 = 4
+    }
+
+    /// <summary>
+    /// 货叉状态
+    /// </summary>
+    [Flags]
+    public enum SRMForkStatus : ushort
+    {
+        握手 = 1 << 0,
+        取货完成 = 1 << 1,
+        放货完成 = 1 << 2,
+        设备故障 = 1 << 3,
+        任务完成 = 1 << 4,
+        有货 = 1 << 5,
+        货叉中位 = 1 << 6,
+        WCS能否发任务 = 1 << 7,
+        备用1 = 1 << 8,
+        备用2 = 1 << 9,
+        备用3 = 1 << 10,
+        备用4 = 1 << 11,
+        备用5 = 1 << 12,
+        备用6 = 1 << 13,
+        备用7 = 1 << 14,
+        备用8 = 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,
+    }
+}

+ 158 - 0
WCS.Entity.Protocol/SRM/WCS_SRM520.cs

@@ -0,0 +1,158 @@
+using SqlSugar;
+using System.Runtime.Serialization;
+using WCS.Entity.Protocol.SRM;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// 堆垛机协议,WCS写入
+    /// </summary>
+    [SugarTable(nameof(WCS_SRM520), "堆垛机协议,WCS写入")]
+    [DataContract]
+    public class WCS_SRM520 : WCS_PROTOCOLDATA, ISRM520
+    {
+        [SugarColumn(ColumnDescription = "WCS心跳信号")]
+        [DataMember(Order = 0)]
+        public short Handshake_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物数量")]
+        [DataMember(Order = 1)]
+        public short RES1_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用")]
+        [DataMember(Order = 2)]
+        public short RES2_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物类型")]
+        [DataMember(Order = 3)]
+        public short GoodsType_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "速度")]
+        [DataMember(Order = 4)]
+        public SCSpeedMode SpeedMode_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始行")]
+        [DataMember(Order = 5)]
+        public short SLine_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始列")]
+        [DataMember(Order = 6)]
+        public short SCol_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始层")]
+        [DataMember(Order = 7)]
+        public short SLayer_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始深度")]
+        [DataMember(Order = 8)]
+        public short SDepth_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标行")]
+        [DataMember(Order = 9)]
+        public short ELine_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标列")]
+        [DataMember(Order = 10)]
+        public short ECol_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标层")]
+        [DataMember(Order = 11)]
+        public short ELayer_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标深度")]
+        [DataMember(Order = 12)]
+        public short EDepth_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "任务号")]
+        [DataMember(Order = 13)]
+        public int TaskID_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "触发")]
+        [DataMember(Order = 14)]
+        public short VoucherNo_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "完成任务触发")]
+        [DataMember(Order = 15)]
+        public short FinishedACK_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用3")]
+        [DataMember(Order = 16)]
+        public short RES3_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用4")]
+        [DataMember(Order = 17)]
+        public short RES4_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "WCS心跳信号")]
+        [DataMember(Order = 18)]
+        public short Handshake_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物数量")]
+        [DataMember(Order = 19)]
+        public short RES1_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用2")]
+        [DataMember(Order = 20)]
+        public short RES2_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物类型")]
+        [DataMember(Order = 21)]
+        public short GoodsType_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "行驶速度")]
+        [DataMember(Order = 22)]
+        public SCSpeedMode SCSpeedMode_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始行")]
+        [DataMember(Order = 23)]
+        public short SLine_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始列")]
+        [DataMember(Order = 24)]
+        public short SCol_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始层")]
+        [DataMember(Order = 25)]
+        public short SLayer_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始深度")]
+        [DataMember(Order = 26)]
+        public short SDepth_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标行")]
+        [DataMember(Order = 27)]
+        public short ELine_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标列")]
+        [DataMember(Order = 28)]
+        public short ECol_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标层")]
+        [DataMember(Order = 29)]
+        public short ELayer_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标深度")]
+        [DataMember(Order = 30)]
+        public short EDepth_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "任务号")]
+        [DataMember(Order = 31)]
+        public int TaskID_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "触发")]
+        [DataMember(Order = 32)]
+        public short VoucherNo_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "完成任务触发")]
+        [DataMember(Order = 33)]
+        public short FinishedACK_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用3")]
+        [DataMember(Order = 34)]
+        public short RES3_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用4")]
+        [DataMember(Order = 35)]
+        public short RES4_2 { get; set; }
+    }
+}

+ 266 - 0
WCS.Entity.Protocol/SRM/WCS_SRM521.cs

@@ -0,0 +1,266 @@
+using SqlSugar;
+using System.Runtime.Serialization;
+using WCS.Entity.Protocol.SRM;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// 堆垛机协议,WCS只读
+    /// </summary>
+    [SugarTable(nameof(WCS_SRM521), "堆垛机协议,WCS只读")]
+    [DataContract]
+    public class WCS_SRM521 : WCS_PROTOCOLDATA, ISRM521
+    {
+        [SugarColumn(ColumnDescription = "货叉状态")]
+        [DataMember(Order = 0)]
+        public SRMForkStatus ForkStatus_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "模式")]
+        [DataMember(Order = 1)]
+        public SCMode Mode_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "运行状态")]
+        [DataMember(Order = 2)]
+        public SCRunStatus Status_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始行")]
+        [DataMember(Order = 3)]
+        public short SLine_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始列")]
+        [DataMember(Order = 4)]
+        public short SCol_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始层")]
+        [DataMember(Order = 5)]
+        public short SLayer_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始深度")]
+        [DataMember(Order = 6)]
+        public short SDepth_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标行")]
+        [DataMember(Order = 7)]
+        public short ELine_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标列")]
+        [DataMember(Order = 8)]
+        public short ECol_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标层")]
+        [DataMember(Order = 9)]
+        public short ELayer_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标深度")]
+        [DataMember(Order = 10)]
+        public short EDepth_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "任务号")]
+        [DataMember(Order = 11)]
+        public int TaskID_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "触发信号")]
+        [DataMember(Order = 12)]
+        public short VoucherNo_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "当前行")]
+        [DataMember(Order = 13)]
+        public short Line_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "当前列")]
+        [DataMember(Order = 14)]
+        public short Col_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "当前层")]
+        [DataMember(Order = 15)]
+        public short Layer_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "已完成任务号")]
+        [DataMember(Order = 16)]
+        public int FinishedTask_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "X轴位置(0.1毫米) 行走")]
+        [DataMember(Order = 17)]
+        public int TravelPos_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "Y轴位置 提升")]
+        [DataMember(Order = 18)]
+        public int LiftPos_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "Z轴位置 货叉")]
+        [DataMember(Order = 19)]
+        public int ForkPos_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=Start_number1")]
+        [DataMember(Order = 20)]
+        public short RES9_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=End_number2")]
+        [DataMember(Order = 21)]
+        public short RES10_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "总里程")]
+        [DataMember(Order = 22)]
+        public float TotalKM_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物类型")]
+        [DataMember(Order = 23)]
+        public short GoodsType_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "运行时长")]
+        [DataMember(Order = 24)]
+        public float Runtime_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=ForkPos2")]
+        [DataMember(Order = 25)]
+        public int RES11_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=Dest_Xmm")]
+        [DataMember(Order = 26)]
+        public int RES12_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=Dest_Ymm")]
+        [DataMember(Order = 27)]
+        public int RES13_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=Dest_Zmm")]
+        [DataMember(Order = 28)]
+        public int RES14_1 { get; set; }
+
+        [SugarColumn(ColumnDescription = "货叉状态")]
+        [DataMember(Order = 29)]
+        public SRMForkStatus ForkStatus_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "模式")]
+        [DataMember(Order = 30)]
+        public SCMode Mode_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "运行状态")]
+        [DataMember(Order = 31)]
+        public SCRunStatus Status_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始行")]
+        [DataMember(Order = 32)]
+        public short SLine_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始列")]
+        [DataMember(Order = 33)]
+        public short SCol_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始层")]
+        [DataMember(Order = 34)]
+        public short SLayer_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始深度")]
+        [DataMember(Order = 35)]
+        public short SDepth_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标行")]
+        [DataMember(Order = 36)]
+        public short ELine_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标列")]
+        [DataMember(Order = 37)]
+        public short ECol_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标层")]
+        [DataMember(Order = 38)]
+        public short ELayer_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标深度")]
+        [DataMember(Order = 39)]
+        public short EDepth_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "任务号")]
+        [DataMember(Order = 40)]
+        public int TaskID_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "触发信号")]
+        [DataMember(Order = 41)]
+        public short VoucherNo_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "当前行")]
+        [DataMember(Order = 42)]
+        public short Line_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "当前列")]
+        [DataMember(Order = 43)]
+        public short Col_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "当前层")]
+        [DataMember(Order = 44)]
+        public short Layer_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "已完成任务号")]
+        [DataMember(Order = 45)]
+        public int FinishedTask_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "X轴位置(0.1毫米) 行走")]
+        [DataMember(Order = 46)]
+        public int TravelPos_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "Y轴位置 提升")]
+        [DataMember(Order = 47)]
+        public int LiftPos_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "Z轴位置 货叉")]
+        [DataMember(Order = 48)]
+        public int ForkPos_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=Start_number1")]
+        [DataMember(Order = 49)]
+        public short RES9_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=End_number2")]
+        [DataMember(Order = 50)]
+        public short RES10_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "总里程")]
+        [DataMember(Order = 51)]
+        public float TotalKM_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物类型")]
+        [DataMember(Order = 52)]
+        public short GoodsType_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "运行时长")]
+        [DataMember(Order = 53)]
+        public float Runtime_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=ForkPos2")]
+        [DataMember(Order = 54)]
+        public int RES11_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=Dest_Xmm")]
+        [DataMember(Order = 55)]
+        public int RES12_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=Dest_Ymm")]
+        [DataMember(Order = 56)]
+        public int RES13_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用 PLCname=Dest_Zmm")]
+        [DataMember(Order = 57)]
+        public int RES14_2 { get; set; }
+
+        [SugarColumn(ColumnDescription = "堆垛机模式")]
+        [DataMember(Order = 58)]
+        public SCMode SRMMode { get; set; }
+
+        [SugarColumn(ColumnDescription = "堆垛机状态")]
+        [DataMember(Order = 59)]
+        public SCRunStatus SRMStatus { get; set; }
+
+        [SugarColumn(ColumnDescription = "总里程")]
+        [DataMember(Order = 60)]
+        public float TotalKM { get; set; }
+
+        [SugarColumn(ColumnDescription = "运行时长")]
+        [DataMember(Order = 61)]
+        public float Runtime { get; set; }
+
+        [SugarColumn(ColumnDescription = "堆垛机是否异常 1:异常 0:正常")]
+        [DataMember(Order = 62)]
+        public short Alarm { get; set; }
+    }
+}

+ 18 - 0
WCS.Entity.Protocol/SRM/WCS_SRM537.cs

@@ -0,0 +1,18 @@
+using SqlSugar;
+using System.Runtime.Serialization;
+using WCS.Entity.Protocol.SRM;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// 堆垛机异常读取
+    /// </summary>
+    [SugarTable(nameof(WCS_SRM537), "堆垛机异常读取")]
+    [DataContract]
+    public class WCS_SRM537 : WCS_PROTOCOLDATA, ISRM537
+    {
+        [SugarColumn(ColumnDescription = "堆垛机报警")]
+        [DataMember(Order = 0)]
+        public SCAlarm SCAlarm { get; set; }
+    }
+}

+ 58 - 0
WCS.Entity.Protocol/Station/IStation520.cs

@@ -0,0 +1,58 @@
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    ///
+    /// </summary>
+    public interface IStation520 : IProtocol
+    {
+        /// <summary>
+        ///  任务号
+        /// </summary>
+        int Tasknum { get; set; }
+
+        /// <summary>
+        /// 货物数条码 涂布入库口代表AGV任务
+        /// </summary>
+        int Goodscode { get; set; }
+
+        /// <summary>
+        /// 货物数量(1.两个位置放1个货物,2.两个位置放2个货物)
+        /// </summary>
+        short Goodsnum { get; set; }
+
+        /// <summary>
+        /// 货物高度
+        /// </summary>
+        short GoodsSize { get; set; }
+
+        /// <summary>
+        /// 起始地址
+        /// </summary>
+        short Goodsstart { get; set; }
+
+        /// <summary>
+        /// 目标地址
+        /// </summary>
+        short Goodsend { get; set; }
+
+        /// <summary>
+        /// 请求
+        /// </summary>
+        IstationRequest Request { get; set; }
+
+        /// <summary>
+        /// 命令类型
+        /// </summary>
+        IstationCmdType CmdType { get; set; }
+
+        /// <summary>
+        /// 凭证号 每次累加
+        /// </summary>
+        short VoucherNo { get; set; }
+
+        /// <summary>
+        /// 输送机状态
+        /// </summary>
+        IstationStatus Istation521Status { get; set; }
+    }
+}

+ 108 - 0
WCS.Entity.Protocol/Station/IStation521.cs

@@ -0,0 +1,108 @@
+using System;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// 输送机交互信号 读
+    /// </summary>
+    public interface IStation521 : IProtocol
+    {
+        /// <summary>
+        ///  任务号
+        /// </summary>
+        int Tasknum { get; set; }
+
+        /// <summary>
+        /// 货物数条码 涂布入库扫码位是AGV任务号
+        /// </summary>
+        int Goodscode { get; set; }
+
+        /// <summary>
+        /// 货物数量(1.两个位置放1个货物,2.两个位置放2个货物)
+        /// </summary>
+        short Goodsnum { get; set; }
+
+        /// <summary>
+        /// 货物高度
+        /// </summary>
+        short GoodsSize { get; set; }
+
+        /// <summary>
+        /// 起始地址
+        /// </summary>
+        short Goodsstart { get; set; }
+
+        /// <summary>
+        /// 目标地址
+        /// </summary>
+        short Goodsend { get; set; }
+
+        /// <summary>
+        /// 请求
+        /// </summary>
+        IstationRequest Request { get; set; }
+
+        /// <summary>
+        /// 命令类型
+        /// </summary>
+        IstationCmdType CmdType { get; set; }
+
+        /// <summary>
+        /// 凭证号 每次累加
+        /// </summary>
+        short VoucherNo { get; set; }
+
+        /// <summary>
+        /// 输送机状态
+        /// </summary>
+        IstationStatus Status { get; set; }
+    }
+
+    /// <summary>
+    /// 输送机请求
+    /// </summary>
+    public enum IstationRequest : short
+    {
+        无 = 0,
+        扫码入库 = 1,
+        请求分配目标地址 = 2,
+        月台出库口任务完成 = 3,
+        堆垛机放货完成请求目标地址 = 4,
+    }
+
+    /// <summary>
+    /// 输送机确认
+    /// </summary>
+    public enum IstationCmdType : short
+    {
+        无 = 0,
+        扫码入库 = 1,
+        分配目标地址 = 2,
+        月台出库口任务完成 = 3,
+        堆垛机放货完成请求目标地址 = 4,
+    }
+
+    /// <summary>
+    /// 输送机状态
+    /// </summary>
+    [Flags]
+    public enum IstationStatus : ushort
+    {
+        手动入库 = 1 << 0,
+        备用2 = 1 << 1,
+        RES3 = 1 << 2,
+        上位机未分配任务 = 1 << 3,
+        光电状态 = 1 << 4,
+        外检扫码故障 = 1 << 5,
+        前超长故障 = 1 << 6,
+        后超长故障 = 1 << 7,
+        左超宽故障 = 1 << 8,
+        右超宽故障 = 1 << 9,
+        超高故障 = 1 << 10,
+        条码未读出 = 1 << 11,
+        超重 = 1 << 12,
+        AGV放货完成信号 = 1 << 13,
+        AGV取货完成信号 = 1 << 14,
+        RES7 = 1 << 15,
+    }
+}

+ 79 - 0
WCS.Entity.Protocol/Station/IStation523.cs

@@ -0,0 +1,79 @@
+using System;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// 输送机状态读取协议
+    /// </summary>
+    public interface IStation523 : IProtocol
+    {
+        /// <summary>
+        /// 警报
+        /// </summary>
+        StationFault Alarm { get; set; }
+
+        /// <summary>
+        /// 备用
+        /// </summary>
+        short RES { get; set; }
+
+        /// <summary>
+        /// 允许状态 值为零时是手动
+        /// </summary>
+        StationStatus Status { get; set; }
+
+        /// <summary>
+        /// 运行时间
+        /// </summary>
+        [IgnoreChanging]
+        float RunTime { get; set; }
+    }
+
+    /// <summary>
+    /// 输送机故障
+    /// </summary>
+    [Flags]
+    public enum StationFault : ushort
+    {
+        总故障 = 1 << 0,
+        急停故障 = 1 << 1,
+        超时故障 = 1 << 2,
+        驱动故障 = 1 << 3,
+        空气开关故障 = 1 << 4,
+        传感器异常故障 = 1 << 5,
+        其它故障汇入 = 1 << 6,
+        无Ready信号请检查柜内空开 = 1 << 7,
+        超时故障2 = 1 << 8,
+        驱动故障2 = 1 << 9,
+        空气开关故障2 = 1 << 10,
+        左极限故障 = 1 << 11,
+        右极限故障 = 1 << 12,
+        无Ready信号请检查柜内空开2 = 1 << 13,
+        前极限故障 = 1 << 14,
+        后极限故障 = 1 << 15,
+    }
+
+    /// <summary>
+    /// 输送机状态
+    /// </summary>
+    [Flags]
+    public enum StationStatus : ushort
+    {
+        自动 = 1 << 0,
+        选中状态位 = 1 << 1,
+        有货状态位 = 1 << 2,
+        运行状态位 = 1 << 3,
+        正转 = 1 << 4,
+        反转 = 1 << 5,
+        上升_右转 = 1 << 6,
+        下降_左转 = 1 << 7,
+        高位 = 1 << 8,
+        低位 = 1 << 9,
+        左位 = 1 << 10,
+        中位 = 1 << 11,
+        右位 = 1 << 12,
+        前位 = 1 << 13,
+        后位 = 1 << 14,
+        备用 = 1 << 15,
+    }
+}

+ 53 - 0
WCS.Entity.Protocol/Station/WCS_Station520.cs

@@ -0,0 +1,53 @@
+using SqlSugar;
+using System.Runtime.Serialization;
+
+namespace WCS.Entity.Protocol.Station
+{
+    /// <summary>
+    /// 站台交互信号 写记录表
+    /// </summary>
+    [SugarTable(nameof(WCS_Station520), "站台交互信号 写记录表")]
+    [DataContract]
+    public class WCS_Station520 : WCS_PROTOCOLDATA, IStation520
+    {
+        [SugarColumn(ColumnDescription = "任务号")]
+        [DataMember(Order = 0)]
+        public int Tasknum { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物数条码 涂布入库口代表AGV任务")]
+        [DataMember(Order = 1)]
+        public int Goodscode { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物数量(1.两个位置放1个货物,2.两个位置放2个货物)")]
+        [DataMember(Order = 2)]
+        public short Goodsnum { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物高度")]
+        [DataMember(Order = 3)]
+        public short GoodsSize { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始地址")]
+        [DataMember(Order = 4)]
+        public short Goodsstart { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标地址")]
+        [DataMember(Order = 5)]
+        public short Goodsend { get; set; }
+
+        [SugarColumn(ColumnDescription = "请求")]
+        [DataMember(Order = 6)]
+        public IstationRequest Request { get; set; }
+
+        [SugarColumn(ColumnDescription = "命令类型")]
+        [DataMember(Order = 7)]
+        public IstationCmdType CmdType { get; set; }
+
+        [SugarColumn(ColumnDescription = "凭证号 每次累加")]
+        [DataMember(Order = 8)]
+        public short VoucherNo { get; set; }
+
+        [SugarColumn(ColumnDescription = "输送机状态")]
+        [DataMember(Order = 9)]
+        public IstationStatus Istation521Status { get; set; }
+    }
+}

+ 50 - 0
WCS.Entity.Protocol/Station/WCS_Station521.cs

@@ -0,0 +1,50 @@
+using SqlSugar;
+using System.Runtime.Serialization;
+
+namespace WCS.Entity.Protocol.Station
+{
+    [SugarTable(nameof(WCS_Station521), "输送机交互信号 读记录表")]
+    [DataContract]
+    public class WCS_Station521 : WCS_PROTOCOLDATA, IStation521
+    {
+        [SugarColumn(ColumnDescription = "任务号")]
+        [DataMember(Order = 0)]
+        public int Tasknum { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物数条码 涂布入库扫码位是AGV任务号")]
+        [DataMember(Order = 1)]
+        public int Goodscode { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物数量(1.两个位置放1个货物,2.两个位置放2个货物)")]
+        [DataMember(Order = 2)]
+        public short Goodsnum { get; set; }
+
+        [SugarColumn(ColumnDescription = "货物高度")]
+        [DataMember(Order = 3)]
+        public short GoodsSize { get; set; }
+
+        [SugarColumn(ColumnDescription = "起始地址")]
+        [DataMember(Order = 4)]
+        public short Goodsstart { get; set; }
+
+        [SugarColumn(ColumnDescription = "目标地址")]
+        [DataMember(Order = 5)]
+        public short Goodsend { get; set; }
+
+        [SugarColumn(ColumnDescription = "请求")]
+        [DataMember(Order = 6)]
+        public IstationRequest Request { get; set; }
+
+        [SugarColumn(ColumnDescription = "命令类型")]
+        [DataMember(Order = 7)]
+        public IstationCmdType CmdType { get; set; }
+
+        [SugarColumn(ColumnDescription = "凭证号 每次累加")]
+        [DataMember(Order = 8)]
+        public short VoucherNo { get; set; }
+
+        [SugarColumn(ColumnDescription = "输送机状态")]
+        [DataMember(Order = 9)]
+        public IstationStatus Status { get; set; }
+    }
+}

+ 29 - 0
WCS.Entity.Protocol/Station/WCS_Station523.cs

@@ -0,0 +1,29 @@
+using SqlSugar;
+using System.Runtime.Serialization;
+
+namespace WCS.Entity.Protocol.Station
+{
+    /// <summary>
+    /// 站台状态读取记录表
+    /// </summary>
+    [SugarTable(nameof(WCS_Station523), "站台状态读取记录表")]
+    [DataContract]
+    public class WCS_Station523 : WCS_PROTOCOLDATA, IStation523
+    {
+        [SugarColumn(ColumnDescription = "警报")]
+        [DataMember(Order = 0)]
+        public StationFault Alarm { get; set; }
+
+        [SugarColumn(ColumnDescription = "备用")]
+        [DataMember(Order = 1)]
+        public short RES { get; set; }
+
+        [SugarColumn(ColumnDescription = "允许状态 值为零时是手动")]
+        [DataMember(Order = 2)]
+        public StationStatus Status { get; set; }
+
+        [SugarColumn(ColumnDescription = "运行时间")]
+        [DataMember(Order = 3)]
+        public float RunTime { get; set; }
+    }
+}

+ 11 - 0
WCS.Entity.Protocol/WCS.Entity.Protocol.csproj

@@ -0,0 +1,11 @@
+<Project Sdk="Microsoft.NET.Sdk">
+
+  <PropertyGroup>
+    <TargetFramework>netstandard2.1</TargetFramework>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <PackageReference Include="WCS.Entity" Version="1.0.1" />
+  </ItemGroup>
+
+</Project>

+ 129 - 0
WCS.Entity.Protocol/WCS_AGVTask.cs

@@ -0,0 +1,129 @@
+using SqlSugar;
+using System;
+using System.Runtime.Serialization;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// AGV任务中间表
+    /// </summary>
+    [SugarTable(nameof(WCS_AGVTask), "AGV任务中间表")]
+    [DataContract]
+    public class WCS_AGVTask
+    {
+        /// <summary>
+        /// ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "ID"), DataMember(Order = 0)]
+        public int ID { get; set; }
+
+        /// <summary>
+        /// AGVID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "AGVID", Length = 20), DataMember(Order = 1)]
+        public string AGVID { get; set; }
+
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        [SugarColumn(ColumnDescription = "任务类型")]
+        [DataMember(Order = 2)]
+        public AGVTaskType TaskType { get; set; }
+
+        /// <summary>
+        /// WCS AGV任务状态
+        /// </summary>
+        [SugarColumn(ColumnDescription = "WCS AGV任务状态")]
+        [DataMember(Order = 3)]
+        public AGVTaskStatus Status { get; set; }
+
+        /// <summary>
+        /// AGV自身状态
+        /// </summary>
+        [SugarColumn(ColumnDescription = "AGV自身状态")]
+        [DataMember(Order = 4)]
+        public AGVTaskStatus AGVStatus { get; set; }
+
+        /// <summary>
+        /// 车间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "车间")]
+        [DataMember(Order = 5)]
+        public int Workshop { get; set; }
+
+        /// <summary>
+        /// 站台
+        /// </summary>
+        [SugarColumn(ColumnDescription = "站台", Length = 20)]
+        [DataMember(Order = 6)]
+        public string Station { get; set; }
+
+        /// <summary>
+        /// 位置
+        /// </summary>
+        [SugarColumn(ColumnDescription = "位置", Length = 20)]
+        [DataMember(Order = 7)]
+        public string Position { get; set; }
+
+        /// <summary>
+        /// 货物数量(1.两个位置放1个货物,2.两个位置放2个货物)
+        /// </summary>
+        [SugarColumn(ColumnDescription = "货物数量(1.两个位置放1个货物,2.两个位置放2个货物)")]
+        [DataMember(Order = 11)]
+        public int Goodsnum { get; set; }
+
+        /// <summary>
+        /// 创建时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "创建时间")]
+        [DataMember(Order = 8)]
+        public DateTime CreateTime { get; set; }
+
+        /// <summary>
+        /// WCS更新时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "WCS更新时间")]
+        [DataMember(Order = 9)]
+        public DateTime? UpdateTime { get; set; }
+
+        /// <summary>
+        /// AGV更新时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "AGV更新时间")]
+        [DataMember(Order = 10)]
+        public DateTime? AGVUpdateTime { get; set; }
+
+        /// <summary>
+        ///更新用户
+        /// </summary>
+        [SugarColumn(ColumnDescription = "更新用户")]
+        [DataMember(Order = 11)]
+        public string UPDATEUSER { get; set; }
+
+        /// <summary>
+        /// 更新用户详细信息
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(UPDATEUSER))]
+        public WCS_USERS USER { get; set; }
+    }
+
+    public enum AGVTaskStatus
+    {
+        新建 = 0,
+        确认 = 5,
+        执行 = 10,
+        请求_允许 = 20,
+        取放完成 = 21,
+        请求_允许2 = 30,
+        取放完成2 = 31,
+        完成 = 99,
+        完成扫码 = 100,
+        取消 = 106
+    }
+
+    public enum AGVTaskType
+    {
+        入库 = 1,
+        叫料 = 2
+    }
+}

+ 47 - 0
WCS.Entity.Protocol/WCS_StatusLog.cs

@@ -0,0 +1,47 @@
+using SqlSugar;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// 任务状态变更记录
+    /// </summary>
+    [SugarTable(nameof(WCS_StatusLog), "任务状态变更记录")]
+    public class WCS_StatusLog : OBJ
+    {
+        /// <summary>
+        /// 关联任务ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "关联任务ID")]
+        public int WCS_TASKID { get; set; }
+
+        /// <summary>
+        /// 新的状态
+        /// </summary>
+        [SugarColumn(ColumnDescription = "新的状态")]
+        public TaskStatus NewStatus { get; set; }
+
+        /// <summary>
+        /// 旧的状态
+        /// </summary>
+        [SugarColumn(ColumnDescription = "旧的状态")]
+        public TaskStatus OldStatus { get; set; }
+
+        /// <summary>
+        /// 上传的状态
+        /// </summary>
+        [SugarColumn(ColumnDescription = "上传的状态")]
+        public TaskStatus upStatus { get; set; }
+
+        /// <summary>
+        /// 产生本次变化的节点
+        /// </summary>
+        [SugarColumn(ColumnDescription = "产生本次变化的节点")]
+        public string Node { get; set; }
+
+        /// <summary>
+        /// 变化的内容
+        /// </summary>
+        [SugarColumn(ColumnDescription = "变化的内容")]
+        public string msg { get; set; }
+    }
+}

+ 53 - 0
WCS.Entity.Protocol/WCS_SystemConfig.cs

@@ -0,0 +1,53 @@
+using SqlSugar;
+
+namespace WCS.Entity.Protocol
+{
+    /// <summary>
+    /// 系统配置
+    /// </summary>
+    [SugarTable(nameof(WCS_SystemConfig), "系统配置")]
+    public class WCS_SystemConfig : OBJ
+    {
+        /// <summary>
+        /// 设备编号 堆垛机/BCR
+        /// </summary>
+        [SugarColumn(ColumnDescription = "设备编号")]
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 描述
+        /// </summary>
+        [SugarColumn(ColumnDescription = "描述")]
+        public string Describe { get; set; }
+
+        /// <summary>
+        /// 所属设备
+        /// </summary>
+        [SugarColumn(ColumnDescription = "所属设备")]
+        public string DEVICECODE { get; set; }
+
+        /// <summary>
+        /// 所属设备信息
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(DEVICECODE))]
+        public WCS_DEVICE DEVICE { get; set; }
+
+        /// <summary>
+        /// 巷道
+        /// </summary>
+        [SugarColumn(ColumnDescription = "所属设备")]
+        public string TUNNEL { get; set; }
+
+        /// <summary>
+        /// 所属巷道信息
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(TUNNEL))]
+        public WCS_DEVICE TUNNELDEVICE { get; set; }
+
+        /// <summary>
+        /// 方向
+        /// </summary>
+        [SugarColumn(ColumnDescription = "方向")]
+        public string Direction { get; set; }
+    }
+}

+ 365 - 0
WCS.Entity.Protocol/WCS_TASK.cs

@@ -0,0 +1,365 @@
+using SqlSugar;
+using System;
+using WCS.Entity.Protocol;
+
+namespace WCS.Entity
+{
+    /// <summary>
+    /// 任务表
+    /// </summary>
+    [SugarTable(nameof(WCS_TASK), "任务表")]
+    public class WCS_TASK : OBJ
+    {
+        /// <summary>
+        /// 生产编码
+        /// </summary>
+        [SugarColumn(ColumnDescription = "生产编码", Length = 50)]
+        public string BARCODE { get; set; }
+
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        [SugarColumn(ColumnDescription = "任务类型")]
+        public TaskType TYPE { get; set; }
+
+        /// <summary>
+        /// 任务状态
+        /// </summary>
+        [SugarColumn(ColumnDescription = "任务状态")]
+        public TaskStatus STATUS { get; set; }
+
+        /// <summary>
+        /// 起始地址
+        /// </summary>
+        [SugarColumn(ColumnDescription = "起始地址", Length = 20)]
+        public string ADDRFROM { get; set; }
+
+        /// <summary>
+        /// 目标地址
+        /// </summary>
+        [SugarColumn(ColumnDescription = "目标地址", Length = 20)]
+        public string ADDRTO { get; set; }
+
+        /// <summary>
+        /// 下一个地址
+        /// </summary>
+        [SugarColumn(ColumnDescription = "下一个地址", Length = 20)]
+        public string ADDRNEXT { get; set; }
+
+        /// <summary>
+        /// 巷道
+        /// </summary>
+        [SugarColumn(ColumnDescription = "巷道", Length = 10)]
+        public string TUNNEL { get; set; }
+
+        /// <summary>
+        /// 楼层
+        /// </summary>
+        [SugarColumn(ColumnDescription = "楼层")]
+        public int FLOOR { get; set; }
+
+        /// <summary>
+        /// 设备
+        /// </summary>
+        [SugarColumn(ColumnDescription = "设备", Length = 20)]
+        public string DEVICE { get; set; }
+
+        /// <summary>
+        /// 堆垛机放货站台
+        /// </summary>
+        [SugarColumn(ColumnDescription = "堆垛机放货站台", Length = 20)]
+        public string SRMSTATION { get; set; }
+
+        /// <summary>
+        ///创建时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "创建时间")]
+        public DateTime CREATETIME { get; set; } = DateTime.Now;
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "开始时间")]
+        public DateTime? STARTTIME { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "结束时间")]
+        public DateTime? ENDTIME { get; set; }
+
+        /// <summary>
+        /// 单号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "单号")]
+        public int DOCID { get; set; }
+
+        /// <summary>
+        /// 托盘类型
+        /// </summary>
+        [SugarColumn(ColumnDescription = "托盘类型")]
+        public short PALLETTYPE { get; set; }
+
+        /// <summary>
+        /// 产线
+        /// </summary>
+        [SugarColumn(ColumnDescription = "产线")]
+        public short PRODLINE { get; set; }
+
+        /// <summary>
+        /// 满盘数量
+        /// </summary>
+        [SugarColumn(ColumnDescription = "满盘数量")]
+        public short FULLQTY { get; set; }
+
+        /// <summary>
+        /// 高度
+        /// </summary>
+        [SugarColumn(ColumnDescription = "高度")]
+        public short HEIGHT { get; set; }
+
+        /// <summary>
+        /// WMS任务号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "WMS任务号")]
+        public int WMSTASK { get; set; }
+
+        /// <summary>
+        /// 任务组ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "任务组ID")]
+        public string TaskGroupKey { get; set; }
+
+        /// <summary>
+        /// 更新状态
+        /// </summary>
+        [SugarColumn(ColumnDescription = "更新状态")]
+        public TaskStatus UPLOADED { get; set; }
+
+        /// <summary>
+        /// AGV任务号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "AGV任务号")]
+        public int AGVTASKID { get; set; }
+
+        /// <summary>
+        /// AGV任务详细信息
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(AGVTASKID))]
+        public WCS_AGVTask AGVTASK { get; set; }
+
+        /// <summary>
+        /// 优先级
+        /// </summary>
+        [SugarColumn(ColumnDescription = "优先级")]
+        public int Priority { get; set; }
+
+        /// <summary>
+        /// 手动处理备注
+        /// </summary>
+        [SugarColumn(ColumnDescription = "手动处理备注")]
+        public string ManualRemarks { get; set; }
+
+        /// <summary>
+        /// 产品长度
+        /// </summary>
+        [SugarColumn(ColumnDescription = "产品长度")]
+        public decimal Length { get; set; }
+
+        /// <summary>
+        /// 产品编码
+        /// </summary>
+        [SugarColumn(ColumnDescription = "产品编码")]
+        public string MaterialCode { get; set; }
+    }
+
+    /// <summary>
+    /// 任务表
+    /// </summary>
+    [SugarTable(nameof(WCS_TASK_OLD), "任务表")]
+    public class WCS_TASK_OLD : OBJ
+    {
+        /// <summary>
+        /// 生产编码
+        /// </summary>
+        [SugarColumn(ColumnDescription = "生产编码", Length = 50)]
+        public string BARCODE { get; set; }
+
+        /// <summary>
+        /// 任务类型
+        /// </summary>
+        [SugarColumn(ColumnDescription = "任务类型")]
+        public TaskType TYPE { get; set; }
+
+        /// <summary>
+        /// 任务状态
+        /// </summary>
+        [SugarColumn(ColumnDescription = "任务状态")]
+        public TaskStatus STATUS { get; set; }
+
+        /// <summary>
+        /// 起始地址
+        /// </summary>
+        [SugarColumn(ColumnDescription = "起始地址", Length = 20)]
+        public string ADDRFROM { get; set; }
+
+        /// <summary>
+        /// 目标地址
+        /// </summary>
+        [SugarColumn(ColumnDescription = "目标地址", Length = 20)]
+        public string ADDRTO { get; set; }
+
+        /// <summary>
+        /// 下一个地址
+        /// </summary>
+        [SugarColumn(ColumnDescription = "下一个地址", Length = 20)]
+        public string ADDRNEXT { get; set; }
+
+        /// <summary>
+        /// 巷道
+        /// </summary>
+        [SugarColumn(ColumnDescription = "巷道", Length = 10)]
+        public string TUNNEL { get; set; }
+
+        /// <summary>
+        /// 楼层
+        /// </summary>
+        [SugarColumn(ColumnDescription = "楼层")]
+        public int FLOOR { get; set; }
+
+        /// <summary>
+        /// 设备
+        /// </summary>
+        [SugarColumn(ColumnDescription = "设备", Length = 20)]
+        public string DEVICE { get; set; }
+
+        /// <summary>
+        /// 堆垛机放货站台
+        /// </summary>
+        [SugarColumn(ColumnDescription = "堆垛机放货站台", Length = 20)]
+        public string SRMSTATION { get; set; }
+
+        /// <summary>
+        ///创建时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "创建时间")]
+        public DateTime CREATETIME { get; set; } = DateTime.Now;
+
+        /// <summary>
+        /// 开始时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "开始时间")]
+        public DateTime? STARTTIME { get; set; }
+
+        /// <summary>
+        /// 结束时间
+        /// </summary>
+        [SugarColumn(ColumnDescription = "结束时间")]
+        public DateTime? ENDTIME { get; set; }
+
+        /// <summary>
+        /// 单号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "单号")]
+        public int DOCID { get; set; }
+
+        /// <summary>
+        /// 托盘类型
+        /// </summary>
+        [SugarColumn(ColumnDescription = "托盘类型")]
+        public short PALLETTYPE { get; set; }
+
+        /// <summary>
+        /// 产线
+        /// </summary>
+        [SugarColumn(ColumnDescription = "产线")]
+        public short PRODLINE { get; set; }
+
+        /// <summary>
+        /// 满盘数量
+        /// </summary>
+        [SugarColumn(ColumnDescription = "满盘数量")]
+        public short FULLQTY { get; set; }
+
+        /// <summary>
+        /// 高度
+        /// </summary>
+        [SugarColumn(ColumnDescription = "高度")]
+        public short HEIGHT { get; set; }
+
+        /// <summary>
+        /// WMS任务号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "WMS任务号")]
+        public int WMSTASK { get; set; }
+
+        /// <summary>
+        /// 任务组ID
+        /// </summary>
+        [SugarColumn(ColumnDescription = "任务组ID")]
+        public string TaskGroupKey { get; set; }
+
+        /// <summary>
+        /// 更新状态
+        /// </summary>
+        [SugarColumn(ColumnDescription = "更新状态")]
+        public TaskStatus UPLOADED { get; set; }
+
+        /// <summary>
+        /// AGV任务号
+        /// </summary>
+        [SugarColumn(ColumnDescription = "AGV任务号")]
+        public int AGVTASKID { get; set; }
+
+        /// <summary>
+        /// AGV任务详细信息
+        /// </summary>
+        [Navigate(NavigateType.OneToOne, nameof(AGVTASKID))]
+        public WCS_AGVTask AGVTASK { get; set; }
+
+        /// <summary>
+        /// 优先级
+        /// </summary>
+        [SugarColumn(ColumnDescription = "优先级")]
+        public int Priority { get; set; }
+
+        /// <summary>
+        /// 手动处理备注
+        /// </summary>
+        [SugarColumn(ColumnDescription = "手动处理备注")]
+        public string ManualRemarks { get; set; }
+
+        /// <summary>
+        /// 产品长度
+        /// </summary>
+        [SugarColumn(ColumnDescription = "产品长度")]
+        public decimal Length { get; set; }
+
+        /// <summary>
+        /// 产品编码
+        /// </summary>
+        [SugarColumn(ColumnDescription = "产品编码")]
+        public string MaterialCode { get; set; }
+    }
+
+    public enum TaskType
+    {
+        组盘 = 0,
+        入库 = 1,
+        出库 = 2,
+        移库 = 3,
+        输送 = 5,
+    }
+
+    public enum TaskStatus
+    {
+        新建 = 0,
+        执行中 = 2,
+        入库交管结束 = 3,
+        堆垛机执行 = 5,
+        堆垛机完成 = 6,
+        出库RGV执行 = 9,
+        已完成 = 99,
+        已取消 = 106
+    }
+}

+ 17 - 5
测试.sln

@@ -5,7 +5,11 @@ VisualStudioVersion = 17.1.32328.378
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "测试", "测试\测试.csproj", "{AB613AE6-A420-490E-8C84-D80C7341ECFC}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtualPlc.Service", "..\WCS\项目框架\VirtualPlc.Service\VirtualPlc.Service.csproj", "{46EFEE5F-3274-4DF8-848A-91A00D10669A}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VirtualPlc.Service", "VirtualPlc.Service\VirtualPlc.Service.csproj", "{D0156050-ACEE-47BC-B3F1-740A07206DF2}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WCS.Entity.Protocol", "WCS.Entity.Protocol\WCS.Entity.Protocol.csproj", "{446FCDE1-2117-484B-B5C7-31E3CFFBE1BA}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Virtual_PLC", "..\WCS\项目框架\Virtual_PLC\Virtual_PLC.csproj", "{68189214-42AE-4FF0-8719-D647579C3582}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -17,10 +21,18 @@ Global
 		{AB613AE6-A420-490E-8C84-D80C7341ECFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{AB613AE6-A420-490E-8C84-D80C7341ECFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{AB613AE6-A420-490E-8C84-D80C7341ECFC}.Release|Any CPU.Build.0 = Release|Any CPU
-		{46EFEE5F-3274-4DF8-848A-91A00D10669A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{46EFEE5F-3274-4DF8-848A-91A00D10669A}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{46EFEE5F-3274-4DF8-848A-91A00D10669A}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{46EFEE5F-3274-4DF8-848A-91A00D10669A}.Release|Any CPU.Build.0 = Release|Any CPU
+		{D0156050-ACEE-47BC-B3F1-740A07206DF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{D0156050-ACEE-47BC-B3F1-740A07206DF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{D0156050-ACEE-47BC-B3F1-740A07206DF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{D0156050-ACEE-47BC-B3F1-740A07206DF2}.Release|Any CPU.Build.0 = Release|Any CPU
+		{446FCDE1-2117-484B-B5C7-31E3CFFBE1BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{446FCDE1-2117-484B-B5C7-31E3CFFBE1BA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{446FCDE1-2117-484B-B5C7-31E3CFFBE1BA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{446FCDE1-2117-484B-B5C7-31E3CFFBE1BA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{68189214-42AE-4FF0-8719-D647579C3582}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{68189214-42AE-4FF0-8719-D647579C3582}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{68189214-42AE-4FF0-8719-D647579C3582}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{68189214-42AE-4FF0-8719-D647579C3582}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE