From fc1354adc54b05c201e00ccb1f125bf69e4b6530 Mon Sep 17 00:00:00 2001 From: BennyZhao Date: Wed, 29 Jun 2022 19:47:00 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E8=B6=85=E6=97=B6=E8=AE=BE?= =?UTF-8?q?=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs | 10 +++++++++- IoTClient/Clients/Modbus/ModbusTcpClient.cs | 12 ++++++++++-- IoTClient/Clients/PLC/AllenBradleyClient.cs | 9 ++++++++- IoTClient/Clients/PLC/MitsubishiClient.cs | 9 ++++++++- IoTClient/Clients/PLC/OmronFinsClient.cs | 9 ++++++++- IoTClient/Clients/PLC/SiemensClient.cs | 9 ++++++++- IoTClient/IoTClient.csproj | 4 ++-- IoTClient/IoTClient/IoTClient.xml | 2 +- IoTServer/IoTServer.csproj | 4 ++-- 9 files changed, 56 insertions(+), 12 deletions(-) diff --git a/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs b/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs index 6e0b381..87a3eb8 100644 --- a/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs +++ b/IoTClient/Clients/Modbus/ModbusRtuOverTcpClient.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; +using System.Threading; namespace IoTClient.Clients.Modbus { @@ -56,6 +57,8 @@ namespace IoTClient.Clients.Modbus this.plcAddresses = plcAddresses; } + private readonly ManualResetEvent TimeoutObject = new ManualResetEvent(false); + protected override Result Connect() { var result = new Result(); @@ -67,7 +70,12 @@ namespace IoTClient.Clients.Modbus socket.SendTimeout = timeout; //连接 - socket.Connect(ipEndPoint); + //socket.Connect(ipEndPoint); + TimeoutObject.Reset(); + socket.BeginConnect(ipEndPoint, (asyncresult) => { TimeoutObject.Set(); }, socket); + //阻塞当前线程 + if (!TimeoutObject.WaitOne(timeout, false)) + throw new Exception("连接超时"); } catch (Exception ex) { diff --git a/IoTClient/Clients/Modbus/ModbusTcpClient.cs b/IoTClient/Clients/Modbus/ModbusTcpClient.cs index da34442..8e2f759 100644 --- a/IoTClient/Clients/Modbus/ModbusTcpClient.cs +++ b/IoTClient/Clients/Modbus/ModbusTcpClient.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; +using System.Threading; namespace IoTClient.Clients.Modbus { @@ -59,6 +60,8 @@ namespace IoTClient.Clients.Modbus this.plcAddresses = plcAddresses; } + private readonly ManualResetEvent TimeoutObject = new ManualResetEvent(false); + /// /// 连接 /// @@ -75,7 +78,12 @@ namespace IoTClient.Clients.Modbus socket.SendTimeout = timeout; //连接 - socket.Connect(ipEndPoint); + //socket.Connect(ipEndPoint); + TimeoutObject.Reset(); + socket.BeginConnect(ipEndPoint, (asyncresult) => { TimeoutObject.Set(); }, socket); + //阻塞当前线程 + if (!TimeoutObject.WaitOne(timeout, false)) + throw new Exception("连接超时"); } catch (Exception ex) { @@ -1165,7 +1173,7 @@ namespace IoTClient.Clients.Modbus /// 写入 /// /// 写入地址 - /// 批量读取的值 + /// 写入字节数组 /// 站号 /// 功能码 /// 大小端设置 diff --git a/IoTClient/Clients/PLC/AllenBradleyClient.cs b/IoTClient/Clients/PLC/AllenBradleyClient.cs index 9b98c81..d132dd1 100644 --- a/IoTClient/Clients/PLC/AllenBradleyClient.cs +++ b/IoTClient/Clients/PLC/AllenBradleyClient.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; +using System.Threading; namespace IoTClient.Clients.PLC { @@ -66,6 +67,7 @@ namespace IoTClient.Clients.PLC 0x00,0x00 //选项标记(0x0000 }; + private readonly ManualResetEvent TimeoutObject = new ManualResetEvent(false); /// /// 打开连接(如果已经是连接状态会先关闭再打开) /// @@ -83,7 +85,12 @@ namespace IoTClient.Clients.PLC socket.SendTimeout = timeout; //连接 - socket.Connect(IpEndPoint); + //socket.Connect(IpEndPoint); + TimeoutObject.Reset(); + socket.BeginConnect(IpEndPoint, (asyncresult) => { TimeoutObject.Set(); }, socket); + //阻塞当前线程 + if (!TimeoutObject.WaitOne(timeout, false)) + throw new Exception("连接超时"); result.Requst = string.Join(" ", RegisteredCommand.Select(t => t.ToString("X2"))); socket.Send(RegisteredCommand); diff --git a/IoTClient/Clients/PLC/MitsubishiClient.cs b/IoTClient/Clients/PLC/MitsubishiClient.cs index 4e4dad4..4ded436 100644 --- a/IoTClient/Clients/PLC/MitsubishiClient.cs +++ b/IoTClient/Clients/PLC/MitsubishiClient.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Net; using System.Net.Sockets; using System.Text; +using System.Threading; namespace IoTClient.Clients.PLC { @@ -48,6 +49,7 @@ namespace IoTClient.Clients.PLC this.timeout = timeout; } + private readonly ManualResetEvent TimeoutObject = new ManualResetEvent(false); /// /// 打开连接(如果已经是连接状态会先关闭再打开) /// @@ -63,7 +65,12 @@ namespace IoTClient.Clients.PLC socket.ReceiveTimeout = timeout; socket.SendTimeout = timeout; - socket.Connect(IpEndPoint); + //socket.Connect(IpEndPoint); + TimeoutObject.Reset(); + socket.BeginConnect(IpEndPoint, (asyncresult) => { TimeoutObject.Set(); }, socket); + //阻塞当前线程 + if (!TimeoutObject.WaitOne(timeout, false)) + throw new Exception("连接超时"); } catch (Exception ex) { diff --git a/IoTClient/Clients/PLC/OmronFinsClient.cs b/IoTClient/Clients/PLC/OmronFinsClient.cs index 102ce6f..c9c2edd 100644 --- a/IoTClient/Clients/PLC/OmronFinsClient.cs +++ b/IoTClient/Clients/PLC/OmronFinsClient.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Sockets; +using System.Threading; namespace IoTClient.Clients.PLC { @@ -80,6 +81,7 @@ namespace IoTClient.Clients.PLC this.endianFormat = endianFormat; } + private readonly ManualResetEvent TimeoutObject = new ManualResetEvent(false); /// /// 打开连接(如果已经是连接状态会先关闭再打开) /// @@ -95,7 +97,12 @@ namespace IoTClient.Clients.PLC socket.ReceiveTimeout = timeout; socket.SendTimeout = timeout; - socket.Connect(IpEndPoint); + //socket.Connect(IpEndPoint); + TimeoutObject.Reset(); + socket.BeginConnect(IpEndPoint, (asyncresult) => { TimeoutObject.Set(); }, socket); + //阻塞当前线程 + if (!TimeoutObject.WaitOne(timeout, false)) + throw new Exception("连接超时"); BasicCommand[19] = SA1; result.Requst = string.Join(" ", BasicCommand.Select(t => t.ToString("X2"))); diff --git a/IoTClient/Clients/PLC/SiemensClient.cs b/IoTClient/Clients/PLC/SiemensClient.cs index d24e468..b7e4788 100644 --- a/IoTClient/Clients/PLC/SiemensClient.cs +++ b/IoTClient/Clients/PLC/SiemensClient.cs @@ -90,6 +90,8 @@ namespace IoTClient.Clients.PLC this.timeout = timeout; } + private readonly ManualResetEvent TimeoutObject = new ManualResetEvent(false); + /// /// 打开连接(如果已经是连接状态会先关闭再打开) /// @@ -106,7 +108,12 @@ namespace IoTClient.Clients.PLC socket.SendTimeout = timeout; //连接 - socket.Connect(IpEndPoint); + //socket.Connect(IpEndPoint); + TimeoutObject.Reset(); + socket.BeginConnect(IpEndPoint, (asyncresult) => { TimeoutObject.Set(); }, socket); + //阻塞当前线程 + if (!TimeoutObject.WaitOne(timeout, false)) + throw new Exception("连接超时"); var Command1 = SiemensConstant.Command1; var Command2 = SiemensConstant.Command2; diff --git a/IoTClient/IoTClient.csproj b/IoTClient/IoTClient.csproj index c091198..9e91b80 100644 --- a/IoTClient/IoTClient.csproj +++ b/IoTClient/IoTClient.csproj @@ -7,9 +7,9 @@ MIT https://github.com/zhaopeiym/IoTClient 农码一生 - benny - 擎呐科技 + 农码一生 物联网设备通讯协议实现 - Copyright (c) 2019 擎呐科技. All rights reserved. + Copyright (c) 2022 农码一生. All rights reserved. git https://github.com/zhaopeiym/IoTClient IoT,物联网,PLC,Modbus,Bacnet diff --git a/IoTClient/IoTClient/IoTClient.xml b/IoTClient/IoTClient/IoTClient.xml index e8e4786..8a8911b 100644 --- a/IoTClient/IoTClient/IoTClient.xml +++ b/IoTClient/IoTClient/IoTClient.xml @@ -1589,7 +1589,7 @@ 写入 写入地址 - 批量读取的值 + 写入字节数组 站号 功能码 大小端设置 diff --git a/IoTServer/IoTServer.csproj b/IoTServer/IoTServer.csproj index e56e295..010de92 100644 --- a/IoTServer/IoTServer.csproj +++ b/IoTServer/IoTServer.csproj @@ -6,9 +6,9 @@ MIT https://github.com/zhaopeiym/IoTClient 农码一生 - benny - 擎呐科技 + 农码一生 物联网设备通讯协议实现 - Copyright (c) 2019 擎呐科技. All rights reserved. + Copyright (c) 2022 农码一生. All rights reserved. git https://github.com/zhaopeiym/IoTClient IoT,物联网,PLC,Modbus,Bacnet