소스 검색

1. 修改三菱采集协议包问题
2. tool 存在遗留问题待解决

Shun 2 년 전
부모
커밋
37b0d82461

+ 4 - 1
README.md

@@ -519,4 +519,7 @@ while(true)
 1. 修改地址处理的细节,让数据质量更准确
 2. 对象比较器更换至[CompareNETObjects]
 3. 新增示例代码
-4. 修改PACK生成代码位置,与主代码不存在引用关系
+4. 修改PACK生成代码位置,与主代码不存在引用关系
+
+#### 2023-12-5
+1. 传输协议 netty 更新 

+ 8 - 6
src/YSAI.Controls/tabcontrol/Helper.cs

@@ -1,8 +1,5 @@
-using System.IO;
-using System.Windows;
-using System.Windows.Markup;
+using System.Windows;
 using System.Windows.Media;
-using System.Xml;
 
 namespace YSAI.Controls.tabcontrol
 {
@@ -77,8 +74,13 @@ namespace YSAI.Controls.tabcontrol
         /// <returns></returns>
         public static object CloneElement(object elementToClone)
         {
-            string xaml = XamlWriter.Save(elementToClone);
-            return XamlReader.Load(new XmlTextReader(new StringReader(xaml)));
+            return elementToClone;
+            //string savedObject = System.Windows.Markup.XamlWriter.Save(elementToClone);
+
+            //// Load the XamlObject
+            //StringReader stringReader = new StringReader(savedObject);
+            //System.Xml.XmlReader xmlReader = System.Xml.XmlReader.Create(stringReader);
+            //return System.Windows.Markup.XamlReader.Load(xmlReader);
         }
 
     }

+ 1 - 4
src/YSAI.Mitsubishi/YSAI.Mitsubishi.csproj

@@ -3,7 +3,7 @@
     <TargetFrameworks>net6.0;net8.0</TargetFrameworks>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-    <Version>23.338.19977</Version>
+    <Version>23.340.9645</Version>
     <PackageOutputPath Condition="'$(Configuration)' == 'Release'">../YSAI.Publish/Release</PackageOutputPath>
     <PackageOutputPath Condition="'$(Configuration)' == 'Debug'">../YSAI.Publish/Debug</PackageOutputPath>
     <Authors>Shun</Authors>
@@ -18,7 +18,4 @@
   <ItemGroup>
     <PackageReference Include="YSAI.Core" Version="23.338.19544" />
   </ItemGroup>
-  <ItemGroup>
-    <ProjectReference Include="..\YSAI.Modbus\YSAI.Modbus.csproj" />
-  </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Pack/src/YSAI.AllenBradley.Pack/YSAI.AllenBradley.Pack.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>net8.0</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>

+ 2 - 2
src/YSAI.Pack/src/YSAI.Beckhoff.Pack/YSAI.Beckhoff.Pack.csproj

@@ -2,13 +2,13 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>net8.0</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="YSAI.Beckhoff" Version="23.338.19976" />
+		<PackageReference Include="YSAI.Beckhoff" Version="23.338.19977" />
 	</ItemGroup>
 
   <Target Name="PostBuild" AfterTargets="PostBuildEvent">

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 5 - 5
src/YSAI.Pack/src/YSAI.Can.Pack/YSAI.Can.Pack.csproj


+ 2 - 2
src/YSAI.Pack/src/YSAI.DB.Pack/YSAI.DB.Pack.csproj

@@ -2,13 +2,13 @@
 
 	<PropertyGroup>
 		<OutputType>Exe</OutputType>
-		<TargetFramework>net8.0</TargetFramework>
+		<TargetFramework>net6.0</TargetFramework>
 		<ImplicitUsings>enable</ImplicitUsings>
 		<Nullable>enable</Nullable>
 	</PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="YSAI.DB" Version="23.338.19976" />
+		<PackageReference Include="YSAI.DB" Version="23.338.19977" />
 	</ItemGroup>
 
 	<Target Name="PostBuild" AfterTargets="PostBuildEvent">

+ 1 - 1
src/YSAI.Pack/src/YSAI.Kafka.Pack/YSAI.Kafka.Pack.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>net8.0</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>

+ 2 - 2
src/YSAI.Pack/src/YSAI.Mewtocol.Pack/YSAI.Mewtocol.Pack.csproj

@@ -2,13 +2,13 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>net8.0</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>
 
 	<ItemGroup>
-		<PackageReference Include="YSAI.Mewtocol" Version="23.338.19976" />
+		<PackageReference Include="YSAI.Mewtocol" Version="23.338.19977" />
 	</ItemGroup>
 
 	<Target Name="PostBuild" AfterTargets="PostBuildEvent">

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2 - 2
src/YSAI.Pack/src/YSAI.Mitsubishi.Pack/YSAI.Mitsubishi.Pack.csproj


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2 - 2
src/YSAI.Pack/src/YSAI.Modbus.Pack/YSAI.Modbus.Pack.csproj


+ 1 - 1
src/YSAI.Pack/src/YSAI.Mqtt.Pack/YSAI.Mqtt.Pack.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>net8.0</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>

+ 1 - 1
src/YSAI.Pack/src/YSAI.NetMQ.Pack/YSAI.NetMQ.Pack.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>net8.0</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2 - 2
src/YSAI.Pack/src/YSAI.Netty.Pack/YSAI.Netty.Pack.csproj


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2 - 2
src/YSAI.Pack/src/YSAI.Omron.Pack/YSAI.Omron.Pack.csproj


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2 - 2
src/YSAI.Pack/src/YSAI.Opc.Pack/YSAI.Opc.Pack.csproj


+ 1 - 1
src/YSAI.Pack/src/YSAI.RabbitMQ.Pack/YSAI.RabbitMQ.Pack.csproj

@@ -2,7 +2,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>net8.0</TargetFramework>
+    <TargetFramework>net6.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
   </PropertyGroup>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2 - 2
src/YSAI.Pack/src/YSAI.Siemens.Pack/YSAI.Siemens.Pack.csproj


+ 81 - 131
src/YSAI.Tests/Program.cs

@@ -1,75 +1,45 @@
-using YSAI.Log;
-using YSAI.Model.data;
-using YSAI.Netty.client;
-using YSAI.Netty.service;
-using YSAI.Unility;
-
-NettyServiceOperate nettyServiceOperate = NettyServiceOperate.Instance(new NettyServiceData.Basics
-{
-    Port = 8007,
-    SN = "1"
-});
+
 
-Console.WriteLine(nettyServiceOperate.On().ToJson());
-nettyServiceOperate.OnEvent += delegate (object? sender, EventResult e)
-{
-    LogHelper.Info(e.ToJson().JsonFormatting());
-};
-
-//转发协议
-NettyClientOperate operate1 = NettyClientOperate.Instance(new NettyClientData.Basics
-{
-    Host = "127.0.0.1",
-    Port = 8007,
-    SN = "1"
-});
-//打开
-OperateResult result = operate1.On();
-LogHelper.Info(result.ToJson().JsonFormatting());
-//消费
-operate1.OnEvent += delegate (object? sender, EventResult e)
-{
-    LogHelper.Error("客户端1\r\n" + e.ToJson().JsonFormatting());
-};
-result = operate1.Subscribe("测试1");
-LogHelper.Info(result.ToJson().JsonFormatting());
+//using YSAI.Log;
+//using YSAI.Model.data;
+//using YSAI.Netty.client;
+//using YSAI.Netty.service;
+//using YSAI.Unility;
 
+//NettyServiceOperate nettyServiceOperate = NettyServiceOperate.Instance(new NettyServiceData.Basics
+//{
+//    Port = 8007
+//});
 
+//Console.WriteLine(nettyServiceOperate.On().ToJson());
+//nettyServiceOperate.OnEvent += delegate (object? sender, EventResult e)
+//{
+//    LogHelper.Info(e.ToJson().JsonFormatting());
+//};
 
 ////转发协议
-//NettyClientOperate operate2 = NettyClientOperate.Instance(new NettyClientData.Basics
+//NettyClientOperate operate1 = NettyClientOperate.Instance(new NettyClientData.Basics
 //{
 //    Host = "127.0.0.1",
-//    Port = 8007,
-//    SN = "2"
+//    Port = 8007
 //});
 ////打开
-//result = operate2.On();
+//OperateResult result = operate1.On();
 //LogHelper.Info(result.ToJson().JsonFormatting());
 ////消费
-//operate2.OnEvent += delegate (object? sender, EventResult e)
+//operate1.OnEvent += delegate (object? sender, EventResult e)
 //{
-//    LogHelper.Error("客户端2\r\n" + e.ToJson().JsonFormatting());
+//    LogHelper.Error("客户端1\r\n" + e.ToJson().JsonFormatting());
 //};
-//result = operate2.Subscribe("测试");
+//result = operate1.Subscribe("测试");
 //LogHelper.Info(result.ToJson().JsonFormatting());
 
-while (true)
-{
-    for (int i = 0; i < 9999999999; i++)
-    {
-        Console.ReadLine();
-        if (i % 2 == 0)
-        {
-            //生产
-            Console.WriteLine(operate1.Produce("测试1", "客户端1 -> 客户端2  " + new Random().NextDouble().ToString()).ToJson().JsonFormatting());
-        }
-        else
-        {
-            //Console.WriteLine(operate2.Produce("测试", "客户端2 -> 客户端1  " + new Random().NextDouble().ToString()).ToJson().JsonFormatting());
-        }
-    }
-}
+
+//while (true)
+//{
+//    Console.ReadLine();
+//    Console.WriteLine(operate1.Produce("测试", new Random().NextDouble().ToString()).ToJson().JsonFormatting());
+//}
 
 
 
@@ -548,84 +518,64 @@ while (true)
 
 
 
-//using S7.Net;
-//using System.Collections.Concurrent;
-//using YSAI.Model.data;
-//using YSAI.Model.@enum;
-//using YSAI.Siemens;
-//using YSAI.Unility;
-//using DataType = YSAI.Model.@enum.DataType;
-
-//SiemensOperate s7ClientOperate = SiemensOperate.Instance(new SiemensData.Basics()
-//{
-//    Ip = "192.168.2.20",
-//    Port = 102,
-//    Rack = 0,
-//    Slot = 1,
-//    CType = CpuType.S71200,
-//    ChangeOut = true,
-//    SN = Guid.NewGuid().ToString()
-//}); ;
-
-////打开
-//OperateResult operateResult = s7ClientOperate.On();
-//Console.WriteLine(operateResult.Message);
+using S7.Net;
+using System.Collections.Concurrent;
+using YSAI.Model.data;
+using YSAI.Model.@enum;
+using YSAI.Siemens;
+using YSAI.Unility;
+using DataType = YSAI.Model.@enum.DataType;
 
-////点位地址
-//Address address = new Address();
-//address.SN = Guid.NewGuid().ToString();
-//address.CreationTime = DateTime.Now.ToLocalTime();
-//address.AddressArray = new List<AddressDetails>();
-//address.AddressArray.Add(new AddressDetails()
-//{
-//    AddressName = "DB71.DBD4",
-//    AddressDataType = DataType.String,
-//    AddressType = AddressType.Reality
-//});
+SiemensOperate s7ClientOperate = SiemensOperate.Instance(new SiemensData.Basics()
+{
+    Ip = "192.168.2.20",
+    Port = 102,
+    Rack = 0,
+    Slot = 1,
+    CType = CpuType.S71200,
+    ChangeOut = true,
+    SN = Guid.NewGuid().ToString()
+}); ;
 
-////读取
-//operateResult = s7ClientOperate.Read(address);
-//Console.WriteLine(operateResult.Message);
-//if (operateResult.State)
-//{
-//    foreach (var item in operateResult.RData as ConcurrentDictionary<string, AddressValue>)
-//    {
-//        Console.WriteLine(item.Key);
-//        Console.WriteLine(item.Value.Value);
-//    }
-//}
+//打开
+OperateResult operateResult = s7ClientOperate.On();
+Console.WriteLine(operateResult.Message);
+
+//点位地址
+Address address = new Address();
+address.SN = Guid.NewGuid().ToString();
+address.CreationTime = DateTime.Now.ToLocalTime();
+address.AddressArray = new List<AddressDetails>();
+address.AddressArray.Add(new AddressDetails()
+{
+    AddressName = "DB71.DBD4",    //地址格式  DB*.DBD*
+    AddressDataType = DataType.String,
+    AddressType = AddressType.Reality
+});
 
-////订阅
-//s7ClientOperate.OnEvent += S7ClientOperate_OnEvent;
-//s7ClientOperate.Subscribe(address);
+//读取
+operateResult = s7ClientOperate.Read(address);
+Console.WriteLine(operateResult.Message);
+if (operateResult.State)
+{
+    foreach (var item in operateResult.RData as ConcurrentDictionary<string, AddressValue>)
+    {
+        Console.WriteLine(item.Key);
+        Console.WriteLine(item.Value.Value);
+    }
+}
 
-//while (true)
-//{
-//    string value = Console.ReadLine();
-//    //写入
-//    ConcurrentDictionary<string, string> keyValuePairs = new ConcurrentDictionary<string, string>();
-//    //keyValuePairs.TryAdd("DB71.DBD4", string.IsNullOrWhiteSpace(value) ? uint.MaxValue : uint.Parse(value));
-//    keyValuePairs.TryAdd("DB71.DBD4", value);
-//    operateResult = s7ClientOperate.Write(keyValuePairs);
-//    Console.WriteLine(operateResult.Message);
-
-
-//    ////读取
-//    //operateResult = s7ClientOperate.Read(address);
-//    //Console.WriteLine(operateResult.Message);
-//    //if (operateResult.State)
-//    //{
-//    //    foreach (var item in operateResult.RData as ConcurrentDictionary<string, AddressValue>)
-//    //    {
-//    //        Console.WriteLine(item.Key);
-//    //        Console.WriteLine(item.Value.Value);
-//    //    }
-//    //}
+//订阅
+s7ClientOperate.OnEvent += S7ClientOperate_OnEvent;
+s7ClientOperate.Subscribe(address);
 
-//}
+while (true)
+{
+    Console.ReadLine();
+}
 
-//void S7ClientOperate_OnEvent(object? sender, EventResult e)
-//{
-//    Console.WriteLine(e.ToJson());
-//}
+void S7ClientOperate_OnEvent(object? sender, EventResult e)
+{
+    Console.WriteLine(e.ToJson());
+}
 

+ 55 - 2
src/YSAI.Tool/MainWindow.xaml

@@ -4,7 +4,7 @@
         xmlns:base="clr-namespace:YSAI.Window;assembly=YSAI.Window"
         xmlns:local="clr-namespace:YSAI.Tool"
         xmlns:hm="clr-namespace:YSAI.Controls.hamburgermenu;assembly=YSAI.Controls"
-        xmlns:tc="clr-namespace:YSAI.Controls.transition;assembly=YSAI.Controls"
+        xmlns:tc="clr-namespace:YSAI.Controls.tabcontrol;assembly=YSAI.Controls"
         Icon="YSAI_One.ico"
         FontFamily="{DynamicResource AllFontFamily}" WindowStartupLocation="CenterScreen" IsContentBackgroundPicture="True" ResizeMode="CanResize"
         Title="[ 远舢智能 ] 调试工具">
@@ -39,7 +39,60 @@
             </hm:HamburgerMenu>
         </Border>
         <Grid Grid.Column="1">
-            <ContentControl Content="{Binding UserControl}" />
+            <tc:TabControl TabStripPlacement="Top" 
+                           VerticalContentAlignment="Center"  
+                           Background="Transparent" 
+                           ItemsSource="{Binding TabControlItemsSource}" 
+                           AllowDelete="True"
+                           AllowAddNew="False"
+                           SelectNewTabOnCreate="False"
+                           AddNewTabToEnd="False">
+
+                <tc:TabControl.TabItemNormalBackground>
+                    <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
+                        <GradientStop Color="#FFFCFDFD" Offset="0"/>
+                        <GradientStop Color="#FFE5EAF5" Offset="0.3"/>
+                        <GradientStop Color="#FFCFD7EB" Offset="0.3"/>
+                        <GradientStop Color="#FFE0E5F5" Offset="0.7"/>
+                        <GradientStop Color="#FFECEEFC" Offset="1"/>
+                    </LinearGradientBrush>
+                </tc:TabControl.TabItemNormalBackground>
+
+                <tc:TabControl.TabItemSelectedBackground>
+                    <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
+                        <GradientStop Color="#FFFBFDFE" Offset="0"/>
+                        <GradientStop Color="#FFEAF6FB" Offset="0.3"/>
+                        <GradientStop Color="#FFCEE7FA" Offset="0.3"/>
+                        <GradientStop Color="#FFB9D1FA" Offset="1"/>
+                    </LinearGradientBrush>
+                </tc:TabControl.TabItemSelectedBackground>
+
+                <tc:TabControl.TabItemMouseOverBackground>
+                    <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
+                        <GradientStop Color="#FFFCFDFD" Offset="0"/>
+                        <GradientStop Color="#FFC6DDF7" Offset="0.3"/>
+                        <GradientStop Color="#FF99C6EE" Offset="0.3"/>
+                        <GradientStop Color="#FFB6D6F1" Offset="0.7"/>
+                        <GradientStop Color="#FFD9E9F9" Offset="1"/>
+                    </LinearGradientBrush>
+                </tc:TabControl.TabItemMouseOverBackground>
+
+
+                <!--通过使用ItemTemplate属性绑定到MyObject实例的Header属性来设置TabItem Header-->
+                <tc:TabControl.ItemTemplate>
+                    <DataTemplate>
+                        <TextBlock Text="{Binding Title}" />
+                    </DataTemplate>
+                </tc:TabControl.ItemTemplate>
+
+                <!-- TabObject类型的DataTemplate, TabItems的内容-->
+                <tc:TabControl.ContentTemplate>
+                    <DataTemplate >
+                        <ContentControl Content="{Binding UserControl}" />
+                    </DataTemplate>
+                </tc:TabControl.ContentTemplate>
+                
+            </tc:TabControl>
         </Grid>
     </Grid>
 </base:WindowBase>

+ 207 - 31
src/YSAI.Tool/MainWindowController.cs

@@ -1,4 +1,5 @@
 using System.Collections.Concurrent;
+using System.Collections.ObjectModel;
 using System.Windows.Controls;
 using System.Windows.Input;
 using YSAI.Langs;
@@ -19,29 +20,198 @@ using YSAI.Tool.Core.svg;
 
 namespace YSAI.Tool
 {
-    public class MainWindowController : NotifyObject
+    /// <summary>
+    /// 数据源
+    /// </summary>
+    public class Source : NotifyObject
     {
         /// <summary>
-        /// 关于页面
+        /// 图标
+        /// </summary>
+        //public ImageSource Icon
+        //{
+        //    get => GetProperty(() => Icon);
+        //    set => SetProperty(() => Icon, value);
+        //}
+        /// <summary>
+        /// 标题
         /// </summary>
-        public ICommand AboutUsTool { get => new CommandX(() => { UserControl = UserControls["AboutUsTool"]; }); }
+        public string Title
+        {
+            get => GetProperty(() => Title);
+            set => SetProperty(() => Title, value);
+        }
 
         /// <summary>
-        /// Can操作
+        /// 展示的地方
         /// </summary>
-        public ICommand CanTool { get => new CommandX(() => { UserControl = UserControls["CanTool"]; }); }
+        public object UserControl
+        {
+            get => GetProperty(() => UserControl);
+            set => SetProperty(() => UserControl, value);
+        }
+    }
 
-        public ICommand MqttClientTool { get => new CommandX(() => { UserControl = UserControls["MqttClientTool"]; }); }
-        public ICommand MqttServiceTool { get => new CommandX(() => { UserControl = UserControls["MqttServiceTool"]; }); }
-        public ICommand MqttWebSocketServiceTool { get => new CommandX(() => { UserControl = UserControls["MqttWebSocketServiceTool"]; }); }
-        public ICommand OpcDaHttpClientTool { get => new CommandX(() => { UserControl = UserControls["OpcDaHttpClientTool"]; }); }
-        public ICommand OpcUaClientTool { get => new CommandX(() => { UserControl = UserControls["OpcUaClientTool"]; }); }
-        public ICommand OpcUaServiceTool { get => new CommandX(() => { UserControl = UserControls["OpcUaServiceTool"]; }); }
-        public ICommand SerialPortTool { get => new CommandX(() => { UserControl = UserControls["SerialPortTool"]; }); }
-        public ICommand SocketTcpClientTool { get => new CommandX(() => { UserControl = UserControls["SocketTcpClientTool"]; }); }
-        public ICommand SocketTcpServerTool { get => new CommandX(() => { UserControl = UserControls["SocketTcpServerTool"]; }); }
-        public ICommand SocketUdpTool { get => new CommandX(() => { UserControl = UserControls["SocketUdpTool"]; }); }
-        public ICommand SvgTool { get => new CommandX(() => { UserControl = UserControls["SvgTool"]; }); }
+    public class MainWindowController : NotifyObject
+    {
+        #region 控件
+        public ICommand AboutUsTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "AboutUsTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand CanTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "CanTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand MqttClientTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "MqttClientTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand MqttServiceTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "MqttServiceTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand MqttWebSocketServiceTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "MqttWebSocketServiceTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand OpcDaHttpClientTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "OpcDaHttpClientTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand OpcUaClientTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "OpcUaClientTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand OpcUaServiceTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "OpcUaServiceTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand SerialPortTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "SerialPortTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand SocketTcpClientTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "SocketTcpClientTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand SocketTcpServerTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "SocketTcpServerTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand SocketUdpTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "SocketUdpTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        public ICommand SvgTool
+        {
+            get => new CommandX(() =>
+            {
+                string name = "SvgTool";
+                TabControlItemsSource.Add(new Source
+                {
+                    Title = name,
+                    UserControl = UserControls[name]
+                });
+            });
+        }
+        #endregion 控件
 
         public MainWindowController()
         {
@@ -62,28 +232,34 @@ namespace YSAI.Tool
             UserControls.AddOrUpdate("SvgTool", new SvgTool(), (k, v) => new SvgTool());
             UserControls.AddOrUpdate("AboutUsTool", new AboutUsTool(), (k, v) => new AboutUsTool());
 
-            //显示用户控件
-            UserControl = UserControls["AboutUsTool"];
-        }
-
-        /// <summary>
-        /// 展示的地方
-        /// </summary>
-        public object UserControl
-        {
-            get => GetProperty(() => UserControl);
-            set
+            if (TabControlItemsSource == null)
             {
-                if (value != UserControl)
-                {
-                    SetProperty(() => UserControl, value);
-                }
+                TabControlItemsSource = new ObservableCollection<Source>();
             }
+
+            TabControlItemsSource.Add(new Source
+            {
+                Title = "AboutUsTool",
+                UserControl = UserControls["AboutUsTool"]
+            });
         }
 
+
+
         /// <summary>
         /// 控件集合
         /// </summary>
         private ConcurrentDictionary<string, UserControl> UserControls = new ConcurrentDictionary<string, UserControl>();
+
+
+
+        /// <summary>
+        /// 选项卡控件项源
+        /// </summary>
+        public ObservableCollection<Source> TabControlItemsSource
+        {
+            get => GetProperty(() => TabControlItemsSource);
+            set => SetProperty(() => TabControlItemsSource, value);
+        }
     }
 }

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

@@ -6,33 +6,33 @@ using YSAI.Unility;
 List<string> strings = new List<string>
 {
 #if RELEASE
-                //"YSAI.Unility",
-                //"YSAI.Log",
-
-                //"YSAI.Model",
-
-                //"YSAI.Core",
-
-                //"YSAI.Rpc",
-                //"YSAI.Redis",
-
-                //"YSAI.Kafka",
-                //"YSAI.Mqtt",
-                //"YSAI.NetMQ",
-                "YSAI.Netty",
-                //"YSAI.RabbitMQ",
-                //////////"YSAI.Rest",
-
-                //"YSAI.AllenBradley",
-                //"YSAI.Beckhoff",
-                //"YSAI.Can",
-                //"YSAI.DB",
-                //"YSAI.Mewtocol",
-                //"YSAI.Mitsubishi",
-                //"YSAI.Modbus",
-                //"YSAI.Omron",
-                //"YSAI.Opc",
-                //"YSAI.Siemens",
+    //"YSAI.Unility",
+    //"YSAI.Log",
+
+    //"YSAI.Model",
+
+    //"YSAI.Core",
+
+    //"YSAI.Rpc",
+    //"YSAI.Redis",
+
+    //"YSAI.Kafka",
+    //"YSAI.Mqtt",
+    //"YSAI.NetMQ",
+    //"YSAI.Netty",
+    //"YSAI.RabbitMQ",
+    //////////"YSAI.Rest",
+
+    //"YSAI.AllenBradley",
+    //"YSAI.Beckhoff",
+    //"YSAI.Can",
+    //"YSAI.DB",
+    //"YSAI.Mewtocol",
+    "YSAI.Mitsubishi",
+    //"YSAI.Modbus",
+    //"YSAI.Omron",
+    //"YSAI.Opc",
+    //"YSAI.Siemens",
 
 #endif
 };