Skip to content

Commit

Permalink
Merge pull request #1254 from pkuehnel/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
pkuehnel authored May 26, 2024
2 parents d750238 + 15d7a38 commit 3792f2d
Show file tree
Hide file tree
Showing 4 changed files with 34 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ namespace TeslaSolarCharger.Services.Services.Modbus.Contracts;
public interface IModbusTcpClient : IDisposable
{
bool IsConnected { get; }
void Connect(IPEndPoint ipEndPoint, ModbusEndianess endianess);
Task Connect(IPEndPoint ipEndPoint, ModbusEndianess endianess, TimeSpan connectTimeout);
void Disconnect();
Task<byte[]> GetByteArrayFromHoldingRegisters(byte unitIdentifier, ushort startingAddress, ushort quantity, TimeSpan readTimeout);
Task<byte[]> GetByteArrayFromInputRegisters(byte unitIdentifier, ushort startingAddress, ushort quantity, TimeSpan readTimeout);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,14 @@ public async Task<byte[]> GetByteArrayFromHoldingRegisters(byte unitIdentifier,
try
{
ReadTimeout = (int)readTimeout.TotalMilliseconds;
logger.LogTrace("ReadTimeout: {ReadTimeout}", ReadTimeout);
var result = await base.ReadHoldingRegistersAsync(unitIdentifier, startingAddress, quantity);
return result.ToArray();
}
finally
{
_semaphoreSlim.Release();
logger.LogTrace("Semaphore released");
}
}

Expand All @@ -35,12 +37,14 @@ public async Task<byte[]> GetByteArrayFromInputRegisters(byte unitIdentifier, us
try
{
ReadTimeout = (int)readTimeout.TotalMilliseconds;
logger.LogTrace("ReadTimeout: {ReadTimeout}", ReadTimeout);
var result = await base.ReadInputRegistersAsync(unitIdentifier, startingAddress, quantity);
return result.ToArray();
}
finally
{
_semaphoreSlim.Release();
logger.LogTrace("Semaphore released");
}
}

Expand All @@ -49,14 +53,27 @@ public void Demo()
Connect();
}

public void Connect(IPEndPoint ipEndPoint, ModbusEndianess endianess)
public async Task Connect(IPEndPoint ipEndPoint, ModbusEndianess endianess, TimeSpan connectTimeout)
{
var fluentEndianness = endianess switch
logger.LogTrace("{method}({ipEndPoint}, {endianess}, {connectTimeout})", nameof(Connect), ipEndPoint, endianess, connectTimeout);
await _semaphoreSlim.WaitAsync().ConfigureAwait(false);
try
{
var fluentEndianness = endianess switch
{
ModbusEndianess.BigEndian => ModbusEndianness.BigEndian,
ModbusEndianess.LittleEndian => ModbusEndianness.LittleEndian,
_ => throw new ArgumentOutOfRangeException(nameof(endianess), endianess, "Endianess not known"),
};
ConnectTimeout = (int)connectTimeout.TotalMilliseconds;
logger.LogTrace("ConnectTimeout: {ConnectTimeout}", ConnectTimeout);
base.Connect(ipEndPoint, fluentEndianness);
}
finally
{
ModbusEndianess.BigEndian => ModbusEndianness.BigEndian,
ModbusEndianess.LittleEndian => ModbusEndianness.LittleEndian,
_ => throw new ArgumentOutOfRangeException(nameof(endianess), endianess, "Endianess not known"),
};
base.Connect(ipEndPoint, fluentEndianness);
_semaphoreSlim.Release();
logger.LogTrace("Semaphore relesed");
}

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ public async Task<byte[]> GetByteArray(byte unitIdentifier, string host, int por
{
logger.LogTrace("{method}({unitIdentifier}, {host}, {port}, {endianess}, {connectDelay}, {readTimeout}, {registerType}, {address}, {length})",
nameof(GetByteArray), unitIdentifier, host, port, endianess, connectDelay, readTimeout, registerType, address, length);
var client = await GetConnectedModbusTcpClient(host, port, endianess, connectDelay);
var client = await GetConnectedModbusTcpClient(host, port, endianess, connectDelay, readTimeout);
byte[] byteArray;
if (registerType == ModbusRegisterType.HoldingRegister)
{
Expand Down Expand Up @@ -62,7 +62,8 @@ private static byte[] ConvertToCorrectEndianess(ModbusEndianess endianess, byte[
return tempArray;
}

private async Task<IModbusTcpClient> GetConnectedModbusTcpClient(string host, int port, ModbusEndianess endianess, TimeSpan connectDelay)
private async Task<IModbusTcpClient> GetConnectedModbusTcpClient(string host, int port, ModbusEndianess endianess,
TimeSpan connectDelay, TimeSpan connectTimeout)
{
logger.LogTrace("{method}({host}, {port})", nameof(GetConnectedModbusTcpClient), host, port);
var ipAddress = GetIpAddressFromHost(host);
Expand All @@ -71,21 +72,22 @@ private async Task<IModbusTcpClient> GetConnectedModbusTcpClient(string host, in
{
if (!modbusClient.IsConnected)
{
await ConnectModbusClient(modbusClient, ipAddress, port, endianess, connectDelay);
await ConnectModbusClient(modbusClient, ipAddress, port, endianess, connectDelay, connectTimeout);
}
return modbusClient;
}

var client = serviceProvider.GetRequiredService<IModbusTcpClient>();
await ConnectModbusClient(client, ipAddress, port, endianess, connectDelay);
_modbusClients.Add(key, client);
await ConnectModbusClient(client, ipAddress, port, endianess, connectDelay, connectTimeout);
return client;
}

private async Task ConnectModbusClient(IModbusTcpClient modbusClient, IPAddress ipAddress, int port, ModbusEndianess endianess,
TimeSpan connectDelay)
TimeSpan connectDelay, TimeSpan connectTimeout)
{
modbusClient.Connect(new IPEndPoint(ipAddress, port), endianess);
logger.LogTrace("{method}(modbusClient, {ipAddress}, {port}, {endianess}, {connectDelay}, {connectTimeout})", nameof(ConnectModbusClient), ipAddress, port, endianess, connectDelay, connectTimeout);
await modbusClient.Connect(new IPEndPoint(ipAddress, port), endianess, connectTimeout);
await Task.Delay(connectDelay).ConfigureAwait(false);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public async Task<byte[]> GetResult(DtoModbusConfiguration modbusConfig, DtoModb
{
logger.LogTrace("{method}({modbusConfig})", nameof(GetResult), modbusConfig);
var byteArray = await modbusClientHandlingService.GetByteArray((byte)modbusConfig.UnitIdentifier!, modbusConfig.Host,
modbusConfig.Port, modbusConfig.Endianess, TimeSpan.FromSeconds(modbusConfig.ConnectDelayMilliseconds),
modbusConfig.Port, modbusConfig.Endianess, TimeSpan.FromMilliseconds(modbusConfig.ConnectDelayMilliseconds),
TimeSpan.FromMilliseconds(modbusConfig.ReadTimeoutMilliseconds), resultConfiguration.RegisterType,
(ushort)resultConfiguration.Address, (ushort)resultConfiguration.Length);
return byteArray;
Expand Down

0 comments on commit 3792f2d

Please sign in to comment.