2017-12-27 Update 1 Tcp Connector and Siemens Tcp Update
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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()
|
||||
{
|
||||
|
||||
@@ -85,6 +85,13 @@ namespace Modbus.Net
|
||||
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void SendStart()
|
||||
{
|
||||
_taskCancel = false;
|
||||
base.SendStart();
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
public override void SendStop()
|
||||
{
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user