lixun 2 年之前
父节点
当前提交
58d19c35d4
共有 25 个文件被更改,包括 2740 次插入2720 次删除
  1. 36 0
      src/YSAI.DAQ/YSAI.Core/config/ReflectionConfig.json
  2. 93 18
      src/YSAI.DAQ/YSAI.Core/data/AddressHandler.cs
  3. 1 1
      src/YSAI.DAQ/YSAI.Core/data/AddressManage.cs
  4. 3 26
      src/YSAI.DAQ/YSAI.Core/enum/Enums.cs
  5. 99 109
      src/YSAI.DAQ/YSAI.Core/interface/only/IManage.cs
  6. 1 7
      src/YSAI.DAQ/YSAI.DAQ.sln
  7. 306 245
      src/YSAI.DAQ/YSAI.DaqManage/DaqManageOperate.cs
  8. 119 0
      src/YSAI.DAQ/YSAI.Manage.Core/DaqManage.cs
  9. 78 78
      src/YSAI.DAQ/YSAI.Manage.Core/ManageInfoOperate.cs
  10. 154 186
      src/YSAI.DAQ/YSAI.Manage.Core/ManageOperate.cs
  11. 84 0
      src/YSAI.DAQ/YSAI.Manage.Core/RelayManage.cs
  12. 1 0
      src/YSAI.DAQ/YSAI.Manage.Core/YSAI.Manage.Core.csproj
  13. 1143 1143
      src/YSAI.DAQ/YSAI.Manage.Core/base/ManageBaseOperate.cs
  14. 0 69
      src/YSAI.DAQ/YSAI.Manage/Controllers/DaqLibInfoController.cs
  15. 0 192
      src/YSAI.DAQ/YSAI.Manage/Controllers/DaqLibOperateController.cs
  16. 369 0
      src/YSAI.DAQ/YSAI.Manage/Controllers/OperateController.cs
  17. 0 51
      src/YSAI.DAQ/YSAI.Manage/Controllers/RelayLibInfoController.cs
  18. 0 54
      src/YSAI.DAQ/YSAI.Manage/Controllers/RelayLibOperateController.cs
  19. 28 15
      src/YSAI.DAQ/YSAI.Manage/Program.cs
  20. 9 19
      src/YSAI.DAQ/YSAI.Manage/YSAI.Manage.csproj
  21. 0 185
      src/YSAI.DAQ/YSAI.Manage/config/DaqConfig.json
  22. 0 40
      src/YSAI.DAQ/YSAI.Manage/config/ReflectionConfig.json
  23. 0 46
      src/YSAI.DAQ/YSAI.Manage/config/RelayConfig.json
  24. 212 232
      src/YSAI.DAQ/YSAI.RelayManage/RelayManageOperate.cs
  25. 4 4
      src/YSAI.DAQ/YSAI.Test/TestAll.cs

+ 36 - 0
src/YSAI.DAQ/YSAI.Core/config/ReflectionConfig.json

@@ -17,6 +17,42 @@
                   "WhetherExecute": false,
                   "MethodName": "Produce",
                   "MethodParam": null
+                },
+                {
+                  "SN": "[TypeSns]",
+                  "WhetherExecute": false,
+                  "MethodName": "TypeSns",
+                  "MethodParam": null
+                },
+                {
+                  "SN": "[InstanceSns]",
+                  "WhetherExecute": false,
+                  "MethodName": "InstanceSns",
+                  "MethodParam": null
+                },
+                {
+                  "SN": "[DisposeISn]",
+                  "WhetherExecute": false,
+                  "MethodName": "DisposeISn",
+                  "MethodParam": null
+                },
+                {
+                  "SN": "[RemoveISn]",
+                  "WhetherExecute": false,
+                  "MethodName": "RemoveISn",
+                  "MethodParam": null
+                },
+                {
+                  "SN": "[On]",
+                  "WhetherExecute": false,
+                  "MethodName": "On",
+                  "MethodParam": null
+                },
+                {
+                  "SN": "[Off]",
+                  "WhetherExecute": false,
+                  "MethodName": "Off",
+                  "MethodParam": null
                 }
               ],
               "EventDatas": [

+ 93 - 18
src/YSAI.DAQ/YSAI.Core/data/AddressHandler.cs

@@ -75,7 +75,7 @@ namespace YSAI.Core.data
                 addressValue.Quality = 1;
 
                 //转发
-                OperateResult operateResult = Relay(PacketType.Message, addressValue);
+                OperateResult operateResult = Produce(PacketType.Message.ToString(), addressValue.ToJson().JsonFormatting());
                 if (!operateResult.State)
                 {
                     //当数据转发失败,就存到本地
@@ -138,28 +138,102 @@ namespace YSAI.Core.data
             return value;
         }
 
+        #region 转发库的操作
+
         /// <summary>
-        /// 数据转发
+        /// 生产
         /// </summary>
-        /// <param name="PType">转发类型</param>
+        /// <param name="Topic">主题</param>
         /// <param name="Content">内容</param>
-        public static OperateResult Relay(PacketType PType, object Content)
+        public static OperateResult Produce(string Topic, string Content)
         {
-            try
-            {
-                //类的唯一标识符
-                string ClassSN = "YSAI.RelayManage.RelayManageOperate[Instance]";
-                //方法的唯一标识符
-                string MethodSN = "[Produce]";
-                //执行转发方法
-                return reflectionOperate.ExecuteMethod($"{ClassSN}{MethodSN}", new object[] { PType.ToString(), Content.ToJson() }) as OperateResult;
-            }
-            catch (Exception ex)
-            {
-                return new OperateResult(false, $"数据转发异常:{ex.Message}", 0.1);
-            }
+            //类的唯一标识符
+            string ClassSN = "YSAI.RelayManage.RelayManageOperate[Instance]";
+            //方法的唯一标识符
+            string MethodSN = "[Produce]";
+            //执行转发方法
+            return reflectionOperate.ExecuteMethod($"{ClassSN}{MethodSN}", new object[] { Topic, Content }) as OperateResult;
+        }
+        /// <summary>
+        /// 程序集唯一标识符集合
+        /// </summary>
+        public static List<string>? TypeSns()
+        {
+            //类的唯一标识符
+            string ClassSN = "YSAI.RelayManage.RelayManageOperate[Instance]";
+            //方法的唯一标识符
+            string MethodSN = "[TypeSns]";
+            //执行转发方法
+            return reflectionOperate.ExecuteMethod($"{ClassSN}{MethodSN}", null) as List<string>;
+        }
+        /// <summary>
+        /// 实例唯一标识符集合
+        /// </summary>
+        public static List<string>? InstanceSns()
+        {
+            //类的唯一标识符
+            string ClassSN = "YSAI.RelayManage.RelayManageOperate[Instance]";
+            //方法的唯一标识符
+            string MethodSN = "[InstanceSns]";
+            //执行转发方法
+            return reflectionOperate.ExecuteMethod($"{ClassSN}{MethodSN}", null) as List<string>;
+        }
+        /// <summary>
+        /// 释放指定实例
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        public static OperateResult DisposeISn(string ISn)
+        {
+            //类的唯一标识符
+            string ClassSN = "YSAI.RelayManage.RelayManageOperate[Instance]";
+            //方法的唯一标识符
+            string MethodSN = "[DisposeISn]";
+            //执行转发方法
+            return reflectionOperate.ExecuteMethod($"{ClassSN}{MethodSN}", new object[] { ISn }) as OperateResult;
+        }
+        /// <summary>
+        /// 移除指定实例
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        public static OperateResult RemoveISn(string ISn)
+        {
+            //类的唯一标识符
+            string ClassSN = "YSAI.RelayManage.RelayManageOperate[Instance]";
+            //方法的唯一标识符
+            string MethodSN = "[RemoveISn]";
+            //执行转发方法
+            return reflectionOperate.ExecuteMethod($"{ClassSN}{MethodSN}", new object[] { ISn }) as OperateResult;
+        }
+        /// <summary>
+        /// 打开
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        public static OperateResult On(string ISn)
+        {
+            //类的唯一标识符
+            string ClassSN = "YSAI.RelayManage.RelayManageOperate[Instance]";
+            //方法的唯一标识符
+            string MethodSN = "[On]";
+            //执行转发方法
+            return reflectionOperate.ExecuteMethod($"{ClassSN}{MethodSN}", new object[] { ISn }) as OperateResult;
+        }
+        /// <summary>
+        /// 关闭
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        public static OperateResult Off(string ISn)
+        {
+            //类的唯一标识符
+            string ClassSN = "YSAI.RelayManage.RelayManageOperate[Instance]";
+            //方法的唯一标识符
+            string MethodSN = "[Off]";
+            //执行转发方法
+            return reflectionOperate.ExecuteMethod($"{ClassSN}{MethodSN}", new object[] { ISn }) as OperateResult;
         }
-
         /// <summary>
         /// 转发事件注册
         /// </summary>
@@ -181,5 +255,6 @@ namespace YSAI.Core.data
             }
         }
 
+        #endregion
     }
 }

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

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

+ 3 - 26
src/YSAI.DAQ/YSAI.Core/enum/Enums.cs

@@ -170,7 +170,7 @@ namespace YSAI.Core.@enum
     /// <summary>
     /// 数据采集类型
     /// </summary>
-    public enum DaqType
+    public enum LibType
     {
         /// <summary>
         /// 数据库采集
@@ -201,15 +201,7 @@ namespace YSAI.Core.@enum
         /// S7采集
         /// </summary>
         [Description("S7采集")]
-        S7
-    }
-
-
-    /// <summary>
-    /// 转发类型
-    /// </summary>
-    public enum RelayType
-    {
+        S7,
         /// <summary>
         /// Kafka转发
         /// </summary>
@@ -228,22 +220,7 @@ namespace YSAI.Core.@enum
     }
 
 
-    /// <summary>
-    /// 库类型
-    /// </summary>
-    public enum LibType
-    {
-        /// <summary>
-        /// 采集库
-        /// </summary>
-        [Description("采集库")]
-        Daq,
-        /// <summary>
-        /// 转发库
-        /// </summary>
-        [Description("转发库")]
-        Relay
-    }
+   
 
     /// <summary>
     /// 状态类型

+ 99 - 109
src/YSAI.DAQ/YSAI.Core/interface/only/IManage.cs

@@ -1,6 +1,7 @@
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using System;
+using System.Collections.Concurrent;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
@@ -13,176 +14,165 @@ namespace YSAI.Core.@interface.only
     /// <summary>
     /// 统一管理接口
     /// </summary>
-    public interface IManage:IManageBase
+    public interface IManage: IDisposable
     {
-
         /// <summary>
-        /// 设置配置
+        /// 设置库文件
         /// </summary>
-        /// <param name="ConfigFile">配置文件</param>
-        /// <param name="LType">库类型</param>
+        /// <param name="FormFiles">文件集合</param>
         /// <returns>统一出参</returns>
-        OperateResult Setting(IFormFile? ConfigFile, LibType LType);
+        OperateResult SettingLib(List<IFormFile> FormFiles);
+
         /// <summary>
-        /// 设置配置
+        /// 删除库文件
         /// </summary>
-        /// <param name="ConfigFile">配置文件</param>
-        /// <param name="LType">库类型</param>
+        /// <param name="LibNames">库文件名集合</param>
         /// <returns>统一出参</returns>
-        Task<OperateResult> SettingAsync(IFormFile? ConfigFile, LibType LType);
+        OperateResult DeleteLib(List<string> LibNames);
 
         /// <summary>
-        /// 修改配置
+        /// 设置库配置文件
         /// </summary>
-        /// <param name="ConfigFile">配置文件</param>
-        /// <param name="LType">库类型</param>
+        /// <param name="FormFiles">文件集合</param>
         /// <returns>统一出参</returns>
-        OperateResult Update(IFormFile? ConfigFile, LibType LType);
+        OperateResult SettingLibConfig(List<IFormFile> FormFiles);
 
         /// <summary>
-        /// 修改配置
+        /// 修改配置文件
         /// </summary>
-        /// <param name="ConfigFile">配置文件</param>
-        /// <param name="LType">库类型</param>
+        /// <param name="FormFiles">文件集合</param>
         /// <returns>统一出参</returns>
-        Task<OperateResult> UpdateAsync(IFormFile? ConfigFile, LibType LType);
-    }
+        OperateResult UpdateLibConfig(List<IFormFile> FormFiles);
 
-    /// <summary>
-    /// 统一管理接口
-    /// </summary>
-    public interface IManageBase:IDisposable
-    {
         /// <summary>
-        /// 初始化
+        /// 程序集唯一标识符集合
         /// </summary>
         /// <returns>统一出参</returns>
-        OperateResult Init();
+        List<string>? TypeSns();
 
         /// <summary>
-        /// 初始化
+        /// 实例唯一标识符集合
         /// </summary>
         /// <returns>统一出参</returns>
-        Task<OperateResult> InitAsync();
+        List<string>? InstanceSns();
 
         /// <summary>
-        /// 打开采集
+        /// 释放指定实例
         /// </summary>
-        /// <param name="DType">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <returns>统一返回结果</returns>
-        OperateResult On(DaqType? DType, string SN);
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        OperateResult DisposeISn(string ISn);
 
         /// <summary>
-        /// 打开采集
+        /// 移除指定实例
         /// </summary>
-        /// <param name="DType">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <returns>统一返回结果</returns>
-        Task<OperateResult> OnAsync(DaqType? DType, string SN);
-
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        OperateResult RemoveISn(string ISn);
         /// <summary>
-        /// 关闭采集
+        /// 打开
         /// </summary>
-        /// <param name="DType">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <returns>统一返回结果</returns>
-        OperateResult Off(DaqType? DType, string SN);
-
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        OperateResult On(string ISn);
         /// <summary>
-        /// 关闭采集
+        /// 关闭
         /// </summary>
-        /// <param name="DType">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <returns>统一返回结果</returns>
-        Task<OperateResult> OffAsync(DaqType? DType, string SN);
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        OperateResult Off(string ISn);
+
+    }
+    /// <summary>
+    /// 数采管理
+    /// </summary>
+    public interface IDaqManage:IManage
+    {
 
         /// <summary>
         /// 读取
         /// </summary>
-        /// <param name="DType">库名称</param>
-        /// <param name="SN">库实例SN</param> 
-        /// <param name="AddressName">地址</param>
-        /// <returns>统一返回结果</returns>
-        OperateResult Read(DaqType? DType, string SN, string AddressName);
-
+        /// <param name="FormFile">地址文件</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        OperateResult Read(IFormFile FormFile, string ISn);
         /// <summary>
         /// 读取
         /// </summary>
-        /// <param name="DType">库名称</param>
-        /// <param name="SN">库实例SN</param> 
-        /// <param name="AddressName">地址</param>
-        /// <returns>统一返回结果</returns>
-        Task<OperateResult> ReadAsync(DaqType? DType, string SN, string AddressName);
+        /// <param name="address">地址</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        OperateResult Read(Address address, string ISn);
+        /// <summary>
+        /// 单点读取
+        /// </summary>
+        /// <param name="AddressName">地址名称</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        OperateResult Read(string AddressName, string ISn);
 
         /// <summary>
         /// 写入
         /// </summary>
-        /// <param name="DType">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <param name="AddressName">地址</param>
-        /// <param name="Value">值</param>
-        /// <param name="DaType">数据类型</param>
-        /// <returns>统一返回结果</returns>
-        OperateResult Write(DaqType? DType, string SN, string AddressName, string Value, DataType DaType);
+        /// <typeparam name="V">数据类型</typeparam>
+        /// <param name="Values">键值</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        OperateResult Write<V>(ConcurrentDictionary<string, V> Values, string ISn);
 
         /// <summary>
-        /// 写入
+        /// 单点写入
         /// </summary>
-        /// <param name="DType">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <param name="AddressName">地址</param>
+        /// <param name="AddressName">地址名称</param>
         /// <param name="Value">值</param>
         /// <param name="DaType">数据类型</param>
-        /// <returns>统一返回结果</returns>
-        Task<OperateResult> WriteAsync(DaqType? DType, string SN, string AddressName, string Value, DataType DaType);
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        OperateResult Write(string AddressName, string Value, DataType DaType,string ISn);
 
         /// <summary>
-        /// 获取初始化成功集合
+        /// 订阅
         /// </summary>
-        /// <param name="LType">库类型</param>
-        /// <returns>统一返回结果</returns>
-        OperateResult InitSucceedArray();
-
+        /// <param name="FormFile">地址文件</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        OperateResult Subscribe(IFormFile FormFile, string ISn);
         /// <summary>
-        /// 获取初始化成功集合
+        /// 订阅
         /// </summary>
-        /// <param name="LType">库类型</param>
-        /// <returns>统一返回结果</returns>
-        Task<OperateResult> InitSucceedArrayAsync();
-    }
+        /// <param name="address">地址</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        OperateResult Subscribe(Address address, string ISn);
 
-    /// <summary>
-    /// 统一管理信息接口
-    /// </summary>
-    public interface IManageInfo
-    {
         /// <summary>
-        /// 获取数采库文件集合
+        /// 取消订阅
         /// </summary>
-        /// <param name="LType">库类型</param>
-        /// <returns>rData:库文件名集合</returns>
-        OperateResult Array(LibType LType);
-        /// <summary>
-        /// 获取数采库文件集合
-        /// </summary>
-        /// <param name="LType">库类型</param>
-        /// <returns>rData:库文件名集合</returns>
-        Task<OperateResult> ArrayAsync(LibType LType);
+        /// <param name="FormFile">地址文件</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns></returns>
+        OperateResult UnSubscribe(IFormFile FormFile, string ISn);
 
         /// <summary>
-        /// 获取数采库文件实例参数
+        /// 取消订阅
         /// </summary>
-        /// <param name="LType">库类型</param>
-        /// <param name="Name">库文件名</param>
-        /// <returns>rData:库文件所需实例参数集合</returns>
-        OperateResult Param(LibType LType, string Name);
+        /// <param name="FormFile">地址</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns></returns>
+        OperateResult UnSubscribe(Address address, string ISn);
+
+    }
+    /// <summary>
+    /// 转发管理
+    /// </summary>
+    public interface IRelayManage : IManage
+    {
         /// <summary>
-        /// 获取数采库文件实例参数
+        /// 生产
         /// </summary>
-        /// <param name="Name">库文件名</param>
-        /// <param name="LType">库类型</param>
-        /// <returns>rData:库文件所需实例参数集合</returns>
-        Task<OperateResult> ParamAsync(LibType LType, string Name);
+        /// <param name="Topic">主题</param>
+        /// <param name="Content">内容</param>
+        /// <returns>统一出参</returns>
+        OperateResult Produce(string Topic, string Content);
     }
 }

+ 1 - 7
src/YSAI.DAQ/YSAI.DAQ.sln

@@ -31,8 +31,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YSAI.RabbitMQ", "YSAI.Rabbi
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YSAI.Manage", "YSAI.Manage\YSAI.Manage.csproj", "{6E9667C0-303C-472D-949B-60F812E6C659}"
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YSAI.Manage.Core", "YSAI.Manage.Core\YSAI.Manage.Core.csproj", "{57F9FF57-ADD3-40B0-AE20-C2F88A2784A0}"
-EndProject
 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "wpf", "wpf", "{6F526F44-A5B0-49D5-8E04-DBFDB5F8E6C6}"
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "YSAI.Can", "YSAI.Can\YSAI.Can.csproj", "{8B8BF505-7A00-4868-939F-EB5056083E49}"
@@ -133,10 +131,6 @@ Global
 		{6E9667C0-303C-472D-949B-60F812E6C659}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{6E9667C0-303C-472D-949B-60F812E6C659}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{6E9667C0-303C-472D-949B-60F812E6C659}.Release|Any CPU.Build.0 = Release|Any CPU
-		{57F9FF57-ADD3-40B0-AE20-C2F88A2784A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{57F9FF57-ADD3-40B0-AE20-C2F88A2784A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{57F9FF57-ADD3-40B0-AE20-C2F88A2784A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{57F9FF57-ADD3-40B0-AE20-C2F88A2784A0}.Release|Any CPU.Build.0 = Release|Any CPU
 		{8B8BF505-7A00-4868-939F-EB5056083E49}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
 		{8B8BF505-7A00-4868-939F-EB5056083E49}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{8B8BF505-7A00-4868-939F-EB5056083E49}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -212,7 +206,6 @@ Global
 		{26BEA521-56B3-4BE8-9F5C-62BCA2323ABD} = {12CB0510-7B1E-4518-AA3B-412A4D323D42}
 		{8CE7E64C-7A6A-4581-A9B3-C05214986B4F} = {9D8EDBBA-7A97-4D84-9B12-7FCC2F834046}
 		{6E9667C0-303C-472D-949B-60F812E6C659} = {ECAD410C-2895-4836-BCA7-D4EF340E778E}
-		{57F9FF57-ADD3-40B0-AE20-C2F88A2784A0} = {ECAD410C-2895-4836-BCA7-D4EF340E778E}
 		{6F526F44-A5B0-49D5-8E04-DBFDB5F8E6C6} = {1856E9E1-33C4-45C1-832C-854F9BE1ACC4}
 		{8B8BF505-7A00-4868-939F-EB5056083E49} = {0A264424-1AD7-49FA-B813-D96498066479}
 		{CCF267B2-ABB4-4B42-8351-103D59FA4B3B} = {6F526F44-A5B0-49D5-8E04-DBFDB5F8E6C6}
@@ -229,6 +222,7 @@ Global
 		{41AB3A5A-5372-4A75-898C-9A4F9454F8A5} = {ECAD410C-2895-4836-BCA7-D4EF340E778E}
 		{DD9020DC-A51F-48F2-83FA-A3F10A43220F} = {ECAD410C-2895-4836-BCA7-D4EF340E778E}
 		{623C8558-8901-4D69-B1AC-1615597E8B88} = {12CB0510-7B1E-4518-AA3B-412A4D323D42}
+		{1856E9E1-33C4-45C1-832C-854F9BE1ACC4} = {ECAD410C-2895-4836-BCA7-D4EF340E778E}
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {5D5D3927-6714-40C0-84EA-44C5BA4C5E87}

+ 306 - 245
src/YSAI.DAQ/YSAI.DaqManage/DaqManageOperate.cs

@@ -1,18 +1,10 @@
-using Newtonsoft.Json.Linq;
-using System;
+using Microsoft.AspNetCore.Http;
+using Newtonsoft.Json.Linq;
 using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Diagnostics;
-using System.IO;
-using System.Linq;
-using System.Net;
 using System.Reflection;
-using System.Reflection.Metadata;
-using System.Text;
-using System.Text.RegularExpressions;
-using System.Threading.Tasks;
 using YSAI.Core.data;
 using YSAI.Core.@enum;
+using YSAI.Core.@interface.only;
 using YSAI.Core.@interface.unify;
 using YSAI.Unility;
 
@@ -21,9 +13,9 @@ namespace YSAI.DaqManage
     /// <summary>
     /// 采集管理操作,
     /// 库:*.dll,
-    /// 库配置:命名空间 + 类名.SN.Config.json
+    /// 库配置:命名空间 + 类名.ISn.Config.json
     /// </summary>
-    public class DaqManageOperate : IBaseAbstract
+    public class DaqManageOperate : IBaseAbstract, IDaqManage
     {
         protected override string LogHead => "[ DaqManageOperate 操作 ]";
         protected override string ClassName => "DaqManageOperate";
@@ -73,7 +65,7 @@ namespace YSAI.DaqManage
         {
             try
             {
-                if (File.Exists(ConfigFile))  //配置存在
+                if (System.IO.File.Exists(ConfigFile))  //配置存在
                 {
                     return JsonTool.StringToJsonEntity<DaqManageData.Basics>(FileTool.FileToString(ConfigFile));
                 }
@@ -100,7 +92,7 @@ namespace YSAI.DaqManage
                 //实体转JSON字符串
                 string json = JsonTool.JsonEntityToString(basics);
                 //写入文件
-                File.WriteAllText(ConfigFile, JsonTool.JsonFormatting(json));
+                System.IO.File.WriteAllText(ConfigFile, JsonTool.JsonFormatting(json));
                 return true;
             }
             catch (Exception ex)
@@ -209,13 +201,13 @@ namespace YSAI.DaqManage
         /// <param name="Type">【0:库文件】【1:配置文件】</param>
         private void Watcher_Deleted(object sender, FileSystemEventArgs e, int Type)
         {
-            //程序集SN
+            //程序集ISn
             string TypeIocSN = string.Empty;
             switch (Type)
             {
                 case 0:
                     OnEventHandler?.Invoke(this, new EventResult(true, $"{e.Name} 文件被删除,移除此库程序集,并移除所有实例"));
-                    //程序集SN
+                    //程序集ISn
                     TypeIocSN = e.Name.Replace(".dll", string.Empty);
 
                     foreach (var item in InstanceIoc)
@@ -251,9 +243,9 @@ namespace YSAI.DaqManage
                     break;
                 case 1:
                     OnEventHandler?.Invoke(this, new EventResult(true, $"{e.Name} 文件被删除,移除对应配置实例"));
-                    //实例的SN
+                    //实例的ISn
                     string InstanceIocSN = e.Name.Replace(basics.ConfigReplaceFormat, string.Empty);
-                    //程序集SN
+                    //程序集ISn
                     TypeIocSN = InstanceIocSN.Replace($".{InstanceIocSN.Split('.')[InstanceIocSN.Split('.').Length - 1]}", string.Empty);
                     if (InstanceIoc.ContainsKey(InstanceIocSN))
                     {
@@ -301,7 +293,7 @@ namespace YSAI.DaqManage
                         {
                             string path = String.Format(e.FullPath);
                             string? filename = Path.GetFileName(path);
-                            using (Stream fs = File.OpenRead(@path))
+                            using (Stream fs = System.IO.File.OpenRead(@path))
                             {
                                 StreamReader srdPreview = new StreamReader(fs);
                                 String temp = string.Empty;
@@ -313,11 +305,11 @@ namespace YSAI.DaqManage
                                 srdPreview.Close();
                                 srdPreview.Dispose();
 
-                                //实例的SN
+                                //实例的ISn
                                 string InstanceIocSN = e.Name.Replace(basics.ConfigReplaceFormat, string.Empty);
-                                //程序集SN
+                                //程序集ISn
                                 string TypeIocSN = InstanceIocSN.Replace($".{InstanceIocSN.Split('.')[InstanceIocSN.Split('.').Length - 1]}", string.Empty);
-                                //判断是否存在此程序集SN
+                                //判断是否存在此程序集ISn
                                 if (TypeIoc.ContainsKey(TypeIocSN))
                                 {
                                     if (!InstanceIoc.ContainsKey(InstanceIocSN))
@@ -481,7 +473,6 @@ namespace YSAI.DaqManage
         /// </summary>
         /// <param name="sender"></param>
         /// <param name="e"></param>
-        /// <exception cref="NotImplementedException"></exception>
         private void Instance_OnEvent(object? sender, EventResult e)
         {
             //抛出信息
@@ -576,7 +567,30 @@ namespace YSAI.DaqManage
             else
                 return false;
         }
-      
+        /// <summary>
+        /// 写入文件
+        /// </summary>
+        /// <param name="file">文件</param>
+        /// <param name="path">路径</param>
+        private static void WriteFile(IFormFile file, string path)
+        {
+            var stream = file.OpenReadStream();
+
+            // 把 Stream 转换成 byte[] 
+            byte[] bytes = new byte[stream.Length];
+            stream.Read(bytes, 0, bytes.Length);
+
+            // 设置当前流的位置为流的开始 
+            stream.Seek(0, SeekOrigin.Begin);
+
+            // 把 byte[] 写入文件 
+            FileStream fs = new FileStream(path, FileMode.Create);
+
+            BinaryWriter bw = new BinaryWriter(fs);
+            bw.Write(bytes);
+            bw.Close();
+            fs.Close();
+        }
         /// <summary>
         /// 这是释放所有包含自身对象
         /// </summary>
@@ -594,24 +608,19 @@ namespace YSAI.DaqManage
             GC.SuppressFinalize(this);
             ThisObjList = null;
         }
-
-        /// <summary>
-        /// 释放
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        public OperateResult Dispose(string SN)
+        public OperateResult DisposeISn(string ISn)
         {
             Depart("Dispose");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                if (InstanceIoc.ContainsKey(ISn))
                 {
-                    InstanceIoc[SN].Dispose();
-                    return Break("Dispose", true);
+                    OperateResult operateResult = RemoveISn(ISn);
+                    return Break("Dispose", operateResult.State, operateResult.Message);
                 }
                 else
                 {
-                    return Break("Dispose", false, $"未找到 {SN} 的实例");
+                    return Break("Dispose", false, $"未找到 {ISn} 的实例");
                 }
             }
             catch (Exception ex)
@@ -619,21 +628,15 @@ namespace YSAI.DaqManage
                 return Break("Dispose", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 释放
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> DisposeAsync(string SN)
+        public List<string>? TypeSns()
         {
-            return Task.Run(() => Dispose(SN));
+            if (TypeIoc != null)
+            {
+                return TypeIoc.Keys.ToList();
+            }
+            return null;
         }
-
-        /// <summary>
-        /// 实例列表
-        /// </summary>
-        /// <returns>实例数组</returns>
-        public List<string>? InstanceList()
+        public List<string>? InstanceSns()
         {
             if (InstanceIoc != null)
             {
@@ -641,30 +644,31 @@ namespace YSAI.DaqManage
             }
             return null;
         }
-        /// <summary>
-        /// 移除实例
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult Remove(string SN)
+        public OperateResult RemoveISn(string ISn)
         {
             Depart("Remove");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                if (InstanceIoc.ContainsKey(ISn))
                 {
-                    if (InstanceIoc.Remove(SN, out _))
+                    IDaq? daq;
+                    if (InstanceIoc.Remove(ISn, out daq))
                     {
+                        if (daq != null)
+                        {
+                            //直接释放
+                            daq.Dispose();
+                        }
                         return Break("Remove", true);
                     }
                     else
                     {
-                        return Break("Remove", false, $"{SN} 的实例移除失败");
+                        return Break("Remove", false, $"{ISn} 的实例移除失败");
                     }
                 }
                 else
                 {
-                    return Break("Remove", false, $"未找到 {SN} 的实例");
+                    return Break("Remove", false, $"未找到 {ISn} 的实例");
                 }
             }
             catch (Exception ex)
@@ -672,43 +676,32 @@ namespace YSAI.DaqManage
                 return Break("Remove", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 移除实例
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> RemoveAsync(string SN)
-        {
-            return Task.Run(() => Remove(SN));
-        }
-        /// <summary>
-        /// 读取
-        /// </summary>
-        /// <param name="address">地址</param>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> ReadAsync(Address address,string SN)
-        {
-            return Task.Run(() => Read(address, SN));
-        }
-        /// <summary>
-        /// 读取
-        /// </summary>
-        /// <param name="address">地址</param>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult Read(Address address, string SN)
+        public OperateResult Read(IFormFile FormFile, string ISn)
         {
             Depart("Read");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                if (FormFile == null || FormFile.Length == 0)
                 {
-                    return InstanceIoc[SN].Read(address);
+                    return Break("Read", false, "请选择地址信息文件");
+                }
+                if (InstanceIoc.ContainsKey(ISn))
+                {
+                    //数据转换
+                    StreamReader reader = new StreamReader(FormFile.OpenReadStream());
+                    //Json内容
+                    string jsonContent = reader.ReadToEnd();
+                    //转换成指定对象
+                    Address? address = JsonTool.StringToJsonEntity<Address>(jsonContent);
+                    if (address != null)
+                    {
+                        return InstanceIoc[ISn].Read(address);
+                    }
+                    return Break("Read", false, $"文件数据内容错误");
                 }
                 else
                 {
-                    return Break("Read", false, $"未找到 {SN} 的实例");
+                    return Break("Read", false, $"未找到 {ISn} 的实例");
                 }
             }
             catch (Exception ex)
@@ -716,36 +709,37 @@ namespace YSAI.DaqManage
                 return Break("Read", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 写入
-        /// </summary>
-        /// <typeparam name="V">值类型</typeparam>
-        /// <param name="Values">数据</param>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> WriteAsync<V>(ConcurrentDictionary<string, V> Values, string SN)
+        public OperateResult Read(Address address, string ISn)
         {
-            return Task.Run(() => Write(Values, SN));
+            Depart("Read");
+            try
+            {
+                if (InstanceIoc.ContainsKey(ISn))
+                {
+                    return InstanceIoc[ISn].Read(address);
+                }
+                else
+                {
+                    return Break("Read", false, $"未找到 {ISn} 的实例");
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("Read", false, ex.Message);
+            }
         }
-        /// <summary>
-        /// 写入
-        /// </summary>
-        /// <typeparam name="V">值类型</typeparam>
-        /// <param name="Values">数据</param>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult Write<V>(ConcurrentDictionary<string, V> Values, string SN)
+        public OperateResult Write<V>(ConcurrentDictionary<string, V> Values, string ISn)
         {
             Depart("Write");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                if (InstanceIoc.ContainsKey(ISn))
                 {
-                    return InstanceIoc[SN].Write(Values);
+                    return InstanceIoc[ISn].Write(Values);
                 }
                 else
                 {
-                    return Break("Write", false, $"未找到 {SN} 的实例");
+                    return Break("Write", false, $"未找到 {ISn} 的实例");
                 }
             }
             catch (Exception ex)
@@ -753,24 +747,32 @@ namespace YSAI.DaqManage
                 return Break("Write", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 订阅
-        /// </summary>
-        /// <param name="address">地址</param>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult Subscribe(Address address, string SN)
+        public OperateResult Subscribe(IFormFile FormFile, string ISn)
         {
             Depart("Subscribe");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                if (FormFile == null || FormFile.Length == 0)
                 {
-                    return InstanceIoc[SN].Subscribe(address);
+                    return Break("Subscribe", false, "请选择地址信息文件");
+                }
+                if (InstanceIoc.ContainsKey(ISn))
+                {
+                    //数据转换
+                    StreamReader reader = new StreamReader(FormFile.OpenReadStream());
+                    //Json内容
+                    string jsonContent = reader.ReadToEnd();
+                    //转换成指定对象
+                    Address? address = JsonTool.StringToJsonEntity<Address>(jsonContent);
+                    if (address != null)
+                    {
+                        return InstanceIoc[ISn].Subscribe(address);
+                    }
+                    return Break("Subscribe", false, $"文件数据内容错误");
                 }
                 else
                 {
-                    return Break("Subscribe", false, $"未找到 {SN} 的实例");
+                    return Break("Subscribe", false, $"未找到 {ISn} 的实例");
                 }
             }
             catch (Exception ex)
@@ -778,34 +780,51 @@ namespace YSAI.DaqManage
                 return Break("Subscribe", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 订阅
-        /// </summary>
-        /// <param name="address">地址</param>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> SubscribeAsync(Address address, string SN)
+        public OperateResult Subscribe(Address address, string ISn)
         {
-            return Task.Run(() => Subscribe(address, SN));
+            Depart("Subscribe");
+            try
+            {
+                if (InstanceIoc.ContainsKey(ISn))
+                {
+                        return InstanceIoc[ISn].Subscribe(address);
+                }
+                else
+                {
+                    return Break("Subscribe", false, $"未找到 {ISn} 的实例");
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("Subscribe", false, ex.Message);
+            }
         }
-        /// <summary>
-        /// 取消订阅
-        /// </summary>
-        /// <param name="address">地址</param>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult UnSubscribe(Address address, string SN)
+        public OperateResult UnSubscribe(IFormFile FormFile, string ISn)
         {
             Depart("UnSubscribe");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                if (FormFile == null || FormFile.Length == 0)
+                {
+                    return Break("UnSubscribe", false, "请选择地址信息文件");
+                }
+                if (InstanceIoc.ContainsKey(ISn))
                 {
-                    return InstanceIoc[SN].UnSubscribe(address);
+                    //数据转换
+                    StreamReader reader = new StreamReader(FormFile.OpenReadStream());
+                    //Json内容
+                    string jsonContent = reader.ReadToEnd();
+                    //转换成指定对象
+                    Address? address = JsonTool.StringToJsonEntity<Address>(jsonContent);
+                    if (address != null)
+                    {
+                        return InstanceIoc[ISn].UnSubscribe(address);
+                    }
+                    return Break("UnSubscribe", false, $"文件数据内容错误");
                 }
                 else
                 {
-                    return Break("UnSubscribe", false, $"未找到 {SN} 的实例");
+                    return Break("UnSubscribe", false, $"未找到 {ISn} 的实例");
                 }
             }
             catch (Exception ex)
@@ -813,43 +832,37 @@ namespace YSAI.DaqManage
                 return Break("UnSubscribe", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 取消订阅
-        /// </summary>
-        /// <param name="address">地址</param>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> UnSubscribeAsync(Address address, string SN)
-        {
-            return Task.Run(() => UnSubscribe(address, SN));
-        }
-        
-        /// <summary>
-        /// 打开
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> OnAsync(string SN)
+        public OperateResult UnSubscribe(Address address, string ISn)
         {
-            return Task.Run(() => On(SN));
+            Depart("UnSubscribe");
+            try
+            {
+                if (InstanceIoc.ContainsKey(ISn))
+                {
+                     return InstanceIoc[ISn].UnSubscribe(address);
+                }
+                else
+                {
+                    return Break("UnSubscribe", false, $"未找到 {ISn} 的实例");
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("UnSubscribe", false, ex.Message);
+            }
         }
-        /// <summary>
-        /// 打开
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult On(string SN)
+        public OperateResult On(string ISn)
         {
             Depart("On");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                if (InstanceIoc.ContainsKey(ISn))
                 {
-                    return InstanceIoc[SN].On();
+                    return InstanceIoc[ISn].On();
                 }
                 else
                 {
-                    return Break("On", false, $"未找到 {SN} 的实例");
+                    return Break("On", false, $"未找到 {ISn} 的实例");
                 }
             }
             catch (Exception ex)
@@ -857,135 +870,183 @@ namespace YSAI.DaqManage
                 return Break("On", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 打开所有
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> OnAllAsync()
+        public OperateResult Off(string ISn)
+        {
+            Depart("Off");
+            try
+            {
+                if (InstanceIoc.ContainsKey(ISn))
+                {
+                    return InstanceIoc[ISn].Off();
+                }
+                else
+                {
+                    return Break("Off", false, $"未找到 {ISn} 的实例");
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("Off", false, ex.Message);
+            }
+        }
+        public OperateResult Read(string AddressName, string ISn)
         {
-            return Task.Run(() => OnAll());
+            Address address = new Address() { AddressArray = new List<AddressDetails> { new AddressDetails { AddressName = AddressName } } };
+            return InstanceIoc[ISn].Read(address);
         }
-        /// <summary>
-        /// 打开所有
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult OnAll()
+        public OperateResult Write(string AddressName, string Value, DataType DaType, string ISn)
         {
-            Depart("OnAll");
+            ConcurrentDictionary<string, object> pairs = new ConcurrentDictionary<string, object>();
             try
             {
-                if (InstanceIoc != null && InstanceIoc.Count > 0)
+                switch (DaType)
                 {
-                    List<string> FailMessage = new List<string>();
-                    foreach (var item in InstanceIoc)
-                    {
-                        OperateResult operateResult = item.Value.On();
-                        if (!operateResult.State)
-                        {
-                            FailMessage.Add(operateResult.Message);
-                        }
-                    }
-                    if (FailMessage.Count > 0)
+                    case DataType.String:
+                        pairs.TryAdd(AddressName, Value);
+                        break;
+                    case DataType.Bool:
+                        pairs.TryAdd(AddressName, bool.Parse(Value));
+                        break;
+                    case DataType.Float:
+                        pairs.TryAdd(AddressName, float.Parse(Value));
+                        break;
+                    case DataType.Int:
+                        pairs.TryAdd(AddressName, int.Parse(Value));
+                        break;
+                    default:
+                        return Break("Write", false, $"目前只支持{DataType.String}、{DataType.Bool}、{DataType.Float}、{DataType.Int}");
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("Write", false, $"数据类型转换异常:{ex.Message}");
+            }
+            return Write(pairs, ISn);
+        }
+        public OperateResult SettingLib(List<IFormFile> FormFiles)
+        {
+            Depart("SettingLib");
+            try
+            {
+                List<string> FailMessage=new List<string>();
+                FormFiles.ForEach(file =>
+                {
+                    var LibName = file.FileName;
+
+                    string path = Path.Combine(basics.LibFolder, LibName);
+
+                    if (!System.IO.File.Exists(path))
                     {
-                        return Break("OnAll", false, $"存在{FailMessage.Count}个异常信息,请查看RData", FailMessage, ResultType.All);
+                        WriteFile(file, path);
                     }
                     else
                     {
-                        return Break("OnAll", true);
+                        FailMessage.Add($"{LibName} 已存在");
                     }
-                }
-                else
+                });
+                if (FailMessage.Count > 0)
                 {
-                    return Break("OnAll", false, "实例为空");
+                    return Break("SettingLib", false, $"存在{FailMessage.Count}个失败信息",FailMessage,ResultType.Json);
                 }
+                return Break("SettingLib", true);
             }
             catch (Exception ex)
             {
-                return Break("OnAll", false, ex.Message);
+                return Break("SettingLib", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 关闭
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> OffAsync(string SN)
-        {
-            return Task.Run(() => Off(SN));
-        }
-        /// <summary>
-        /// 关闭
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult Off(string SN)
+        public OperateResult DeleteLib(List<string> LibNames)
         {
-            Depart("Off");
+            Depart("DeleteLib");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                List<string> FailMessage = new List<string>();
+                foreach (string LibName in LibNames) 
                 {
-                    return InstanceIoc[SN].Off();
+                    string path = Path.Combine(basics.LibFolder, LibName);
+
+                    if (System.IO.File.Exists(path))
+                    {
+                        System.IO.File.Delete(path);
+                    }
+                    else
+                    {
+                        FailMessage.Add($"{LibName} 不存在");
+                    }
                 }
-                else
+                if (FailMessage.Count > 0)
                 {
-                    return Break("Off", false, $"未找到 {SN} 的实例");
+                    return Break("DeleteLib", false, $"存在{FailMessage.Count}个失败信息", FailMessage, ResultType.Json);
                 }
+                return Break("DeleteLib", true);
             }
             catch (Exception ex)
             {
-                return Break("Off", false, ex.Message);
+                return Break("DeleteLib", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 关闭所有
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> OffAllAsync()
-        {
-            return Task.Run(() => OffAll());
-        }
-        /// <summary>
-        /// 关闭所有
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult OffAll()
+        public OperateResult SettingLibConfig(List<IFormFile> FormFiles)
         {
-            Depart("OffAll");
+            Depart("SettingLibConfig");
             try
             {
-                if (InstanceIoc != null && InstanceIoc.Count > 0)
+                List<string> FailMessage = new List<string>();
+                FormFiles.ForEach(file =>
                 {
-                    List<string> FailMessage = new List<string>();
-                    foreach (var item in InstanceIoc)
+                    var configName = file.FileName;
+
+                    string path = Path.Combine(basics.LibConfigFolder, configName);
+
+                    if (!System.IO.File.Exists(path))
                     {
-                        OperateResult operateResult = item.Value.Off();
-                        if (!operateResult.State)
-                        {
-                            FailMessage.Add(operateResult.Message);
-                        }
+                        WriteFile(file, path);
                     }
-                    if (FailMessage.Count > 0)
+                    else
                     {
-                        return Break("OffAll", false, $"存在{FailMessage.Count}个异常信息,请查看RData", FailMessage, ResultType.All);
+                        FailMessage.Add($"{configName} 已存在,请执行修改库配置文件");
+                    }
+                });
+                if (FailMessage.Count > 0)
+                {
+                    return Break("SettingLibConfig", false, $"存在{FailMessage.Count}个失败信息", FailMessage, ResultType.Json);
+                }
+                return Break("SettingLibConfig", true);
+            }
+            catch (Exception ex)
+            {
+                return Break("SettingLibConfig", false, ex.Message);
+            }
+        }
+        public OperateResult UpdateLibConfig(List<IFormFile> FormFiles)
+        {
+            Depart("UpdateLibConfig");
+            try
+            {
+                List<string> FailMessage = new List<string>();
+                FormFiles.ForEach(file =>
+                {
+
+                    string path = Path.Combine(basics.LibConfigFolder, file.FileName);
+
+                    if (!System.IO.File.Exists(path))
+                    {
+                        WriteFile(file, path);
                     }
                     else
                     {
-                        return Break("OffAll", true);
+                        System.IO.File.Delete(path);
+                        WriteFile(file, path);
                     }
-                }
-                else
+                });
+                if (FailMessage.Count > 0)
                 {
-                    return Break("OffAll", false, "实例为空");
+                    return Break("UpdateLibConfig", false, $"存在{FailMessage.Count}个失败信息", FailMessage, ResultType.Json);
                 }
+                return Break("UpdateLibConfig", true);
             }
             catch (Exception ex)
             {
-                return Break("OffAll", false, ex.Message);
+                return Break("UpdateLibConfig", false, ex.Message);
             }
         }
     }

+ 119 - 0
src/YSAI.DAQ/YSAI.Manage.Core/DaqManage.cs

@@ -0,0 +1,119 @@
+using Microsoft.AspNetCore.Http;
+using System;
+using System.Collections.Concurrent;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using YSAI.Core.data;
+using YSAI.Core.@enum;
+using YSAI.Core.@interface.only;
+using YSAI.Core.@interface.unify;
+using YSAI.DaqManage;
+
+namespace YSAI.Manage.Core
+{
+    /// <summary>
+    /// 采集管理
+    /// </summary>
+    public class DaqManage :IBaseAbstract, IDaqManage
+    {
+        protected override string LogHead => "[ DaqManage 操作 ]";
+        protected override string ClassName => "DaqManage";
+        /// <summary>
+        /// 采集库管理操作
+        /// </summary>
+        private DaqManageOperate daqManageOperate = DaqManageOperate.Instance();
+
+
+        public OperateResult DeleteLib(string LibName)
+        {
+            throw new NotImplementedException();
+        }
+
+        public void Dispose()
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult DisposeISn(string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult InstanceSns()
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Off(string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult On(string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Param(DaqType DaqType)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Read(Address address, string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Read(string AddressName, string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Remove(string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult SettingLib(IFormFile LFile)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult SettingLibConfig(string ISn, object Config)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Subscribe(Address address, string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult TypeSns()
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult UnSubscribe(Address address, string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult UpdateLibConfig(string ISn, object Config)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Write<V>(ConcurrentDictionary<string, V> Values, string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Write(string AddressName, string Value, DataType DaType, string ISn)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

+ 78 - 78
src/YSAI.DAQ/YSAI.Manage.Core/ManageInfoOperate.cs

@@ -23,88 +23,88 @@ namespace YSAI.Manage.Core
     /// <summary>
     /// 信息管理
     /// </summary>
-    public class ManageInfoOperate : IBaseAbstract, IManageInfo
+    public class ManageInfoOperate 
     {
-        protected override string LogHead => "[ ManageInfoOperate 操作 ]";
-        protected override string ClassName => "ManageInfoOperate";
+        //protected override string LogHead => "[ ManageInfoOperate 操作 ]";
+        //protected override string ClassName => "ManageInfoOperate";
 
-        public OperateResult Array(LibType LType)
-        {
-            Depart("Array");
-            try
-            {
-                switch (LType)
-                {
-                    case LibType.Daq:
-                        return Break("Array", true, RData: EnumTool.EnumToList<DaqType>(), RType: ResultType.Json);
-                    case LibType.Relay:
-                        return Break("Array", true, RData: EnumTool.EnumToList<RelayType>(), RType: ResultType.Json);
-                    default:
-                        return Break("Array", false, "错误");
-                }
-            }
-            catch (Exception ex)
-            {
-                return Break("Array", false, ex.Message);
-            }
-        }
+        //public OperateResult Array(LibType LType)
+        //{
+        //    Depart("Array");
+        //    try
+        //    {
+        //        switch (LType)
+        //        {
+        //            case LibType.Daq:
+        //                return Break("Array", true, RData: EnumTool.EnumToList<DaqType>(), RType: ResultType.Json);
+        //            case LibType.Relay:
+        //                return Break("Array", true, RData: EnumTool.EnumToList<RelayType>(), RType: ResultType.Json);
+        //            default:
+        //                return Break("Array", false, "错误");
+        //        }
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        return Break("Array", false, ex.Message);
+        //    }
+        //}
 
-        public Task<OperateResult> ArrayAsync(LibType LType)
-        {
-            return Task.Run(() => Array(LType));
-        }
+        //public Task<OperateResult> ArrayAsync(LibType LType)
+        //{
+        //    return Task.Run(() => Array(LType));
+        //}
 
-        public OperateResult Param(LibType LType, string Name)
-        {
-            Depart("Param");
-            try
-            {
-                switch (LType)
-                {
-                    case LibType.Daq:
-                        DaqType daqType = (DaqType)Enum.Parse(typeof(DaqType), Name);
-                        switch (daqType)
-                        {
-                            case DaqType.DB:
-                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<DBData.Basics>(), RType: ResultType.Json);
-                            case DaqType.Modbus:
-                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<ModbusClientData.Basics>(), RType: ResultType.Json);
-                            case DaqType.OpcUa:
-                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcUaClientData.Basics>(), RType: ResultType.Json);
-                            case DaqType.OpcDa:
-                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcDaClientData.Basics>(), RType: ResultType.Json);
-                            case DaqType.OpcDaHttp:
-                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcDaHttpData.Basics>(), RType: ResultType.Json);
-                            case DaqType.S7:
-                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<S7ClientData.Basics>(), RType: ResultType.Json);
-                            default:
-                                return Break("Param", false, "输入有误");
-                        }
-                    case LibType.Relay:
-                        RelayType relayType = (RelayType)Enum.Parse(typeof(RelayType), Name);
-                        switch (relayType)
-                        {
-                            case RelayType.Kafka:
-                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<KafkaProducerData.Basics>(), RType: ResultType.Json);
-                            case RelayType.Mqtt:
-                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<MqttClientData.Basics>(), RType: ResultType.Json);
-                            case RelayType.RabbitMQ:
-                                return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<RabbitMQData.Basics>(), RType: ResultType.Json);
-                            default:
-                                return Break("Param", false, "输入有误");
-                        }
-                }
-            }
-            catch (Exception ex)
-            {
-                return Break("Param", false, ex.Message);
-            }
-            return Break("Param", false, "获取失败,位置原因");
-        }
+        //public OperateResult Param(LibType LType, string Name)
+        //{
+        //    Depart("Param");
+        //    try
+        //    {
+        //        switch (LType)
+        //        {
+        //            case LibType.Daq:
+        //                DaqType daqType = (DaqType)Enum.Parse(typeof(DaqType), Name);
+        //                switch (daqType)
+        //                {
+        //                    case DaqType.DB:
+        //                        return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<DBData.Basics>(), RType: ResultType.Json);
+        //                    case DaqType.Modbus:
+        //                        return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<ModbusClientData.Basics>(), RType: ResultType.Json);
+        //                    case DaqType.OpcUa:
+        //                        return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcUaClientData.Basics>(), RType: ResultType.Json);
+        //                    case DaqType.OpcDa:
+        //                        return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcDaClientData.Basics>(), RType: ResultType.Json);
+        //                    case DaqType.OpcDaHttp:
+        //                        return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<OpcDaHttpData.Basics>(), RType: ResultType.Json);
+        //                    case DaqType.S7:
+        //                        return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<S7ClientData.Basics>(), RType: ResultType.Json);
+        //                    default:
+        //                        return Break("Param", false, "输入有误");
+        //                }
+        //            case LibType.Relay:
+        //                RelayType relayType = (RelayType)Enum.Parse(typeof(RelayType), Name);
+        //                switch (relayType)
+        //                {
+        //                    case RelayType.Kafka:
+        //                        return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<KafkaProducerData.Basics>(), RType: ResultType.Json);
+        //                    case RelayType.Mqtt:
+        //                        return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<MqttClientData.Basics>(), RType: ResultType.Json);
+        //                    case RelayType.RabbitMQ:
+        //                        return Break("Param", true, RData: ReflexTool.GetClassAllPropertyData<RabbitMQData.Basics>(), RType: ResultType.Json);
+        //                    default:
+        //                        return Break("Param", false, "输入有误");
+        //                }
+        //        }
+        //    }
+        //    catch (Exception ex)
+        //    {
+        //        return Break("Param", false, ex.Message);
+        //    }
+        //    return Break("Param", false, "获取失败,位置原因");
+        //}
 
-        public Task<OperateResult> ParamAsync(LibType LType, string Name)
-        {
-            return Task.Run(() => Param(LType,Name));
-        }
+        //public Task<OperateResult> ParamAsync(LibType LType, string Name)
+        //{
+        //    return Task.Run(() => Param(LType,Name));
+        //}
     }
 }

+ 154 - 186
src/YSAI.DAQ/YSAI.Manage.Core/ManageOperate.cs

@@ -15,7 +15,7 @@ namespace YSAI.Manage.Core
     /// <summary>
     /// 统一管理
     /// </summary>
-    public class ManageOperate : IBaseAbstract, IManage
+    public class ManageOperate : IBaseAbstract
     {
         protected override string LogHead => "[ ManageOperate 操作 ]";
         protected override string ClassName => "ManageOperate";
@@ -36,164 +36,144 @@ namespace YSAI.Manage.Core
         /// </summary>
         private ManageBaseOperate? baseOperate = null;
 
-        public OperateResult Setting(IFormFile? ConfigFile, LibType LType)
-        {
-            //开始记录运行时间
-            Depart("Setting");
-            try
-            {
-                if (ConfigFile == null || ConfigFile.Length == 0)
-                {
-                    return Break("Setting", false, "请选择要上传的文件");
-                }
-                switch (LType)
-                {
-                    case LibType.Daq:
-                        if (!System.IO.File.Exists(DaqConfigPath))
-                        {
-                            OperateResult operateResult = Update(ConfigFile, LType);
-                            if (operateResult.State)
-                            {
-                                return Break("Setting", operateResult.State);
-                            }
-                            return Break("Setting", operateResult.State, operateResult.Message.Split(')')[1]);
-                        }
-                        else
-                        {
-                            return Break("Setting", false, "配置文件已存在,请执行修改配置接口");
-                        }
-                    case LibType.Relay:
-                        if (!System.IO.File.Exists(RelayConfigPath))
-                        {
-                            OperateResult operateResult = Update(ConfigFile, LType);
-                            if (operateResult.State)
-                            {
-                                return Break("Setting", operateResult.State);
-                            }
-                            return Break("Setting", operateResult.State, operateResult.Message.Split(')')[1]);
-                        }
-                        else
-                        {
-                            return Break("Setting", false, "配置文件已存在,请执行修改配置接口");
-                        }
-                }
-                return Break("Setting", false, $"设置配置失败");
-            }
-            catch (Exception ex)
-            {
-                return Break("Setting", false, $"设置配置异常:{ex.Message}");
-            }
-        }
-
-        public Task<OperateResult> SettingAsync(IFormFile? ConfigFile, LibType LType)
-        {
-            return Task.Run(() => Setting(ConfigFile, LType));
-        }
-
-        public OperateResult Update(IFormFile? ConfigFile, LibType LType)
-        {
-            //开始记录运行时间
-            Depart("Update");
-            try
-            {
-                if (ConfigFile == null || ConfigFile.Length == 0)
-                {
-                    return Break("Update", false, "请选择要上传的文件");
-                }
-                //判断文件夹是否存在,不存在则创建
-                FileTool.GetPathFolderPath(DaqConfigPath, true);
-                FileTool.GetPathFolderPath(RelayConfigPath, true);
-
-                //数据转换
-                StreamReader reader = new StreamReader(ConfigFile.OpenReadStream());
-                //Json内容
-                string jsonContent = reader.ReadToEnd();
-
-                switch (LType)
-                {
-                    case LibType.Daq:
-                        
-                        List<AddressManage>? addressManage = null;
-                        //json转换
-                        try
-                        {
-                            addressManage = JsonTool.StringToJsonEntity<List<AddressManage>>(jsonContent);
-                        }
-                        catch { }
-
-                        if (addressManage != null)
-                        {
-                            FileTool.StringToFile(DaqConfigPath, jsonContent);
-                        }
-                        else
-                        {
-                            return Break("Update", false, $"[ {LType.ToString()} ] 文件内容错误");
-                        }
-                        break;
-                    case LibType.Relay:
-                        //RelayMData.Basics? reflectionData = null;
-                        ////json转换
-                        //try
-                        //{
-                        //    reflectionData = JsonTool.StringToJsonEntity<RelayData.Basics>(jsonContent);
-                        //}
-                        //catch { }
-
-                        //if (reflectionData != null)
-                        //{
-                        //    FileTool.StringToFile(RelayConfigPath, jsonContent);
-                        //}
-                        //else
-                        //{
-                        //    return Break("Update", false, $"[ {LType.ToString()} ] 文件内容错误");
-                        //}
-                        break;
-                }
-
-                //当配置更新时,底层统一管理将被释放
-                baseOperate?.Dispose();
-                baseOperate = null;
-
-                return Break("Update", true);
-            }
-            catch (Exception ex)
-            {
-                return Break("Update", false, $"修改配置异常:{ex.Message}");
-            }
-        }
-
-        public Task<OperateResult> UpdateAsync(IFormFile? ConfigFile, LibType LType)
-        {
-            return Task.Run(() => Update(ConfigFile, LType));
-        }
+        public OperateResult Setting(IFormFile? ConfigFile)
+        {
+            return new OperateResult();
+            //
+            ////开始记录运行时间
+            //Depart("Setting");
+            //try
+            //{
+            //    if (ConfigFile == null || ConfigFile.Length == 0)
+            //    {
+            //        return Break("Setting", false, "请选择要上传的文件");
+            //    }
+            //    switch (LType)
+            //    {
+            //        case LibType.Daq:
+            //            if (!System.IO.File.Exists(DaqConfigPath))
+            //            {
+            //                OperateResult operateResult = Update(ConfigFile, LType);
+            //                if (operateResult.State)
+            //                {
+            //                    return Break("Setting", operateResult.State);
+            //                }
+            //                return Break("Setting", operateResult.State, operateResult.Message.Split(')')[1]);
+            //            }
+            //            else
+            //            {
+            //                return Break("Setting", false, "配置文件已存在,请执行修改配置接口");
+            //            }
+            //        case LibType.Relay:
+            //            if (!System.IO.File.Exists(RelayConfigPath))
+            //            {
+            //                OperateResult operateResult = Update(ConfigFile, LType);
+            //                if (operateResult.State)
+            //                {
+            //                    return Break("Setting", operateResult.State);
+            //                }
+            //                return Break("Setting", operateResult.State, operateResult.Message.Split(')')[1]);
+            //            }
+            //            else
+            //            {
+            //                return Break("Setting", false, "配置文件已存在,请执行修改配置接口");
+            //            }
+            //    }
+            //    return Break("Setting", false, $"设置配置失败");
+            //}
+            //catch (Exception ex)
+            //{
+            //    return Break("Setting", false, $"设置配置异常:{ex.Message}");
+            //}
+        }
+
+        //public Task<OperateResult> SettingAsync(IFormFile? ConfigFile)
+        //{
+        //    return new OperateResult();
+        //    //return Task.Run(() => Setting(ConfigFile, LType));
+        //}
+
+        public OperateResult Update(IFormFile? ConfigFile)
+        {
+            return new OperateResult();
+            //////开始记录运行时间
+            //Depart("Update");
+            //try
+            //{
+            //    if (ConfigFile == null || ConfigFile.Length == 0)
+            //    {
+            //        return Break("Update", false, "请选择要上传的文件");
+            //    }
+            //    //判断文件夹是否存在,不存在则创建
+            //    FileTool.GetPathFolderPath(DaqConfigPath, true);
+            //    FileTool.GetPathFolderPath(RelayConfigPath, true);
+
+            //    //数据转换
+            //    StreamReader reader = new StreamReader(ConfigFile.OpenReadStream());
+            //    //Json内容
+            //    string jsonContent = reader.ReadToEnd();
+
+            //    switch (LType)
+            //    {
+            //        case LibType.Daq:
+
+            //            List<AddressManage>? addressManage = null;
+            //            //json转换
+            //            try
+            //            {
+            //                addressManage = JsonTool.StringToJsonEntity<List<AddressManage>>(jsonContent);
+            //            }
+            //            catch { }
+
+            //            if (addressManage != null)
+            //            {
+            //                FileTool.StringToFile(DaqConfigPath, jsonContent);
+            //            }
+            //            else
+            //            {
+            //                return Break("Update", false, $"[ {LType.ToString()} ] 文件内容错误");
+            //            }
+            //            break;
+            //        case LibType.Relay:
+            //            //RelayMData.Basics? reflectionData = null;
+            //            ////json转换
+            //            //try
+            //            //{
+            //            //    reflectionData = JsonTool.StringToJsonEntity<RelayData.Basics>(jsonContent);
+            //            //}
+            //            //catch { }
+
+            //            //if (reflectionData != null)
+            //            //{
+            //            //    FileTool.StringToFile(RelayConfigPath, jsonContent);
+            //            //}
+            //            //else
+            //            //{
+            //            //    return Break("Update", false, $"[ {LType.ToString()} ] 文件内容错误");
+            //            //}
+            //            break;
+            //    }
+
+            //    //当配置更新时,底层统一管理将被释放
+            //    //baseOperate?.Dispose();
+            //    baseOperate = null;
+
+            //    return Break("Update", true);
+        //}
+        //    catch (Exception ex)
+        //    {
+        //        return Break("Update", false, $"修改配置异常:{ex.Message}");
+        //    }
+        }
+
+        //public Task<OperateResult> UpdateAsync(IFormFile? ConfigFile, LibType LType)
+        //{
+        //    return Task.Run(() => Update(ConfigFile, LType));
+        //}
 
         public OperateResult Init()
         {
-            if (baseOperate == null)
-            {
-                try
-                {
-                    //配置赋值
-                    AManages = JsonTool.StringToListJsonEntity<AddressManage>(FileTool.FileToString(DaqConfigPath));
-                    if (baseOperate != null)
-                    {
-                        baseOperate.Dispose();
-                    }
-                    //实例底层统一管理
-                    baseOperate = ManageBaseOperate.Instance(new ManageBaseData.Basics { AManages = AManages });
-                }
-                catch (Exception ex)
-                {
-                    Depart("Init");
-                    return Break("Init", false, ex.Message);
-                }
-                return baseOperate.Init();
-            }
-            else
-            {
-                Depart("Init");
-                return Break("Init", false, "已初始化");
-            }
+            return new OperateResult();
         }
 
         public Task<OperateResult> InitAsync()
@@ -203,11 +183,7 @@ namespace YSAI.Manage.Core
 
         public OperateResult Off(DaqType? DType, string SN)
         {
-            if (baseOperate == null)
-            {
-                return Break(Depart("Off"), false, "请先设置配置,如配置存在,可直接初始化");
-            }
-            return baseOperate.Off(DType, SN);
+            return new OperateResult();
         }
 
         public Task<OperateResult> OffAsync(DaqType? DType, string SN)
@@ -217,12 +193,7 @@ namespace YSAI.Manage.Core
 
         public OperateResult On(DaqType? DType, string SN)
         {
-            if (baseOperate == null)
-            {
-                Depart("On");
-                return Break("On", false, "请先设置配置,如配置存在,可直接初始化");
-            }
-            return baseOperate.On(DType, SN);
+            return new OperateResult();
         }
 
         public Task<OperateResult> OnAsync(DaqType? DType, string SN)
@@ -232,12 +203,7 @@ namespace YSAI.Manage.Core
 
         public OperateResult Read(DaqType? DType, string SN, string AddressName)
         {
-            if (baseOperate == null)
-            {
-                Depart("Read");
-                return Break("Read", false, "请先设置配置,如配置存在,可直接初始化");
-            }
-            return baseOperate.Read(DType, SN, AddressName);
+            return new OperateResult();
         }
 
         public Task<OperateResult> ReadAsync(DaqType? DType, string SN, string AddressName)
@@ -245,14 +211,15 @@ namespace YSAI.Manage.Core
             return Task.Run(() => Read(DType, SN, AddressName));
         }
 
-        public OperateResult Write(DaqType? DType, string SN, string AddressName, string Value,DataType DaType)
+        public OperateResult Write(DaqType? DType, string SN, string AddressName, string Value, DataType DaType)
         {
-            if (baseOperate == null)
-            {
-                Depart("Write");
-                return Break("Write", false, "请先设置配置,如配置存在,可直接初始化");
-            }
-            return baseOperate.Write(DType, SN, AddressName, Value, DaType);
+            return new OperateResult();
+            //if (baseOperate == null)
+            //{
+            //    Depart("Write");
+            //    return Break("Write", false, "请先设置配置,如配置存在,可直接初始化");
+            //}
+            //return baseOperate.Write(DType, SN, AddressName, Value, DaType);
         }
 
         public Task<OperateResult> WriteAsync(DaqType? DType, string SN, string AddressName, string Value, DataType DaType)
@@ -262,17 +229,18 @@ namespace YSAI.Manage.Core
 
         public void Dispose()
         {
-            baseOperate?.Dispose();
+            //baseOperate?.Dispose();
             baseOperate = null;
         }
 
         public OperateResult InitSucceedArray()
         {
-            if (baseOperate == null)
-            {
-                return Break(Depart("InitSucceedArray"), false, "请先设置配置,如配置存在,可直接初始化");
-            }
-            return baseOperate.InitSucceedArray();
+            return new OperateResult();
+            //if (baseOperate == null)
+            //{
+            //    return Break(Depart("InitSucceedArray"), false, "请先设置配置,如配置存在,可直接初始化");
+            //}
+            //return baseOperate.InitSucceedArray();
         }
 
         public Task<OperateResult> InitSucceedArrayAsync()

+ 84 - 0
src/YSAI.DAQ/YSAI.Manage.Core/RelayManage.cs

@@ -0,0 +1,84 @@
+using Microsoft.AspNetCore.Http;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using YSAI.Core.data;
+using YSAI.Core.@enum;
+using YSAI.Core.@interface.only;
+using YSAI.Core.@interface.unify;
+
+namespace YSAI.Manage.Core
+{
+    /// <summary>
+    /// 转发管理
+    /// </summary>
+    public class RelayManage : IBaseAbstract, IRelayManage
+    {
+        public OperateResult DeleteLib(string LibName)
+        {
+            throw new NotImplementedException();
+        }
+
+        public void Dispose()
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult DisposeISn(string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult InstanceSns()
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Off(string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult On(string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Param(RelayType RelayType)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Produce(string Topic, string Content)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult Remove(string ISn)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult SettingLib(IFormFile LFile)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult SettingLibConfig(string ISn, object Config)
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult TypeSns()
+        {
+            throw new NotImplementedException();
+        }
+
+        public OperateResult UpdateLibConfig(string ISn, object Config)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

+ 1 - 0
src/YSAI.DAQ/YSAI.Manage.Core/YSAI.Manage.Core.csproj

@@ -11,6 +11,7 @@
   </ItemGroup>
 
   <ItemGroup>
+    <ProjectReference Include="..\YSAI.DaqManage\YSAI.DaqManage.csproj" />
     <ProjectReference Include="..\YSAI.DB\YSAI.DB.csproj" />
     <ProjectReference Include="..\YSAI.Kafka\YSAI.Kafka.csproj" />
     <ProjectReference Include="..\YSAI.Modbus\YSAI.Modbus.csproj" />

文件差异内容过多而无法显示
+ 1143 - 1143
src/YSAI.DAQ/YSAI.Manage.Core/base/ManageBaseOperate.cs


+ 0 - 69
src/YSAI.DAQ/YSAI.Manage/Controllers/DaqLibInfoController.cs

@@ -1,69 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using System.ComponentModel;
-using System.Reflection.Metadata.Ecma335;
-using YSAI.Core.data;
-using YSAI.Core.@enum;
-using YSAI.Core.@interface.only;
-using YSAI.Core.@interface.unify;
-using YSAI.DB;
-using YSAI.Kafka;
-using YSAI.Log;
-using YSAI.Manage.Core;
-using YSAI.Modbus.client;
-using YSAI.Mqtt.client;
-using YSAI.Mqtt.service;
-using YSAI.Mqtt.service.websocket;
-using YSAI.Opc.da.client;
-using YSAI.Opc.da.http;
-using YSAI.Opc.ua.client;
-using YSAI.Opc.ua.service;
-using YSAI.RabbitMQ;
-using YSAI.S7.client;
-using YSAI.Unility;
-
-namespace YSAI.Manage.Controllers
-{
-    /// <summary>
-    /// 采集库文件信息
-    /// </summary>
-    [ApiController]
-    [Route("api/[controller]/[action]")]
-    public class DaqLibInfoController : Controller
-    {
-        /// <summary>
-        /// 配置
-        /// </summary>
-        private readonly IConfiguration configuration;
-        /// <summary>
-        /// 管理信息操作
-        /// </summary>
-        private readonly ManageInfoOperate manageInfoOperate;
-        /// <summary>
-        /// 采集库文件信息
-        /// </summary>
-        public DaqLibInfoController(IConfiguration configuration, ManageInfoOperate manageInfoOperate)
-        {
-            this.configuration = configuration;
-            this.manageInfoOperate = manageInfoOperate;
-        }
-        /// <summary>
-        /// 获取数采库文件集合
-        /// </summary>
-        /// <returns>rData:库文件名集合</returns>
-        [HttpGet]
-        public OperateResult Array()
-        {
-            return manageInfoOperate.Array(LibType.Daq);
-        }
-        /// <summary>
-        /// 获取数采库文件实例参数
-        /// </summary>
-        /// <param name="Name">库文件名</param>
-        /// <returns>rData:库文件所需实例参数集合</returns>
-        [HttpGet]
-        public OperateResult Param(string Name)
-        {
-            return manageInfoOperate.Param(LibType.Daq, Name);
-        }
-    }
-}

+ 0 - 192
src/YSAI.DAQ/YSAI.Manage/Controllers/DaqLibOperateController.cs

@@ -1,192 +0,0 @@
-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;
-
-namespace YSAI.Manage.Controllers
-{
-    /// <summary>
-    /// 库文件操作
-    /// </summary>
-    [ApiController]
-    [Route("api/[controller]/[action]")]
-    public class DaqLibOperateController : Controller
-    {
-        /// <summary>
-        /// 配置
-        /// </summary>
-        private readonly IConfiguration configuration;
-        /// <summary>
-        /// 统一操作结果
-        /// </summary>
-        private readonly ManageOperate manageOperate;
-
-        /// <summary>
-        /// 数采操作
-        /// </summary>
-        public DaqLibOperateController(IConfiguration configuration, ManageOperate manageOperate)
-        {
-            this.configuration = configuration;
-            this.manageOperate = manageOperate;
-            //自动初始化
-            if (configuration.GetValue<bool>("AutoInit"))
-            {
-                Init();
-            }
-        }
-
-
-        /// <summary>
-        /// 获取初始化成功的集合
-        /// </summary>
-        /// <returns>统一出参</returns>
-        [HttpGet]
-        public OperateResult InitSucceedArray()
-        {
-            return manageOperate.InitSucceedArray();
-        }
-
-        /// <summary>
-        /// 设置配置
-        /// </summary>
-        /// <param name="ConfigFile">配置文件</param>
-        /// <returns>统一出参</returns>
-        [HttpPost]
-        public OperateResult Setting(IFormFile? ConfigFile)
-        {
-            return manageOperate.Setting(ConfigFile, LibType.Daq);
-        }
-        /// <summary>
-        /// 修改配置
-        /// </summary>
-        /// <param name="ConfigFile">配置文件</param>
-        /// <returns>统一出参</returns>
-        [HttpPost]
-        public OperateResult Update(IFormFile? ConfigFile)
-        {
-            return manageOperate.Update(ConfigFile, LibType.Daq);
-        }
-        /// <summary>
-        /// 初始化
-        /// </summary>
-        /// <returns>统一出参</returns>
-        [HttpPost]
-        public OperateResult Init()
-        {
-            return manageOperate.Init();
-        }
-
-        /// <summary>
-        /// 释放所有已初始化的实例
-        /// </summary>
-        /// <returns></returns>
-        [HttpPost]
-        public IActionResult InitDispose()
-        {
-            manageOperate.Dispose();
-            return Ok();
-        }
-        /// <summary>
-        /// 打开
-        /// </summary>
-        /// <param name="Dtype">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <returns>统一返回结果</returns>
-        [HttpPost]
-        public OperateResult On(DaqType Dtype, string SN)
-        {
-            return manageOperate.On(Dtype, SN);
-        }
-        /// <summary>
-        /// 关闭
-        /// </summary>
-        /// <param name="Dtype">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <returns>统一返回结果</returns>
-        [HttpPost]
-        public OperateResult Off(DaqType Dtype, string SN)
-        {
-            return manageOperate.Off(Dtype, SN);
-        }
-        /// <summary>
-        /// 读取
-        /// </summary>
-        /// <param name="Dtype">库名称</param>
-        /// <param name="SN">库实例SN</param> 
-        /// <param name="AddressName">地址</param>
-        /// <returns>统一返回结果</returns>
-        [HttpPost]
-        public OperateResult Read(DaqType Dtype, string SN, string AddressName)
-        {
-            return manageOperate.Read(Dtype, SN, AddressName);
-        }
-        /// <summary>
-        /// 写入浮点型数据
-        /// </summary>
-        /// <param name="Dtype">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <param name="AddressName">地址</param>
-        /// <param name="Value">值</param>
-        /// <returns>统一返回结果</returns>
-        [HttpPost]
-        public OperateResult WriteDouble(DaqType Dtype, string SN, string AddressName, string Value)
-        {
-            return manageOperate.Write(Dtype, SN, AddressName, Value, YSAI.Core.@enum.DataType.Double);
-        }
-
-        /// <summary>
-        /// 写入整数型数据
-        /// </summary>
-        /// <param name="Dtype">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <param name="AddressName">地址</param>
-        /// <param name="Value">值</param>
-        /// <returns>统一返回结果</returns>
-        [HttpPost]
-        public OperateResult WriteInt(DaqType Dtype, string SN, string AddressName, string Value)
-        {
-            return manageOperate.Write(Dtype, SN, AddressName, Value, YSAI.Core.@enum.DataType.Int);
-        }
-
-        /// <summary>
-        /// 写入字符串类型数据
-        /// </summary>
-        /// <param name="Dtype">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <param name="AddressName">地址</param>
-        /// <param name="Value">值</param>
-        /// <returns>统一返回结果</returns>
-        [HttpPost]
-        public OperateResult WriteString(DaqType Dtype, string SN, string AddressName, string Value)
-        {
-            return manageOperate.Write(Dtype, SN, AddressName, Value, YSAI.Core.@enum.DataType.String);
-        }
-
-        /// <summary>
-        /// 写入布尔类型数据
-        /// </summary>
-        /// <param name="Dtype">库名称</param>
-        /// <param name="SN">库实例SN</param>
-        /// <param name="AddressName">地址</param>
-        /// <param name="Value">值</param>
-        /// <returns>统一返回结果</returns>
-        [HttpPost]
-        public OperateResult WriteBool(DaqType Dtype, string SN, string AddressName, string Value)
-        {
-            return manageOperate.Write(Dtype, SN, AddressName, Value, YSAI.Core.@enum.DataType.Bool);
-        }
-    }
-}

+ 369 - 0
src/YSAI.DAQ/YSAI.Manage/Controllers/OperateController.cs

@@ -0,0 +1,369 @@
+using Google.Protobuf.WellKnownTypes;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.Extensions.Configuration;
+using System.Collections.Concurrent;
+using System.Drawing;
+using System.Text;
+using YSAI.Core.data;
+using YSAI.Core.@enum;
+using YSAI.Core.@interface.only;
+using YSAI.Core.@interface.unify;
+using YSAI.DaqManage;
+using YSAI.DB;
+using YSAI.Kafka;
+using YSAI.Modbus.client;
+using YSAI.Mqtt.client;
+using YSAI.Opc.da.client;
+using YSAI.Opc.da.http;
+using YSAI.Opc.ua.client;
+using YSAI.RabbitMQ;
+using YSAI.RelayManage;
+using YSAI.S7.client;
+using YSAI.Unility;
+using static System.Net.Mime.MediaTypeNames;
+
+namespace YSAI.Manage.Controllers
+{
+    /// <summary>
+    /// 采集库操作
+    /// </summary>
+    [ApiController]
+    [Route("api/[controller]/[action]")]
+    public class OperateController : Controller
+    {
+        /// <summary>
+        /// 统一操作结果
+        /// </summary>
+        private readonly DaqManageOperate daqManageOperate = Program.daqManageOperate;
+
+        /// <summary>
+        /// 参数
+        /// </summary>
+        /// <param name="DType">数采库类型</param>
+        /// <returns>统一出参</returns>
+        [HttpGet]
+        public object Param(LibType DType)
+        {
+            switch (DType)
+            {
+                case LibType.DB:
+                    return new DBData.Basics();
+                case LibType.Modbus:
+                    return new ModbusClientData.Basics();
+                case LibType.OpcUa:
+                    return new OpcUaClientData.Basics();
+                case LibType.OpcDa:
+                    return new OpcDaClientData.Basics();
+                case LibType.OpcDaHttp:
+                    return new OpcDaHttpData.Basics();
+                case LibType.S7:
+                    return new S7ClientData.Basics();
+                case LibType.Kafka:
+                    return new KafkaProducerData.Basics();
+                case LibType.Mqtt:
+                    return new MqttClientData.Basics();
+                case LibType.RabbitMQ:
+                    return new RabbitMQData.Basics();
+                default:
+                    return new OperateResult(false, "输入有误", 0.1);
+            }
+        }
+
+     
+        
+        /// <summary>
+        /// 参数详情
+        /// </summary>
+        /// <param name="DType">数采库类型</param>
+        /// <returns>统一出参</returns>
+        [HttpGet]
+        public OperateResult ParamDetails(LibType DType)
+        {
+            switch (DType)
+            {
+                case LibType.DB:
+                    return new OperateResult(true, string.Empty, 0.1, RData: ReflexTool.GetClassAllPropertyData<DBData.Basics>(), RType: ResultType.Json);
+                case LibType.Modbus:
+                    return new OperateResult(true, string.Empty, 0.1, RData: ReflexTool.GetClassAllPropertyData<ModbusClientData.Basics>(), RType: ResultType.Json);
+                case LibType.OpcUa:
+                    return new OperateResult(true, string.Empty, 0.1, RData: ReflexTool.GetClassAllPropertyData<OpcUaClientData.Basics>(), RType: ResultType.Json);
+                case LibType.OpcDa:
+                    return new OperateResult(true, string.Empty, 0.1, RData: ReflexTool.GetClassAllPropertyData<OpcDaClientData.Basics>(), RType: ResultType.Json);
+                case LibType.OpcDaHttp:
+                    return new OperateResult(true, string.Empty, 0.1, RData: ReflexTool.GetClassAllPropertyData<OpcDaHttpData.Basics>(), RType: ResultType.Json);
+                case LibType.S7:
+                    return new OperateResult(true, string.Empty, 0.1, RData: ReflexTool.GetClassAllPropertyData<S7ClientData.Basics>(), RType: ResultType.Json);
+                case LibType.Kafka:
+                    return new OperateResult(true, string.Empty, 0.1, RData: ReflexTool.GetClassAllPropertyData<KafkaProducerData.Basics>(), RType: ResultType.Json);
+                case LibType.Mqtt:
+                    return new OperateResult(true, string.Empty, 0.1, RData: ReflexTool.GetClassAllPropertyData<MqttClientData.Basics>(), RType: ResultType.Json);
+                case LibType.RabbitMQ:
+                    return new OperateResult(true, string.Empty, 0.1, RData: ReflexTool.GetClassAllPropertyData<RabbitMQData.Basics>(), RType: ResultType.Json);
+                default:
+                    return new OperateResult(false, "输入有误", 0.1);
+            }
+        }
+
+
+
+        /// <summary>
+        /// 设置库文件
+        /// </summary>
+        /// <param name="FormFiles">文件集合</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult SettingLib(List<IFormFile> FormFiles)
+        {
+            return daqManageOperate.SettingLib(FormFiles);
+        }
+        
+
+        /// <summary>
+        /// 删除库文件
+        /// </summary>
+        /// <param name="LibNames">库文件名集合</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult DeleteLib(List<string> LibNames)
+        {
+            return daqManageOperate.DeleteLib(LibNames);
+        }
+    
+        
+        /// <summary>
+        /// 设置库配置文件
+        /// </summary>
+        /// <param name="FormFiles">文件集合</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult SettingLibConfig(List<IFormFile> FormFiles)
+        {
+            return daqManageOperate.SettingLibConfig(FormFiles);
+        }
+
+        /// <summary>
+        /// 修改库配置文件
+        /// </summary>
+        /// <param name="FormFiles">文件集合</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult UpdateLibConfig(List<IFormFile> FormFiles)
+        {
+            return daqManageOperate.UpdateLibConfig(FormFiles);
+        }
+
+
+
+        /// <summary>
+        /// 批量读取
+        /// </summary>
+        /// <param name="FormFile">地址数据文件</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult BatchRead(IFormFile FormFile, string ISn)
+        {
+            return daqManageOperate.Read(FormFile, ISn);
+        }
+   
+        
+        /// <summary>
+        /// 单点读取
+        /// </summary>
+        /// <param name="AddressName">地址名称</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult Read(string AddressName, string ISn)
+        {
+            return daqManageOperate.Read(AddressName, ISn);
+        }
+      
+        
+        /// <summary>
+        /// 单点写入
+        /// </summary>
+        /// <param name="AddressName">地址名称</param>
+        /// <param name="Value">值</param>
+        /// <param name="DaType">数据类型</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult Write(string AddressName, string Value, DataType DaType, string ISn)
+        {
+            return daqManageOperate.Write(AddressName, Value, DaType, ISn);
+        }
+
+
+        /// <summary>
+        /// 订阅
+        /// </summary>
+        /// <param name="FormFile">地址数据文件</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult Subscribe(IFormFile FormFile, string ISn)
+        {
+            return daqManageOperate.Subscribe(FormFile, ISn);
+        }
+
+
+        /// <summary>
+        /// 取消订阅
+        /// </summary>
+        /// <param name="FormFile">地址数据文件</param>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns></returns>
+        [HttpPost]
+        public OperateResult UnSubscribe(IFormFile FormFile, string ISn)
+        {
+            return daqManageOperate.UnSubscribe(FormFile, ISn);
+        }
+     
+        
+        /// <summary>
+        /// 程序集唯一标识符集合
+        /// </summary>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public List<string>? TypeSns()
+        {
+            return daqManageOperate.TypeSns();
+        }
+
+        /// <summary>
+        /// 实例唯一标识符集合
+        /// </summary>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public List<string>? InstanceSns()
+        {
+            return daqManageOperate.InstanceSns();
+        }
+
+        /// <summary>
+        /// 释放指定实例
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult DisposeISn(string ISn)
+        {
+            return daqManageOperate.DisposeISn(ISn);
+        }
+
+        /// <summary>
+        /// 移除指定实例
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult Remove(string ISn)
+        {
+            return daqManageOperate.RemoveISn(ISn);
+        }
+
+        /// <summary>
+        /// 打开
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult On(string ISn)
+        {
+            return daqManageOperate.On(ISn);
+        }
+
+        /// <summary>
+        /// 关闭
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult Off(string ISn)
+        {
+            return daqManageOperate.Off(ISn);
+        }
+
+
+        //***********************************
+
+
+        /// <summary>
+        /// 打开
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult RelayOn(string ISn)
+        {
+            return AddressHandler.On(ISn);
+        }
+
+        /// <summary>
+        /// 关闭
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult RelayOff(string ISn)
+        {
+            return AddressHandler.Off(ISn);
+        }
+
+        /// <summary>
+        /// 程序集唯一标识符集合
+        /// </summary>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public List<string>? RelayTypeSns()
+        {
+            return AddressHandler.TypeSns();
+        }
+
+        /// <summary>
+        /// 实例唯一标识符集合
+        /// </summary>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public List<string>? RelayInstanceSns()
+        {
+            return AddressHandler.InstanceSns();
+        }
+
+        /// <summary>
+        /// 释放指定实例
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult RelayDisposeISn(string ISn)
+        {
+            return AddressHandler.DisposeISn(ISn);
+        }
+
+        /// <summary>
+        /// 移除指定实例
+        /// </summary>
+        /// <param name="ISn">实例唯一标识符</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult RelayRemove(string ISn)
+        {
+            return AddressHandler.RemoveISn(ISn);
+        }
+
+        /// <summary>
+        /// 数据转发
+        /// </summary>
+        /// <param name="Topic">主题</param>
+        /// <param name="Content">内容</param>
+        /// <returns>统一出参</returns>
+        [HttpPost]
+        public OperateResult Relay(string Topic, string Content)
+        {
+            return AddressHandler.Produce(Topic, Content);
+        }
+    }
+}

+ 0 - 51
src/YSAI.DAQ/YSAI.Manage/Controllers/RelayLibInfoController.cs

@@ -1,51 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using YSAI.Core.@enum;
-using YSAI.Core.data;
-using YSAI.Manage.Core;
-
-namespace YSAI.Manage.Controllers
-{
-    /// <summary>
-    /// 转发库文件信息
-    /// </summary>
-    [ApiController]
-    [Route("api/[controller]/[action]")]
-    public class RelayLibInfoController : Controller
-    {
-        /// <summary>
-        /// 配置
-        /// </summary>
-        private readonly IConfiguration configuration;
-        /// <summary>
-        /// 管理信息操作
-        /// </summary>
-        private readonly ManageInfoOperate manageInfoOperate;
-        /// <summary>
-        /// 转发库文件信息
-        /// </summary>
-        public RelayLibInfoController(IConfiguration configuration, ManageInfoOperate manageInfoOperate)
-        {
-            this.configuration = configuration;
-            this.manageInfoOperate = manageInfoOperate;
-        }
-        /// <summary>
-        /// 获取转发库文件集合
-        /// </summary>
-        /// <returns>rData:库文件名集合</returns>
-        [HttpGet]
-        public OperateResult Array()
-        {
-            return manageInfoOperate.Array(LibType.Relay);
-        }
-        /// <summary>
-        /// 获取转发库文件实例参数
-        /// </summary>
-        /// <param name="Name">库文件名</param>
-        /// <returns>rData:库文件所需实例参数集合</returns>
-        [HttpGet]
-        public OperateResult Param(string Name)
-        {
-            return manageInfoOperate.Param(LibType.Relay, Name);
-        }
-    }
-}

+ 0 - 54
src/YSAI.DAQ/YSAI.Manage/Controllers/RelayLibOperateController.cs

@@ -1,54 +0,0 @@
-using Microsoft.AspNetCore.Mvc;
-using YSAI.Core.data;
-using YSAI.Core.@enum;
-using YSAI.Manage.Core;
-
-namespace YSAI.Manage.Controllers
-{
-    /// <summary>
-    /// 库文件操作
-    /// </summary>
-    [ApiController]
-    [Route("api/[controller]/[action]")]
-    public class RelayLibOperateController : Controller
-    {
-        /// <summary>
-        /// 配置
-        /// </summary>
-        private readonly IConfiguration configuration;
-        /// <summary>
-        /// 统一操作结果
-        /// </summary>
-        private readonly ManageOperate manageOperate;
-
-        /// <summary>
-        /// 点位地址信息操作
-        /// </summary>
-        public RelayLibOperateController(IConfiguration configuration, ManageOperate manageOperate)
-        {
-            this.configuration = configuration;
-            this.manageOperate = manageOperate;
-        }
-
-        /// <summary>
-        /// 设置配置
-        /// </summary>
-        /// <param name="ConfigFile">配置文件</param>
-        /// <returns>统一出参</returns>
-        [HttpPost]
-        public OperateResult Setting(IFormFile? ConfigFile)
-        {
-            return manageOperate.Setting(ConfigFile, LibType.Relay);
-        }
-        /// <summary>
-        /// 修改配置
-        /// </summary>
-        /// <param name="ConfigFile">配置文件</param>
-        /// <returns>统一出参</returns>
-        [HttpPost]
-        public OperateResult Update(IFormFile? ConfigFile)
-        {
-            return manageOperate.Update(ConfigFile, LibType.Relay);
-        }
-    }
-}

+ 28 - 15
src/YSAI.DAQ/YSAI.Manage/Program.cs

@@ -1,24 +1,40 @@
 
-using Microsoft.Extensions.Configuration.Json;
 using System.Reflection;
 using System.Text.Json.Serialization;
-using YSAI.Core.@interface.unify;
-using YSAI.Manage.Controllers;
-using YSAI.Manage.Core;
-using YSAI.Opc.ua.service.core;
+using YSAI.Core.data;
+using YSAI.DaqManage;
+using YSAI.RelayManage;
+using YSAI.Unility;
 
 namespace YSAI.Manage
 {
     public class Program
     {
+
+        public static DaqManageOperate daqManageOperate;
+        static void DaqEvent(object? sender, YSAI.Core.data.EventResult e)
+        {
+            if (e.Message == "点位数据更新")
+                return;
+            Console.ForegroundColor = ConsoleColor.Green;
+            Console.WriteLine(e.Message);
+        }
+        static void RelayEvent(object? sender, object e)
+        {
+            EventResult? result = JsonTool.StringToJsonEntity<EventResult>(e.ToJson());
+            Console.ForegroundColor = ConsoleColor.Red;
+            Console.WriteLine(result.Message);
+        }
+
         public static void Main(string[] args)
         {
-            var builder = WebApplication.CreateBuilder(args);
+            //创建实例
+            daqManageOperate = DaqManageOperate.Instance();
+            daqManageOperate.OnEvent += DaqEvent;
+            AddressHandler.RelayEventRegister(RelayEvent);
+
 
-            //注入管理信息类
-            builder.Services.AddSingleton<ManageInfoOperate>();
-            //注入管理类
-            builder.Services.AddSingleton<ManageOperate>();
+            var builder = WebApplication.CreateBuilder(args);
 
             // Add services to the container.
             builder.Services.AddControllers().AddJsonOptions(options =>
@@ -41,20 +57,17 @@ namespace YSAI.Manage
             });
             var app = builder.Build();
 
-            // Configure the HTTP request pipeline.
-            //if (app.Environment.IsDevelopment())
-            //{
             app.UseSwagger();
             app.UseSwaggerUI();
-            //}
+
             app.UseHttpsRedirection();
 
             app.UseAuthorization();
 
-
             app.MapControllers();
 
             app.Run();
+
         }
     }
 }

+ 9 - 19
src/YSAI.DAQ/YSAI.Manage/YSAI.Manage.csproj

@@ -8,31 +8,21 @@
     <PlatformTarget>x86</PlatformTarget>
   </PropertyGroup>
 
-  <ItemGroup>
-    <Content Remove="config\DaqConfig.json" />
-    <Content Remove="config\ReflectionConfig.json" />
-    <Content Remove="config\RelayConfig.json" />
-  </ItemGroup>
-
   <ItemGroup>
     <PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
   </ItemGroup>
 
   <ItemGroup>
     <ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />
-    <ProjectReference Include="..\YSAI.Manage.Core\YSAI.Manage.Core.csproj" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <None Include="config\DaqConfig.json">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="config\ReflectionConfig.json">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Include="config\RelayConfig.json">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
+    <ProjectReference Include="..\YSAI.DaqManage\YSAI.DaqManage.csproj" />
+    <ProjectReference Include="..\YSAI.DB\YSAI.DB.csproj" />
+    <ProjectReference Include="..\YSAI.Kafka\YSAI.Kafka.csproj" />
+    <ProjectReference Include="..\YSAI.Modbus\YSAI.Modbus.csproj" />
+    <ProjectReference Include="..\YSAI.Mqtt\YSAI.Mqtt.csproj" />
+    <ProjectReference Include="..\YSAI.Opc\YSAI.Opc.csproj" />
+    <ProjectReference Include="..\YSAI.RabbitMQ\YSAI.RabbitMQ.csproj" />
+    <ProjectReference Include="..\YSAI.RelayManage\YSAI.RelayManage.csproj" />
+    <ProjectReference Include="..\YSAI.S7\YSAI.S7.csproj" />
   </ItemGroup>
 
 </Project>

+ 0 - 185
src/YSAI.DAQ/YSAI.Manage/config/DaqConfig.json

@@ -1,185 +0,0 @@
-[
-    {
-        "DType": "OpcDa",
-        "InstanceParam": {
-            "SN": "OPCDA采集",
-            "ServiceName": "Knight.OPC.Server.Demo",
-            "ApiVerType": "COM_DA_20",
-            "UpdateRate": 100
-        },
-        "SN": "OPCDA采集",
-        "AddressArray": [
-            {
-                "SN": null,
-                "AddressName": "a.a.a",
-                "AddressAnotherName": "test",
-                "AddressPropertyName": "aaa",
-                "AddressDescribe": "一个动态的布尔类型",
-                "AddressParseParam": null,
-                "AddressExtendParam": null,
-                "IsEnable": true,
-                "AddressDataType": "Bool",
-                "AddressType": "Reality"
-            },
-            {
-                "SN": null,
-                "AddressName": "a.a.h",
-                "AddressAnotherName": "test",
-                "AddressPropertyName": "aah",
-                "AddressDescribe": "一个动态的字符串类型",
-                "AddressParseParam": {
-                    "ParseType": "ScriptAnalysis",
-                    "ReflectionSN": null,
-                    "Script": {
-                        "ScriptType": "JavaScript",
-                        "ScriptCode": "function Convert(value) \r\n                                            {\r\n                                                return '这是脚本测试,传入的参数是:' + value;\r\n                                            }",
-                        "ScriptFunction": "Convert"
-                    }
-                },
-                "AddressExtendParam": null,
-                "IsEnable": true,
-                "AddressDataType": "String",
-                "AddressType": "Reality"
-            },
-            {
-                "SN": null,
-                "AddressName": "a.a.g",
-                "AddressAnotherName": "test",
-                "AddressPropertyName": "aag",
-                "AddressDescribe": "一个动态的浮点类型",
-                "AddressParseParam": {
-                    "ParseType": "ScriptAnalysis",
-                    "ReflectionSN": null,
-                    "Script": {
-                        "ScriptType": "JavaScript",
-                        "ScriptCode": "function Convert(value) \r\n                                            {\r\n                                                return value*1000;\r\n                                            }",
-                        "ScriptFunction": "Convert"
-                    }
-                },
-                "AddressExtendParam": null,
-                "IsEnable": true,
-                "AddressDataType": "Double",
-                "AddressType": "Reality"
-            },
-            {
-                "SN": null,
-                "AddressName": "OPCDA_VirtualAddress",
-                "AddressAnotherName": "test",
-                "AddressPropertyName": "OPCDA_VirtualAddress",
-                "AddressDescribe": "虚拟地址",
-                "AddressParseParam": null,
-                "AddressExtendParam": null,
-                "IsEnable": true,
-                "AddressDataType": "String",
-                "AddressType": "Virtual"
-            },
-            {
-                "SN": null,
-                "AddressName": "OPCDA_VirtualDynamicAddress",
-                "AddressAnotherName": "test",
-                "AddressPropertyName": "OPCDA_VirtualDynamicAddress",
-                "AddressDescribe": "虚拟动态地址",
-                "AddressParseParam": null,
-                "AddressExtendParam": null,
-                "IsEnable": true,
-                "AddressDataType": "String",
-                "AddressType": "VirtualDynamic"
-            }
-        ],
-        "CreationTime": "2023-08-15T10:09:50.7036638+08:00"
-    },
-    {
-        "DType": "OpcUa",
-        "InstanceParam": {
-            "SN": "OPCUA采集",
-            "UserName": "ysai",
-            "Password": "ysai",
-            "Cer": null,
-            "SecreKey": null,
-            "ServerUrl": "opc.tcp://192.168.2.38:8866/Opc.Ua.Service",
-            "Name": "TEST",
-            "SamplingInterval": 100,
-            "PublishingInterval": 20
-        },
-        "SN": "OPCUA采集",
-        "AddressArray": [
-            {
-                "SN": null,
-                "AddressName": "ns=2;s=Boolean_Dynamic",
-                "AddressAnotherName": "test",
-                "AddressPropertyName": "Boolean_Dynamic",
-                "AddressDescribe": "一个动态的布尔类型",
-                "AddressParseParam": null,
-                "AddressExtendParam": null,
-                "IsEnable": true,
-                "AddressDataType": "Bool",
-                "AddressType": "Reality"
-            },
-            {
-                "SN": null,
-                "AddressName": "ns=2;s=String_Dynamic",
-                "AddressAnotherName": "test",
-                "AddressPropertyName": "String_Dynamic",
-                "AddressDescribe": "一个动态的字符串类型",
-                "AddressParseParam": {
-                    "ParseType": "ScriptAnalysis",
-                    "ReflectionSN": null,
-                    "Script": {
-                        "ScriptType": "JavaScript",
-                        "ScriptCode": "function Convert(value) \r\n                                            {\r\n                                                return '这是脚本测试,传入的参数是:' + value;\r\n                                            }",
-                        "ScriptFunction": "Convert"
-                    }
-                },
-                "AddressExtendParam": null,
-                "IsEnable": true,
-                "AddressDataType": "String",
-                "AddressType": "Reality"
-            },
-            {
-                "SN": null,
-                "AddressName": "ns=2;s=Double_Dynamic",
-                "AddressAnotherName": "test",
-                "AddressPropertyName": "Double_Dynamic",
-                "AddressDescribe": "一个动态的浮点类型",
-                "AddressParseParam": {
-                    "ParseType": "ScriptAnalysis",
-                    "ReflectionSN": null,
-                    "Script": {
-                        "ScriptType": "JavaScript",
-                        "ScriptCode": "function Convert(value) \r\n                                            {\r\n                                                return value*1000;\r\n                                            }",
-                        "ScriptFunction": "Convert"
-                    }
-                },
-                "AddressExtendParam": null,
-                "IsEnable": true,
-                "AddressDataType": "Double",
-                "AddressType": "Reality"
-            },
-            {
-                "SN": null,
-                "AddressName": "OPCUA_VirtualAddress",
-                "AddressAnotherName": "test",
-                "AddressPropertyName": "OPCUA_VirtualAddress",
-                "AddressDescribe": "虚拟地址",
-                "AddressParseParam": null,
-                "AddressExtendParam": null,
-                "IsEnable": true,
-                "AddressDataType": "String",
-                "AddressType": "Virtual"
-            },
-            {
-                "SN": null,
-                "AddressName": "OPCUA_VirtualDynamicAddress",
-                "AddressAnotherName": "test",
-                "AddressPropertyName": "OPCUA_VirtualDynamicAddress",
-                "AddressDescribe": "虚拟动态地址",
-                "AddressParseParam": null,
-                "AddressExtendParam": null,
-                "IsEnable": true,
-                "AddressDataType": "String",
-                "AddressType": "VirtualDynamic"
-            }
-        ],
-        "CreationTime": "2023-08-15T10:09:50.7067724+08:00"
-    }
-]

+ 0 - 40
src/YSAI.DAQ/YSAI.Manage/config/ReflectionConfig.json

@@ -1,40 +0,0 @@
-{
-    "DllDatas": [
-        {
-            "DllPath": "YSAI.Relay.dll",
-            "IsAbsolutePath": false,
-            "NamespaceDatas": [
-                {
-                    "Namespace": "YSAI.Relay",
-                    "ClassDatas": [
-                        {
-                            "SN": "YSAI.Relay.RelayOperate[Instance]",
-                            "ClassName": "RelayOperate",
-                            "ConstructorParam": null,
-                            "MethodDatas": [
-                                {
-                                    "SN": "[Produce]",
-                                    "WhetherExecute": false,
-                                    "MethodName": "Produce",
-                                    "MethodParam": null
-                                },
-                                {
-                                    "SN": "[Dispose]",
-                                    "WhetherExecute": false,
-                                    "MethodName": "Dispose",
-                                    "MethodParam": null
-                                }
-                            ],
-                            "EventDatas": [
-                                {
-                                    "SN": "[OnEvent]",
-                                    "EventName": "OnEvent"
-                                }
-                            ]
-                        }
-                    ]
-                }
-            ]
-        }
-    ]
-}

+ 0 - 46
src/YSAI.DAQ/YSAI.Manage/config/RelayConfig.json

@@ -1,46 +0,0 @@
-{
-    "MessageTopic": "message",
-    "StatusTopic": "status",
-    "TaskHandleCount": 8,
-    "TaskHandleAccomplishSleepTime": 500,
-    "MqttClientDataArray": [
-        {
-            "SN": "mqtt转发一号",
-            "ServerIPAddress": "127.0.0.1",
-            "ServerPort": 8881,
-            "ServerLoginID": "ysai",
-            "ServerLoginPassword": "ysai",
-            "ClientID": null,
-            "QualityOfServiceLevel": "AtMostOnce"
-        },
-        {
-            "SN": "mqtt转发二号",
-            "ServerIPAddress": "127.0.0.1",
-            "ServerPort": 8882,
-            "ServerLoginID": "ysai",
-            "ServerLoginPassword": "ysai",
-            "ClientID": null,
-            "QualityOfServiceLevel": "AtMostOnce"
-        },
-        {
-            "SN": "mqtt转发三号",
-            "ServerIPAddress": "127.0.0.1",
-            "ServerPort": 8883,
-            "ServerLoginID": "ysai",
-            "ServerLoginPassword": "ysai",
-            "ClientID": null,
-            "QualityOfServiceLevel": "AtMostOnce"
-        },
-        {
-            "SN": "mqtt转发四号",
-            "ServerIPAddress": "127.0.0.1",
-            "ServerPort": 8884,
-            "ServerLoginID": "ysai",
-            "ServerLoginPassword": "ysai",
-            "ClientID": null,
-            "QualityOfServiceLevel": "AtMostOnce"
-        }
-    ],
-    "KafkaProducerDataArray": [],
-    "RabbitMQDataArray": []
-}

+ 212 - 232
src/YSAI.DAQ/YSAI.RelayManage/RelayManageOperate.cs

@@ -1,4 +1,5 @@
-using Newtonsoft.Json.Linq;
+using Microsoft.AspNetCore.Http;
+using Newtonsoft.Json.Linq;
 using System;
 using System.Collections.Concurrent;
 using System.Collections.Generic;
@@ -8,6 +9,7 @@ using System.Text;
 using System.Threading.Tasks;
 using YSAI.Core.data;
 using YSAI.Core.@enum;
+using YSAI.Core.@interface.only;
 using YSAI.Core.@interface.unify;
 using YSAI.Core.reflection;
 using YSAI.Log;
@@ -18,9 +20,9 @@ namespace YSAI.RelayManage
     /// <summary>
     /// 转发管理操作,
     /// 库:*.dll,
-    /// 库配置:命名空间 + 类名.SN.Config.json
+    /// 库配置:命名空间 + 类名.ISn.Config.json
     /// </summary>
-    public class RelayManageOperate : IBaseAbstract
+    public class RelayManageOperate : IBaseAbstract,IRelayManage
     {
         protected override string LogHead => "[ RelayManageOperate 操作 ]";
         protected override string ClassName => "RelayManageOperate";
@@ -230,13 +232,13 @@ namespace YSAI.RelayManage
         /// <param name="Type">【0:库文件】【1:配置文件】</param>
         private void Watcher_Deleted(object sender, FileSystemEventArgs e, int Type)
         {
-            //程序集SN
+            //程序集ISn
             string TypeIocSN = string.Empty;
             switch (Type)
             {
                 case 0:
                     OnEventHandler?.Invoke(this, new EventResult(true, $"{e.Name} 文件被删除,移除此库程序集,并移除所有实例"));
-                    //程序集SN
+                    //程序集ISn
                     TypeIocSN = e.Name.Replace(".dll", string.Empty);
 
                     foreach (var item in InstanceIoc)
@@ -272,9 +274,9 @@ namespace YSAI.RelayManage
                     break;
                 case 1:
                     OnEventHandler?.Invoke(this, new EventResult(true, $"{e.Name} 文件被删除,移除对应配置实例"));
-                    //实例的SN
+                    //实例的ISn
                     string InstanceIocSN = e.Name.Replace(basics.ConfigReplaceFormat, string.Empty);
-                    //程序集SN
+                    //程序集ISn
                     TypeIocSN = InstanceIocSN.Replace($".{InstanceIocSN.Split('.')[InstanceIocSN.Split('.').Length - 1]}", string.Empty);
                     if (InstanceIoc.ContainsKey(InstanceIocSN))
                     {
@@ -334,11 +336,11 @@ namespace YSAI.RelayManage
                                 srdPreview.Close();
                                 srdPreview.Dispose();
 
-                                //实例的SN
+                                //实例的ISn
                                 string InstanceIocSN = e.Name.Replace(basics.ConfigReplaceFormat, string.Empty);
-                                //程序集SN
+                                //程序集ISn
                                 string TypeIocSN = InstanceIocSN.Replace($".{InstanceIocSN.Split('.')[InstanceIocSN.Split('.').Length - 1]}", string.Empty);
-                                //判断是否存在此程序集SN
+                                //判断是否存在此程序集ISn
                                 if (TypeIoc.ContainsKey(TypeIocSN))
                                 {
                                     if (!InstanceIoc.ContainsKey(InstanceIocSN))
@@ -495,17 +497,6 @@ namespace YSAI.RelayManage
             }
         }
         /// <summary>
-        /// 实例事件信息
-        /// </summary>
-        /// <param name="sender"></param>
-        /// <param name="e"></param>
-        /// <exception cref="NotImplementedException"></exception>
-        private void Instance_OnEvent(object? sender, EventResult e)
-        {
-            //抛出信息
-            OnEventHandler?.Invoke(this, e);
-        }
-        /// <summary>
         /// 创建实例
         /// </summary>
         /// <param name="NamespaceAndClassNameType">类型</param>
@@ -595,6 +586,69 @@ namespace YSAI.RelayManage
                 return false;
         }
 
+        /// <summary>
+        /// 任务处理
+        /// </summary>
+        /// <returns></returns>
+        private Task TaskHandle()
+        {
+            string logName = "TaskHandle.log";
+            //起个新线程处理
+            return Task.Factory.StartNew(() =>
+            {
+                //循环
+                while (TaskArray != null)
+                {
+                    try
+                    {
+                        //队列数据
+                        QueueData? queueData;
+                        //出列
+                        while (DataQueue.TryDequeue(out queueData))
+                        {
+                            if (queueData != null)
+                            {
+                                foreach (var item in InstanceIoc)
+                                {
+                                    OperateResult operateResult = item.Value.Produce(queueData.Topic, queueData.Content);
+                                    OnEventHandler?.Invoke(this, new EventResult(operateResult.State, operateResult.Message, operateResult.RData, operateResult.RType));
+                                }
+                            }
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        LogHelper.Error($"任务处理异常:{ex.Message}", logName);
+                    }
+                    Thread.Sleep(basics.TaskHandleAccomplishSleepTime);
+                }
+            });
+        }
+        /// <summary>
+        /// 写入文件
+        /// </summary>
+        /// <param name="file">文件</param>
+        /// <param name="path">路径</param>
+        private static void WriteFile(IFormFile file, string path)
+        {
+            var stream = file.OpenReadStream();
+
+            // 把 Stream 转换成 byte[] 
+            byte[] bytes = new byte[stream.Length];
+            stream.Read(bytes, 0, bytes.Length);
+
+            // 设置当前流的位置为流的开始 
+            stream.Seek(0, SeekOrigin.Begin);
+
+            // 把 byte[] 写入文件 
+            FileStream fs = new FileStream(path, FileMode.Create);
+
+            BinaryWriter bw = new BinaryWriter(fs);
+            bw.Write(bytes);
+            bw.Close();
+            fs.Close();
+        }
+
         /// <summary>
         /// 这是释放所有包含自身对象
         /// </summary>
@@ -615,302 +669,238 @@ namespace YSAI.RelayManage
             GC.SuppressFinalize(this);
             ThisObjList = null;
         }
-
-        /// <summary>
-        /// 释放
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        public OperateResult Dispose(string SN)
+        public OperateResult SettingLib(List<IFormFile> FormFiles)
         {
-            Depart("Dispose");
+            Depart("SettingLib");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                List<string> FailMessage = new List<string>();
+                FormFiles.ForEach(file =>
                 {
-                    InstanceIoc[SN].Dispose();
-                    return Break("Dispose", true);
-                }
-                else
+                    var LibName = file.FileName;
+
+                    string path = Path.Combine(basics.LibFolder, LibName);
+
+                    if (!System.IO.File.Exists(path))
+                    {
+                        WriteFile(file, path);
+                    }
+                    else
+                    {
+                        FailMessage.Add($"{LibName} 已存在");
+                    }
+                });
+                if (FailMessage.Count > 0)
                 {
-                    return Break("Dispose", false, $"未找到 {SN} 的实例");
+                    return Break("SettingLib", false, $"存在{FailMessage.Count}个失败信息", FailMessage, ResultType.Json);
                 }
+                return Break("SettingLib", true);
             }
             catch (Exception ex)
             {
-                return Break("Dispose", false, ex.Message);
-            }
-        }
-        /// <summary>
-        /// 释放
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> DisposeAsync(string SN)
-        {
-            return Task.Run(() => Dispose(SN));
-        }
-        /// <summary>
-        /// 实例列表
-        /// </summary>
-        /// <returns>实例数组</returns>
-        public List<string>? InstanceList()
-        {
-            if (InstanceIoc != null)
-            {
-                return InstanceIoc.Keys.ToList();
+                return Break("SettingLib", false, ex.Message);
             }
-            return null;
         }
-        /// <summary>
-        /// 移除实例
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult Remove(string SN)
+        public OperateResult DeleteLib(List<string> LibNames)
         {
-            Depart("Remove");
+            Depart("DeleteLib");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                List<string> FailMessage = new List<string>();
+                foreach (string LibName in LibNames)
                 {
-                    if (InstanceIoc.Remove(SN, out _))
+                    string path = Path.Combine(basics.LibFolder, LibName);
+
+                    if (System.IO.File.Exists(path))
                     {
-                        return Break("Remove", true);
+                        System.IO.File.Delete(path);
                     }
                     else
                     {
-                        return Break("Remove", false, $"{SN} 的实例移除失败");
+                        FailMessage.Add($"{LibName} 不存在");
                     }
                 }
-                else
+                if (FailMessage.Count > 0)
                 {
-                    return Break("Remove", false, $"未找到 {SN} 的实例");
+                    return Break("DeleteLib", false, $"存在{FailMessage.Count}个失败信息", FailMessage, ResultType.Json);
                 }
+                return Break("DeleteLib", true);
             }
             catch (Exception ex)
             {
-                return Break("Remove", false, ex.Message);
+                return Break("DeleteLib", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 移除实例
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> RemoveAsync(string SN)
-        {
-            return Task.Run(() => Remove(SN));
-        }
-        /// <summary>
-        /// 打开
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> OnAsync(string SN)
-        {
-            return Task.Run(() => On(SN));
-        }
-        /// <summary>
-        /// 打开
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult On(string SN)
+        public OperateResult SettingLibConfig(List<IFormFile> FormFiles)
         {
-            Depart("On");
+            Depart("SettingLibConfig");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                List<string> FailMessage = new List<string>();
+                FormFiles.ForEach(file =>
                 {
-                    return InstanceIoc[SN].On();
-                }
-                else
+                    var configName = file.FileName;
+
+                    string path = Path.Combine(basics.LibConfigFolder, configName);
+
+                    if (!System.IO.File.Exists(path))
+                    {
+                        WriteFile(file, path);
+                    }
+                    else
+                    {
+                        FailMessage.Add($"{configName} 已存在,请执行修改库配置文件");
+                    }
+                });
+                if (FailMessage.Count > 0)
                 {
-                    return Break("On", false, $"未找到 {SN} 的实例");
+                    return Break("SettingLibConfig", false, $"存在{FailMessage.Count}个失败信息", FailMessage, ResultType.Json);
                 }
+                return Break("SettingLibConfig", true);
             }
             catch (Exception ex)
             {
-                return Break("On", false, ex.Message);
+                return Break("SettingLibConfig", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 打开所有
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> OnAllAsync()
+        public OperateResult UpdateLibConfig(List<IFormFile> FormFiles)
         {
-            return Task.Run(() => OnAll());
-        }
-        /// <summary>
-        /// 打开所有
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult OnAll()
-        {
-            Depart("OnAll");
+            Depart("UpdateLibConfig");
             try
             {
-                if (InstanceIoc != null && InstanceIoc.Count > 0)
+                List<string> FailMessage = new List<string>();
+                FormFiles.ForEach(file =>
                 {
-                    List<string> FailMessage = new List<string>();
-                    foreach (var item in InstanceIoc)
-                    {
-                        OperateResult operateResult = item.Value.On();
-                        if (!operateResult.State)
-                        {
-                            FailMessage.Add(operateResult.Message);
-                        }
-                    }
-                    if (FailMessage.Count > 0)
+
+                    string path = Path.Combine(basics.LibConfigFolder, file.FileName);
+
+                    if (!System.IO.File.Exists(path))
                     {
-                        return Break("OnAll", false, $"存在{FailMessage.Count}个异常信息,请查看RData", FailMessage, ResultType.All);
+                        WriteFile(file, path);
                     }
                     else
                     {
-                        return Break("OnAll", true);
+                        System.IO.File.Delete(path);
+                        WriteFile(file, path);
                     }
-                }
-                else
+                });
+                if (FailMessage.Count > 0)
                 {
-                    return Break("OnAll", false,"实例为空");
+                    return Break("UpdateLibConfig", false, $"存在{FailMessage.Count}个失败信息", FailMessage, ResultType.Json);
                 }
+                return Break("UpdateLibConfig", true);
             }
             catch (Exception ex)
             {
-                return Break("OnAll", false, ex.Message);
+                return Break("UpdateLibConfig", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 关闭
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> OffAsync(string SN)
-        {
-            return Task.Run(() => Off(SN));
-        }
-        /// <summary>
-        /// 关闭
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult Off(string SN)
+        public OperateResult DisposeISn(string ISn)
         {
-            Depart("Off");
+            Depart("Dispose");
             try
             {
-                if (InstanceIoc.ContainsKey(SN))
+                if (InstanceIoc.ContainsKey(ISn))
                 {
-                    return InstanceIoc[SN].Off();
+                   OperateResult operateResult = RemoveISn(ISn);
+                   return Break("Dispose", operateResult.State, operateResult.Message);
                 }
                 else
                 {
-                    return Break("Off", false, $"未找到 {SN} 的实例");
+                    return Break("Dispose", false, $"未找到 {ISn} 的实例");
                 }
             }
             catch (Exception ex)
             {
-                return Break("Off", false, ex.Message);
+                return Break("Dispose", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 关闭所有
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> OffAllAsync()
+        public List<string>? TypeSns()
         {
-            return Task.Run(() => OffAll());
+            if (TypeIoc != null)
+            {
+                return TypeIoc.Keys.ToList();
+            }
+            return null;
         }
-        /// <summary>
-        /// 关闭所有
-        /// </summary>
-        /// <param name="SN">实例的唯一标识符</param>
-        /// <returns>统一出参</returns>
-        public OperateResult OffAll()
+        public List<string>? InstanceSns()
+        {
+            if (InstanceIoc != null)
+            {
+                return InstanceIoc.Keys.ToList();
+            }
+            return null;
+        }
+        public OperateResult RemoveISn(string ISn)
         {
-            Depart("OffAll");
+            Depart("Remove");
             try
             {
-                if (InstanceIoc != null && InstanceIoc.Count > 0)
+                if (InstanceIoc.ContainsKey(ISn))
                 {
-                    List<string> FailMessage = new List<string>();
-                    foreach (var item in InstanceIoc)
+                    IRelay? relay;
+                    if (InstanceIoc.Remove(ISn, out relay))
                     {
-                        OperateResult operateResult = item.Value.Off();
-                        if (!operateResult.State)
+                        if (relay != null)
                         {
-                            FailMessage.Add(operateResult.Message);
+                            //直接释放
+                            relay.Dispose();
                         }
-                    }
-                    if (FailMessage.Count > 0)
-                    {
-                        return Break("OffAll", false, $"存在{FailMessage.Count}个异常信息,请查看RData", FailMessage, ResultType.All);
+                        return Break("Remove", true);
                     }
                     else
                     {
-                        return Break("OffAll", true);
+                        return Break("Remove", false, $"{ISn} 的实例移除失败");
                     }
                 }
                 else
                 {
-                    return Break("OffAll", false, "实例为空");
+                    return Break("Remove", false, $"未找到 {ISn} 的实例");
                 }
             }
             catch (Exception ex)
             {
-                return Break("OffAll", false, ex.Message);
+                return Break("Remove", false, ex.Message);
             }
         }
-
-        /// <summary>
-        /// 任务处理
-        /// </summary>
-        /// <returns></returns>
-        private Task TaskHandle()
+        public OperateResult On(string ISn)
         {
-            string logName = "TaskHandle.log";
-            //起个新线程处理
-            return Task.Factory.StartNew(() =>
+            Depart("On");
+            try
             {
-                //循环
-                while (TaskArray != null)
+                if (InstanceIoc.ContainsKey(ISn))
                 {
-                    try
-                    {
-                        //队列数据
-                        QueueData? queueData;
-                        //出列
-                        while (DataQueue.TryDequeue(out queueData))
-                        {
-                            if (queueData != null)
-                            {
-                                foreach (var item in InstanceIoc)
-                                {
-                                    OperateResult operateResult = item.Value.Produce(queueData.Topic, queueData.Content);
-                                    OnEventHandler?.Invoke(this, new EventResult(operateResult.State, operateResult.Message, operateResult.RData, operateResult.RType));
-                                }
-                            }
-                        }
-                    }
-                    catch (Exception ex)
-                    {
-                        LogHelper.Error($"任务处理异常:{ex.Message}", logName);
-                    }
-                    Thread.Sleep(basics.TaskHandleAccomplishSleepTime);
+                    return InstanceIoc[ISn].On();
                 }
-            });
+                else
+                {
+                    return Break("On", false, $"未找到 {ISn} 的实例");
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("On", false, ex.Message);
+            }
+        }
+        public OperateResult Off(string ISn)
+        {
+            Depart("Off");
+            try
+            {
+                if (InstanceIoc.ContainsKey(ISn))
+                {
+                    return InstanceIoc[ISn].Off();
+                }
+                else
+                {
+                    return Break("Off", false, $"未找到 {ISn} 的实例");
+                }
+            }
+            catch (Exception ex)
+            {
+                return Break("Off", false, ex.Message);
+            }
         }
-
-        /// <summary>
-        /// 生产
-        /// </summary>
-        /// <param name="Topic">主题</param>
-        /// <param name="Content">内容</param>
-        /// <returns>统一出参</returns>
         public OperateResult Produce(string Topic, string Content)
         {
             Depart("Produce");
@@ -939,15 +929,5 @@ namespace YSAI.RelayManage
                 return Break("Produce", false, ex.Message);
             }
         }
-        /// <summary>
-        /// 生产
-        /// </summary>
-        /// <param name="Topic">主题</param>
-        /// <param name="Content">内容</param>
-        /// <returns>统一出参</returns>
-        public Task<OperateResult> ProduceAsync(string Topic, string Content)
-        {
-            return Task.Run(() => Produce(Topic, Content));
-        }
     }
 }

+ 4 - 4
src/YSAI.DAQ/YSAI.Test/TestAll.cs

@@ -546,7 +546,7 @@ namespace YSAI.Test
             List<AddressManage> addressManages = new List<AddressManage>();
 
             AddressManage addressManage = new AddressManage();
-            addressManage.DType = Core.@enum.DaqType.OpcDa;
+            addressManage.DType = Core.@enum.LibType.OpcDa;
             addressManage.SN = "OPCDA²É¼¯";
             addressManage.InstanceParam = new OpcDaClientData.Basics() { SN = "OPCDA²É¼¯", ServiceName = "Knight.OPC.Server.Demo", ApiVerType = OpcDaClientData.ApiVerType.COM_DA_20 };
             addressManage.AddressArray = new List<AddressDetails>()
@@ -627,7 +627,7 @@ namespace YSAI.Test
             addressManages.Add(addressManage);
 
             addressManage = new AddressManage();
-            addressManage.DType = Core.@enum.DaqType.OpcUa;
+            addressManage.DType = Core.@enum.LibType.OpcUa;
             addressManage.SN = "OPCUA²É¼¯";
             addressManage.InstanceParam = new OpcUaClientData.Basics() { SN = "OPCUA²É¼¯", Name = "TEST", Password = "ysai", UserName = "ysai", ServerUrl = "opc.tcp://192.168.2.38:8866/Opc.Ua.Service", SamplingInterval = 100 };
             addressManage.AddressArray = new List<AddressDetails>()
@@ -874,7 +874,7 @@ namespace YSAI.Test
             List<AddressManage> addressManages = new List<AddressManage>();
 
             AddressManage addressManage = new AddressManage();
-            addressManage.DType = Core.@enum.DaqType.OpcDa;
+            addressManage.DType = Core.@enum.LibType.OpcDa;
             addressManage.SN = "OPCDA²É¼¯";
             addressManage.InstanceParam = new OpcDaClientData.Basics() { SN = "OPCDA²É¼¯", ServiceName = "Knight.OPC.Server.Demo", ApiVerType = OpcDaClientData.ApiVerType.COM_DA_20 };
             addressManage.AddressArray = new List<AddressDetails>()
@@ -955,7 +955,7 @@ namespace YSAI.Test
             addressManages.Add(addressManage);
 
             addressManage = new AddressManage();
-            addressManage.DType = Core.@enum.DaqType.OpcUa;
+            addressManage.DType = Core.@enum.LibType.OpcUa;
             addressManage.SN = "OPCUA²É¼¯";
             addressManage.InstanceParam = new OpcUaClientData.Basics() { SN = "OPCUA²É¼¯", Name = "TEST", Password = "ysai", UserName = "ysai", ServerUrl = "opc.tcp://192.168.2.38:8866/Opc.Ua.Service", SamplingInterval = 100 };
             addressManage.AddressArray = new List<AddressDetails>()