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

View File

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

View File

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

View File

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

View File

@@ -34,7 +34,7 @@ namespace Modbus.Net
int slaveAddress) int slaveAddress)
: this( : this(
com, baudRate, parity, stopBits, dataBits, 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, protected ComProtocolLinker(string com, int baudRate, Parity parity, StopBits stopBits, int dataBits,
int connectionTimeout, int slaveAddress) int connectionTimeout, int slaveAddress)
{ {
BaseConnector = new ComConnector(com + ":" + slaveAddress, baudRate, parity, stopBits, dataBits, if (connectionTimeout == -1)
connectionTimeout); {
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) lock (WaitingMessages)
{ {
if (_currentSendingPos == null)
{
if (WaitingMessages.Count > 0)
{
_currentSendingPos = WaitingMessages.First();
_currentSendingPos.SendMutex.Set();
}
}
if (_currentSendingPos != null) if (_currentSendingPos != null)
{ {
if (WaitingMessages.Count <= 0) if (WaitingMessages.Count <= 0)
@@ -70,6 +78,13 @@ namespace Modbus.Net
} }
/// <inheritdoc />
public override void SendStart()
{
_taskCancel = false;
base.SendStart();
}
/// <inheritdoc /> /// <inheritdoc />
public override void SendStop() public override void SendStop()
{ {

View File

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

View File

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

View File

@@ -21,7 +21,7 @@ namespace Modbus.Net
/// <param name="ip">Ip地址</param> /// <param name="ip">Ip地址</param>
/// <param name="port">端口</param> /// <param name="port">端口</param>
protected TcpProtocolLinker(string ip, int port) 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> /// <param name="connectionTimeout">超时时间</param>
protected TcpProtocolLinker(string ip, int port, int connectionTimeout) protected TcpProtocolLinker(string ip, int port, int connectionTimeout)
{ {
//初始化连接对象 if (connectionTimeout == -1)
BaseConnector = new TcpConnector(ip, port, connectionTimeout); {
//初始化连接对象
BaseConnector = new TcpConnector(ip, port);
}
else
{
//初始化连接对象
BaseConnector = new TcpConnector(ip, port, connectionTimeout);
}
} }
} }
} }