This commit is contained in:
2248356998 qq.com
2025-09-28 17:01:19 +08:00
parent 976323a716
commit 2416226eb0
9 changed files with 51 additions and 46 deletions

View File

@@ -1,9 +1,9 @@
<Project> <Project>
<PropertyGroup> <PropertyGroup>
<PluginVersion>10.11.77</PluginVersion> <PluginVersion>10.11.78</PluginVersion>
<ProPluginVersion>10.11.77</ProPluginVersion> <ProPluginVersion>10.11.78</ProPluginVersion>
<DefaultVersion>10.11.77</DefaultVersion> <DefaultVersion>10.11.78</DefaultVersion>
<AuthenticationVersion>10.11.6</AuthenticationVersion> <AuthenticationVersion>10.11.6</AuthenticationVersion>
<SourceGeneratorVersion>10.11.6</SourceGeneratorVersion> <SourceGeneratorVersion>10.11.6</SourceGeneratorVersion>
<NET8Version>8.0.20</NET8Version> <NET8Version>8.0.20</NET8Version>

View File

@@ -73,7 +73,7 @@ public partial class ThingsGatewayBitConverter : IThingsGatewayBitConverter
get => endianType; set get => endianType; set
{ {
endianType = value; endianType = value;
TouchSocketBitConverter = new TouchSocketBitConverter(endianType); TouchSocketBitConverter = TouchSocketBitConverter.GetBitConverter(endianType);
} }
} }
@@ -188,13 +188,13 @@ public partial class ThingsGatewayBitConverter : IThingsGatewayBitConverter
// 更新设备地址为去除附加信息后的地址 // 更新设备地址为去除附加信息后的地址
registerAddress = sb.ToString(); registerAddress = sb.ToString();
var converter = (IThingsGatewayBitConverter)FastMapper.Mapper(this, type);
// 如果没有解析出任何附加信息,则直接返回默认的数据转换器 // 如果没有解析出任何附加信息,则直接返回默认的数据转换器
if (bcdFormat == null && stringlength == null && encoding == null && dataFormat == null && wstring == null) if (bcdFormat == null && stringlength == null && encoding == null && dataFormat == null && wstring == null)
{ {
//MemoryCache.Set(cacheKey, this!, 3600); //MemoryCache.Set(cacheKey, this!, 3600);
return converter; return this;
} }
var converter = (IThingsGatewayBitConverter)FastMapper.Mapper(this, type);
// 根据默认的数据转换器创建新的数据转换器实例 // 根据默认的数据转换器创建新的数据转换器实例

View File

@@ -84,7 +84,7 @@ public class ChannelRuntime : Channel
[Newtonsoft.Json.JsonIgnore] [Newtonsoft.Json.JsonIgnore]
[MapperIgnore] [MapperIgnore]
[AutoGenerateColumn(Ignore = true)] [AutoGenerateColumn(Ignore = true)]
internal ConcurrentDictionary<long, DeviceRuntime>? DeviceRuntimes { get; } = new(Environment.ProcessorCount, 1000); internal ConcurrentDictionary<long, DeviceRuntime>? DeviceRuntimes { get; } = new();
/// <summary> /// <summary>
/// 设备数量 /// 设备数量

View File

@@ -251,7 +251,7 @@ public class DeviceRuntime : Device
[Newtonsoft.Json.JsonIgnore] [Newtonsoft.Json.JsonIgnore]
[MapperIgnore] [MapperIgnore]
[AutoGenerateColumn(Ignore = true)] [AutoGenerateColumn(Ignore = true)]
internal ConcurrentDictionary<string, VariableRuntime>? VariableRuntimes { get; } = new(Environment.ProcessorCount, 1000); internal ConcurrentDictionary<string, VariableRuntime>? VariableRuntimes { get; } = new();
/// <summary> /// <summary>
/// 特殊方法变量 /// 特殊方法变量

View File

@@ -36,6 +36,10 @@ namespace ThingsGateway.Foundation;
[MemoryDiagnoser] [MemoryDiagnoser]
public class ModbusBenchmark : IDisposable public class ModbusBenchmark : IDisposable
{ {
public static int ClientCount = 2;
public static int TaskNumberOfItems = 4;
public static int NumberOfItems = 4;
private readonly List<IModbusClient> _lgbModbusClients = []; private readonly List<IModbusClient> _lgbModbusClients = [];
private List<ModbusMaster> thingsgatewaymodbuss = new(); private List<ModbusMaster> thingsgatewaymodbuss = new();
private List<IModbusMaster> nmodbuss = new(); private List<IModbusMaster> nmodbuss = new();
@@ -45,7 +49,7 @@ public class ModbusBenchmark : IDisposable
[GlobalSetup] [GlobalSetup]
public async Task Init() public async Task Init()
{ {
for (int i = 0; i < Program.ClientCount; i++) for (int i = 0; i < ClientCount; i++)
{ {
var clientConfig = new TouchSocket.Core.TouchSocketConfig(); var clientConfig = new TouchSocket.Core.TouchSocketConfig();
@@ -65,7 +69,7 @@ public class ModbusBenchmark : IDisposable
} }
for (int i = 0; i < Program.ClientCount; i++) for (int i = 0; i < ClientCount; i++)
{ {
var factory = new NModbus.ModbusFactory(); var factory = new NModbus.ModbusFactory();
@@ -73,7 +77,7 @@ public class ModbusBenchmark : IDisposable
await nmodbus.ReadHoldingRegistersAsync(1, 0, 100); await nmodbus.ReadHoldingRegistersAsync(1, 0, 100);
nmodbuss.Add(nmodbus); nmodbuss.Add(nmodbus);
} }
//for (int i = 0; i < Program.ClientCount; i++) //for (int i = 0; i < ClientCount; i++)
//{ //{
// ModbusTcpNet modbusTcpNet = new(); // ModbusTcpNet modbusTcpNet = new();
// modbusTcpNet.IpAddress = "127.0.0.1"; // modbusTcpNet.IpAddress = "127.0.0.1";
@@ -83,7 +87,7 @@ public class ModbusBenchmark : IDisposable
// modbusTcpNets.Add(modbusTcpNet); // modbusTcpNets.Add(modbusTcpNet);
//} //}
for (int i = 0; i < Program.ClientCount; i++) for (int i = 0; i < ClientCount; i++)
{ {
var client = new ModbusTcpMaster(); var client = new ModbusTcpMaster();
await client.SetupAsync(new TouchSocketConfig() await client.SetupAsync(new TouchSocketConfig()
@@ -101,7 +105,7 @@ public class ModbusBenchmark : IDisposable
var provider = sc.BuildServiceProvider(); var provider = sc.BuildServiceProvider();
var factory = provider.GetRequiredService<IModbusFactory>(); var factory = provider.GetRequiredService<IModbusFactory>();
for (int i = 0; i < Program.ClientCount; i++) for (int i = 0; i < ClientCount; i++)
{ {
var client = factory.GetOrCreateTcpMaster(); var client = factory.GetOrCreateTcpMaster();
await client.ConnectAsync("127.0.0.1", 502); await client.ConnectAsync("127.0.0.1", 502);
@@ -120,11 +124,11 @@ public class ModbusBenchmark : IDisposable
foreach (var thingsgatewaymodbus in thingsgatewaymodbuss) foreach (var thingsgatewaymodbus in thingsgatewaymodbuss)
{ {
for (int i = 0; i < Program.TaskNumberOfItems; i++) for (int i = 0; i < TaskNumberOfItems; i++)
{ {
tasks.Add(Task.Run(async () => tasks.Add(Task.Run(async () =>
{ {
for (int i = 0; i < Program.NumberOfItems; i++) for (int i = 0; i < NumberOfItems; i++)
{ {
var result = await thingsgatewaymodbus.ModbusReadAsync(addr).ConfigureAwait(false); var result = await thingsgatewaymodbus.ModbusReadAsync(addr).ConfigureAwait(false);
if (!result.IsSuccess) if (!result.IsSuccess)
@@ -146,11 +150,11 @@ public class ModbusBenchmark : IDisposable
foreach (var _lgbModbusClient in _lgbModbusClients) foreach (var _lgbModbusClient in _lgbModbusClients)
{ {
for (int i = 0; i < Program.TaskNumberOfItems; i++) for (int i = 0; i < TaskNumberOfItems; i++)
{ {
tasks.Add(Task.Run(async () => tasks.Add(Task.Run(async () =>
{ {
for (int i = 0; i < Program.NumberOfItems; i++) for (int i = 0; i < NumberOfItems; i++)
{ {
using var cts = new CancellationTokenSource(3000); using var cts = new CancellationTokenSource(3000);
var task = await _lgbModbusClient.ReadHoldingRegistersAsync(1, 0, 100, cts.Token).ConfigureAwait(false); var task = await _lgbModbusClient.ReadHoldingRegistersAsync(1, 0, 100, cts.Token).ConfigureAwait(false);
@@ -167,11 +171,11 @@ public class ModbusBenchmark : IDisposable
List<Task> tasks = new List<Task>(); List<Task> tasks = new List<Task>();
foreach (var modbusTcpMaster in modbusTcpMasters) foreach (var modbusTcpMaster in modbusTcpMasters)
{ {
for (int i = 0; i < Program.TaskNumberOfItems; i++) for (int i = 0; i < TaskNumberOfItems; i++)
{ {
tasks.Add(Task.Run(async () => tasks.Add(Task.Run(async () =>
{ {
for (int i = 0; i < Program.NumberOfItems; i++) for (int i = 0; i < NumberOfItems; i++)
{ {
var result = await modbusTcpMaster.ReadHoldingRegistersAsync(0, 100).ConfigureAwait(false); var result = await modbusTcpMaster.ReadHoldingRegistersAsync(0, 100).ConfigureAwait(false);
var data = TouchSocketBitConverter.ConvertValues<byte, ushort>(result.Data.Span, EndianType.Little); var data = TouchSocketBitConverter.ConvertValues<byte, ushort>(result.Data.Span, EndianType.Little);
@@ -193,11 +197,11 @@ public class ModbusBenchmark : IDisposable
List<Task> tasks = new List<Task>(); List<Task> tasks = new List<Task>();
foreach (var nmodbus in nmodbuss) foreach (var nmodbus in nmodbuss)
{ {
for (int i = 0; i < Program.TaskNumberOfItems; i++) for (int i = 0; i < TaskNumberOfItems; i++)
{ {
tasks.Add(Task.Run(async () => tasks.Add(Task.Run(async () =>
{ {
for (int i = 0; i < Program.NumberOfItems; i++) for (int i = 0; i < NumberOfItems; i++)
{ {
var result = await nmodbus.ReadHoldingRegistersAsync(1, 0, 100).ConfigureAwait(false); var result = await nmodbus.ReadHoldingRegistersAsync(1, 0, 100).ConfigureAwait(false);
} }
@@ -215,11 +219,11 @@ public class ModbusBenchmark : IDisposable
// List<Task> tasks = new List<Task>(); // List<Task> tasks = new List<Task>();
// foreach (var modbusTcpNet in modbusTcpNets) // foreach (var modbusTcpNet in modbusTcpNets)
// { // {
// for (int i = 0; i < Program.TaskNumberOfItems; i++) // for (int i = 0; i < TaskNumberOfItems; i++)
// { // {
// tasks.Add(Task.Run(async () => // tasks.Add(Task.Run(async () =>
// { // {
// for (int i = 0; i < Program.NumberOfItems; i++) // for (int i = 0; i < NumberOfItems; i++)
// { // {
// var result = await modbusTcpNet.ReadAsync("0", 100); // var result = await modbusTcpNet.ReadAsync("0", 100);
// if (!result.IsSuccess) // if (!result.IsSuccess)

View File

@@ -29,6 +29,10 @@ namespace ThingsGateway.Foundation;
[MemoryDiagnoser] [MemoryDiagnoser]
public class S7Benchmark : IDisposable public class S7Benchmark : IDisposable
{ {
public static int ClientCount = 5;
public static int TaskNumberOfItems = 1;
public static int NumberOfItems = 5;
private List<SiemensS7Master> siemensS7s = new(); private List<SiemensS7Master> siemensS7s = new();
private List<Plc> plcs = new(); private List<Plc> plcs = new();
@@ -39,7 +43,7 @@ public class S7Benchmark : IDisposable
{ {
{ {
for (int i = 0; i < Program.ClientCount; i++) for (int i = 0; i < ClientCount; i++)
{ {
var clientConfig = new TouchSocket.Core.TouchSocketConfig(); var clientConfig = new TouchSocket.Core.TouchSocketConfig();
@@ -56,14 +60,14 @@ public class S7Benchmark : IDisposable
await siemensS7.ReadAsync("M1", 100); await siemensS7.ReadAsync("M1", 100);
siemensS7s.Add(siemensS7); siemensS7s.Add(siemensS7);
} }
for (int i = 0; i < Program.ClientCount; i++) for (int i = 0; i < ClientCount; i++)
{ {
var siemensS7Net = new SiemensS7Net(SiemensPLCS.S1500, "127.0.0.1"); var siemensS7Net = new SiemensS7Net(SiemensPLCS.S1500, "127.0.0.1");
await siemensS7Net.ConnectServerAsync(); await siemensS7Net.ConnectServerAsync();
await siemensS7Net.ReadAsync("M0", 100); await siemensS7Net.ReadAsync("M0", 100);
siemensS7Nets.Add(siemensS7Net); siemensS7Nets.Add(siemensS7Net);
} }
for (int i = 0; i < Program.ClientCount; i++) for (int i = 0; i < ClientCount; i++)
{ {
var plc = new Plc(CpuType.S71500, "127.0.0.1", 102, 0, 0); var plc = new Plc(CpuType.S71500, "127.0.0.1", 102, 0, 0);
await plc.OpenAsync();//打开plc连接 await plc.OpenAsync();//打开plc连接
@@ -79,11 +83,11 @@ public class S7Benchmark : IDisposable
List<Task> tasks = new List<Task>(); List<Task> tasks = new List<Task>();
foreach (var plc in plcs) foreach (var plc in plcs)
{ {
for (int i = 0; i < Program.TaskNumberOfItems; i++) for (int i = 0; i < TaskNumberOfItems; i++)
{ {
tasks.Add(Task.Run(async () => tasks.Add(Task.Run(async () =>
{ {
for (int i = 0; i < Program.NumberOfItems; i++) for (int i = 0; i < NumberOfItems; i++)
{ {
var result = await plc.ReadAsync(DataType.Memory, 1, 0, VarType.Byte, 100); var result = await plc.ReadAsync(DataType.Memory, 1, 0, VarType.Byte, 100);
} }
@@ -99,11 +103,11 @@ public class S7Benchmark : IDisposable
List<Task> tasks = new List<Task>(); List<Task> tasks = new List<Task>();
foreach (var siemensS7Net in siemensS7Nets) foreach (var siemensS7Net in siemensS7Nets)
{ {
for (int i = 0; i < Program.TaskNumberOfItems; i++) for (int i = 0; i < TaskNumberOfItems; i++)
{ {
tasks.Add(Task.Run(async () => tasks.Add(Task.Run(async () =>
{ {
for (int i = 0; i < Program.NumberOfItems; i++) for (int i = 0; i < NumberOfItems; i++)
{ {
var result = await siemensS7Net.ReadAsync("M0", 100); var result = await siemensS7Net.ReadAsync("M0", 100);
if (!result.IsSuccess) if (!result.IsSuccess)
@@ -129,11 +133,11 @@ public class S7Benchmark : IDisposable
List<Task> tasks = new List<Task>(); List<Task> tasks = new List<Task>();
foreach (var siemensS7 in siemensS7s) foreach (var siemensS7 in siemensS7s)
{ {
for (int i = 0; i < Program.TaskNumberOfItems; i++) for (int i = 0; i < TaskNumberOfItems; i++)
{ {
tasks.Add(Task.Run(async () => tasks.Add(Task.Run(async () =>
{ {
for (int i = 0; i < Program.NumberOfItems; i++) for (int i = 0; i < NumberOfItems; i++)
{ {
var result = await siemensS7.S7ReadAsync(siemensS7Address); var result = await siemensS7.S7ReadAsync(siemensS7Address);
if (!result.IsSuccess) if (!result.IsSuccess)

View File

@@ -20,14 +20,11 @@ namespace BenchmarkConsoleApp
{ {
internal class Program internal class Program
{ {
public static int ClientCount = 50;
public static int TaskNumberOfItems = 6;
public static int NumberOfItems = 50;
private static async Task Main(string[] args) private static async Task Main(string[] args)
{ {
Console.WriteLine("开始测试前请先启动ModbusSlave建议使用本项目自带的ThingsGateway.Debug.Photino软件开启S7可以用KEPSERVER的S7模拟服务"); Console.WriteLine("开始测试前请先启动ModbusSlave建议使用本项目自带的ThingsGateway.Debug.Photino软件开启S7可以用KEPSERVER的S7模拟服务");
Console.WriteLine($"多客户端({ClientCount}),多线程({TaskNumberOfItems})并发读取({NumberOfItems})测试,共{ClientCount * TaskNumberOfItems * NumberOfItems}次");
await Task.CompletedTask; await Task.CompletedTask;
//ModbusBenchmark modbusBenchmark = new ModbusBenchmark(); //ModbusBenchmark modbusBenchmark = new ModbusBenchmark();
//System.Diagnostics.Stopwatch stopwatch = new(); //System.Diagnostics.Stopwatch stopwatch = new();
@@ -46,15 +43,15 @@ namespace BenchmarkConsoleApp
//.WithOptions(ConfigOptions.DisableOptimizationsValidator) //.WithOptions(ConfigOptions.DisableOptimizationsValidator)
//); //);
BenchmarkRunner.Run<MapperBench>( // BenchmarkRunner.Run<MapperBench>(
ManualConfig.Create(DefaultConfig.Instance) //ManualConfig.Create(DefaultConfig.Instance)
.WithOptions(ConfigOptions.DisableOptimizationsValidator) //.WithOptions(ConfigOptions.DisableOptimizationsValidator)
); //);
// BenchmarkRunner.Run<ModbusBenchmark>( BenchmarkRunner.Run<ModbusBenchmark>(
// ManualConfig.Create(DefaultConfig.Instance) ManualConfig.Create(DefaultConfig.Instance)
// .WithOptions(ConfigOptions.DisableOptimizationsValidator) .WithOptions(ConfigOptions.DisableOptimizationsValidator)
//); );
// BenchmarkRunner.Run<S7Benchmark>( // BenchmarkRunner.Run<S7Benchmark>(
//ManualConfig.Create(DefaultConfig.Instance) //ManualConfig.Create(DefaultConfig.Instance)
//.WithOptions(ConfigOptions.DisableOptimizationsValidator) //.WithOptions(ConfigOptions.DisableOptimizationsValidator)

View File

@@ -45,7 +45,7 @@ public class SQLHistoryValue : IPrimaryIdEntity
///<summary> ///<summary>
///实时值 ///实时值
///</summary> ///</summary>
[SugarColumn(ColumnDescription = "实时值")] [SugarColumn(ColumnDescription = "实时值", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)]
[AutoGenerateColumn(Order = 23, Visible = true, Sortable = true, Filterable = false)] [AutoGenerateColumn(Order = 23, Visible = true, Sortable = true, Filterable = false)]
public string Value { get; set; } public string Value { get; set; }

View File

@@ -44,7 +44,7 @@ public class SQLRealValue : IPrimaryIdEntity
///<summary> ///<summary>
///实时值 ///实时值
///</summary> ///</summary>
[SugarColumn(ColumnDescription = "实时值")] [SugarColumn(ColumnDescription = "实时值", ColumnDataType = StaticConfig.CodeFirst_BigString, IsNullable = true)]
[AutoGenerateColumn(Order = 21, Visible = true, Sortable = true, Filterable = false)] [AutoGenerateColumn(Order = 21, Visible = true, Sortable = true, Filterable = false)]
public string Value { get; set; } public string Value { get; set; }