diff --git a/Modbus.Net/Modbus.Net/ComConnector.cs b/Modbus.Net/Modbus.Net/ComConnector.cs index cfa123b..42a9b19 100644 --- a/Modbus.Net/Modbus.Net/ComConnector.cs +++ b/Modbus.Net/Modbus.Net/ComConnector.cs @@ -260,14 +260,10 @@ namespace Modbus.Net { if (Linkers.Values.Count(p => p == _com) <= 1) { - try + if (SerialPort.IsOpen) { SerialPort.Close(); } - catch - { - //ignore - } SerialPort.Dispose(); Log.Information("Com interface {Com} Disposed", _com); Connectors[_com] = null; @@ -364,6 +360,7 @@ namespace Modbus.Net catch (Exception e) { Log.Error(e, "Com client {ConnectionToken} connect error", ConnectionToken); + Dispose(); return false; } } diff --git a/Modbus.Net/Modbus.Net/TcpConnector.cs b/Modbus.Net/Modbus.Net/TcpConnector.cs index cadff86..2787698 100644 --- a/Modbus.Net/Modbus.Net/TcpConnector.cs +++ b/Modbus.Net/Modbus.Net/TcpConnector.cs @@ -96,11 +96,7 @@ namespace Modbus.Net if (_socketClient != null) { CloseClientSocket(); -#if NET40 || NET45 || NET451 || NET452 - _socketClient.Close(); -#else - _socketClient.Dispose(); -#endif + _socketClient = null; Log.Debug("Tcp client {ConnectionToken} Disposed", ConnectionToken); } m_disposed = true; @@ -123,7 +119,8 @@ namespace Modbus.Net { if (_socketClient != null) { - return true; + if (_socketClient.Connected) + return true; } try { @@ -133,16 +130,10 @@ namespace Modbus.Net ReceiveTimeout = TimeoutTime }; - try - { - var cts = new CancellationTokenSource(); - cts.CancelAfter(TimeoutTime); - await _socketClient.ConnectAsync(_host, _port).WithCancellation(cts.Token); - } - catch (Exception e) - { - Log.Error(e, "Tcp client {ConnectionToken} connect error", ConnectionToken); - } + var cts = new CancellationTokenSource(); + cts.CancelAfter(TimeoutTime); + await _socketClient.ConnectAsync(_host, _port).WithCancellation(cts.Token); + if (_socketClient.Connected) { _taskCancel = false; @@ -152,11 +143,13 @@ namespace Modbus.Net return true; } Log.Error("Tcp client {ConnectionToken} connect failed.", ConnectionToken); + Dispose(); return false; } catch (Exception err) { Log.Error(err, "Tcp client {ConnectionToken} connect exception", ConnectionToken); + Dispose(); return false; } } @@ -249,9 +242,9 @@ namespace Modbus.Net { //主动传输事件 } - } - RefreshReceiveCount(); + RefreshReceiveCount(); + } } } catch (ObjectDisposedException) diff --git a/Modbus.Net/Modbus.Net/UdpConnector.cs b/Modbus.Net/Modbus.Net/UdpConnector.cs index 96a8623..30682af 100644 --- a/Modbus.Net/Modbus.Net/UdpConnector.cs +++ b/Modbus.Net/Modbus.Net/UdpConnector.cs @@ -83,12 +83,8 @@ namespace Modbus.Net if (_socketClient != null) { CloseClientSocket(); -#if NET40 || NET45 || NET451 || NET452 - _socketClient.Close(); -#else - _socketClient.Dispose(); -#endif - Log.Debug("Tcp client {ConnectionToken} Disposed", ConnectionToken); + _socketClient = null; + Log.Debug("Udp client {ConnectionToken} Disposed", ConnectionToken); } m_disposed = true; } @@ -110,36 +106,33 @@ namespace Modbus.Net { if (_socketClient != null) { - return true; + return true; } try { _socketClient = new UdpClient(); - try - { - var cts = new CancellationTokenSource(); - cts.CancelAfter(TimeoutTime); - await Task.Run(() => _socketClient.Connect(_host, _port), cts.Token); - } - catch (Exception e) - { - Log.Error(e, "Tcp client {ConnectionToken} connect error", ConnectionToken); - } + var cts = new CancellationTokenSource(); + cts.CancelAfter(TimeoutTime); + await Task.Run(() => _socketClient.Connect(_host, _port), cts.Token); + if (_socketClient.Client.Connected) { _taskCancel = false; Controller.SendStart(); ReceiveMsgThreadStart(); - Log.Information("Tcp client {ConnectionToken} connected", ConnectionToken); + Log.Information("Udp client {ConnectionToken} connected", ConnectionToken); return true; } - Log.Error("Tcp client {ConnectionToken} connect failed.", ConnectionToken); + + Log.Error("Udp client {ConnectionToken} connect failed.", ConnectionToken); + Dispose(); return false; } catch (Exception err) { - Log.Error(err, "Tcp client {ConnectionToken} connect exception", ConnectionToken); + Log.Error(err, "Udp client {ConnectionToken} connect exception", ConnectionToken); + Dispose(); return false; } } @@ -154,12 +147,12 @@ namespace Modbus.Net try { Dispose(); - Log.Information("Tcp client {ConnectionToken} disconnected successfully", ConnectionToken); + Log.Information("Udp client {ConnectionToken} disconnected successfully", ConnectionToken); return true; } catch (Exception err) { - Log.Error(err, "Tcp client {ConnectionToken} disconnected exception", ConnectionToken); + Log.Error(err, "Udp client {ConnectionToken} disconnected exception", ConnectionToken); return false; } finally @@ -180,13 +173,13 @@ namespace Modbus.Net RefreshSendCount(); - Log.Verbose("Tcp client {ConnectionToken} send text len = {Length}", ConnectionToken, datagram.Length); - Log.Verbose($"Tcp client {ConnectionToken} send: {String.Concat(datagram.Select(p => " " + p.ToString("X2")))}"); + Log.Verbose("Udp client {ConnectionToken} send text len = {Length}", ConnectionToken, datagram.Length); + Log.Verbose($"Udp client {ConnectionToken} send: {String.Concat(datagram.Select(p => " " + p.ToString("X2")))}"); await _socketClient.SendAsync(datagram, datagram.Length); } catch (Exception err) { - Log.Error(err, "Tcp client {ConnectionToken} send exception", ConnectionToken); + Log.Error(err, "Udp client {ConnectionToken} send exception", ConnectionToken); CloseClientSocket(); } } @@ -221,19 +214,19 @@ namespace Modbus.Net { if (receive.Buffer.Clone() is byte[] receiveBytes) { - Log.Verbose("Tcp client {ConnectionToken} receive text len = {Length}", ConnectionToken, + Log.Verbose("Udp client {ConnectionToken} receive text len = {Length}", ConnectionToken, receiveBytes.Length); Log.Verbose( - $"Tcp client {ConnectionToken} receive: {String.Concat(receiveBytes.Select(p => " " + p.ToString("X2")))}"); + $"Udp client {ConnectionToken} receive: {String.Concat(receiveBytes.Select(p => " " + p.ToString("X2")))}"); var isMessageConfirmed = Controller.ConfirmMessage(receiveBytes); if (isMessageConfirmed == false) { //主动传输事件 } } - } - RefreshReceiveCount(); + RefreshReceiveCount(); + } } } catch (ObjectDisposedException) @@ -242,7 +235,7 @@ namespace Modbus.Net } catch (Exception err) { - Log.Error(err, "Tcp client {ConnectionToken} receive exception", ConnectionToken); + Log.Error(err, "Udp client {ConnectionToken} receive exception", ConnectionToken); //CloseClientSocket(); } } @@ -250,19 +243,19 @@ namespace Modbus.Net private void RefreshSendCount() { _sendCount++; - Log.Verbose("Tcp client {ConnectionToken} send count: {SendCount}", ConnectionToken, _sendCount); + Log.Verbose("Udp client {ConnectionToken} send count: {SendCount}", ConnectionToken, _sendCount); } private void RefreshReceiveCount() { _receiveCount++; - Log.Verbose("Tcp client {ConnectionToken} receive count: {SendCount}", ConnectionToken, _receiveCount); + Log.Verbose("Udp client {ConnectionToken} receive count: {SendCount}", ConnectionToken, _receiveCount); } private void RefreshErrorCount() { _errorCount++; - Log.Verbose("Tcp client {ConnectionToken} error count: {ErrorCount}", ConnectionToken, _errorCount); + Log.Verbose("Udp client {ConnectionToken} error count: {ErrorCount}", ConnectionToken, _errorCount); } private void CloseClientSocket() @@ -280,7 +273,11 @@ namespace Modbus.Net } catch (Exception ex) { - Log.Error(ex, "Tcp client {ConnectionToken} client close exception", ConnectionToken); + Log.Error(ex, "Udp client {ConnectionToken} client close exception", ConnectionToken); + } + finally + { + _socketClient = null; } } } diff --git a/Tests/Modbus.Net.PersistedTests/Program.cs b/Tests/Modbus.Net.PersistedTests/Program.cs index ec6ee60..930b98d 100644 --- a/Tests/Modbus.Net.PersistedTests/Program.cs +++ b/Tests/Modbus.Net.PersistedTests/Program.cs @@ -12,7 +12,7 @@ namespace Modbus.Net.PersistedTests { Log.Logger = new LoggerConfiguration().MinimumLevel.Verbose().WriteTo.Console().CreateLogger(); - IMachineProperty machine = new ModbusMachine(1, ModbusType.Rtu, "COM1", + IMachineProperty machine = new ModbusMachine(1, ModbusType.Tcp, "127.0.0.1", new List() { new AddressUnit() @@ -40,65 +40,9 @@ namespace Modbus.Net.PersistedTests DataType = typeof(ushort) }, }, true, 2, 1); - IMachineProperty machine2 = new ModbusMachine(2, ModbusType.Rtu, "COM1", - new List() - { - new AddressUnit() - { - Id = "1", - Area = "4X", - Address = 11, - Name = "test 1", - DataType = typeof(ushort) - }, - new AddressUnit() - { - Id = "2", - Area = "4X", - Address = 12, - Name = "test 2", - DataType = typeof(ushort) - }, - new AddressUnit() - { - Id = "3", - Area = "4X", - Address = 13, - Name = "test 3", - DataType = typeof(ushort) - }, - }, true, 3, 1); - IMachineProperty machine3 = new ModbusMachine(3, ModbusType.Rtu, "COM1", - new List() - { - new AddressUnit() - { - Id = "1", - Area = "4X", - Address = 21, - Name = "test 1", - DataType = typeof(ushort) - }, - new AddressUnit() - { - Id = "2", - Area = "4X", - Address = 22, - Name = "test 2", - DataType = typeof(ushort) - }, - new AddressUnit() - { - Id = "3", - Area = "4X", - Address = 23, - Name = "test 3", - DataType = typeof(ushort) - }, - }, true, 4, 1); TaskManager manager = new TaskManager(20, true); - manager.AddMachines(new List> { machine, machine2, machine3 }); + manager.AddMachines(new List> { machine }); Random r = new Random(); manager.InvokeTimerForMachine(1, new TaskItemSetData(() => new Dictionary { @@ -112,38 +56,16 @@ namespace Modbus.Net.PersistedTests "4X 3.0", r.Next() % 65536 }, }, MachineSetDataType.Address, 10000, 10000)); - manager.InvokeTimerForMachine(2, new TaskItemSetData(() => new Dictionary - { - { - "4X 11.0", r.Next() % 65536 - }, - { - "4X 12.0", r.Next() % 65536 - }, - { - "4X 13.0", r.Next() % 65536 - }, - }, MachineSetDataType.Address, 10000, 10000)); - manager.InvokeTimerForMachine(3, new TaskItemSetData(() => new Dictionary - { - { - "4X 21.0", r.Next() % 65536 - }, - { - "4X 22.0", r.Next() % 65536 - }, - { - "4X 23.0", r.Next() % 65536 - }, - }, MachineSetDataType.Address, 10000, 10000)); Thread.Sleep(5000); manager.InvokeTimerAll(new TaskItemGetData(data => { - foreach (var dataInner in data.ReturnValues) + if (data?.ReturnValues != null) { - Console.WriteLine(dataInner.Key + " " + dataInner.Value.PlcValue); + foreach (var dataInner in data.ReturnValues) + { + Console.WriteLine(dataInner.Key + " " + dataInner.Value.PlcValue); + } } - }, MachineGetDataType.Address, 10000, 10000)); Console.Read();