林豪 左 11 ヶ月 前
コミット
ea16a9b08f

+ 2 - 2
WCS.Entity.Protocol/RGV/RGVEnum.cs

@@ -150,7 +150,7 @@ namespace WCS.Entity.Protocol.RGV
     ///     RGV状态
     /// </summary>
     [Flags]
-    public enum RGVStatus : ushort
+    public enum RGVStatus : short
     {
         /// <summary>
         ///     光电
@@ -230,7 +230,7 @@ namespace WCS.Entity.Protocol.RGV
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] RES11 = 1 << 15
+        [Description("备用")] RES11 = -1 << 15
     }
 
     /// <summary>

+ 19 - 19
WCS.Entity.Protocol/Robot/RobotEnum.cs

@@ -7,7 +7,7 @@ namespace WCS.Entity.Protocol.Protocol.Robot
     ///     机械手工位状态
     /// </summary>
     [Flags]
-    public enum RobotState : ushort
+    public enum RobotState : short
     {
         /// <summary>
         ///     完成取货信号
@@ -88,7 +88,7 @@ namespace WCS.Entity.Protocol.Protocol.Robot
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res8 = 1 << 15
+        [Description("备用")] Res8 = -1 << 15
     }
 
     /// <summary>
@@ -479,86 +479,86 @@ namespace WCS.Entity.Protocol.Protocol.Robot
     ///     机械臂指令
     /// </summary>
     [Flags]
-    public enum RobotCmdType : ushort
+    public enum RobotCmdType : short
     {
         /// <summary>
         ///     码垛结束
         /// </summary>
-        [Description("码垛结束")] End = 1 >> 0,
+        [Description("码垛结束")] End = 1 << 0,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res7 = 1 >> 1,
+        [Description("备用")] Res7 = 1 << 1,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res8 = 1 >> 2,
+        [Description("备用")] Res8 = 1 << 2,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res9 = 1 >> 3,
+        [Description("备用")] Res9 = 1 << 3,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res10 = 1 >> 4,
+        [Description("备用")] Res10 = 1 << 4,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res11 = 1 >> 5,
+        [Description("备用")] Res11 = 1 << 5,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res12 = 1 >> 6,
+        [Description("备用")] Res12 = 1 << 6,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res13 = 1 >> 7,
+        [Description("备用")] Res13 = 1 << 7,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res14 = 1 >> 8,
+        [Description("备用")] Res14 = 1 << 8,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res = 1 >> 9,
+        [Description("备用")] Res = 1 << 9,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res1 = 1 >> 10,
+        [Description("备用")] Res1 = 1 << 10,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res2 = 1 >> 11,
+        [Description("备用")] Res2 = 1 << 11,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res3 = 1 >> 12,
+        [Description("备用")] Res3 = 1 << 12,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res4 = 1 >> 13,
+        [Description("备用")] Res4 = 1 << 13,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res5 = 1 >> 14,
+        [Description("备用")] Res5 = 1 << 14,
 
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res6 = 1 >> 15
+        [Description("备用")] Res6 = -1 << 15
     }
 }

+ 4 - 4
WCS.Entity.Protocol/SRM/SrmEnum.cs

@@ -173,7 +173,7 @@ namespace WCS.Entity.Protocol.SRM
     /// </summary>
     [Description("堆垛机状态")]
     [Flags]
-    public enum SrmStatus : ushort
+    public enum SrmStatus : short
     {
         /// <summary>
         ///     PLC的握手信号
@@ -253,7 +253,7 @@ namespace WCS.Entity.Protocol.SRM
         /// <summary>
         ///     保留
         /// </summary>
-        [Description("保留")] RES8 = 1 << 15
+        [Description("保留")] RES8 = -1 << 15
     }
 
     /// <summary>
@@ -589,7 +589,7 @@ namespace WCS.Entity.Protocol.SRM
     /// </summary>
     [Description("堆垛机报警项")]
     [Flags]
-    public enum SrmAlarm2 : ushort
+    public enum SrmAlarm2 : short
     {
         /// <summary>
         ///     无
@@ -674,6 +674,6 @@ namespace WCS.Entity.Protocol.SRM
         /// <summary>
         ///     备用11
         /// </summary>
-        [Description("备用11")] 备用11 = 1 << 15
+        [Description("备用11")] 备用11 = -1 << 15
     }
 }

+ 9 - 9
WCS.Entity.Protocol/Station/StationEnum.cs

@@ -28,7 +28,7 @@ namespace WCS.Entity.Protocol.Station
     ///     输送机警报
     /// </summary>
     [Flags]
-    public enum StationAlarm : ushort
+    public enum StationAlarm : short
     {
     }
 
@@ -36,7 +36,7 @@ namespace WCS.Entity.Protocol.Station
     ///     输送机状态
     /// </summary>
     [Flags]
-    public enum StationStatus : ushort
+    public enum StationStatus : short
     {
         /// <summary>
         ///     自动
@@ -120,14 +120,14 @@ namespace WCS.Entity.Protocol.Station
         /// <summary>
         ///     上位机未分配任务
         /// </summary>
-        [Description("上位机未分配任务")] UnassignedTask = 1 << 15
+        [Description("上位机未分配任务")] UnassignedTask = -1 << 15
     }
 
     /// <summary>
     ///     输送机状态
     /// </summary>
     [Flags]
-    public enum StationStatus1 : ushort
+    public enum StationStatus1 : short
     {
         /// <summary>
         ///     备用
@@ -207,14 +207,14 @@ namespace WCS.Entity.Protocol.Station
         /// <summary>
         ///     是否锁定
         /// </summary>
-        [Description("备用")] IsLock = 1 << 15
+        [Description("备用")] IsLock = -1 << 15
     }
 
     /// <summary>
     ///     外形故障
     /// </summary>
     [Flags]
-    public enum StationShapeAlarm : ushort
+    public enum StationShapeAlarm : short
     {
         /// <summary>
         ///     外形/条码等货物故障
@@ -294,14 +294,14 @@ namespace WCS.Entity.Protocol.Station
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res6 = 1 << 15
+        [Description("备用")] Res6 = -1 << 15
     }
 
     /// <summary>
     ///     站台指令
     /// </summary>
     [Flags]
-    public enum StationCmd : ushort
+    public enum StationCmd : short
     {
         /// <summary>
         ///     AGV放货通知
@@ -381,7 +381,7 @@ namespace WCS.Entity.Protocol.Station
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] Res15 = 1 << 15
+        [Description("备用")] Res15 = -1 << 15
     }
 
     /// <summary>

+ 2 - 2
WCS.Entity.Protocol/Truss/TrussEnum.cs

@@ -365,7 +365,7 @@ namespace WCS.Entity.Protocol.Truss
     ///     桁架码垛位指令类型
     /// </summary>
     [Flags]
-    public enum TrussCmdType : ushort
+    public enum TrussCmdType : short
     {
         /// <summary>
         ///     码垛结束
@@ -445,6 +445,6 @@ namespace WCS.Entity.Protocol.Truss
         /// <summary>
         ///     备用
         /// </summary>
-        [Description("备用")] RES6 = 1 << 15
+        [Description("备用")] RES6 = -1 << 15
     }
 }

+ 138 - 136
WCS.Service/Worker.cs

@@ -1,182 +1,184 @@
+using System.Text;
 using MessagePack;
 using Newtonsoft.Json;
 using ServiceCenter;
-using ServiceCenter.Redis;
-using System.Text;
 using ServiceCenter.Extensions;
 using ServiceCenter.Logs;
+using ServiceCenter.Redis;
 using ServiceCenter.SqlSugars;
 using SqlSugar;
 using WCS.Core;
-using WCS.WorkEngineering;
-using MessagePack.ImmutableCollection;
-using MessagePack.Resolvers;
-using ReZero.SuperAPI;
-using ServiceCenter.Virtual_PLC;
 using WCS.Service.PLCAccessors;
+using WCS.WorkEngineering;
 
-namespace WCS.Service
+namespace WCS.Service;
+
+/// <summary>
+///     工作服务
+/// </summary>
+public class Worker : BackgroundService
 {
+    public static readonly string WcsDlog = "WCSDlog";
+    public static readonly string Wcsdb = "WCSDB";
+
+    /// <summary>
+    ///     记录器
+    /// </summary>
+    private readonly ILogger<Worker> _logger;
+
     /// <summary>
-    /// 工作服务
+    ///     构造函数
     /// </summary>
-    public class Worker : BackgroundService
+    /// <param name="logger">记录器</param>
+    public Worker(ILogger<Worker> logger)
     {
-        /// <summary>
-        /// 记录器
-        /// </summary>
-        private readonly ILogger<Worker> _logger;
-
-        /// <summary>
-        /// 构造函数
-        /// </summary>
-        /// <param name="logger">记录器</param>
-        public Worker(ILogger<Worker> logger)
-        {
-            _logger = logger;
-        }
+        _logger = logger;
+    }
 
-        public static readonly string WcsDlog = "WCSDlog";
-        public static readonly string Wcsdb = "WCSDB";
+    /// <summary>
+    ///     执行
+    /// </summary>
+    /// <param name="stoppingToken">停止令牌</param>
+    /// <returns></returns>
+    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+    {
+        if (stoppingToken.IsCancellationRequested)
+            return;
 
-        /// <summary>
-        ///  执行
-        /// </summary>
-        /// <param name="stoppingToken">停止令牌</param>
-        /// <returns></returns>
-        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
+        #region 初始化Redis连接
+
+        var redisConnectionStrings = RedisHub.Default.Check("RedisConnectionStrings") ??
+                                     throw new Exception("请在Redis中配置RedisConnectionStrings");
+        var configs = JsonConvert.DeserializeObject<List<DataBaseConnectionString>>(redisConnectionStrings);
+        if (configs != null)
+            if (configs.All(v => v.Key != "Monitor"))
+                throw new Exception("请在RedisConnectionStrings中配置监控RedisDB库连接字符串");
+
+        foreach (var redisConnection in configs!)
         {
-            if (stoppingToken.IsCancellationRequested)
-                return;
-          
-            #region 初始化Redis连接
-
-            var redisConnectionStrings = RedisHub.Default.Check("RedisConnectionStrings") ?? throw new Exception("请在Redis中配置RedisConnectionStrings");
-            var configs = JsonConvert.DeserializeObject<List<DataBaseConnectionString>>(redisConnectionStrings);
-            if (configs != null)
+            RedisHub.CreateContext(redisConnection.ConnectionString, redisConnection.Key);
+            switch (redisConnection.Key)
             {
-                if (configs.All(v => v.Key != "Monitor")) throw new Exception("请在RedisConnectionStrings中配置监控RedisDB库连接字符串");
+                case "Monitor":
+                    RedisHub.SetMonitorContextType(redisConnection.Key);
+                    RedisHub.Monitor.Serialize = obj =>
+                    {
+                        var bytes = MessagePackSerializer.Serialize(obj);
+                        return bytes;
+                    };
+                    RedisHub.Monitor.DeserializeRaw = (bytes, type) =>
+                    {
+                        var obj = MessagePackSerializer.Deserialize(type, bytes);
+                        return obj;
+                    };
+                    break;
+
+                case "DebugRedisUrl":
+                    RedisHub.SetDebugContextType(redisConnection.Key);
+                    Configs.DebugRedisUrl = redisConnection.ConnectionString;
+                    break;
+
+                case "WMS":
+                    RedisHub.SetWMSContextType(redisConnection.Key);
+                    break;
+
+                case "Virtual_PLC":
+                    PLCAccessorsCreater.RedisConnStr = redisConnection.ConnectionString;
+                    break;
             }
+        }
 
-            foreach (var redisConnection in configs!)
-            {
-                RedisHub.CreateContext(redisConnection.ConnectionString, redisConnection.Key);
-                switch (redisConnection.Key)
-                {
-                    case "Monitor":
-                        RedisHub.SetMonitorContextType(redisConnection.Key);
-                        RedisHub.Monitor.Serialize = obj =>
-                        {
-                            var bytes = MessagePackSerializer.Serialize(obj);
-                            return bytes;
-                        };
-                        RedisHub.Monitor.DeserializeRaw = (bytes, type) =>
-                        {
-                            var obj = MessagePackSerializer.Deserialize(type, bytes);
-                            return obj;
-                        };
-                        break;
-
-                    case "DebugRedisUrl":
-                        RedisHub.SetDebugContextType(redisConnection.Key);
-                        Configs.DebugRedisUrl = redisConnection.ConnectionString;
-                        break;
-
-                    case "WMS":
-                        RedisHub.SetWMSContextType(redisConnection.Key);
-                        break;
-
-                    case "Virtual_PLC":
-                        PLCAccessorsCreater.RedisConnStr = redisConnection.ConnectionString;
-                        break;
-                }
-            }
+        #endregion 初始化Redis连接
 
-            #endregion 初始化Redis连接
+        #region 启用日志
 
-            #region 启用日志
+        //var logConfigText = RedisHub.Default.Check("LogConfigText") ?? throw new Exception("请在Redis中配置log4net相关内容");
+        //var logConfig = JsonConvert.DeserializeObject<LogConfig>(logConfigText);
+        //LogHub.SetConfigInfo(logConfig!);
 
-            //var logConfigText = RedisHub.Default.Check("LogConfigText") ?? throw new Exception("请在Redis中配置log4net相关内容");
-            //var logConfig = JsonConvert.DeserializeObject<LogConfig>(logConfigText);
-            //LogHub.SetConfigInfo(logConfig!);
+        #endregion 启用日志
 
-            #endregion 启用日志
+        _logger.LogInformation("WCS开始启动");
+        Configs.ProtocolProxyBaseType = typeof(ProtocolProxy);
+        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
+        Configs.StringEncoding = Encoding.UTF8;
+        //var warehouseName = RedisHub.Default.Check("WarehouseName") ?? throw new Exception("请在Redis中配置仓库名称");
+        //if (string.IsNullOrEmpty(warehouseName)) throw new Exception("请在Redis中配置仓库名称");
+        //ServiceHub.SetWarehouseName(warehouseName);
 
-            _logger.LogInformation("WCS开始启动");
-            Configs.ProtocolProxyBaseType = typeof(ProtocolProxy);
-            Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
-            Configs.StringEncoding = Encoding.UTF8;
-            //var warehouseName = RedisHub.Default.Check("WarehouseName") ?? throw new Exception("请在Redis中配置仓库名称");
-            //if (string.IsNullOrEmpty(warehouseName)) throw new Exception("请在Redis中配置仓库名称");
-            //ServiceHub.SetWarehouseName(warehouseName);
+        #region 初始化数据库连接
 
-            #region 初始化数据库连接
+        //InstanceFactory.CustomDbName = "TDengine";
+        //InstanceFactory.CustomDllName = "SqlSugar.BzTDengineCore";
+        //InstanceFactory.CustomNamespace = "SqlSugar.BzTDengineCore";
 
-            //InstanceFactory.CustomDbName = "TDengine";
-            //InstanceFactory.CustomDllName = "SqlSugar.BzTDengineCore";
-            //InstanceFactory.CustomNamespace = "SqlSugar.BzTDengineCore";
+        var dbConnectionStrings =
+            RedisHub.Default.Check("DbConnectionStrings") ?? throw new Exception("请在Redis中配置数据库连接相关内容");
+        ServiceHub.DbConnectionStrings =
+            JsonConvert.DeserializeObject<List<DataBaseConnectionString>>(dbConnectionStrings);
+        if (ServiceHub.DbConnectionStrings != null)
+        {
+            //if (ServiceHub.DbConnectionStrings.All(v => v.Key != Wcsdb)) throw new Exception("请在DbConnectionStrings中配置WCS基础数据库连接字符串");
+            //if (ServiceHub.DbConnectionStrings.All(v => v.Key == Wcsdb && !v.IsDefault)) throw new Exception("请在DbConnectionStrings中配置WCS基础数据库为默认数据库");
+            // if (ServiceHub.DbConnectionStrings.All(v => v.Key != WcsDlog)) throw new Exception("请在DbConnectionStrings中配置WCS日志数据库连接字符串");
+        }
 
-            var dbConnectionStrings = RedisHub.Default.Check("DbConnectionStrings") ?? throw new Exception("请在Redis中配置数据库连接相关内容");
-            ServiceHub.DbConnectionStrings = JsonConvert.DeserializeObject<List<DataBaseConnectionString>>(dbConnectionStrings);
-            if (ServiceHub.DbConnectionStrings != null)
-            {
-                //if (ServiceHub.DbConnectionStrings.All(v => v.Key != Wcsdb)) throw new Exception("请在DbConnectionStrings中配置WCS基础数据库连接字符串");
-                //if (ServiceHub.DbConnectionStrings.All(v => v.Key == Wcsdb && !v.IsDefault)) throw new Exception("请在DbConnectionStrings中配置WCS基础数据库为默认数据库");
-                // if (ServiceHub.DbConnectionStrings.All(v => v.Key != WcsDlog)) throw new Exception("请在DbConnectionStrings中配置WCS日志数据库连接字符串");
-            }
+        //设置连接信息
+        var connectionConfigs = new List<ConnectionConfig>();
+        foreach (var connectionString in ServiceHub.DbConnectionStrings!)
+        {
+            if (connectionString.Key == "PLC") Configs.QdbConnString = connectionString.ConnectionString;
 
-            //设置连接信息
-            List<ConnectionConfig> connectionConfigs = new List<ConnectionConfig>();
-            foreach (var connectionString in ServiceHub.DbConnectionStrings!)
+            connectionConfigs.Add(new ConnectionConfig
             {
-                connectionConfigs.Add(new ConnectionConfig()
+                ConfigId = connectionString.Key,
+                ConnectionString = connectionString.ConnectionString, //连接符字串
+                DbType = connectionString.DbType, //数据库类型
+                IsAutoCloseConnection = true, //不设成true要手动close
+                LanguageType = LanguageType.Chinese,
+                MoreSettings = new ConnMoreSettings
                 {
-                    ConfigId = connectionString.Key,
-                    ConnectionString = connectionString.ConnectionString,//连接符字串
-                    DbType = connectionString.DbType,//数据库类型
-                    IsAutoCloseConnection = true,//不设成true要手动close
-                    LanguageType = LanguageType.Chinese,
-                    MoreSettings = new ConnMoreSettings()
-                    {
-                        IsNoReadXmlDescription = true
-                    }
-                });
-            };
-            SqlSugarHelper.SetDb(new SqlSugarScope(connectionConfigs));
-
-            ServiceHub.DbConnectionStrings.InitDB();
+                    IsNoReadXmlDescription = true
+                }
+            });
+        }
 
-            #endregion 初始化数据库连接
+        ;
+        SqlSugarHelper.SetDb(new SqlSugarScope(connectionConfigs));
 
-            #region 初始化设备信息
+        //ServiceHub.DbConnectionStrings.InitDB();
+        //Configs.QdbConnString = configuration.GetSection("Connections")["qdb"];
 
-            WorkStart.InitializeDeviceInfo();
+        #endregion 初始化数据库连接
 
-            #endregion 初始化设备信息
+        #region 初始化设备信息
 
-            #region 初始化PLC访问器及PLC读取协议
+        WorkStart.InitializeDeviceInfo();
 
-            //创建PLC访问器
-            Configs.PLCAccessorCreater = new PLCAccessors.PLCAccessorsCreater();
+        #endregion 初始化设备信息
 
-            try
-            {
-                #region 唤醒所有的世界
+        #region 初始化PLC访问器及PLC读取协议
 
-                World.StartAll();
+        //创建PLC访问器
+        Configs.PLCAccessorCreater = new PLCAccessorsCreater();
 
-                #endregion 唤醒所有的世界
+        try
+        {
+            #region 唤醒所有的世界
 
-                _logger.LogInformation("WCS启动成功");
-            }
-            catch (Exception ex)
-            {
-                _logger.LogError("WCS启动失败{0}", ex.Message);
-            }
+            World.StartAll();
 
-            #endregion 初始化PLC访问器及PLC读取协议
+            #endregion 唤醒所有的世界
 
-            LogHub.init();
+            _logger.LogInformation("WCS启动成功");
+        }
+        catch (Exception ex)
+        {
+            _logger.LogError("WCS启动失败{0}", ex.Message);
         }
+
+        #endregion 初始化PLC访问器及PLC读取协议
+
+        LogHub.init();
     }
 }

BIN
WCS.Service/xxx.db


+ 4 - 11
WCS.WorkEngineering/Systems/DataCollectionSysyem.cs

@@ -12,6 +12,7 @@ using System.Text;
 using WCS.Core;
 using WCS.Entity.Protocol.BCR;
 using WCS.Entity.Protocol.DataStructure;
+using WCS.Entity.Protocol.Protocol.Robot;
 using WCS.Entity.Protocol.RGV;
 using WCS.Entity.Protocol.Robot;
 using WCS.Entity.Protocol.SRM;
@@ -229,24 +230,16 @@ namespace WCS.WorkEngineering.Systems
                     Status = x.Data.Status.ToInt(),
                     Time = x.Frame
                 }));
-
+                var a = RobotCmdType.End;
+                //a.HasFlag()
                 RedisHub.Default.Set(nameof(EquipmentStatus), JsonConvert.SerializeObject(equipmentStatus));
                 sw4.Stop();
 
                 #endregion 存储设备状态信息
 
-                #region 存储数采数据
-
-                var sw5 = new Stopwatch();
-                sw5.Start();
-                RedisHub.Monitor.RPush("DataCollectionpacks", pack);
-                sw5.Stop();
-
-                #endregion 存储数采数据
-
                 sw.Stop();
 
-                World.Log($"业务耗时:[{sw.ElapsedMilliseconds}]--处理数据:[{sw1.ElapsedMilliseconds}]--存储监控数据:[{sw2.ElapsedMilliseconds}]--存储设备报警信息:[{sw3.ElapsedMilliseconds}]--存储设备状态数据:[{sw4.ElapsedMilliseconds}]--存储数采数据:[{sw5.ElapsedMilliseconds}]");
+                World.Log($"业务耗时:[{sw.ElapsedMilliseconds}]--处理数据:[{sw1.ElapsedMilliseconds}]--存储监控数据:[{sw2.ElapsedMilliseconds}]--存储设备报警信息:[{sw3.ElapsedMilliseconds}]--存储设备状态数据:[{sw4.ElapsedMilliseconds}]");
             }
             catch (Exception e)
             {

+ 1 - 1
WCS.WorkEngineering/WCS.WorkEngineering.csproj

@@ -23,7 +23,7 @@
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\..\ZTGT-FJZX\ServiceCenter\ServiceCenter.csproj" />
-    <ProjectReference Include="..\..\ZTGT-FJZX\YWGC\FJK\WCS.Entity.Protocol\WCS.Entity.Protocol.csproj" />
+    <ProjectReference Include="..\WCS.Entity.Protocol\WCS.Entity.Protocol.csproj" />
   </ItemGroup>
   <ItemGroup>
     <Reference Include="wms.dto">

+ 456 - 425
WCS.WorkEngineering/WorkStart.cs

@@ -1,6 +1,11 @@
-using ServiceCenter;
-using ServiceCenter.SqlSugars;
+using System.Reflection;
+using Dapper;
+using Npgsql;
+using ServiceCenter;
+using SqlSugar;
+using System.Reflection.Metadata;
 using WCS.Core;
+using WCS.Entity;
 using WCS.Entity.Protocol.BCR;
 using WCS.Entity.Protocol.RGV;
 using WCS.Entity.Protocol.Robot;
@@ -10,535 +15,561 @@ using WCS.Entity.Protocol.Truss;
 using WCS.WorkEngineering.Extensions;
 using DeviceFlags = WCS.WorkEngineering.Extensions.DeviceFlags;
 
-namespace WCS.WorkEngineering
+namespace WCS.WorkEngineering;
+
+/// <summary>
+///     业务工程配置信息
+/// </summary>
+public static class WorkStart
 {
     /// <summary>
-    /// 业务工程配置信息
+    ///     初始化 设备信息
     /// </summary>
-    public static class WorkStart
+    public static void InitializeDeviceInfo()
     {
-        /// <summary>
-        ///  初始化 设备信息
-        /// </summary>
+        #region 初始化RGV相关信息
 
-        public static void InitializeDeviceInfo()
+        var RgvInfo = new List<RgvSegmentInfo>
         {
-            #region 初始化RGV相关信息
-
-            List<RgvSegmentInfo> RgvInfo = new List<RgvSegmentInfo>
-            {
-                new RgvSegmentInfo( 1, "10.30.37.113"), //库一北
-                new RgvSegmentInfo( 2, "10.30.37.118"), //库一南
-                new RgvSegmentInfo( 3, "10.30.37.123"), //库二北
-                new RgvSegmentInfo( 4, "10.30.37.128"), //库二南
-                new RgvSegmentInfo( 5, "10.30.37.133"), //库三北
-                new RgvSegmentInfo( 6, "10.30.37.138"), //库三南
-            };
-
-            foreach (var item in RgvInfo)
-            {
-                var conv = new Device($"RGV{item.Code}");
-                conv.AddFlag(DeviceFlags.RGV);
-                conv.AddProtocol<IRGV520>(0, 520, item.Ip);
-                conv.AddProtocol<IRGV521>(0, 521, item.Ip);
-                conv.AddProtocol<IRGV523>(0, 523, item.Ip);
-            }
+            new(1, "10.30.37.113"), //库一北
+            new(2, "10.30.37.118"), //库一南
+            new(3, "10.30.37.123"), //库二北
+            new(4, "10.30.37.128"), //库二南
+            new(5, "10.30.37.133"), //库三北
+            new(6, "10.30.37.138") //库三南
+        };
+
+        foreach (var item in RgvInfo)
+        {
+            var conv = new Device($"RGV{item.Code}");
+            conv.AddFlag(DeviceFlags.RGV);
+            conv.AddProtocol<IRGV520>(0, 520, item.Ip);
+            conv.AddProtocol<IRGV521>(0, 521, item.Ip);
+            conv.AddProtocol<IRGV523>(0, 523, item.Ip);
+        }
 
-            #endregion 初始化RGV相关信息
+        #endregion 初始化RGV相关信息
 
-            #region 初始化输送机相关信息
+        #region 初始化输送机相关信息
 
-            #region 基本信息
+        #region 基本信息
 
-            #region 托盘线输送线
+        #region 托盘线输送线
 
-            var tuples = new List<Tuple<string, List<Tuple<int, int>>>>
+        var tuples = new List<Tuple<string, List<Tuple<int, int>>>>
+        {
+            //分拣库一
+            new("10.30.37.89", new List<Tuple<int, int>>
             {
-                //分拣库一
-                new("10.30.37.89",new List<Tuple<int, int>>()
-                {
-                    new(1601, 1620),
-                    new(2501, 2540),
-                    new(2701, 2740),
-                    new(1661, 1690),
-                }),
-                //分拣库二
-                new("10.30.37.97",new List<Tuple<int, int>>()
-                {
-                    new(1621, 1640),
-                    new(2901, 2940),
-                    new(3101, 3140),
-                    new(1691, 1720),
-                }),
-                //分拣库三
-                new("10.30.37.105",new List<Tuple<int, int>>()
-                {
-                    new(1641, 1660),
-                    new(3301, 3340),
-                    new(3501, 3540),
-                    new(1721, 1750)
-                })
-            };
-
-            foreach (var item in tuples)
+                new(1601, 1620),
+                new(2501, 2540),
+                new(2701, 2740),
+                new(1661, 1690)
+            }),
+            //分拣库二
+            new("10.30.37.97", new List<Tuple<int, int>>
+            {
+                new(1621, 1640),
+                new(2901, 2940),
+                new(3101, 3140),
+                new(1691, 1720)
+            }),
+            //分拣库三
+            new("10.30.37.105", new List<Tuple<int, int>>
             {
-                var db520 = 0;
-                var db521 = 0;
-                var db523 = 0;
-                foreach (var item1 in item.Item2)
+                new(1641, 1660),
+                new(3301, 3340),
+                new(3501, 3540),
+                new(1721, 1750)
+            })
+        };
+
+        foreach (var item in tuples)
+        {
+            var db520 = 0;
+            var db521 = 0;
+            var db523 = 0;
+            foreach (var item1 in item.Item2)
+                for (var i = item1.Item1; i <= item1.Item2; i++)
                 {
-                    for (var i = item1.Item1; i <= item1.Item2; i++)
-                    {
-                        var conv = new Device(i.ToString());
-                        conv.AddFlag(DeviceFlags.输送机);
-
-                        conv.AddProtocol<IStation520>(db520, 520, item.Item1);
-                        conv.AddProtocol<IStation521>(db521, 521, item.Item1);
-                        conv.AddProtocol<IStation523>(db523, 523, item.Item1);
-
-                        db520 += 14;
-                        db521 += 16;
-                        db523 += 12;
-                    }
+                    var conv = new Device(i.ToString());
+                    conv.AddFlag(DeviceFlags.输送机);
+
+                    conv.AddProtocol<IStation520>(db520, 520, item.Item1);
+                    conv.AddProtocol<IStation521>(db521, 521, item.Item1);
+                    conv.AddProtocol<IStation523>(db523, 523, item.Item1);
+
+                    db520 += 14;
+                    db521 += 16;
+                    db523 += 12;
                 }
-            }
+        }
 
-            #endregion 托盘线输送线
+        #endregion 托盘线输送线
 
-            #region 满轮输送线
+        #region 满轮输送线
 
-            #region DB523,所有线体都会有DB523
+        #region DB523,所有线体都会有DB523
 
-            var mLtuples523 = new List<Tuple<string, List<Tuple<int, int>>>>()
+        var mLtuples523 = new List<Tuple<string, List<Tuple<int, int>>>>
+        {
+            new("10.30.37.166", new List<Tuple<int, int>>() //北侧满轮主线
             {
-                new("10.30.37.166",new List<Tuple<int, int>>() //北侧满轮主线
-                {
-                    new(1, 100),
-                    new(9001, 9010),//暂用,无意义
-                    new(401, 599),
-                    new(801,999),
-                    new(1201,1399),
-                }),
-                new("10.30.37.198",new List<Tuple<int, int>>() //南侧满轮主线
-                {
-                    new(101, 210),
-                    new(601, 799),
-                    new(1001, 1199),
-                    new(1401,1599),
-                    new(341,379),
-                })
-            };
-
-            foreach (var item in mLtuples523)
+                new(1, 100),
+                new(9001, 9010), //暂用,无意义
+                new(401, 599),
+                new(801, 999),
+                new(1201, 1399)
+            }),
+            new("10.30.37.198", new List<Tuple<int, int>>() //南侧满轮主线
             {
-                var db523 = 0;
-                var db524 = 0;
-                foreach (var item1 in item.Item2)
+                new(101, 210),
+                new(601, 799),
+                new(1001, 1199),
+                new(1401, 1599),
+                new(341, 379)
+            })
+        };
+
+        foreach (var item in mLtuples523)
+        {
+            var db523 = 0;
+            var db524 = 0;
+            foreach (var item1 in item.Item2)
+                for (var i = item1.Item1; i <= item1.Item2; i++)
                 {
-                    for (var i = item1.Item1; i <= item1.Item2; i++)
-                    {
-                        var conv = new Device(i.ToString());
-                        conv.AddFlag(DeviceFlags.输送机);
-                        conv.AddProtocol<IStation523>(db523, 523, item.Item1);
-                        conv.AddProtocol<IStation524>(db524, 524, item.Item1);
-
-                        db523 += 12;
-                        db524 += 16;
-                    }
+                    var conv = new Device(i.ToString());
+                    conv.AddFlag(DeviceFlags.输送机);
+                    conv.AddProtocol<IStation523>(db523, 523, item.Item1);
+                    conv.AddProtocol<IStation524>(db524, 524, item.Item1);
+
+                    db523 += 12;
+                    db524 += 16;
                 }
-            }
+        }
 
-            #endregion DB523,所有线体都会有DB523
+        #endregion DB523,所有线体都会有DB523
 
-            #region 520、521 交互线体会有520、521
+        #region 520、521 交互线体会有520、521
 
-            //Item2表示线体号集合,Item1表示IP
-            var mLTuples520 = new List<Tuple<string, List<int>>>()
-            {
-                //北侧
-                new("10.30.37.166",new List<int>() {1,22,41,61,418,426,435,444,455,466,480,494,508,522,536,550,564,578,591,818,826,835,844,855,866,880,894,908,922,936,950,964,978,991,1218,1226,1235,1244,1255,1266,1280,1294,1308,1322,1336,1350,1364,1378,1391}),
-                //南侧
-                new("10.30.37.198",new List<int>(){101,122,141,161,618,626,635,644,655,666,680,694,708,722,736,750,764,778,791,1018,1026,1035,1044,1055,1066,1080,1094,1108,1122,1136,1150,1164,1178,1191,1418,1426,1435,1444,1455,1466,1480,1494,1508,1522,1536,1550,1564,1578,1591})
-            };
+        //Item2表示线体号集合,Item1表示IP
+        var mLTuples520 = new List<Tuple<string, List<int>>>
+        {
+            //北侧
+            new("10.30.37.166",
+                new List<int>
+                {
+                    1, 22, 41, 61, 418, 426, 435, 444, 455, 466, 480, 494, 508, 522, 536, 550, 564, 578, 591, 818, 826,
+                    835, 844, 855, 866, 880, 894, 908, 922, 936, 950, 964, 978, 991, 1218, 1226, 1235, 1244, 1255, 1266,
+                    1280, 1294, 1308, 1322, 1336, 1350, 1364, 1378, 1391
+                }),
+            //南侧
+            new("10.30.37.198",
+                new List<int>
+                {
+                    101, 122, 141, 161, 618, 626, 635, 644, 655, 666, 680, 694, 708, 722, 736, 750, 764, 778, 791, 1018,
+                    1026, 1035, 1044, 1055, 1066, 1080, 1094, 1108, 1122, 1136, 1150, 1164, 1178, 1191, 1418, 1426,
+                    1435, 1444, 1455, 1466, 1480, 1494, 1508, 1522, 1536, 1550, 1564, 1578, 1591
+                })
+        };
 
-            foreach (var item in mLTuples520)
-            {
-                var db520 = 0;
-                var db521 = 0;
+        foreach (var item in mLTuples520)
+        {
+            var db520 = 0;
+            var db521 = 0;
 
-                foreach (var device in item.Item2.Select(item1 => Device.All.FirstOrDefault(v => v.Code == item1.ToString())))
+            foreach (var device in item.Item2.Select(
+                         item1 => Device.All.FirstOrDefault(v => v.Code == item1.ToString())))
+            {
+                if (device != null)
                 {
-                    if (device != null)
-                    {
-                        device.AddProtocol<IStation520>(db520, 520, item.Item1);
-                        device.AddProtocol<IStation521>(db521, 521, item.Item1);
-                    }
-
-                    db520 += 14;
-                    db521 += 16;
+                    device.AddProtocol<IStation520>(db520, 520, item.Item1);
+                    device.AddProtocol<IStation521>(db521, 521, item.Item1);
                 }
+
+                db520 += 14;
+                db521 += 16;
             }
+        }
 
-            var conv9 = Device.All.FirstOrDefault(x => x.Code == "1");
-            conv9.AddProtocol<IStation5>(32, 5, "10.30.37.166");
+        var conv9 = Device.All.FirstOrDefault(x => x.Code == "1");
+        conv9.AddProtocol<IStation5>(32, 5, "10.30.37.166");
 
-            var conv10 = Device.All.FirstOrDefault(x => x.Code == "101");
-            conv10.AddProtocol<IStation5>(32, 5, "10.30.37.198");
+        var conv10 = Device.All.FirstOrDefault(x => x.Code == "101");
+        conv10.AddProtocol<IStation5>(32, 5, "10.30.37.198");
 
-            #endregion 520、521 交互线体会有520、521
+        #endregion 520、521 交互线体会有520、521
 
-            #region 满轮扫码器
+        #region 满轮扫码器
 
-            //Item2表示线体号集合,Item1表示IP
-            var mLTuples83 = new List<Tuple<string, List<int>>>()
-            {
-                new("10.30.37.166",new List<int>(){3,14,18,22,38,323,41,58,61}) ,
-                new("10.30.37.198",new List<int>(){101,114,118,122,138,363,141,158,161})
-            };
+        //Item2表示线体号集合,Item1表示IP
+        var mLTuples83 = new List<Tuple<string, List<int>>>
+        {
+            new("10.30.37.166", new List<int> { 3, 14, 18, 22, 38, 323, 41, 58, 61 }),
+            new("10.30.37.198", new List<int> { 101, 114, 118, 122, 138, 363, 141, 158, 161 })
+        };
 
-            foreach (var item in mLTuples83)
-            {
-                var db83 = 0;
+        foreach (var item in mLTuples83)
+        {
+            var db83 = 0;
 
-                foreach (var device in item.Item2.Select(item1 => Device.All.FirstOrDefault(v => v.Code == item1.ToString())))
-                {
-                    device?.AddProtocol<IBCR83>(db83, 83, item.Item1);
+            foreach (var device in item.Item2.Select(
+                         item1 => Device.All.FirstOrDefault(v => v.Code == item1.ToString())))
+            {
+                device?.AddProtocol<IBCR83>(db83, 83, item.Item1);
 
-                    db83 += 604;
-                }
+                db83 += 604;
             }
+        }
 
-            #endregion 满轮扫码器
+        #endregion 满轮扫码器
 
-            #region 满轮线告诉分拣预分配
+        #region 满轮线告诉分拣预分配
 
-            //Item2表示线体号集合,Item1表示IP
-            var mLTuples525 = new List<Tuple<string, List<int>>>()
-            {
-                new("10.30.37.166",new List<int>(){18,38,58}),
-                new("10.30.37.198",new List<int>(){118,138,158}),
-            };
+        //Item2表示线体号集合,Item1表示IP
+        var mLTuples525 = new List<Tuple<string, List<int>>>
+        {
+            new("10.30.37.166", new List<int> { 18, 38, 58 }),
+            new("10.30.37.198", new List<int> { 118, 138, 158 })
+        };
 
-            foreach (var item in mLTuples525)
-            {
-                var db525 = 0;
+        foreach (var item in mLTuples525)
+        {
+            var db525 = 0;
 
-                foreach (var device in item.Item2.Select(item1 => Device.All.FirstOrDefault(v => v.Code == item1.ToString())))
-                {
-                    device?.AddProtocol<IStation525>(db525, 525, item.Item1);
-                    db525 += 3266;
-                }
+            foreach (var device in item.Item2.Select(
+                         item1 => Device.All.FirstOrDefault(v => v.Code == item1.ToString())))
+            {
+                device?.AddProtocol<IStation525>(db525, 525, item.Item1);
+                db525 += 3266;
             }
+        }
 
-            #endregion 满轮线告诉分拣预分配
+        #endregion 满轮线告诉分拣预分配
 
-            #region 外检信息
+        #region 外检信息
 
-            //Item2表示线体号集合,Item1表示IP
-            var mLTuples91 = new List<Tuple<string, List<int>>>()
-            {
-                new("10.30.37.166",new List<int>(){418,818,1218}),
-                new("10.30.37.198",new List<int>(){618,1018,1418})
-            };
+        //Item2表示线体号集合,Item1表示IP
+        var mLTuples91 = new List<Tuple<string, List<int>>>
+        {
+            new("10.30.37.166", new List<int> { 418, 818, 1218 }),
+            new("10.30.37.198", new List<int> { 618, 1018, 1418 })
+        };
 
-            foreach (var item in mLTuples91)
-            {
-                var db91 = 0;
+        foreach (var item in mLTuples91)
+        {
+            var db91 = 0;
 
-                foreach (var device in item.Item2.Select(item2 => Device.All.FirstOrDefault(v => v.Code == item2.ToString())))
-                {
-                    device?.AddProtocol<IStation91>(db91, 91, item.Item1);
-                    db91 += 14;
-                }
+            foreach (var device in item.Item2.Select(
+                         item2 => Device.All.FirstOrDefault(v => v.Code == item2.ToString())))
+            {
+                device?.AddProtocol<IStation91>(db91, 91, item.Item1);
+                db91 += 14;
             }
+        }
 
-            #endregion 外检信息
+        #endregion 外检信息
 
-            #endregion 满轮输送线
+        #endregion 满轮输送线
 
-            #endregion 基本信息
+        #endregion 基本信息
 
-            #region 托盘线扫码器
+        #region 托盘线扫码器
 
-            var bcrInfo = new List<BcrInfo>
-            {
-                new(new [] { "2532", "2732" }, "10.30.37.89"),
-                new(new [] { "2932", "3132" }, "10.30.37.97"),
-                new(new [] { "3332", "3532" }, "10.30.37.105"),
-                new(new [] {"RGV1"},"10.30.37.113"),
-                new(new [] {"RGV2"},"10.30.37.118"),
-                new(new [] {"RGV3"},"10.30.37.123"),
-                new(new [] {"RGV4"},"10.30.37.128"),
-                new(new [] {"RGV5"},"10.30.37.133"),
-                new(new [] {"RGV6"},"10.30.37.138")
-            };
-
-            foreach (var item in bcrInfo)
+        var bcrInfo = new List<BcrInfo>
+        {
+            new(new[] { "2532", "2732" }, "10.30.37.89"),
+            new(new[] { "2932", "3132" }, "10.30.37.97"),
+            new(new[] { "3332", "3532" }, "10.30.37.105"),
+            new(new[] { "RGV1" }, "10.30.37.113"),
+            new(new[] { "RGV2" }, "10.30.37.118"),
+            new(new[] { "RGV3" }, "10.30.37.123"),
+            new(new[] { "RGV4" }, "10.30.37.128"),
+            new(new[] { "RGV5" }, "10.30.37.133"),
+            new(new[] { "RGV6" }, "10.30.37.138")
+        };
+
+        foreach (var item in bcrInfo)
+            for (var i = 0; i < item.DeviceNo.Length; i++)
             {
-                for (var i = 0; i < item.DeviceNo.Length; i++)
-                {
-                    var device = Device.All.FirstOrDefault(v => v.Code == item.DeviceNo[i]);
-                    device.AddFlag(DeviceFlags.扫码);
-                    var pos = i * 20;
-                    device.AddProtocol<IBCR81>(pos, 81, item.Ip);
-                }
+                var device = Device.All.FirstOrDefault(v => v.Code == item.DeviceNo[i]);
+                device.AddFlag(DeviceFlags.扫码);
+                var pos = i * 20;
+                device.AddProtocol<IBCR81>(pos, 81, item.Ip);
             }
 
-            #endregion 托盘线扫码器
+        #endregion 托盘线扫码器
 
-            #region 外检信息
+        #region 外检信息
 
-            var conv1 = Device.All.FirstOrDefault(x => x.Code == "2532");
-            conv1.AddFlag(DeviceFlags.外检);
-            conv1.AddProtocol<IStation91>(714, 91, "10.30.37.89");
+        var conv1 = Device.All.FirstOrDefault(x => x.Code == "2532");
+        conv1.AddFlag(DeviceFlags.外检);
+        conv1.AddProtocol<IStation91>(714, 91, "10.30.37.89");
 
-            var conv2 = Device.All.FirstOrDefault(x => x.Code == "2732");
-            conv2.AddFlag(DeviceFlags.外检);
-            conv2.AddProtocol<IStation91>(1274, 91, "10.30.37.89");
+        var conv2 = Device.All.FirstOrDefault(x => x.Code == "2732");
+        conv2.AddFlag(DeviceFlags.外检);
+        conv2.AddProtocol<IStation91>(1274, 91, "10.30.37.89");
 
-            conv1 = Device.All.FirstOrDefault(x => x.Code == "2932");
-            conv1.AddFlag(DeviceFlags.外检);
-            conv1.AddProtocol<IStation91>(714, 91, "10.30.37.97");
+        conv1 = Device.All.FirstOrDefault(x => x.Code == "2932");
+        conv1.AddFlag(DeviceFlags.外检);
+        conv1.AddProtocol<IStation91>(714, 91, "10.30.37.97");
 
-            conv2 = Device.All.FirstOrDefault(x => x.Code == "3132");
-            conv2.AddFlag(DeviceFlags.外检);
-            conv2.AddProtocol<IStation91>(1274, 91, "10.30.37.97");
+        conv2 = Device.All.FirstOrDefault(x => x.Code == "3132");
+        conv2.AddFlag(DeviceFlags.外检);
+        conv2.AddProtocol<IStation91>(1274, 91, "10.30.37.97");
 
-            conv1 = Device.All.FirstOrDefault(x => x.Code == "3332");
-            conv1.AddFlag(DeviceFlags.外检);
-            conv1.AddProtocol<IStation91>(714, 91, "10.30.37.105");
-            conv2 = Device.All.FirstOrDefault(x => x.Code == "3532");
-            conv2.AddFlag(DeviceFlags.外检);
-            conv2.AddProtocol<IStation91>(1274, 91, "10.30.37.105");
+        conv1 = Device.All.FirstOrDefault(x => x.Code == "3332");
+        conv1.AddFlag(DeviceFlags.外检);
+        conv1.AddProtocol<IStation91>(714, 91, "10.30.37.105");
+        conv2 = Device.All.FirstOrDefault(x => x.Code == "3532");
+        conv2.AddFlag(DeviceFlags.外检);
+        conv2.AddProtocol<IStation91>(1274, 91, "10.30.37.105");
 
-            #endregion 外检信息
+        #endregion 外检信息
 
-            #endregion 初始化输送机相关信息
+        #endregion 初始化输送机相关信息
 
-            #region 初始化桁架相关信息
-
-            List<TrussSegmentInfo> TrussInfo = new List<TrussSegmentInfo>
-            {
-                new TrussSegmentInfo( 1, "10.30.37.211"),
-                new TrussSegmentInfo( 2, "10.30.37.217"),
-                new TrussSegmentInfo( 3, "10.30.37.223")
-            };
+        #region 初始化桁架相关信息
 
-            foreach (var item in TrussInfo)
-            {
-                var conv = new Device($"Truss{item.Code}");
-                conv.AddFlag(DeviceFlags.桁架);
-                conv.AddProtocol<ITruss520>(0, 520, item.Ip);
-                conv.AddProtocol<ITruss521>(0, 521, item.Ip);
-                conv.AddProtocol<ITruss523>(0, 522, item.Ip);
-            }
+        var TrussInfo = new List<TrussSegmentInfo>
+        {
+            new(1, "10.30.37.211"),
+            new(2, "10.30.37.217"),
+            new(3, "10.30.37.223")
+        };
 
-            var tuples1 = new List<Tuple<string, List<int>>>
-            {
-                //桁架
-                new("10.30.37.211",new  List<int>(){1685,1686,1687,1688,1689,1690,1675,1674,1673,1672,1671,1670,1677,1678,1679,1680,1665,1664,1663,1662}), //分拣库一
-                new("10.30.37.217",new  List<int>(){1715,1716,1717,1718,1719,1720,1705,1704,1703,1702,1701,1700,1707,1708,1709,1710,1695,1694,1693,1692}), //分拣库二
-                new("10.30.37.223",new  List<int>(){1745,1746,1747,1748,1749,1750,1735,1734,1733,1732,1731,1730,1737,1738,1739,1740,1725,1724,1723,1722}), //分拣库三
-            };
+        foreach (var item in TrussInfo)
+        {
+            var conv = new Device($"Truss{item.Code}");
+            conv.AddFlag(DeviceFlags.桁架);
+            conv.AddProtocol<ITruss520>(0, 520, item.Ip);
+            conv.AddProtocol<ITruss521>(0, 521, item.Ip);
+            conv.AddProtocol<ITruss523>(0, 522, item.Ip);
+        }
 
-            foreach (var item in tuples1)
-            {
-                var db530 = 0;
-                var db531 = 0;
-                foreach (var conv in item.Item2.Select(item1 => Device.All.FirstOrDefault(x => x.Code == item1.ToString())))
+        var tuples1 = new List<Tuple<string, List<int>>>
+        {
+            //桁架
+            new("10.30.37.211",
+                new List<int>
                 {
-                    conv!.AddProtocol<ITruss530>(db530, 530, item.Item1);
-                    conv!.AddProtocol<ITruss531>(db531, 531, item.Item1);
-
-                    db530 += 18;
-                    db531 += 250;
-                    if (conv.Code == "1662")
-                    {
-                        var a = 0;
-                    }
-                }
-            }
+                    1685, 1686, 1687, 1688, 1689, 1690, 1675, 1674, 1673, 1672, 1671, 1670, 1677, 1678, 1679, 1680,
+                    1665, 1664, 1663, 1662
+                }), //分拣库一
+            new("10.30.37.217",
+                new List<int>
+                {
+                    1715, 1716, 1717, 1718, 1719, 1720, 1705, 1704, 1703, 1702, 1701, 1700, 1707, 1708, 1709, 1710,
+                    1695, 1694, 1693, 1692
+                }), //分拣库二
+            new("10.30.37.223",
+                new List<int>
+                {
+                    1745, 1746, 1747, 1748, 1749, 1750, 1735, 1734, 1733, 1732, 1731, 1730, 1737, 1738, 1739, 1740,
+                    1725, 1724, 1723, 1722
+                }) //分拣库三
+        };
 
-            var tuples21 = new List<Tuple<string, List<int>>>
-            {
-                //机械臂
-                new("10.30.37.230",new  List<int>(){ 1666, 1661}), //库一北
-                new("10.30.37.232",new  List<int>(){ 1681, 1676}), //库一南
-                new("10.30.37.234",new  List<int>(){ 1696, 1691}), //库二北
-                new("10.30.37.236",new  List<int>(){ 1711, 1706}), //库二南
-                new("10.30.37.238",new  List<int>(){ 1726, 1721}), //库三北
-                new("10.30.37.240",new  List<int>(){ 1741, 1736 }), //库三南
-            };
-
-            foreach (var item in tuples21)
+        foreach (var item in tuples1)
+        {
+            var db530 = 0;
+            var db531 = 0;
+            foreach (var conv in item.Item2.Select(item1 => Device.All.FirstOrDefault(x => x.Code == item1.ToString())))
             {
-                var db530 = 0;
-                var db531 = 0;
-                foreach (var conv in item.Item2.Select(item1 => Device.All.FirstOrDefault(x => x.Code == item1.ToString())))
+                conv!.AddProtocol<ITruss530>(db530, 530, item.Item1);
+                conv!.AddProtocol<ITruss531>(db531, 531, item.Item1);
+
+                db530 += 18;
+                db531 += 250;
+                if (conv.Code == "1662")
                 {
-                    conv!.AddProtocol<IRobot530>(db530, 530, item.Item1);
-                    conv!.AddProtocol<IRobot531>(db531, 531, item.Item1);
-                    db530 += 8;
-                    db531 += 130;
+                    var a = 0;
                 }
             }
+        }
 
-            #endregion 初始化桁架相关信息
-
-            #region 初始化机械臂相关信息
-
-            List<TrussSegmentInfo> TrussInfo1 = new List<TrussSegmentInfo>
-            {
-                new( 1, "10.30.37.230"),
-                new( 2, "10.30.37.232"),
-                new( 3, "10.30.37.234"),
-                new( 4, "10.30.37.236"),
-                new( 5, "10.30.37.238"),
-                new( 6, "10.30.37.240"),
-            };
-
-            foreach (var item in TrussInfo1)
+        var tuples21 = new List<Tuple<string, List<int>>>
+        {
+            //机械臂
+            new("10.30.37.230", new List<int> { 1666, 1661 }), //库一北
+            new("10.30.37.232", new List<int> { 1681, 1676 }), //库一南
+            new("10.30.37.234", new List<int> { 1696, 1691 }), //库二北
+            new("10.30.37.236", new List<int> { 1711, 1706 }), //库二南
+            new("10.30.37.238", new List<int> { 1726, 1721 }), //库三北
+            new("10.30.37.240", new List<int> { 1741, 1736 }) //库三南
+        };
+
+        foreach (var item in tuples21)
+        {
+            var db530 = 0;
+            var db531 = 0;
+            foreach (var conv in item.Item2.Select(item1 => Device.All.FirstOrDefault(x => x.Code == item1.ToString())))
             {
-                var conv = new Device($"Robot{item.Code}");
-                conv.AddFlag(DeviceFlags.Robot);
-                conv.AddProtocol<IRobot520>(0, 520, item.Ip);
-                conv.AddProtocol<IRobot521>(0, 521, item.Ip);
-                conv.AddProtocol<IRobot522>(0, 522, item.Ip);
+                conv!.AddProtocol<IRobot530>(db530, 530, item.Item1);
+                conv!.AddProtocol<IRobot531>(db531, 531, item.Item1);
+                db530 += 8;
+                db531 += 130;
             }
+        }
 
-            #endregion 初始化机械臂相关信息
+        #endregion 初始化桁架相关信息
 
-            #region 初始化堆垛机相关信息
+        #region 初始化机械臂相关信息
 
-            int ip = 41;
+        var TrussInfo1 = new List<TrussSegmentInfo>
+        {
+            new(1, "10.30.37.230"),
+            new(2, "10.30.37.232"),
+            new(3, "10.30.37.234"),
+            new(4, "10.30.37.236"),
+            new(5, "10.30.37.238"),
+            new(6, "10.30.37.240")
+        };
+
+        foreach (var item in TrussInfo1)
+        {
+            var conv = new Device($"Robot{item.Code}");
+            conv.AddFlag(DeviceFlags.Robot);
+            conv.AddProtocol<IRobot520>(0, 520, item.Ip);
+            conv.AddProtocol<IRobot521>(0, 521, item.Ip);
+            conv.AddProtocol<IRobot522>(0, 522, item.Ip);
+        }
 
-            for (int i = 0; i <= 5; i++)
-            {
-                var srm = new Device($"SRM{i + 1}");
-                srm.AddFlag(DeviceFlags.堆垛机);
-                ip = i == 0 ? ip : ip + 8;
-                //三台堆垛机IP主机位分别是 41、49、57、65、73、81
-                srm.AddProtocol<ISRM520>(0, 520, $"10.30.37.{ip}");
-                srm.AddProtocol<ISRM521>(0, 521, $"10.30.37.{ip}");
-                srm.AddProtocol<ISRM523>(0, 523, $"10.30.37.{ip}");
-
-                //增加巷道
-                var tunnel = new Device($"TY{i + 1}");
-                tunnel.AddFlag(DeviceFlags.巷道);
-            }
+        #endregion 初始化机械臂相关信息
 
-            #endregion 初始化堆垛机相关信息
-        }
+        #region 初始化堆垛机相关信息
+
+        var ip = 41;
 
-        /// <summary>
-        ///  初始化数据库连接
-        /// </summary>
-        /// <param name="datas"></param>
-        public static void InitDB(this List<DataBaseConnectionString> datas)
+        for (var i = 0; i <= 5; i++)
         {
-            //初始化数据库
-            SqlSugarHelper.Do(db =>
-            {
-                foreach (var connectionString in datas!)
-                {
-                    var _db = db.Connect.GetConnectionScope(connectionString.Key);
-                    switch (connectionString.Key)
-                    {
-                        case "WCSDB"://WCS基本数据库
-
-                            break;
-
-                        case "WCSDlog"://WCS日志数据库
-
-                            break;
-
-                        case "PLC"://PLC
-
-                            SqlSugarHelper.SetPLC(connectionString.Key);
-
-                            _db.CodeFirst.InitTables<WCS_SRM520>();
-                            _db.CodeFirst.InitTables<WCS_SRM521>();
-                            _db.CodeFirst.InitTables<WCS_Truss520>();
-                            _db.CodeFirst.InitTables<WCS_Truss521>();
-                            _db.CodeFirst.InitTables<WCS_Robot520>();
-                            _db.CodeFirst.InitTables<WCS_Robot521>();
-                            _db.CodeFirst.InitTables<WCS_Station5>();
-                            _db.CodeFirst.InitTables<QuestDb_Robot522>();
-                            _db.CodeFirst.InitTables<QuestDb_SRM523>();
-                            _db.CodeFirst.InitTables<WCS_RGV520>();
-                            _db.CodeFirst.InitTables<WCS_RGV521>();
-                            _db.CodeFirst.InitTables<QuestDb_RGV523>();
-                            _db.CodeFirst.InitTables<WCS_BCR80>();
-                            _db.CodeFirst.InitTables<WCS_BCR81>();
-                            _db.CodeFirst.InitTables<WCS_Station520>();
-                            _db.CodeFirst.InitTables<WCS_Station521>();
-                            _db.CodeFirst.InitTables<WCS_Station523>();
-                            _db.CodeFirst.InitTables<WCS_Station524>();
-                            _db.CodeFirst.InitTables<WCS_Station91>();
-                            _db.CodeFirst.InitTables<WCS_Station90>();
-                            _db.CodeFirst.InitTables<QuestDb_Truss523>();
-                            _db.CodeFirst.InitTables<WCS_Robot530>();
-                            _db.CodeFirst.InitTables<WCS_Robot531>();
-                            _db.CodeFirst.InitTables<WCS_Station525>();
-                            _db.CodeFirst.InitTables<WCS_Truss530>();
-                            _db.CodeFirst.InitTables<WCS_Truss531>();
-                            break;
-
-                        default: //其他库
-                            break;
-                    };
-                };
-            });
+            var srm = new Device($"SRM{i + 1}");
+            srm.AddFlag(DeviceFlags.堆垛机);
+            ip = i == 0 ? ip : ip + 8;
+            //三台堆垛机IP主机位分别是 41、49、57、65、73、81
+            srm.AddProtocol<ISRM520>(0, 520, $"10.30.37.{ip}");
+            srm.AddProtocol<ISRM521>(0, 521, $"10.30.37.{ip}");
+            srm.AddProtocol<ISRM523>(0, 523, $"10.30.37.{ip}");
+
+            //增加巷道
+            var tunnel = new Device($"TY{i + 1}");
+            tunnel.AddFlag(DeviceFlags.巷道);
         }
+
+        #endregion 初始化堆垛机相关信息
     }
 
-    public class DevDbConfig<T>
+    private static string GetDbTypeString(Type type)
     {
-        public DevDbConfig()
-        {
-        }
+        if (type.IsEnum) return GetDbTypeString(type.GetEnumUnderlyingType());
+        if (type == typeof(int)) return "int";
+
+        if (type == typeof(short))
+            return "short";
+        if (type == typeof(long))
+            return "long";
+        if (type == typeof(float))
+            return "float";
+        if (type == typeof(DateTime))
+            return "date";
+        if (type == typeof(string))
+            return "string";
+        if (type == typeof(byte[]))
+            return "binary";
+        throw new Exception($"类型{type.Name}不支持");
+    }
 
-        public DevDbConfig(string ip, T code)
-        {
-            IP = ip;
-            Code = code;
-        }
+    /// <summary>
+    ///     初始化数据库连接
+    /// </summary>
+    /// <param name="datas"></param>
+    public static void InitDB(this List<DataBaseConnectionString> datas)
+    {
+        //RobotCmdType a = (RobotCmdType)(1000000000000000);
 
-        public DevDbConfig(string ip, List<DevInterval<T>> devIntervalList)
-        {
-            IP = ip;
-            DevIntervalList = devIntervalList;
-        }
 
-        public DevDbConfig(string ip, List<T> devCodeList)
+        var types = AppDomain.CurrentDomain.GetAssemblies()
+            .Select(v => v.GetTypes()).SelectMany(v => v)
+            .Where(x => x.IsClass)
+            .Where(x => x.IsDefined(typeof(SugarTable), false))
+            .Where(x => typeof(IProtocol).IsAssignableFrom(x))
+            .Select(v => new
+            {
+                type = v,
+                itype = v.GetInterface($"I{v.Name.Replace("WCS_", "")}")
+            })
+            .ToList();
+
+        using (var conn = new NpgsqlConnection(Configs.QdbConnString))
         {
-            IP = ip;
-            DevCodeList = devCodeList;
-        }
+            conn.Execute("Drop table if exists Frames");
+            var sSql = "CREATE TABLE IF NOT EXISTS Frames(Frame TIMESTAMP) timestamp (Frame) PARTITION BY DAY BYPASS WAL";
+            var rc = conn.Execute(sSql);
 
-        public string IP { get; set; }
+            foreach (var type in types)
+            {
+                var props = type.itype.GetProperties();
+                if (props.Length==0)continue;
+                var tableName = ((SugarTable)type.type.GetCustomAttribute(typeof(SugarTable))).TableName;
 
-        public T Code { get; set; }
+                conn.Execute($"Drop table if exists {tableName}");
 
-        public T StartCode { get; set; }
+                sSql = $"CREATE TABLE IF NOT EXISTS {tableName}(Frame TIMESTAMP,Code SYMBOL,";
+                sSql += string.Join(',',
+                    props.Select(v => $"{v.Name} {GetDbTypeString(v.PropertyType)}"));
+                sSql += ") timestamp (Frame) PARTITION BY DAY BYPASS WAL"; //BYPASS WAL
+                conn.Execute(sSql);
+            }
+        }
+    }
+}
 
-        public T EndCode { get; set; }
+public class DevDbConfig<T>
+{
+    public DevDbConfig()
+    {
+    }
 
-        public List<T> DevCodeList { get; set; }
+    public DevDbConfig(string ip, T code)
+    {
+        IP = ip;
+        Code = code;
+    }
 
-        public List<DevInterval<T>> DevIntervalList { get; set; }
+    public DevDbConfig(string ip, List<DevInterval<T>> devIntervalList)
+    {
+        IP = ip;
+        DevIntervalList = devIntervalList;
     }
 
-    public class DevInterval<T>
+    public DevDbConfig(string ip, List<T> devCodeList)
     {
-        public DevInterval(T s, T e)
-        {
-            StartCode = s;
-            EndCode = e;
-        }
+        IP = ip;
+        DevCodeList = devCodeList;
+    }
 
-        public T StartCode { get; set; }
+    public string IP { get; set; }
 
-        public T EndCode { get; set; }
+    public T Code { get; set; }
+
+    public T StartCode { get; set; }
+
+    public T EndCode { get; set; }
+
+    public List<T> DevCodeList { get; set; }
+
+    public List<DevInterval<T>> DevIntervalList { get; set; }
+}
+
+public class DevInterval<T>
+{
+    public DevInterval(T s, T e)
+    {
+        StartCode = s;
+        EndCode = e;
     }
+
+    public T StartCode { get; set; }
+
+    public T EndCode { get; set; }
 }

+ 7 - 23
WCS.WorkEngineering/Worlds/MainWorld.cs

@@ -1,10 +1,12 @@
 using System.Collections.Concurrent;
 using System.ComponentModel;
+using System.Reflection;
 using Dapper;
 using FreeRedis;
 using Npgsql;
 using ServiceCenter.Logs;
 using ServiceCenter.SqlSugars;
+using SqlSugar;
 using WCS.Core;
 using LogInfo = ServiceCenter.Logs.LogInfo;
 
@@ -44,7 +46,7 @@ public class MainWorld : World
     ///     世界执行周期间隔
     ///     单位:毫秒
     /// </summary>
-    protected override int Interval => 300;
+    protected override int Interval => 500;
 
     /// <summary>
     ///     更新前执行,重写改方法后请自行添加执行内容
@@ -63,39 +65,21 @@ public class MainWorld : World
     protected override void AfterUpdate(List<WorkTimes> list)
     {
         //LogHub.WorldPublish(Logs, this.GetType().Name);
-        using (var conn = new NpgsqlConnection(SqlSugarHelper._PLC))
+        using (var conn = new NpgsqlConnection(Configs.QdbConnString))
         {
             var frameStr = Frame.ToString("yyyy-MM-dd HH:mm:ss.ffffff");
             conn.Open();
             var trans = conn.BeginTransaction();
             try
             {
-//                    var sSql = "SELECT coalesce(max(Ver),0) FROM LocationData";
-//                    var ver = conn.Query<long>(sSql).First();
-
-//                    LocationData[] ldarr = null;
-//                    using (var wms = new SqlConnection(Configs.wmsConnString))
-//                    {
-//                        sSql = @"select '" + frameStr + @"' Frame,F_No Code,F_line Line,F_cell Col,F_layer Layer,F_depth Depth,F_roadway Tunnel, F_status Status,F_isStop IsStop,cast(F_Version as bigint)Ver
-//from dbo.BASE_LOCATION with(nolock) where F_Version>" + ver;
-//                        ldarr = wms.Query<LocationData>(sSql).ToArray();
-//                    }
-
-//                    if (ldarr.Length > 0)
-//                    {
-//                        var ps = typeof(LocationData).GetProperties();
-//                        var cols = string.Join(',', ps.Select(v => v.Name));
-//                        var pCols = string.Join(',', ps.Select(v => $"@{v.Name}"));
-//                        sSql = $"insert into {nameof(LocationData)}({cols}) values({pCols})";
-//                        var rc = conn.Execute(sSql, ldarr);
-//                        //fi.Ver = ldarr.Max(v => v.Ver);
-//                    }
+
                 if (DataQueue.Count > 0)
                 {
                     var gs = DataQueue.GroupBy(v => new { type = v.ProtocolDataType, itype = v.ProtocolType }).ToList();
                     foreach (var g in gs)
                     {
-                        var cmd = $"insert into {g.Key.type.Name} values('{frameStr}',@Code,";
+                        var tableName = ((SugarTable)g.Key.type.GetCustomAttribute(typeof(SugarTable))).TableName;
+                        var cmd = $"insert into {tableName} values('{frameStr}',@Code,";
                         cmd += string.Join(',', g.Key.itype.GetProperties().Select(v => $"@{v.Name}")) + ")";
                         var arr = g.ToArray();
                         conn.Execute(cmd, arr);

+ 5 - 5
分拣中心数据采集.sln

@@ -15,7 +15,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WCS.Core", "..\ZTGT-FJZX\WC
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WCS.Entity", "..\ZTGT-FJZX\WCS.Entity\WCS.Entity.csproj", "{068A6B12-E558-4536-B695-2C4EBBF29D45}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WCS.Entity.Protocol", "..\ZTGT-FJZX\YWGC\FJK\WCS.Entity.Protocol\WCS.Entity.Protocol.csproj", "{661474D5-B949-48D7-A760-7AA9D2F7349C}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WCS.Entity.Protocol", "WCS.Entity.Protocol\WCS.Entity.Protocol.csproj", "{2F4599CA-CAEB-4E99-B079-2471CFB2B165}"
 EndProject
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -47,10 +47,10 @@ Global
 		{068A6B12-E558-4536-B695-2C4EBBF29D45}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{068A6B12-E558-4536-B695-2C4EBBF29D45}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{068A6B12-E558-4536-B695-2C4EBBF29D45}.Release|Any CPU.Build.0 = Release|Any CPU
-		{661474D5-B949-48D7-A760-7AA9D2F7349C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{661474D5-B949-48D7-A760-7AA9D2F7349C}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{661474D5-B949-48D7-A760-7AA9D2F7349C}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{661474D5-B949-48D7-A760-7AA9D2F7349C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{2F4599CA-CAEB-4E99-B079-2471CFB2B165}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{2F4599CA-CAEB-4E99-B079-2471CFB2B165}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{2F4599CA-CAEB-4E99-B079-2471CFB2B165}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{2F4599CA-CAEB-4E99-B079-2471CFB2B165}.Release|Any CPU.Build.0 = Release|Any CPU
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE