2017-12-27 Update 1 Tcp Connector and Siemens Tcp Update

This commit is contained in:
parallelbgls
2017-12-27 11:52:15 +08:00
parent d32f54e220
commit 517cbb82e9
9 changed files with 95 additions and 45 deletions

View File

@@ -18,6 +18,7 @@ namespace Modbus.Net.Siemens
public SiemensPpiProtocol(byte slaveAddress, byte masterAddress)
: this(ConfigurationManager.AppSettings["COM"], slaveAddress, masterAddress)
{
ProtocolLinker = new SiemensPpiProtocolLinker(_com, SlaveAddress);
}
/// <summary>
@@ -71,7 +72,8 @@ namespace Modbus.Net.Siemens
/// <returns>是否连接成功</returns>
public override async Task<bool> ConnectAsync()
{
ProtocolLinker = new SiemensPpiProtocolLinker(_com, SlaveAddress);
if (ProtocolLinker.IsConnected) return true;
if (!await ProtocolLinker.ConnectAsync()) return false;
var inputStruct = new ComCreateReferenceSiemensInputStruct(SlaveAddress, MasterAddress);
var outputStruct =
(await (await

View File

@@ -74,6 +74,7 @@ namespace Modbus.Net.Siemens
_ip = ip;
_port = port;
_connectTryCount = 0;
ProtocolLinker = new SiemensTcpProtocolLinker(_ip, _port);
}
/// <summary>
@@ -143,7 +144,7 @@ namespace Modbus.Net.Siemens
public override async Task<bool> ConnectAsync()
{
_connectTryCount++;
ProtocolLinker = new SiemensTcpProtocolLinker(_ip, _port);
if (ProtocolLinker.IsConnected) return true;
if (!await ProtocolLinker.ConnectAsync()) return false;
_connectTryCount = 0;
var inputStruct = new CreateReferenceSiemensInputStruct(_tdpuSize, _taspSrc, _tsapDst);

View File

@@ -55,7 +55,7 @@ namespace Modbus.Net
public abstract void SendStop();
/// <inheritdoc />
public void SendStart()
public virtual void SendStart()
{
if (SendingThread == null)
{
@@ -80,7 +80,7 @@ namespace Modbus.Net
{
lock (WaitingMessages)
{
if (WaitingMessages.FirstOrDefault(p => p.Key == def.Key) == null)
if (WaitingMessages.FirstOrDefault(p => p.Key == def.Key) == null || def.Key == null)
{
WaitingMessages.Add(def);
return true;

View File

@@ -349,12 +349,13 @@ namespace Modbus.Net
{
lock (SerialPort)
{
_taskCancel = false;
SerialPort.Open();
ReceiveMsgThreadStart();
Controller.SendStart();
}
}
}
Controller.SendStart();
Log.Information("Com client {ConnectionToken} connect success", ConnectionToken);

View File

@@ -34,7 +34,7 @@ namespace Modbus.Net
int slaveAddress)
: this(
com, baudRate, parity, stopBits, dataBits,
int.Parse(ConfigurationManager.AppSettings["ComConnectionTimeout"] ?? "3000"), slaveAddress)
int.Parse(ConfigurationManager.AppSettings["ComConnectionTimeout"] ?? "-1"), slaveAddress)
{
}
@@ -51,8 +51,16 @@ namespace Modbus.Net
protected ComProtocolLinker(string com, int baudRate, Parity parity, StopBits stopBits, int dataBits,
int connectionTimeout, int slaveAddress)
{
BaseConnector = new ComConnector(com + ":" + slaveAddress, baudRate, parity, stopBits, dataBits,
connectionTimeout);
if (connectionTimeout == -1)
{
BaseConnector = new ComConnector(com + ":" + slaveAddress, baudRate, parity, stopBits, dataBits);
}
else
{
BaseConnector = new ComConnector(com + ":" + slaveAddress, baudRate, parity, stopBits, dataBits,
connectionTimeout);
}
}
}
}

View File

@@ -44,6 +44,14 @@ namespace Modbus.Net
}
lock (WaitingMessages)
{
if (_currentSendingPos == null)
{
if (WaitingMessages.Count > 0)
{
_currentSendingPos = WaitingMessages.First();
_currentSendingPos.SendMutex.Set();
}
}
if (_currentSendingPos != null)
{
if (WaitingMessages.Count <= 0)
@@ -70,6 +78,13 @@ namespace Modbus.Net
}
/// <inheritdoc />
public override void SendStart()
{
_taskCancel = false;
base.SendStart();
}
/// <inheritdoc />
public override void SendStop()
{

View File

@@ -85,6 +85,13 @@ namespace Modbus.Net
}
/// <inheritdoc />
public override void SendStart()
{
_taskCancel = false;
base.SendStart();
}
/// <inheritdoc />
public override void SendStop()
{

View File

@@ -139,40 +139,46 @@ namespace Modbus.Net
/// <inheritdoc />
public override async Task<bool> ConnectAsync()
{
if (_socketClient != null)
Disconnect();
try
using (await Lock.LockAsync())
{
_socketClient = new TcpClient
if (_socketClient != null)
{
SendTimeout = TimeoutTime,
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);
}
if (_socketClient.Connected)
{
Controller.SendStart();
ReceiveMsgThreadStart();
Log.Information("Tcp client {ConnectionToken} connected", ConnectionToken);
return true;
}
Log.Error("Tcp client {ConnectionToken} connect failed.", ConnectionToken);
return false;
}
catch (Exception err)
{
Log.Error(err, "Tcp client {ConnectionToken} connect exception", ConnectionToken);
return false;
try
{
_socketClient = new TcpClient
{
SendTimeout = TimeoutTime,
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);
}
if (_socketClient.Connected)
{
_taskCancel = false;
Controller.SendStart();
ReceiveMsgThreadStart();
Log.Information("Tcp client {ConnectionToken} connected", ConnectionToken);
return true;
}
Log.Error("Tcp client {ConnectionToken} connect failed.", ConnectionToken);
return false;
}
catch (Exception err)
{
Log.Error(err, "Tcp client {ConnectionToken} connect exception", ConnectionToken);
return false;
}
}
}
@@ -185,7 +191,6 @@ namespace Modbus.Net
try
{
Dispose();
Controller.SendStop();
Log.Information("Tcp client {ConnectionToken} disconnected successfully", ConnectionToken);
return true;
}
@@ -276,7 +281,7 @@ namespace Modbus.Net
catch (Exception err)
{
Log.Error(err, "Tcp client {ConnectionToken} receive exception", ConnectionToken);
CloseClientSocket();
//CloseClientSocket();
}
}
@@ -320,7 +325,10 @@ namespace Modbus.Net
Controller.SendStop();
Controller.Clear();
ReceiveMsgThreadStop();
_socketClient?.GetStream().Dispose();
if (_socketClient.Connected)
{
_socketClient?.GetStream().Dispose();
}
_socketClient?.Close();
}
catch (Exception ex)

View File

@@ -21,7 +21,7 @@ namespace Modbus.Net
/// <param name="ip">Ip地址</param>
/// <param name="port">端口</param>
protected TcpProtocolLinker(string ip, int port)
: this(ip, port, int.Parse(ConfigurationManager.AppSettings["IPConnectionTimeout"] ?? "5000"))
: this(ip, port, int.Parse(ConfigurationManager.AppSettings["IPConnectionTimeout"] ?? "-1"))
{
}
@@ -33,8 +33,16 @@ namespace Modbus.Net
/// <param name="connectionTimeout">超时时间</param>
protected TcpProtocolLinker(string ip, int port, int connectionTimeout)
{
//初始化连接对象
BaseConnector = new TcpConnector(ip, port, connectionTimeout);
if (connectionTimeout == -1)
{
//初始化连接对象
BaseConnector = new TcpConnector(ip, port);
}
else
{
//初始化连接对象
BaseConnector = new TcpConnector(ip, port, connectionTimeout);
}
}
}
}