lixun 2 lat temu
rodzic
commit
cd8ed59fcf

+ 1 - 1
src/YSAI.DAQ/YSAI.Core/data/AddressManage.cs

@@ -18,7 +18,7 @@ namespace YSAI.Core.data
         /// 数采类型
         /// </summary>
         [JsonConverter(typeof(StringEnumConverter))]
-        public DaqType DaqType { get; set; }
+        public DaqType DType { get; set; }
 
         /// <summary>
         /// 指定数采类型的实例参数

+ 15 - 10
src/YSAI.DAQ/YSAI.Core/interface/only/IManage.cs

@@ -13,7 +13,7 @@ namespace YSAI.Core.@interface.only
     /// <summary>
     /// 统一管理接口
     /// </summary>
-    public interface IManage
+    public interface IManage:IManageBase
     {
         /// <summary>
         /// 示例
@@ -52,7 +52,13 @@ namespace YSAI.Core.@interface.only
         /// <param name="ConfigFile">配置文件</param>
         /// <returns>统一出参</returns>
         Task<OperateResult> UpdateAsync(IFormFile? ConfigFile);
+    }
 
+    /// <summary>
+    /// 统一管理接口
+    /// </summary>
+    public interface IManageBase:IDisposable
+    {
         /// <summary>
         /// 初始化
         /// </summary>
@@ -71,7 +77,7 @@ namespace YSAI.Core.@interface.only
         /// <param name="Name">库名称</param>
         /// <param name="SN">库实例SN</param>
         /// <returns>统一返回结果</returns>
-        OperateResult On(string Name, string SN);
+        OperateResult On(DaqType? Name, string SN);
 
         /// <summary>
         /// 打开
@@ -79,7 +85,7 @@ namespace YSAI.Core.@interface.only
         /// <param name="Name">库名称</param>
         /// <param name="SN">库实例SN</param>
         /// <returns>统一返回结果</returns>
-        Task<OperateResult> OnAsync(string Name, string SN);
+        Task<OperateResult> OnAsync(DaqType? Name, string SN);
 
         /// <summary>
         /// 关闭
@@ -87,7 +93,7 @@ namespace YSAI.Core.@interface.only
         /// <param name="Name">库名称</param>
         /// <param name="SN">库实例SN</param>
         /// <returns>统一返回结果</returns>
-        OperateResult Off(string Name, string SN);
+        OperateResult Off(DaqType? Name, string SN);
 
         /// <summary>
         /// 关闭
@@ -95,7 +101,7 @@ namespace YSAI.Core.@interface.only
         /// <param name="Name">库名称</param>
         /// <param name="SN">库实例SN</param>
         /// <returns>统一返回结果</returns>
-        Task<OperateResult> OffAsync(string Name, string SN);
+        Task<OperateResult> OffAsync(DaqType? Name, string SN);
 
         /// <summary>
         /// 读取
@@ -104,7 +110,7 @@ namespace YSAI.Core.@interface.only
         /// <param name="SN">库实例SN</param> 
         /// <param name="AddressName">地址</param>
         /// <returns>统一返回结果</returns>
-        OperateResult Read(string Name, string SN, string AddressName);
+        OperateResult Read(DaqType? Name, string SN, string AddressName);
 
         /// <summary>
         /// 读取
@@ -113,7 +119,7 @@ namespace YSAI.Core.@interface.only
         /// <param name="SN">库实例SN</param> 
         /// <param name="AddressName">地址</param>
         /// <returns>统一返回结果</returns>
-        Task<OperateResult> ReadAsync(string Name, string SN, string AddressName);
+        Task<OperateResult> ReadAsync(DaqType? Name, string SN, string AddressName);
 
         /// <summary>
         /// 写入
@@ -124,7 +130,7 @@ namespace YSAI.Core.@interface.only
         /// <param name="Value">值</param>
         /// <param name="DType">数据类型</param>
         /// <returns>统一返回结果</returns>
-        OperateResult Write(string Name, string SN, string AddressName, string Value, DataType DType);
+        OperateResult Write(DaqType? Name, string SN, string AddressName, string Value, DataType DType);
 
         /// <summary>
         /// 写入
@@ -135,8 +141,7 @@ namespace YSAI.Core.@interface.only
         /// <param name="Value">值</param>
         /// <param name="DType">数据类型</param>
         /// <returns>统一返回结果</returns>
-        Task<OperateResult> WriteAsync(string Name, string SN, string AddressName, string Value, DataType DType);
-
+        Task<OperateResult> WriteAsync(DaqType? Name, string SN, string AddressName, string Value, DataType DType);
     }
 
     /// <summary>

+ 2 - 0
src/YSAI.DAQ/YSAI.Core/serialport/SerialPortOperate.cs

@@ -94,6 +94,8 @@ namespace YSAI.Core.serialport
 
         public void Dispose()
         {
+            Off();
+            serialPort?.Dispose();
             GC.Collect();
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);

+ 3 - 1
src/YSAI.DAQ/YSAI.Core/socket/tcp/client/SocketTcpClientOperate.cs

@@ -1,4 +1,5 @@
-using System.Net;
+using System.IO.Ports;
+using System.Net;
 using System.Net.Sockets;
 using YSAI.Core.data;
 using YSAI.Core.@interface.only;
@@ -180,6 +181,7 @@ namespace YSAI.Core.socket.tcp.client
         public void Dispose()
         {
             Off();
+            Client_SK?.Dispose();
             GC.Collect();
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);

+ 1 - 0
src/YSAI.DAQ/YSAI.Core/socket/tcp/service/SocketTcpServiceOperate.cs

@@ -203,6 +203,7 @@ namespace YSAI.Core.socket.tcp.service
         public void Dispose()
         {
             Off();
+            Server_SK?.Dispose();
             GC.Collect();
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);

+ 1 - 0
src/YSAI.DAQ/YSAI.Core/socket/tcpClient/Operate.cs

@@ -191,6 +191,7 @@ namespace YSAI.Core.socket.tcpClient
         public void Dispose()
         {
             Off();
+            Client_SK?.Dispose();
             GC.Collect();
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);

+ 1 - 0
src/YSAI.DAQ/YSAI.Core/socket/udp/SocketUdpOperate.cs

@@ -145,6 +145,7 @@ namespace YSAI.Core.socket.udp
         public void Dispose()
         {
             Off();
+            UdpClients.Dispose();
             GC.Collect();
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);

+ 1 - 0
src/YSAI.DAQ/YSAI.Core/socket/udpClient/Operate.cs

@@ -150,6 +150,7 @@ namespace YSAI.Core.socket.udpClient
         public void Dispose()
         {
             Off();
+            UdpClients.Dispose();
             GC.Collect();
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);

+ 33 - 0
src/YSAI.DAQ/YSAI.DB/DBData.cs

@@ -16,6 +16,11 @@ namespace YSAI.DB
         /// </summary>
         public class Basics
         {
+            /// <summary>
+            /// 唯一标识符
+            /// </summary>
+            [Description("唯一标识符")]
+            public string? SN { get; set; }
             /// <summary>
             /// 数据库连接字符串
             /// </summary>
@@ -27,6 +32,34 @@ namespace YSAI.DB
             [Description("数据库类型")]
             [JsonConverter(typeof(StringEnumConverter))]
             public DBType DBType { get; set; } = DBType.SqlServer;
+            /// <summary>
+            /// 重写基类中的Equals方法
+            /// </summary>
+            /// <param name="obj"></param>
+            /// <returns></returns>
+            public override bool Equals(object obj)
+            {
+                if (obj == null)
+                {
+                    return false;
+                }
+                Basics? Obj = obj as Basics;
+                if (Obj == null)
+                {
+                    return false;
+                }
+                else
+                {
+                    if (ConnectStr == Obj.ConnectStr && DBType == Obj.DBType && SN == Obj.SN)
+                    {
+                        return true;
+                    }
+                    else
+                    {
+                        return false;
+                    }
+                }
+            }
         }
         /// <summary>
         /// 数据库类型

+ 83 - 19
src/YSAI.DAQ/YSAI.Manage.Core/ManageOperate.cs

@@ -4,6 +4,7 @@ using YSAI.Core.data;
 using YSAI.Core.@enum;
 using YSAI.Core.@interface.only;
 using YSAI.Core.@interface.unify;
+using YSAI.Manage.Core.@base;
 using YSAI.Opc.ua.client;
 using YSAI.Unility;
 
@@ -16,7 +17,6 @@ namespace YSAI.Manage.Core
     {
         protected override string LogHead => "[ ManageOperate 操作 ]";
         protected override string ClassName => "ManageOperate";
-
         /// <summary>
         /// 配置路径
         /// </summary>
@@ -25,6 +25,30 @@ namespace YSAI.Manage.Core
         /// 实例文件路径
         /// </summary>
         private readonly string samplePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "config//Sample.json");
+        /// <summary>
+        /// 配置数据
+        /// </summary>
+        private List<AddressManage>? AManages = null;
+        /// <summary>
+        /// 底层统一管理
+        /// </summary>
+        private ManageBaseOperate? baseOperate = null;
+        /// <summary>
+        /// 类型解析
+        /// </summary>
+        /// <param name="Name"></param>
+        /// <returns></returns>
+        public DaqType? TypeParse(string Name)
+        {
+            try
+            {
+                return (DaqType)Enum.Parse(typeof(DaqType), Name);
+            }
+            catch
+            {
+                return null;
+            }
+        }
 
         public IActionResult Sample()
         {
@@ -35,7 +59,7 @@ namespace YSAI.Manage.Core
                 addressManage.SN = address.SN;
                 addressManage.AddressArray = address.AddressArray;
                 addressManage.CreationTime = DateTime.Now.ToLocalTime();
-                addressManage.DaqType = DaqType.OpcUa;
+                addressManage.DType = DaqType.OpcUa;
                 addressManage.InstanceParam = new OpcUaClientData.Basics() { Name = $"OpcUa", UserName = "123", Password = "123", ServerUrl = "opc.tcp://127.0.0.1:4840", SamplingInterval = 100 };
                 return new FileContentResult(System.Text.Encoding.Default.GetBytes(new List<AddressManage> { addressManage, addressManage, addressManage, addressManage, addressManage, addressManage }.ToJson().JsonFormatting()), "application/octet-stream");
             }
@@ -101,6 +125,16 @@ namespace YSAI.Manage.Core
                 {
                     ConfigFile.CopyToAsync(stream).Wait();
                 }
+
+                //配置赋值
+                AManages = JsonTool.StringToListJsonEntity<AddressManage>(FileTool.FileToString(configPath));
+                if (baseOperate != null)
+                {
+                    baseOperate.Dispose();
+                }
+                //实例底层统一管理
+                baseOperate = ManageBaseOperate.Instance(new ManageBaseData.Basics { AManages = AManages });
+
                 return Break("Update", true);
             }
             catch (Exception ex)
@@ -116,52 +150,82 @@ namespace YSAI.Manage.Core
 
         public OperateResult Init()
         {
-            throw new NotImplementedException();
+            if (baseOperate == null)
+            {
+                Depart("Init");
+                return Break("Init",false,"请先设置配置");
+            }
+            return baseOperate.Init();
         }
 
         public Task<OperateResult> InitAsync()
         {
-            throw new NotImplementedException();
+            return Task.Run(() => Init());
         }
 
-        public OperateResult Off(string Name, string SN)
+        public OperateResult Off(DaqType? Name, string SN)
         {
-            throw new NotImplementedException();
+            if (baseOperate == null)
+            {
+                Depart("Off");
+                return Break("Off", false, "请先设置配置");
+            }
+            return baseOperate.Off(Name, SN);
         }
 
-        public Task<OperateResult> OffAsync(string Name, string SN)
+        public Task<OperateResult> OffAsync(DaqType? Name, string SN)
         {
-            throw new NotImplementedException();
+            return Task.Run(() => Off(Name, SN));
         }
 
-        public OperateResult On(string Name, string SN)
+        public OperateResult On(DaqType? Name, string SN)
         {
-            throw new NotImplementedException();
+            if (baseOperate == null)
+            {
+                Depart("On");
+                return Break("On", false, "请先设置配置");
+            }
+            return baseOperate.On(Name, SN);
         }
 
-        public Task<OperateResult> OnAsync(string Name, string SN)
+        public Task<OperateResult> OnAsync(DaqType? Name, string SN)
         {
-            throw new NotImplementedException();
+            return Task.Run(() => On(Name, SN));
         }
 
-        public OperateResult Read(string Name, string SN, string AddressName)
+        public OperateResult Read(DaqType? Name, string SN, string AddressName)
         {
-            throw new NotImplementedException();
+            if (baseOperate == null)
+            {
+                Depart("Read");
+                return Break("Read", false, "请先设置配置");
+            }
+            return baseOperate.Read(Name, SN, AddressName);
         }
 
-        public Task<OperateResult> ReadAsync(string Name, string SN, string AddressName)
+        public Task<OperateResult> ReadAsync(DaqType? Name, string SN, string AddressName)
         {
-            throw new NotImplementedException();
+            return Task.Run(() => Read(Name, SN, AddressName));
         }
 
-        public OperateResult Write(string Name, string SN, string AddressName, string Value,DataType DType)
+        public OperateResult Write(DaqType? Name, string SN, string AddressName, string Value,DataType DType)
         {
-            throw new NotImplementedException();
+            if (baseOperate == null)
+            {
+                Depart("Write");
+                return Break("Write", false, "请先设置配置");
+            }
+            return baseOperate.Write(Name, SN, AddressName, Value, DType);
         }
 
-        public Task<OperateResult> WriteAsync(string Name, string SN, string AddressName, string Value, DataType DType)
+        public Task<OperateResult> WriteAsync(DaqType? Name, string SN, string AddressName, string Value, DataType DType)
         {
             return Task.Run(() => Write(Name, SN, AddressName, Value, DType));
         }
+
+        public void Dispose()
+        {
+            baseOperate?.Dispose();
+        }
     }
 }

+ 55 - 0
src/YSAI.DAQ/YSAI.Manage.Core/base/ManageBaseData.cs

@@ -0,0 +1,55 @@
+using Newtonsoft.Json.Converters;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using YSAI.Core.data;
+using YSAI.DB;
+
+namespace YSAI.Manage.Core.@base
+{
+    public class ManageBaseData
+    {
+        /// <summary>
+        /// 基础数据
+        /// </summary>
+        public class Basics
+        {
+            /// <summary>
+            /// 地址管理集合配置
+            /// </summary>
+            public List<AddressManage> AManages { get; set; }
+
+            /// <summary>
+            /// 重写基类中的Equals方法
+            /// </summary>
+            /// <param name="obj"></param>
+            /// <returns></returns>
+            public override bool Equals(object obj)
+            {
+                if (obj == null)
+                {
+                    return false;
+                }
+                Basics? Obj = obj as Basics;
+                if (Obj == null)
+                {
+                    return false;
+                }
+                else
+                {
+                    if (AManages.SequenceEqual(Obj.AManages))
+                    {
+                        return true;
+                    }
+                    else
+                    {
+                        return false;
+                    }
+                }
+            }
+        }
+    }
+}

+ 227 - 0
src/YSAI.DAQ/YSAI.Manage.Core/base/ManageBaseOperate.cs

@@ -0,0 +1,227 @@
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using System.Collections.Concurrent;
+using System.Data.Entity.Core.Metadata.Edm;
+using System.Reflection.Emit;
+using YSAI.Core.data;
+using YSAI.Core.@enum;
+using YSAI.Core.@interface.only;
+using YSAI.Core.@interface.unify;
+using YSAI.DB;
+using YSAI.Modbus.client;
+using YSAI.Opc.da.client;
+using YSAI.Opc.da.http;
+using YSAI.Opc.ua.client;
+using YSAI.S7.client;
+
+namespace YSAI.Manage.Core.@base
+{
+    /// <summary>
+    /// 底层统一管理
+    /// </summary>
+    public class ManageBaseOperate : IBaseAbstract, IManageBase
+    {
+        protected override string LogHead => "[ LibManageOperate 操作 ]";
+        protected override string ClassName => "LibManageOperate";
+
+        private static readonly object Lock = new object();  //锁
+
+        private static List<ManageBaseOperate> ThisObjList = new List<ManageBaseOperate>(); //自身对象集合
+
+        
+
+        /// <summary>
+        /// 数据库采集对象集合
+        /// </summary>
+        private ConcurrentDictionary<string, DBOperate> DBDaqObjArray = new ConcurrentDictionary<string, DBOperate>();
+        /// <summary>
+        /// modbus采集对象集合
+        /// </summary>
+        private ConcurrentDictionary<string, ModbusClientOperate> ModbusDaqObjArray = new ConcurrentDictionary<string, ModbusClientOperate>();
+        /// <summary>
+        /// opcua采集对象集合
+        /// </summary>
+        private ConcurrentDictionary<string, OpcUaClientOperate> OpcUaDaqObjArray = new ConcurrentDictionary<string, OpcUaClientOperate>();
+        /// <summary>
+        /// opcda采集对象集合
+        /// </summary>
+        private ConcurrentDictionary<string, OpcDaClientOperate> OpcDaDaqObjArray = new ConcurrentDictionary<string, OpcDaClientOperate>();
+        /// <summary>
+        /// opcdahttp采集对象集合
+        /// </summary>
+        private ConcurrentDictionary<string, OpcDaHttpOperate> OpcDaHttpDaqObjArray = new ConcurrentDictionary<string, OpcDaHttpOperate>();
+        /// <summary>
+        /// s7采集对象集合
+        /// </summary>
+        private ConcurrentDictionary<string, S7ClientOperate> S7DaqObjArray = new ConcurrentDictionary<string, S7ClientOperate>();
+
+
+        /// <summary>
+        /// 单例模式
+        /// </summary>
+        /// <returns></returns>
+        public static ManageBaseOperate Instance(ManageBaseData.Basics basics)
+        {
+            ManageBaseOperate? exp = ThisObjList.FirstOrDefault(c => c.basics.Equals(basics));
+            if (exp == null)
+            {
+                lock (Lock)
+                {
+                    if (ThisObjList.Count(c => c.basics.Equals(basics)) > 0)
+                    {
+                        return ThisObjList.First(c => c.basics.Equals(basics));
+                    }
+                    else
+                    {
+                        ManageBaseOperate exp2 = new ManageBaseOperate(basics);
+                        ThisObjList.Add(exp2);
+                        return exp2;
+                    }
+                }
+            }
+            return exp;
+        }
+        /// <summary>
+        /// 构造函数
+        /// </summary>
+        /// <param name="param">参数</param>
+        public ManageBaseOperate(ManageBaseData.Basics basics)
+        {
+            this.basics = basics;
+        }
+
+        /// <summary>
+        /// 连接字符串
+        /// </summary>
+        private ManageBaseData.Basics basics { get; set; }
+
+
+        public OperateResult Init()
+        {
+            Depart("Init");
+            try
+            {
+                foreach (AddressManage manage in basics.AManages)
+                {
+                    switch (manage.DType)
+                    {
+                        case DaqType.DB:
+                            break;
+                        case DaqType.Modbus:
+                            break;
+                        case DaqType.OpcUa:
+                            break;
+                        case DaqType.OpcDa:
+                            break;
+                        case DaqType.OpcDaHttp:
+                            break;
+                        case DaqType.S7:
+                            break;
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("Init", false, ex.Message);
+            }
+        }
+
+        public Task<OperateResult> InitAsync()
+        {
+            return Task.Run(() => Init());
+        }
+
+        public OperateResult On(DaqType? Name, string SN)
+        {
+            Depart("On");
+            try
+            {
+
+            }
+            catch (Exception ex)
+            {
+                return Break("On", false, ex.Message);
+            }
+        }
+
+        public Task<OperateResult> OnAsync(DaqType? Name, string SN)
+        {
+            return Task.Run(() => On(Name, SN));
+        }
+
+        public OperateResult Off(DaqType? Name, string SN)
+        {
+            Depart("Off");
+            try
+            {
+
+            }
+            catch (Exception ex)
+            {
+                return Break("Off", false, ex.Message);
+            }
+        }
+
+        public Task<OperateResult> OffAsync(DaqType? Name, string SN)
+        {
+            return Task.Run(() => Off(Name, SN));
+        }
+
+        public OperateResult Read(DaqType? Name, string SN, string AddressName)
+        {
+            Depart("Read");
+            try
+            {
+
+            }
+            catch (Exception ex)
+            {
+                return Break("Read", false, ex.Message);
+            }
+        }
+
+        public Task<OperateResult> ReadAsync(DaqType? Name, string SN, string AddressName)
+        {
+            return Task.Run(()=>Read(Name, SN, AddressName));
+        }
+
+        public OperateResult Write(DaqType? Name, string SN, string AddressName, string Value, DataType DType)
+        {
+            Depart("Write");
+            try
+            {
+
+            }
+            catch (Exception ex)
+            {
+                return Break("Write", false, ex.Message);
+            }
+        }
+
+        public Task<OperateResult> WriteAsync(DaqType? Name, string SN, string AddressName, string Value, DataType DType)
+        {
+            return Task.Run(()=> Write(Name,SN,AddressName,Value,DType));
+        }
+
+        public void Dispose()
+        {
+            //全部关闭
+
+            foreach (var item in DBDaqObjArray) { item.Value.Dispose(); }
+
+            foreach (var item in ModbusDaqObjArray) { item.Value.Dispose(); }
+
+            foreach (var item in OpcUaDaqObjArray) { item.Value.Dispose(); }
+
+            foreach (var item in OpcDaDaqObjArray) { item.Value.Dispose(); }
+
+            foreach (var item in OpcDaHttpDaqObjArray) { item.Value.Dispose(); }
+
+            foreach (var item in S7DaqObjArray) { item.Value.Dispose(); }
+
+            GC.Collect();
+            GC.SuppressFinalize(this);
+            ThisObjList.Remove(this);
+        }
+    }
+}

+ 54 - 9
src/YSAI.DAQ/YSAI.Manage/Controllers/DaqLibOperateController.cs

@@ -1,11 +1,18 @@
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
 using System.Drawing;
 using System.Text;
 using YSAI.Core.data;
+using YSAI.Core.@enum;
 using YSAI.Core.@interface.only;
+using YSAI.DB;
 using YSAI.Manage.Core;
+using YSAI.Modbus.client;
+using YSAI.Opc.da.client;
+using YSAI.Opc.da.http;
 using YSAI.Opc.ua.client;
+using YSAI.S7.client;
 using YSAI.Unility;
 using static System.Net.Mime.MediaTypeNames;
 
@@ -27,8 +34,6 @@ namespace YSAI.Manage.Controllers
         /// </summary>
         private readonly ManageOperate manageOperate;
 
-
-
         /// <summary>
         /// 点位地址信息操作
         /// </summary>
@@ -36,6 +41,11 @@ namespace YSAI.Manage.Controllers
         {
             this.configuration = configuration;
             this.manageOperate = manageOperate;
+            //自动初始化
+            if (configuration.GetValue<bool>("AutoInit"))
+            {
+                Init();
+            }
         }
 
         /// <summary>
@@ -85,7 +95,12 @@ namespace YSAI.Manage.Controllers
         [HttpPost]
         public OperateResult On(string Name, string SN)
         {
-            return manageOperate.On(Name, SN);
+            DaqType? daqType = manageOperate.TypeParse(Name);
+            if (daqType == null)
+            {
+                return new OperateResult(false, "输入有误",new Random().NextDouble());
+            }
+            return manageOperate.On(daqType, SN);
         }
         /// <summary>
         /// 关闭
@@ -96,7 +111,12 @@ namespace YSAI.Manage.Controllers
         [HttpPost]
         public OperateResult Off(string Name, string SN)
         {
-            return manageOperate.Off(Name, SN);
+            DaqType? daqType = manageOperate.TypeParse(Name);
+            if (daqType == null)
+            {
+                return new OperateResult(false, "输入有误", new Random().NextDouble());
+            }
+            return manageOperate.Off(daqType, SN);
         }
         /// <summary>
         /// 读取
@@ -108,7 +128,12 @@ namespace YSAI.Manage.Controllers
         [HttpPost]
         public OperateResult Read(string Name, string SN, string AddressName)
         {
-            return manageOperate.Read(Name, SN, AddressName);
+            DaqType? daqType = manageOperate.TypeParse(Name);
+            if (daqType == null)
+            {
+                return new OperateResult(false, "输入有误", new Random().NextDouble());
+            }
+            return manageOperate.Read(daqType, SN, AddressName);
         }
         /// <summary>
         /// 写入浮点型数据
@@ -121,7 +146,12 @@ namespace YSAI.Manage.Controllers
         [HttpPost]
         public OperateResult WriteDouble(string Name, string SN, string AddressName, string Value)
         {
-            return manageOperate.Write(Name, SN, AddressName, Value, YSAI.Core.@enum.DataType.Double);
+            DaqType? daqType = manageOperate.TypeParse(Name);
+            if (daqType == null)
+            {
+                return new OperateResult(false, "输入有误", new Random().NextDouble());
+            }
+            return manageOperate.Write(daqType, SN, AddressName, Value, YSAI.Core.@enum.DataType.Double);
         }
 
         /// <summary>
@@ -135,7 +165,12 @@ namespace YSAI.Manage.Controllers
         [HttpPost]
         public OperateResult WriteInt(string Name, string SN, string AddressName, string Value)
         {
-            return manageOperate.Write(Name, SN, AddressName, Value, YSAI.Core.@enum.DataType.Int);
+            DaqType? daqType = manageOperate.TypeParse(Name);
+            if (daqType == null)
+            {
+                return new OperateResult(false, "输入有误", new Random().NextDouble());
+            }
+            return manageOperate.Write(daqType, SN, AddressName, Value, YSAI.Core.@enum.DataType.Int);
         }
 
         /// <summary>
@@ -149,7 +184,12 @@ namespace YSAI.Manage.Controllers
         [HttpPost]
         public OperateResult WriteString(string Name, string SN, string AddressName, string Value)
         {
-            return manageOperate.Write(Name, SN, AddressName, Value, YSAI.Core.@enum.DataType.String);
+            DaqType? daqType = manageOperate.TypeParse(Name);
+            if (daqType == null)
+            {
+                return new OperateResult(false, "输入有误", new Random().NextDouble());
+            }
+            return manageOperate.Write(daqType, SN, AddressName, Value, YSAI.Core.@enum.DataType.String);
         }
 
         /// <summary>
@@ -163,7 +203,12 @@ namespace YSAI.Manage.Controllers
         [HttpPost]
         public OperateResult WriteBool(string Name, string SN, string AddressName, string Value)
         {
-            return manageOperate.Write(Name, SN, AddressName, Value, YSAI.Core.@enum.DataType.Bool);
+            DaqType? daqType = manageOperate.TypeParse(Name);
+            if (daqType == null)
+            {
+                return new OperateResult(false, "输入有误", new Random().NextDouble());
+            }
+            return manageOperate.Write(daqType, SN, AddressName, Value, YSAI.Core.@enum.DataType.Bool);
         }
     }
 }

+ 2 - 1
src/YSAI.DAQ/YSAI.Manage/appsettings.json

@@ -5,5 +5,6 @@
       "Microsoft.AspNetCore": "Warning"
     }
   },
-  "AllowedHosts": "*"
+  "AllowedHosts": "*",
+  "AutoInit": true
 }

+ 2 - 0
src/YSAI.DAQ/YSAI.Mqtt/client/MqttClientOperate.cs

@@ -99,6 +99,7 @@ namespace YSAI.Mqtt.client
 
         public void Dispose()
         {
+            Off();
             GC.Collect();
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);
@@ -268,6 +269,7 @@ namespace YSAI.Mqtt.client
             {
                 //关闭与服务器的连接(异步)(等待执行完成)
                 mqttClient.DisconnectAsync().Wait();
+                mqttClient.Dispose();
                 //设置状态
                 states = States.Off;
                 return Break("Off", true);

+ 1 - 0
src/YSAI.DAQ/YSAI.Mqtt/service/MqttServiceOperate.cs

@@ -200,6 +200,7 @@ namespace YSAI.Mqtt.service
         /// </summary>
         public void Dispose()
         {
+            Off();
             GC.Collect();
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);

+ 3 - 0
src/YSAI.DAQ/YSAI.Opc/da/client/OpcDaClientOperate.cs

@@ -215,7 +215,9 @@ namespace YSAI.Opc.da.client
 
         public void Dispose()
         {
+            Off();
             GC.Collect();
+            GC.SuppressFinalize(this);
             ThisObjList.Remove(this);
         }
 
@@ -593,6 +595,7 @@ namespace YSAI.Opc.da.client
                 if (opcDaClient != null && opcDaClient.IsConnected)
                 {
                     opcDaClient.Disconnect();
+                    opcDaClient.Dispose();
                     opcDaClient = null;
                 }
                 else

+ 6 - 7
src/YSAI.DAQ/YSAI.Opc/ua/client/OpcUaClientData.cs

@@ -23,6 +23,12 @@ namespace YSAI.Opc.ua.client
         /// </summary>
         public class Basics
         {
+            /// <summary>
+            /// 唯一标识符
+            /// </summary>
+            [Description("唯一标识符")]
+            public string? SN { get; set; }
+
             /// <summary>
             /// 用户名
             /// </summary>
@@ -52,13 +58,6 @@ namespace YSAI.Opc.ua.client
             [Description("服务地址")]
             public string? ServerUrl { get; set; }
 
-            /// <summary>
-            /// 唯一标识符
-            /// </summary>
-            [Description("唯一标识符")]
-            public string? SN { get; set; }
-
-
             /// <summary>
             /// 自定义的名称空间
             /// </summary>

+ 2 - 0
src/YSAI.DAQ/YSAI.Opc/ua/client/OpcUaClientOperate.cs

@@ -686,6 +686,7 @@ namespace YSAI.Opc.ua.client
         /// </summary>
         public void Dispose()
         {
+            Off();
             GC.Collect();
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);
@@ -1098,6 +1099,7 @@ namespace YSAI.Opc.ua.client
                 if (clientSession != null)
                 {
                     clientSession.Close(10000);
+                    clientSession.Dispose();
                     clientSession = null;
                 }
                 IsConnected = false;

+ 3 - 0
src/YSAI.DAQ/YSAI.Opc/ua/service/OpcUaServiceOperate.cs

@@ -199,6 +199,7 @@ namespace YSAI.Opc.ua.service
         /// </summary>
         public void Dispose()
         {
+            Off();
             GC.Collect();
             GC.SuppressFinalize(this);
             ThisObjList.Remove(this);
@@ -295,10 +296,12 @@ namespace YSAI.Opc.ua.service
                 using (Service _server = service)
                 {
                     // 停止状态线程
+                    service.Dispose();
                     service = null;
                     Status.Wait();
                     // 停止服务并处理
                     _server.Stop();
+                    _server.Dispose();
                 }
                 IsStart = false;
                 return Break("Off", true);

+ 2 - 0
src/YSAI.DAQ/YSAI.S7/client/S7ClientOperate.cs

@@ -69,7 +69,9 @@ namespace YSAI.S7.client
         private Plc PlcS7;
         public void Dispose()
         {
+            Off();
             GC.Collect();
+            GC.SuppressFinalize(this);
             ThisObjList.Remove(this);
         }
         protected override string LogHead => "[ S7Operate 操作 ]";