From a1b50c9c42ab64154bfcd511e1726692dd65f44c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=A5=E6=B1=9D=E6=A3=8B=E8=8C=97?= <505554090@qq.com> Date: Wed, 30 Apr 2025 10:57:23 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9AModbusTcpMaster=20?= =?UTF-8?q?=E9=87=8D=E8=BF=9E=E7=A4=BA=E4=BE=8B=EF=BC=88=E6=9A=82=E6=97=B6?= =?UTF-8?q?=EF=BC=89=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Modbus/ModbusMasterConsoleApp/Program.cs | 57 ++++++++++++++++++- examples/Tcp/TcpConsoleApp/Program.cs | 2 +- 2 files changed, 57 insertions(+), 2 deletions(-) diff --git a/examples/Modbus/ModbusMasterConsoleApp/Program.cs b/examples/Modbus/ModbusMasterConsoleApp/Program.cs index 400bc7c67..d164cfdc4 100644 --- a/examples/Modbus/ModbusMasterConsoleApp/Program.cs +++ b/examples/Modbus/ModbusMasterConsoleApp/Program.cs @@ -93,7 +93,12 @@ internal class Program public static async Task GetModbusTcpMasterAsync() { var client = new ModbusTcpMaster(); - + await client.SetupAsync(new TouchSocketConfig() + .ConfigurePlugins(a => + { + a.UseModbusTcpMasterReconnectionPlugin() + .UsePolling(TimeSpan.FromSeconds(1)); + })); await client.ConnectAsync("127.0.0.1:502"); return client; } @@ -162,4 +167,54 @@ internal class MyClass { public int P1 { get; set; } public int P2 { get; set; } +} + +public static class MasterReconnectionPluginExtension +{ + public static ReconnectionPlugin UseModbusTcpMasterReconnectionPlugin(this IPluginManager pluginManager) + { + ModbusTcpMasterReconnectionPlugin modbusTcpMasterReconnectionPlugin = new ModbusTcpMasterReconnectionPlugin(); + pluginManager.Add(modbusTcpMasterReconnectionPlugin); + return modbusTcpMasterReconnectionPlugin; + } +} + +internal sealed class ModbusTcpMasterReconnectionPlugin : ReconnectionPlugin, ITcpClosedPlugin +{ + public override Func> ActionForCheck { get; set; } + + public ModbusTcpMasterReconnectionPlugin() + { + this.ActionForCheck = (c, i) => Task.FromResult(c.Online); + } + + public async Task OnTcpClosed(ITcpSession client, ClosedEventArgs e) + { + await e.InvokeNext().ConfigureAwait(EasyTask.ContinueOnCapturedContext); + + if (client is not IModbusTcpMaster tClient) + { + return; + } + + if (e.Manual) + { + return; + } + + _ = Task.Run(async () => + { + while (true) + { + if (this.DisposedValue) + { + return; + } + if (await this.ActionForConnect.Invoke(tClient).ConfigureAwait(EasyTask.ContinueOnCapturedContext)) + { + return; + } + } + }); + } } \ No newline at end of file diff --git a/examples/Tcp/TcpConsoleApp/Program.cs b/examples/Tcp/TcpConsoleApp/Program.cs index b8a6fb098..68a3dfb6b 100644 --- a/examples/Tcp/TcpConsoleApp/Program.cs +++ b/examples/Tcp/TcpConsoleApp/Program.cs @@ -83,7 +83,7 @@ internal class Program .SetRemoteIPHost(new IPHost("127.0.0.1:7789")) .ConfigurePlugins(a => { - a.UseTcpReconnection() + a.UseTcpReconnection() .UsePolling(TimeSpan.FromSeconds(1)); }) .ConfigureContainer(a =>