Przeglądaj źródła

1. OPCUA客户端工具改造完成
2. OPCUA服务端动态库修改
3. OPCUA服务端工具改造完成

Shun 2 lat temu
rodzic
commit
734749651d

+ 6 - 1
README.md

@@ -559,4 +559,9 @@ while(true)
 
 #### 2023-12-20
 1. 优化工具界面
-2. 改成OPCUA客户端界面
+2. 改造OPCUA客户端界面
+
+#### 2023-12-22
+1. OPCUA客户端工具改造完成
+2. OPCUA服务端动态库修改
+3. OPCUA服务端工具改造完成

+ 21 - 36
src/YSAI.Core.Wpf/mvvm/NotifyObject.cs

@@ -1,5 +1,6 @@
 using CommunityToolkit.Mvvm.ComponentModel;
 using System.Linq.Expressions;
+using System.Reflection;
 
 namespace YSAI.Core.Wpf.mvvm
 {
@@ -9,47 +10,47 @@ namespace YSAI.Core.Wpf.mvvm
     public class NotifyObject : ObservableObject
     {
 
-        #region property bag
+        #region 属性包
         Dictionary<string, object> _propertyBag;
         Dictionary<string, object> PropertyBag => _propertyBag ?? (_propertyBag = new Dictionary<string, object>());
-#if DEBUG
-        internal Dictionary<string, object> PropertyBagForTests => PropertyBag;
-#endif
+
         T GetPropertyCore<T>(string propertyName)
         {
-            object val;
-            if (PropertyBag.TryGetValue(propertyName, out val))
+            if (PropertyBag.TryGetValue(propertyName, out object? val))
+            {
                 return (T)val;
+            }
             return default(T);
         }
 
         bool SetPropertyCore<T>(string propertyName, T value, Action changedCallback)
         {
-            T oldValue;
-            var res = SetPropertyCore(propertyName, value, out oldValue);
+            bool res = SetPropertyCore(propertyName, value, out T oldValue);
             if (res)
             {
                 changedCallback?.Invoke();
             }
             return res;
         }
+
         bool SetPropertyCore<T>(string propertyName, T value, Action<T> changedCallback)
         {
-            T oldValue;
-            var res = SetPropertyCore(propertyName, value, out oldValue);
+            bool res = SetPropertyCore(propertyName, value, out T oldValue);
             if (res)
             {
                 changedCallback?.Invoke(oldValue);
             }
             return res;
         }
+
         protected virtual bool SetPropertyCore<T>(string propertyName, T value, out T oldValue)
         {
             VerifyAccess();
             oldValue = default(T);
-            object val;
-            if (PropertyBag.TryGetValue(propertyName, out val))
+            if (PropertyBag.TryGetValue(propertyName, out object? val))
+            {
                 oldValue = (T)val;
+            }
             if (CompareValues<T>(oldValue, value))
                 return false;
             lock (PropertyBag)
@@ -70,47 +71,32 @@ namespace YSAI.Core.Wpf.mvvm
         }
         #endregion
 
-
-
-
-
-
-
-
-
-
         public static string GetPropertyName<T>(Expression<Func<T>> expression)
         {
             return GetPropertyNameFast(expression);
         }
         internal static string GetPropertyNameFast(LambdaExpression expression)
         {
-            MemberExpression memberExpression = expression.Body as MemberExpression;
+            MemberExpression? memberExpression = expression.Body as MemberExpression;
             if (memberExpression == null)
             {
-                throw new ArgumentException("MemberExpression is expected in expression.Body", "NotifyObject");
+                throw new ArgumentException("成员表达式应该在表达式体中", "NotifyObject");
             }
+            MemberInfo member = memberExpression.Member;
             const string vblocalPrefix = "$VB$Local_";
-            var member = memberExpression.Member;
-            if (
-                member.MemberType == System.Reflection.MemberTypes.Field &&
-                member.Name != null &&
-                member.Name.StartsWith(vblocalPrefix))
+            if (member.MemberType == System.Reflection.MemberTypes.Field && member.Name != null && member.Name.StartsWith(vblocalPrefix))
+            {
                 return member.Name.Substring(vblocalPrefix.Length);
+            }
             return member.Name;
         }
-
-
-
-
         protected T GetProperty<T>(Expression<Func<T>> expression)
         {
             return GetPropertyCore<T>(GetPropertyName(expression));
         }
         protected bool SetProperty<T>(Expression<Func<T>> expression, T value, Action<T> changedCallback)
         {
-            string propertyName = GetPropertyName(expression);
-            return SetPropertyCore(propertyName, value, changedCallback);
+            return SetPropertyCore(GetPropertyName(expression), value, changedCallback);
         }
         protected bool SetProperty<T>(Expression<Func<T>> expression, T value)
         {
@@ -118,8 +104,7 @@ namespace YSAI.Core.Wpf.mvvm
         }
         protected bool SetProperty<T>(Expression<Func<T>> expression, T value, Action changedCallback)
         {
-            string propertyName = GetPropertyName(expression);
-            return SetPropertyCore(propertyName, value, changedCallback);
+            return SetPropertyCore(GetPropertyName(expression), value, changedCallback);
         }
     }
 }

+ 1 - 1
src/YSAI.DAQ.Samples/YSAI.DAQ.Samples.csproj

@@ -99,7 +99,7 @@
 
   <ItemGroup>
     <PackageReference Include="YSAI.Mqtt" Version="23.352.38022" />
-    <PackageReference Include="YSAI.Opc" Version="23.353.7802" />
+    <PackageReference Include="YSAI.Opc" Version="23.356.35571" />
   </ItemGroup>
 
   <ItemGroup>

+ 1 - 1
src/YSAI.Opc/YSAI.Opc.csproj

@@ -3,7 +3,7 @@
     <TargetFrameworks>net6.0;net8.0</TargetFrameworks>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-    <Version>23.353.7802</Version>
+    <Version>23.356.35571</Version>
     <PackageOutputPath Condition="'$(Configuration)' == 'Release'">../YSAI.Publish/Release</PackageOutputPath>
     <PackageOutputPath Condition="'$(Configuration)' == 'Debug'">../YSAI.Publish/Debug</PackageOutputPath>
     <Authors>Shun</Authors>

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

@@ -529,6 +529,11 @@ namespace YSAI.Opc.ua.service
             string SN = Depart("On");
             try
             {
+                if (string.IsNullOrWhiteSpace(basics.UserName) || string.IsNullOrWhiteSpace(basics.Password))
+                {
+                    return Break(SN, false, "用户名或密码不能为空");
+                }
+
                 ApplicationInstance.MessageDlg = new MessageDlg();
                 //实例化对象
                 AI = new ApplicationInstance();

+ 16 - 13
src/YSAI.Tool.Wpf/TestController.cs

@@ -125,22 +125,25 @@ namespace YSAI.Tool.Wpf
         /// </summary>
         /// <param name="Data">数据</param>
         /// <param name="IsDate">需要时间</param>
-        private void Output(string Data, bool IsDate = true)
+        private Task Output(string Data, bool IsDate = true)
         {
-            System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
+            return Task.Run(() =>
             {
-                if (Info?.Length > 5000)
+                System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
                 {
-                    Info = string.Empty;
-                }
-                if (IsDate)
-                {
-                    Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
-                }
-                else
-                {
-                    Info += $"{Data}\r\n";
-                }
+                    if (Info?.Length > 10000)
+                    {
+                        Info = string.Empty;
+                    }
+                    if (IsDate)
+                    {
+                        Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
+                    }
+                    else
+                    {
+                        Info += $"{Data}\r\n";
+                    }
+                });
             });
         }
         /// <summary>

+ 1 - 1
src/YSAI.Tool.Wpf/YSAI.Tool.Wpf.csproj

@@ -28,7 +28,7 @@
 		<PackageReference Include="YSAI.NetMQ" Version="23.352.38022" />
 		<PackageReference Include="YSAI.Netty" Version="23.352.38022" />
 		<PackageReference Include="YSAI.Omron" Version="23.353.7802" />
-		<PackageReference Include="YSAI.Opc" Version="23.353.7802" />
+		<PackageReference Include="YSAI.Opc" Version="23.356.35571" />
 		<PackageReference Include="YSAI.RabbitMQ" Version="23.352.38022" />
 		<PackageReference Include="YSAI.Redis" Version="23.352.38022" />
 		<PackageReference Include="YSAI.Siemens" Version="23.353.7802" />

+ 1 - 1
src/YSAI.Tool.Wpf/controllers/MainController.cs

@@ -33,7 +33,7 @@ namespace YSAI.Tool.Wpf.controllers
                         MenuItems = new object[]
                         {
                             CreationControl(string.Format("{0,-8}{1}", "[ 客户端 ]", "UA"), SymbolRegular.DocumentTextToolbox24, typeof(UaClient)),
-                            CreationControl(string.Format("{0,-8}{1}", "[ 服务端 ]", "UA"), SymbolRegular.DesktopToolbox24, typeof(AboutUs)),
+                            CreationControl(string.Format("{0,-8}{1}", "[ 服务端 ]", "UA"), SymbolRegular.DesktopToolbox24, typeof(UaService)),
                             CreationControl(string.Format("{0,-8}{1}", "[ 客户端 ]", "DA ( x86 run )"), SymbolRegular.ClockToolbox24, typeof(AboutUs)),
                             CreationControl(string.Format("{0,-8}{1}", "[ HTTP ]", "DA"), SymbolRegular.BookToolbox24, typeof(AboutUs))
                         }

+ 16 - 13
src/YSAI.Tool.Wpf/controllers/SerialController.cs

@@ -130,22 +130,25 @@ namespace YSAI.Tool.Wpf.controllers
         /// </summary>
         /// <param name="Data">数据</param>
         /// <param name="IsDate">需要时间</param>
-        private void Output(string Data, bool IsDate = true)
+        private Task Output(string Data, bool IsDate = true)
         {
-            System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
+            return Task.Run(() =>
             {
-                if (Info?.Length > 5000)
+                System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
                 {
-                    Info = string.Empty;
-                }
-                if (IsDate)
-                {
-                    Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
-                }
-                else
-                {
-                    Info += $"{Data}\r\n";
-                }
+                    if (Info?.Length > 10000)
+                    {
+                        Info = string.Empty;
+                    }
+                    if (IsDate)
+                    {
+                        Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
+                    }
+                    else
+                    {
+                        Info += $"{Data}\r\n";
+                    }
+                });
             });
         }
         /// <summary>

+ 16 - 13
src/YSAI.Tool.Wpf/controllers/TcpClientController.cs

@@ -129,22 +129,25 @@ namespace YSAI.Tool.Wpf.controllers
         /// </summary>
         /// <param name="Data">数据</param>
         /// <param name="IsDate">需要时间</param>
-        private void Output(string Data, bool IsDate = true)
+        private Task Output(string Data, bool IsDate = true)
         {
-            System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
+            return Task.Run(() =>
             {
-                if (Info?.Length > 5000)
+                System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
                 {
-                    Info = string.Empty;
-                }
-                if (IsDate)
-                {
-                    Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
-                }
-                else
-                {
-                    Info += $"{Data}\r\n";
-                }
+                    if (Info?.Length > 10000)
+                    {
+                        Info = string.Empty;
+                    }
+                    if (IsDate)
+                    {
+                        Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
+                    }
+                    else
+                    {
+                        Info += $"{Data}\r\n";
+                    }
+                });
             });
         }
         /// <summary>

+ 16 - 13
src/YSAI.Tool.Wpf/controllers/TcpServiceController.cs

@@ -136,22 +136,25 @@ namespace YSAI.Tool.Wpf.controllers
         /// </summary>
         /// <param name="Data">数据</param>
         /// <param name="IsDate">需要时间</param>
-        private void Output(string Data, bool IsDate = true)
+        private Task Output(string Data, bool IsDate = true)
         {
-            System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
+            return Task.Run(() =>
             {
-                if (Info?.Length > 5000)
+                System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
                 {
-                    Info = string.Empty;
-                }
-                if (IsDate)
-                {
-                    Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
-                }
-                else
-                {
-                    Info += $"{Data}\r\n";
-                }
+                    if (Info?.Length > 10000)
+                    {
+                        Info = string.Empty;
+                    }
+                    if (IsDate)
+                    {
+                        Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
+                    }
+                    else
+                    {
+                        Info += $"{Data}\r\n";
+                    }
+                });
             });
         }
         /// <summary>

Plik diff jest za duży
+ 521 - 536
src/YSAI.Tool.Wpf/controllers/UaClientController.cs


+ 239 - 0
src/YSAI.Tool.Wpf/controllers/UaServiceController.cs

@@ -0,0 +1,239 @@
+using CommunityToolkit.Mvvm.Input;
+using System.IO;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Input;
+using YSAI.Core.Wpf.mvvm;
+using YSAI.Model.data;
+using YSAI.Opc.ua.service;
+using YSAI.Unility;
+using static YSAI.Opc.ua.service.OpcUaServiceData;
+
+namespace YSAI.Tool.Wpf.controllers
+{
+    public class UaServiceController : NotifyObject
+    {
+        public UaServiceController()
+        {
+            //初始化基础数据
+            BasicsData = new Basics();
+            //工具标题
+            ToolTitle = "OpcUa 服务端工具";
+            //配置文件名
+            FileName = typeof(OpcUaServiceData).Name;
+            //Ascii是否显示
+            AsciiVisibility = Visibility.Collapsed;
+            //Hex是否显示
+            HexVisibility = Visibility.Collapsed;
+            //信息格式;  0 ASCII ; 1 HEX
+            InfoFormat = 0;
+        }
+
+        #region 统一需要的数据
+        /// <summary>
+        /// 导出的文件名
+        /// </summary>
+        private string FileName { get; set; }
+        /// <summary>
+        /// 工具标题
+        /// </summary>
+        public string ToolTitle
+        {
+            get => GetProperty(() => ToolTitle);
+            set => SetProperty(() => ToolTitle, value);
+        }
+        /// <summary>
+        /// 数据源
+        /// </summary>
+        public Basics BasicsData
+        {
+            get => GetProperty(() => BasicsData);
+            set => SetProperty(() => BasicsData, value);
+        }
+
+        /// <summary>
+        /// 导入基础数据命令
+        /// </summary>
+        public ICommand IncBasics { get => new RelayCommand(OnIncBasics); }
+
+        /// <summary>
+        /// 导入基础数据
+        /// </summary>
+        public void OnIncBasics()
+        {
+            (string RetFilePath, string RetFileName) Data = Unility.Windows.FileTool.SelectFiles("json");
+            if (!string.IsNullOrEmpty(Data.RetFilePath))
+            {
+                Basics? basics = FileTool.FileToString(Data.RetFilePath).ToJsonEntity<Basics>();
+                if (basics == null)
+                {
+                    Output("导入失败");
+                }
+                else
+                {
+                    Output("导入成功");
+                    BasicsData = basics;
+                }
+            }
+        }
+
+        /// <summary>
+        /// 导出基础数据命令
+        /// </summary>
+        public ICommand ExpBasics { get => new RelayCommand(OnExpBasics); }
+
+        /// <summary>
+        /// 导出基础数据
+        /// </summary>
+        public void OnExpBasics()
+        {
+            string path = Unility.Windows.FileTool.SelectFolder();
+            if (!string.IsNullOrEmpty(path))
+            {
+                FileTool.StringToFile(Path.Combine(path, $"{FileName}[{DateTime.Now.ToString("yyyyMMddHHmmss")}].json"), BasicsData.ToJson());
+                Output("导出成功");
+            }
+        }
+
+        private string _info = string.Empty;
+        /// <summary>
+        /// 信息
+        /// </summary>
+        public string Info
+        {
+            get => _info;
+            set => SetProperty(ref _info, value);
+        }
+
+        /// <summary>
+        /// 信息框事件
+        /// </summary>
+        public ICommand Info_TextChanged { get => new RelayCommand<TextChangedEventArgs>(OnInfo_TextChanged); }
+
+        /// <summary>
+        /// 信息框事件
+        /// 让滚动条一直处在最下方
+        /// </summary>
+        public void OnInfo_TextChanged(System.Windows.Controls.TextChangedEventArgs e)
+        {
+            System.Windows.Controls.TextBox textBox = (System.Windows.Controls.TextBox)e.Source;
+            textBox.SelectionStart = textBox.Text.Length;
+            textBox.SelectionLength = 0;
+            textBox.ScrollToEnd();
+        }
+
+        /// <summary>
+        /// 输出标准消息
+        /// </summary>
+        /// <param name="Data">数据</param>
+        /// <param name="IsDate">需要时间</param>
+        private Task Output(string Data, bool IsDate = true)
+        {
+            return Task.Run(() =>
+            {
+                System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
+                {
+                    if (Info?.Length > 10000)
+                    {
+                        Info = string.Empty;
+                    }
+                    if (IsDate)
+                    {
+                        Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
+                    }
+                    else
+                    {
+                        Info += $"{Data}\r\n";
+                    }
+                });
+            });
+        }
+        /// <summary>
+        /// ascii
+        /// </summary>
+        public Visibility AsciiVisibility
+        {
+            get => GetProperty(() => AsciiVisibility);
+            set => SetProperty(() => AsciiVisibility, value);
+        }
+        /// <summary>
+        /// hex
+        /// </summary>
+        public Visibility HexVisibility
+        {
+            get => GetProperty(() => HexVisibility);
+            set => SetProperty(() => HexVisibility, value);
+        }
+
+        /// <summary>
+        /// 接收数据格式
+        /// 0 ASCII
+        /// 1 HEX
+        /// </summary>
+        public int InfoFormat
+        {
+            get => GetProperty(() => InfoFormat);
+            set => SetProperty(() => InfoFormat, value);
+        }
+
+        /// <summary>
+        /// 清空信息命令
+        /// </summary>
+        public ICommand Clear { get => new RelayCommand(OnClear); }
+
+        /// <summary>
+        /// 清空信息
+        /// </summary>
+        public void OnClear()
+        {
+            Info = string.Empty;
+        }
+
+        /// <summary>
+        /// 基础数据的显示隐藏
+        /// </summary>
+        public bool BasicsData_ToggleButtonIsChecked
+        {
+            get => GetProperty(() => BasicsData_ToggleButtonIsChecked);
+            set => SetProperty(() => BasicsData_ToggleButtonIsChecked, value);
+        }
+
+
+        #endregion 统一需要的数据
+
+        /// <summary>
+        /// 通信
+        /// </summary>
+        private OpcUaServiceOperate communication;
+
+        /// <summary>
+        /// 启动
+        /// </summary>
+        public ICommand Start { get => new RelayCommand(OnStart); }
+        private void OnStart()
+        {
+            communication = OpcUaServiceOperate.Instance(BasicsData);
+            communication.OnEvent -= Communication_OnEvent;
+            communication.OnEvent += Communication_OnEvent;
+            OperateResult operateResult = communication.On();
+            Output(operateResult.ToJson().JsonFormatting());
+        }
+
+
+        /// <summary>
+        /// 停止
+        /// </summary>
+        public ICommand Stop { get => new RelayCommand(OnStop); }
+        private void OnStop()
+        {
+            if (communication == null) return;
+            OperateResult operateResult = communication.Off();
+            Output(operateResult.ToJson().JsonFormatting());
+        }
+
+        private void Communication_OnEvent(object? sender, EventResult e)
+        {
+            Output(e.Message);
+        }
+    }
+}

+ 16 - 13
src/YSAI.Tool.Wpf/controllers/UdpController.cs

@@ -137,22 +137,25 @@ namespace YSAI.Tool.Wpf.controllers
         /// </summary>
         /// <param name="Data">数据</param>
         /// <param name="IsDate">需要时间</param>
-        private void Output(string Data, bool IsDate = true)
+        private Task Output(string Data, bool IsDate = true)
         {
-            System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
+            return Task.Run(() =>
             {
-                if (Info?.Length > 5000)
+                System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
                 {
-                    Info = string.Empty;
-                }
-                if (IsDate)
-                {
-                    Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
-                }
-                else
-                {
-                    Info += $"{Data}\r\n";
-                }
+                    if (Info?.Length > 10000)
+                    {
+                        Info = string.Empty;
+                    }
+                    if (IsDate)
+                    {
+                        Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
+                    }
+                    else
+                    {
+                        Info += $"{Data}\r\n";
+                    }
+                });
             });
         }
         /// <summary>

+ 16 - 13
src/YSAI.Tool.Wpf/controllers/WsClientController.cs

@@ -126,22 +126,25 @@ namespace YSAI.Tool.Wpf.controllers
         /// </summary>
         /// <param name="Data">数据</param>
         /// <param name="IsDate">需要时间</param>
-        private void Output(string Data, bool IsDate = true)
+        private Task Output(string Data, bool IsDate = true)
         {
-            System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
+            return Task.Run(() =>
             {
-                if (Info?.Length > 5000)
+                System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
                 {
-                    Info = string.Empty;
-                }
-                if (IsDate)
-                {
-                    Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
-                }
-                else
-                {
-                    Info += $"{Data}\r\n";
-                }
+                    if (Info?.Length > 10000)
+                    {
+                        Info = string.Empty;
+                    }
+                    if (IsDate)
+                    {
+                        Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
+                    }
+                    else
+                    {
+                        Info += $"{Data}\r\n";
+                    }
+                });
             });
         }
         /// <summary>

+ 16 - 13
src/YSAI.Tool.Wpf/controllers/WsServiceController.cs

@@ -131,22 +131,25 @@ namespace YSAI.Tool.Wpf.controllers
         /// </summary>
         /// <param name="Data">数据</param>
         /// <param name="IsDate">需要时间</param>
-        private void Output(string Data, bool IsDate = true)
+        private Task Output(string Data, bool IsDate = true)
         {
-            System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
+            return Task.Run(() =>
             {
-                if (Info?.Length > 5000)
+                System.Windows.Application.Current?.Dispatcher.Invoke(delegate ()
                 {
-                    Info = string.Empty;
-                }
-                if (IsDate)
-                {
-                    Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
-                }
-                else
-                {
-                    Info += $"{Data}\r\n";
-                }
+                    if (Info?.Length > 10000)
+                    {
+                        Info = string.Empty;
+                    }
+                    if (IsDate)
+                    {
+                        Info += $" {DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff")} : {Data}\r\n";
+                    }
+                    else
+                    {
+                        Info += $"{Data}\r\n";
+                    }
+                });
             });
         }
         /// <summary>

+ 9 - 9
src/YSAI.Tool.Wpf/views/UaClient.xaml

@@ -105,6 +105,7 @@
                         </EventTrigger>
                     </ToggleButton.Triggers>
                 </ToggleButton>
+                
                 <!--基础数据-->
                 <Grid Grid.Column="0"  x:Name="propertyGrid" Margin="0,0,3,0" Width="550">
                     <Grid.RowDefinitions>
@@ -209,6 +210,7 @@ CategoryHeaderTemplate="{StaticResource HeaderTemplate}"/>
                         <RowDefinition Height="auto"/>
                         <RowDefinition Height="*"/>
                     </Grid.RowDefinitions>
+                    
                     <ToggleButton Grid.Row="0" Grid.RowSpan="2" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="8,8,0,0" ToolTip="基础数据[隐藏/显示]" Panel.ZIndex="3" IsChecked="{Binding BasicsData_ToggleButtonIsChecked}">
                         <ToggleButton.Template>
                             <ControlTemplate TargetType="{x:Type ToggleButton}">
@@ -245,6 +247,7 @@ CategoryHeaderTemplate="{StaticResource HeaderTemplate}"/>
                             </EventTrigger>
                         </ToggleButton.Triggers>
                     </ToggleButton>
+                    
                     <!--功能模块-->
                     <GroupBox Style="{StaticResource GroupBoxTab}" Margin="0" Grid.Row="0">
                         <GroupBox.Header>
@@ -261,9 +264,6 @@ CategoryHeaderTemplate="{StaticResource HeaderTemplate}"/>
                         </GroupBox.Header>
                         <!--■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■-->
 
-
-
-
                         <Grid>
                             <Grid.RowDefinitions>
                                 <RowDefinition Height="auto"/>
@@ -479,8 +479,8 @@ Content="清空"/>
                                         </StackPanel>
                                     </GroupBox.Header>
                                     <TreeView  Background="Transparent" Margin="5,5,0,5"  BorderBrush="{DynamicResource Control.Border.Color}" ItemsSource="{Binding Node}" Style="{StaticResource TreeViewStyle}" >
-                                        <!--右键菜单-->
-                                        <TreeView.ContextMenu>
+                                        <!--右键菜单暂不使用-->
+                                        <!--<TreeView.ContextMenu>
                                             <ContextMenu VerticalContentAlignment="Center" FontSize="13">
                                                 <MenuItem Header="批量订阅" Foreground="{DynamicResource Font.Content.Foreground}">
                                                     <i:Interaction.Triggers>
@@ -519,16 +519,16 @@ Content="清空"/>
                                                     </MenuItem.Icon>
                                                 </MenuItem>
                                             </ContextMenu>
-                                        </TreeView.ContextMenu>
+                                        </TreeView.ContextMenu>-->
                                         <i:Interaction.Triggers>
                                             <!--选中-->
                                             <i:EventTrigger EventName="SelectedItemChanged">
                                                 <mvvm:EventCommand  Command="{Binding TreeView_SelectedItemChanged}" />
                                             </i:EventTrigger>
-                                            <!--右键按下-->
-                                            <i:EventTrigger EventName="PreviewMouseRightButtonDown">
+                                            <!--右键按下暂不使用-->
+                                            <!--<i:EventTrigger EventName="PreviewMouseRightButtonDown">
                                                 <mvvm:EventCommand  Command="{Binding TreeView_PreviewMouseRightButtonDown}" />
-                                            </i:EventTrigger>
+                                            </i:EventTrigger>-->
                                             <!--项被展开-->
                                             <mvvm:RoutedEventTrigger RoutedEvent="TreeViewItem.Expanded">
                                                 <mvvm:EventCommand  Command="{Binding TreeViewItem_Expanded}" />

+ 310 - 0
src/YSAI.Tool.Wpf/views/UaService.xaml

@@ -0,0 +1,310 @@
+<UserControl x:Class="YSAI.Tool.Wpf.views.UaService"
+             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
+             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
+             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
+             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
+             xmlns:local="clr-namespace:YSAI.Tool.Wpf.views"
+             xmlns:c="clr-namespace:YSAI.Tool.Wpf.controllers"
+             xmlns:txt="clr-namespace:YSAI.Core.Wpf.controls.textbox;assembly=YSAI.Core.Wpf"
+             xmlns:btn="clr-namespace:YSAI.Core.Wpf.controls.button;assembly=YSAI.Core.Wpf"
+             xmlns:pt="http://propertytools.org/wpf"
+             xmlns:helpers="clr-namespace:YSAI.Core.Wpf.style;assembly=YSAI.Core.Wpf"
+             xmlns:cs="clr-namespace:YSAI.Core.Wpf.converters;assembly=YSAI.Core.Wpf"
+             xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
+             xmlns:mvvm="clr-namespace:YSAI.Core.Wpf.mvvm;assembly=YSAI.Core.Wpf"
+             Background="{DynamicResource ContentBackgroundPicture}">
+    <UserControl.DataContext>
+        <c:UaServiceController />
+    </UserControl.DataContext>
+
+
+
+    <!--资源加载-->
+    <UserControl.Resources>
+        <ResourceDictionary>
+            <Style TargetType="ToolTip">
+                <Setter Property="Foreground" Value="{DynamicResource Font.Content.Foreground}"/>
+                <Setter Property="BorderBrush" Value="{DynamicResource Control.Border.Color}"/>
+            </Style>
+            <cs:CheckConverter x:Key="CheckConverter" />
+            <ResourceDictionary.MergedDictionaries>
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_ComboBox.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_Button.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_DataGrid.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_Border.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_TbaControl.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_ScrollViewer.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_GroupBox.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_TextBox.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_CheckBox.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_RadioButton.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_DatePicker.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_ContextMenu.xaml" />
+                <ResourceDictionary Source="pack://application:,,,/YSAI.Core.Wpf;component/resources/style/Style_TreeView.xaml" />
+            </ResourceDictionary.MergedDictionaries>
+        </ResourceDictionary>
+    </UserControl.Resources>
+
+    <Border Background="#F0F2F0" Width="auto" Height="auto" CornerRadius="{DynamicResource WindowCornerRadius}" Margin="50">
+        <GroupBox Style="{StaticResource GroupBoxTab}" Margin="0"  >
+            <GroupBox.Header>
+                <StackPanel Orientation="Horizontal">
+                    <Grid Background="Transparent">
+                        <Grid.ColumnDefinitions>
+                            <ColumnDefinition Width="auto" />
+                            <ColumnDefinition Width="*" />
+                        </Grid.ColumnDefinitions>
+                        <Image Grid.Column="0" Margin="10,0,8,0" Source="{DynamicResource Tool}" Width="14" />
+                        <TextBlock Text="{Binding ToolTitle}" FontSize="13"  Grid.Column="1" Foreground="{DynamicResource Font.Content.Foreground}" />
+                    </Grid>
+                </StackPanel>
+            </GroupBox.Header>
+            <!--基础数据与功能区域-->
+            <Grid >
+                <Grid.ColumnDefinitions>
+                    <ColumnDefinition Width="auto"/>
+                    <ColumnDefinition Width="*"/>
+                </Grid.ColumnDefinitions>
+                <!--基础数据-->
+                <Grid Grid.Column="0"  x:Name="propertyGrid" Margin="0,0,3,0" Width="550">
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="auto"/>
+                        <RowDefinition Height="auto"/>
+                    </Grid.RowDefinitions>
+
+                    <!--导入导出-->
+                    <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Margin="0,0,0,-30" Panel.ZIndex="2">
+                        <btn:ButtonControl  
+                                          Width="80"
+                                          Command="{Binding IncBasics}" 
+                                          HorizontalAlignment="Center" 
+                                          VerticalAlignment="Center" 
+                                          IsMouseOverBorderBrushColor="{DynamicResource Control.Border.One.Color}"
+                                          BorderBrush="{DynamicResource Control.Border.Color}"
+                                          IsPressedBorderBrushColor="{DynamicResource Control.Border.Two.Color}"
+                                          Foreground="{DynamicResource Font.Content.Foreground}"
+                                          Icon="{DynamicResource Inc}"
+                                          Content="导入"
+                                          BorderThickness="1,0,0,0" />
+                        <btn:ButtonControl  
+                                          Width="80"
+                                          Command="{Binding ExpBasics}" 
+                                          HorizontalAlignment="Center" 
+                                          VerticalAlignment="Center" 
+                                          IsMouseOverBorderBrushColor="{DynamicResource Control.Border.One.Color}"
+                                          BorderBrush="{DynamicResource Control.Border.Color}"
+                                          IsPressedBorderBrushColor="{DynamicResource Control.Border.Two.Color}"
+                                          Foreground="{DynamicResource Font.Content.Foreground}"
+                                          Icon="{DynamicResource Exp}"
+                                          Content="导出"
+                                          BorderThickness="1,0,0,0" />
+                    </StackPanel>
+                    <!--属性表格-->
+                    <Grid Grid.Row="1" Panel.ZIndex="1">
+                        <Grid.Resources>
+                            <ResourceDictionary>
+                                <Style TargetType="{x:Type Label}" >
+                                    <Setter Property="FontSize" Value="13"/>
+                                    <Setter Property="Foreground" Value="{DynamicResource Font.Content.Foreground}"/>
+                                    <Setter Property="HorizontalAlignment" Value="Left"/>
+                                </Style>
+                                <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource DefaultComboBox}" >
+                                    <Setter Property="Height" Value="25"/>
+                                    <Setter Property="Background" Value="White"/>
+                                    <Setter Property="VerticalAlignment" Value="Center"/>
+                                    <Setter Property="helpers:Style_ComboBox.CornerRadius" Value="{DynamicResource WindowCornerRadius}"/>
+                                </Style>
+                                <Style TargetType="{x:Type pt:TextBoxEx}" BasedOn="{StaticResource TextBoxStyle2}">
+                                    <Setter Property="FontSize" Value="13"/>
+                                    <Setter Property="Foreground" Value="{DynamicResource Font.Content.Foreground}"/>
+                                    <Setter Property="BorderBrush" Value="{DynamicResource Control.Border.Color}"/>
+                                    <Setter Property="HorizontalContentAlignment" Value="Center"/>
+                                    <Setter Property="VerticalContentAlignment" Value="Center"/>
+                                </Style>
+
+                                <Style TargetType="CheckBox" BasedOn="{StaticResource CheckBoxStyle}"/>
+
+                                <Style TargetType="ContentControl" >
+                                    <Setter Property="Foreground" Value="{DynamicResource Font.Content.Foreground}"/>
+                                </Style>
+
+                                <Style TargetType="Expander">
+                                    <Setter Property="Foreground" Value="{DynamicResource Font.Content.Foreground}"/>
+                                </Style>
+
+                                <Style TargetType="RadioButton" BasedOn="{StaticResource RadioButtonStyle}"/>
+
+
+                                <Style TargetType="GroupBox" BasedOn="{StaticResource GroupBoxTab}"/>
+
+
+                                <DataTemplate x:Key="HeaderTemplate">
+                                    <StackPanel Orientation="Horizontal">
+                                        <Grid>
+                                            <Grid.ColumnDefinitions>
+                                                <ColumnDefinition Width="auto" />
+                                                <ColumnDefinition Width="*" />
+                                            </Grid.ColumnDefinitions>
+                                            <Image Grid.Column="0" Margin="10,0,8,0" Source="{DynamicResource ConfigBase}" Width="14" />
+                                            <TextBlock Text="{Binding}" FontSize="13"  Grid.Column="1" Foreground="{DynamicResource Font.Content.Foreground}" />
+                                        </Grid>
+                                    </StackPanel>
+                                </DataTemplate>
+
+                            </ResourceDictionary>
+                        </Grid.Resources>
+                        <pt:PropertyGrid  Margin="1,-4,1,0"
+SelectedObject="{Binding BasicsData}"
+TabVisibility="VisibleIfMoreThanOne" 
+TextBlock.Foreground="{DynamicResource Font.Content.Foreground}" 
+Foreground="{DynamicResource Font.Content.Foreground}"
+BorderBrush="{DynamicResource Control.Border.Color}"
+CategoryHeaderTemplate="{StaticResource HeaderTemplate}"/>
+                    </Grid>
+                </Grid>
+
+                <!--功能模块与信息-->
+                <Grid Grid.Column="1" >
+                    <Grid.RowDefinitions>
+                        <RowDefinition Height="auto"/>
+                        <RowDefinition Height="*"/>
+                    </Grid.RowDefinitions>
+                    <ToggleButton Grid.Row="0" Grid.RowSpan="2" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="8,8,0,0" ToolTip="基础数据[隐藏/显示]" Panel.ZIndex="3" IsChecked="{Binding BasicsData_ToggleButtonIsChecked}">
+                        <ToggleButton.Template>
+                            <ControlTemplate TargetType="{x:Type ToggleButton}">
+                                <Image x:Name="image" Source="{DynamicResource GoLeft_Two}" Stretch="Fill" Width="15" Height="15" />
+                                <ControlTemplate.Triggers>
+                                    <Trigger Property="IsChecked" Value="True">
+                                        <Setter Property="Source" TargetName="image" Value="{DynamicResource GoRight_Two}"/>
+                                    </Trigger>
+                                </ControlTemplate.Triggers>
+                            </ControlTemplate>
+                        </ToggleButton.Template>
+                        <ToggleButton.Triggers>
+                            <EventTrigger RoutedEvent="ToggleButton.Unchecked">
+                                <BeginStoryboard>
+                                    <Storyboard>
+                                        <DoubleAnimation Storyboard.TargetName="propertyGrid" Storyboard.TargetProperty="Width" From="0" To="550" Duration="0:0:0.7"/>
+                                        <ThicknessAnimationUsingKeyFrames Storyboard.TargetName="propertyGrid" Storyboard.TargetProperty="Margin" BeginTime="00:00:00">
+                                            <SplineThicknessKeyFrame KeyTime="00:00:00" Value="0" />
+                                            <SplineThicknessKeyFrame KeyTime="00:00:0.7" Value="0,0,3,0" />
+                                        </ThicknessAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </BeginStoryboard>
+                            </EventTrigger>
+                            <EventTrigger RoutedEvent="ToggleButton.Checked">
+                                <BeginStoryboard>
+                                    <Storyboard>
+                                        <DoubleAnimation Storyboard.TargetName="propertyGrid" Storyboard.TargetProperty="Width" From="550" To="0" Duration="0:0:0.7"/>
+                                        <ThicknessAnimationUsingKeyFrames Storyboard.TargetName="propertyGrid" Storyboard.TargetProperty="Margin" BeginTime="00:00:00">
+                                            <SplineThicknessKeyFrame KeyTime="00:00:00" Value="0,0,3,0" />
+                                            <SplineThicknessKeyFrame KeyTime="00:00:0.7" Value="0" />
+                                        </ThicknessAnimationUsingKeyFrames>
+                                    </Storyboard>
+                                </BeginStoryboard>
+                            </EventTrigger>
+                        </ToggleButton.Triggers>
+                    </ToggleButton>
+                    <!--功能模块-->
+                    <GroupBox Style="{StaticResource GroupBoxTab}" Margin="0" Grid.Row="0">
+                        <GroupBox.Header>
+                            <StackPanel Orientation="Horizontal">
+                                <Grid Background="transparent">
+                                    <Grid.ColumnDefinitions>
+                                        <ColumnDefinition Width="auto" />
+                                        <ColumnDefinition Width="*" />
+                                    </Grid.ColumnDefinitions>
+                                    <Image Grid.Column="0" Margin="10,0,8,0" Source="{DynamicResource Function}" Width="14" />
+                                    <TextBlock Text="功能" FontSize="13" Margin="0,0,10,0"  Grid.Column="1" Foreground="{DynamicResource Font.Content.Foreground}" />
+                                </Grid>
+                            </StackPanel>
+                        </GroupBox.Header>
+                        <!--■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■-->
+
+
+
+
+
+
+
+
+                        <Grid>
+                            <Grid.RowDefinitions>
+                                <RowDefinition Height="auto"/>
+                                <RowDefinition Height="*"/>
+                            </Grid.RowDefinitions>
+                            <!--Start / Stop-->
+                            <Grid  Margin="0,-40,0,0">
+                                <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" >
+                                    <btn:ButtonControl  Grid.Column="5"  Width="80"   Command="{Binding Start}" HorizontalAlignment="Right" VerticalAlignment="Center" BorderThickness="1,0,0,0"
+                                           IsMouseOverBorderBrushColor="{DynamicResource Control.Border.One.Color}"
+                                           BorderBrush="{DynamicResource Control.Border.Color}"
+                                           IsPressedBorderBrushColor="{DynamicResource Control.Border.Two.Color}"
+                                           Foreground="{DynamicResource Font.Content.Foreground}"
+                                           Icon="{DynamicResource Start}"
+                                           Content="启动"/>
+
+                                    <btn:ButtonControl  Grid.Column="6"  Width="80"  Command="{Binding Stop}" HorizontalAlignment="Right" VerticalAlignment="Center" BorderThickness="1,0,0,0"
+                                           IsMouseOverBorderBrushColor="{DynamicResource Control.Border.One.Color}"
+                                           BorderBrush="{DynamicResource Control.Border.Color}"
+                                           IsPressedBorderBrushColor="{DynamicResource Control.Border.Two.Color}"
+                                           Foreground="{DynamicResource Font.Content.Foreground}"
+                                           Icon="{DynamicResource Stop}"
+                                           Content="停止"/>
+                                </StackPanel>
+                            </Grid>
+                        </Grid>
+
+
+
+
+                        <!--■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■-->
+                    </GroupBox>
+                    <!--信息-->
+                    <GroupBox Style="{StaticResource GroupBoxTab}" Margin="0,5,0,0"  Grid.Row="1">
+                        <GroupBox.Header>
+                            <StackPanel Orientation="Horizontal">
+                                <Grid>
+                                    <Grid.ColumnDefinitions>
+                                        <ColumnDefinition Width="auto"/>
+                                        <ColumnDefinition Width="*"/>
+                                    </Grid.ColumnDefinitions>
+                                    <Image Grid.Column="0" Margin="10,0,8,0" Source="{DynamicResource Info}" Width="14" />
+                                    <TextBlock Text="信息" FontSize="13" Margin="0,0,10,0"  Grid.Column="1" Foreground="{DynamicResource Font.Content.Foreground}" VerticalAlignment="Center"/>
+                                </Grid>
+                            </StackPanel>
+                        </GroupBox.Header>
+                        <Grid>
+                            <Grid.RowDefinitions>
+                                <RowDefinition Height="auto" />
+                                <RowDefinition />
+                            </Grid.RowDefinitions>
+                            <Grid.ColumnDefinitions>
+                                <ColumnDefinition />
+                                <ColumnDefinition Width="auto" />
+                            </Grid.ColumnDefinitions>
+                            <StackPanel Orientation="Horizontal" Grid.Column="1" HorizontalAlignment="Right" Margin="0,-40,0,0">
+                                <RadioButton ToolTip="显示方式" Margin="0,0,15,0"  Visibility="{Binding AsciiVisibility}" IsChecked="{Binding InfoFormat,Mode=TwoWay,Converter={StaticResource CheckConverter},ConverterParameter=0}" Style="{StaticResource RadioButtonStyle}" Content="ASCII" VerticalAlignment="Center" HorizontalAlignment="Right" />
+                                <RadioButton ToolTip="显示方式" Margin="0,0,15,0" Visibility="{Binding HexVisibility}" IsChecked="{Binding InfoFormat,Mode=TwoWay,Converter={StaticResource CheckConverter},ConverterParameter=1}"  Style="{StaticResource RadioButtonStyle}" Content="Hex"  VerticalAlignment="Center" HorizontalAlignment="Right" />
+                                <btn:ButtonControl  Width="80"  Command="{Binding Clear}" HorizontalAlignment="Right" VerticalAlignment="Center"  BorderThickness="1,0,0,0"
+IsMouseOverBorderBrushColor="{DynamicResource Control.Border.One.Color}"
+BorderBrush="{DynamicResource Control.Border.Color}"
+IsPressedBorderBrushColor="{DynamicResource Control.Border.Two.Color}"
+Foreground="{DynamicResource Font.Content.Foreground}"
+Icon="{DynamicResource Clear}"
+Content="清空"/>
+                            </StackPanel>
+                            <TextBox Grid.Row="1" Padding="5" Grid.ColumnSpan="2" Style="{DynamicResource TextBoxStyle2}"  FontSize="13" VerticalContentAlignment="Top" HorizontalContentAlignment="Left" TextWrapping="Wrap" AcceptsReturn="True" VerticalScrollBarVisibility="Visible"  Text="{Binding Info}" >
+                                <i:Interaction.Triggers>
+                                    <i:EventTrigger EventName="TextChanged">
+                                        <mvvm:EventCommand  Command="{Binding Info_TextChanged}" />
+                                    </i:EventTrigger>
+                                </i:Interaction.Triggers>
+                            </TextBox>
+                        </Grid>
+                    </GroupBox>
+                </Grid>
+            </Grid>
+        </GroupBox>
+    </Border>
+</UserControl>

+ 28 - 0
src/YSAI.Tool.Wpf/views/UaService.xaml.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows;
+using System.Windows.Controls;
+using System.Windows.Data;
+using System.Windows.Documents;
+using System.Windows.Input;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+using System.Windows.Navigation;
+using System.Windows.Shapes;
+
+namespace YSAI.Tool.Wpf.views
+{
+    /// <summary>
+    /// UaService.xaml 的交互逻辑
+    /// </summary>
+    public partial class UaService : UserControl
+    {
+        public UaService()
+        {
+            InitializeComponent();
+        }
+    }
+}

+ 10 - 10
src/YSAI.Ver.Manage.Tool/Program.cs

@@ -39,16 +39,16 @@ List<string> strings = new List<string>
     //"YSAI.Netty",
     //"YSAI.RabbitMQ",
 
-    "YSAI.AllenBradley",
-    "YSAI.Beckhoff",
-    "YSAI.Can",
-    "YSAI.DB",
-    "YSAI.Mewtocol",
-    "YSAI.Mitsubishi",
-    "YSAI.Modbus",
-    "YSAI.Omron",
-    "YSAI.Opc",
-    "YSAI.Siemens",
+    //"YSAI.AllenBradley",
+    //"YSAI.Beckhoff",
+    //"YSAI.Can",
+    //"YSAI.DB",
+    //"YSAI.Mewtocol",
+    //"YSAI.Mitsubishi",
+    //"YSAI.Modbus",
+    //"YSAI.Omron",
+    //"YSAI.Opc",
+    //"YSAI.Siemens",
 #endif
 };