Skip to content

Commit

Permalink
Added Support for the .NET Standard 2.0 target
Browse files Browse the repository at this point in the history
  • Loading branch information
ashneilson committed Feb 23, 2022
1 parent bd66b6d commit 5af5154
Show file tree
Hide file tree
Showing 14 changed files with 228 additions and 22 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
# RICADO.Modbus
A Modbus Communication Library for .NET 6 Applications
A Modbus Communication Library for .NET 6 and .NET Standard 2.0 Applications


## Sample usage
Expand Down
52 changes: 50 additions & 2 deletions RICADO.Modbus/Channels/EthernetChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -100,13 +100,18 @@ public async Task InitializeAsync(int timeout, CancellationToken cancellationTok
public async Task<ProcessRequestResult> ProcessRequestAsync(RTURequest request, int timeout, int retries, int? delayBetweenMessages, CancellationToken cancellationToken)
{
int attempts = 0;
Memory<byte> responseMessage = new Memory<byte>();
int bytesSent = 0;
int packetsSent = 0;
int bytesReceived = 0;
int packetsReceived = 0;
DateTime startTimestamp = DateTime.UtcNow;

#if NETSTANDARD
byte[] responseMessage = Array.Empty<byte>();
#else
Memory<byte> responseMessage = new Memory<byte>();
#endif

while (attempts <= retries)
{
try
Expand All @@ -122,7 +127,11 @@ public async Task<ProcessRequestResult> ProcessRequestAsync(RTURequest request,
}

// Build the Request into a Message we can Send
#if NETSTANDARD
byte[] requestMessage = request.BuildMessage();
#else
ReadOnlyMemory<byte> requestMessage = request.BuildMessage();
#endif

// Send the Message
SendMessageResult sendResult = await sendMessageAsync(request.UnitID, requestMessage, timeout, cancellationToken);
Expand Down Expand Up @@ -219,15 +228,23 @@ private async Task destroyAndInitializeClient(int timeout, CancellationToken can
}
}

#if NETSTANDARD
private async Task<SendMessageResult> sendMessageAsync(byte unitId, byte[] message, int timeout, CancellationToken cancellationToken)
#else
private async Task<SendMessageResult> sendMessageAsync(byte unitId, ReadOnlyMemory<byte> message, int timeout, CancellationToken cancellationToken)
#endif
{
SendMessageResult result = new SendMessageResult
{
Bytes = 0,
Packets = 0,
};

#if NETSTANDARD
byte[] modbusTcpMessage = buildMBAPMessage(unitId, message);
#else
ReadOnlyMemory<byte> modbusTcpMessage = buildMBAPMessage(unitId, message);
#endif

try
{
Expand All @@ -252,12 +269,21 @@ private async Task<SendMessageResult> sendMessageAsync(byte unitId, ReadOnlyMemo

private async Task<ReceiveMessageResult> receiveMessageAsync(byte unitId, int timeout, CancellationToken cancellationToken)
{
#if NETSTANDARD
ReceiveMessageResult result = new ReceiveMessageResult
{
Bytes = 0,
Packets = 0,
Message = Array.Empty<byte>(),
};
#else
ReceiveMessageResult result = new ReceiveMessageResult
{
Bytes = 0,
Packets = 0,
Message = new Memory<byte>(),
};
#endif

try
{
Expand All @@ -266,7 +292,12 @@ private async Task<ReceiveMessageResult> receiveMessageAsync(byte unitId, int ti

while (DateTime.UtcNow.Subtract(startTimestamp).TotalMilliseconds < timeout && receivedData.Count < MBAPHeaderLength)
{
#if NETSTANDARD
byte[] buffer = new byte[300];
#else
Memory<byte> buffer = new byte[300];
#endif

TimeSpan receiveTimeout = TimeSpan.FromMilliseconds(timeout).Subtract(DateTime.UtcNow.Subtract(startTimestamp));

if (receiveTimeout.TotalMilliseconds >= 50)
Expand All @@ -275,7 +306,11 @@ private async Task<ReceiveMessageResult> receiveMessageAsync(byte unitId, int ti

if (receivedBytes > 0)
{
#if NETSTANDARD
receivedData.AddRange(buffer.Take(receivedBytes));
#else
receivedData.AddRange(buffer.Slice(0, receivedBytes).ToArray());
#endif

result.Bytes += receivedBytes;
result.Packets += 1;
Expand Down Expand Up @@ -310,7 +345,7 @@ private async Task<ReceiveMessageResult> receiveMessageAsync(byte unitId, int ti

byte[] mbapHeader = receivedData.GetRange(0, MBAPHeaderLength).ToArray();

int tcpMessageDataLength = BitConverter.ToUInt16(new byte[] { receivedData[5], receivedData[4] }) - 1;
int tcpMessageDataLength = BitConverter.ToUInt16(new byte[] { receivedData[5], receivedData[4] }, 0) - 1;

if (tcpMessageDataLength <= 0 || tcpMessageDataLength > byte.MaxValue)
{
Expand All @@ -325,7 +360,12 @@ private async Task<ReceiveMessageResult> receiveMessageAsync(byte unitId, int ti

while (DateTime.UtcNow.Subtract(startTimestamp).TotalMilliseconds < timeout && receivedData.Count < tcpMessageDataLength)
{
#if NETSTANDARD
byte[] buffer = new byte[300];
#else
Memory<byte> buffer = new byte[300];
#endif

TimeSpan receiveTimeout = TimeSpan.FromMilliseconds(timeout).Subtract(DateTime.UtcNow.Subtract(startTimestamp));

if (receiveTimeout.TotalMilliseconds >= 50)
Expand All @@ -334,7 +374,11 @@ private async Task<ReceiveMessageResult> receiveMessageAsync(byte unitId, int ti

if (receivedBytes > 0)
{
#if NETSTANDARD
receivedData.AddRange(buffer.Take(receivedBytes));
#else
receivedData.AddRange(buffer.Slice(0, receivedBytes).ToArray());
#endif
}

result.Bytes += receivedBytes;
Expand Down Expand Up @@ -371,7 +415,11 @@ private async Task<ReceiveMessageResult> receiveMessageAsync(byte unitId, int ti
return result;
}

#if NETSTANDARD
private byte[] buildMBAPMessage(byte unitId, byte[] message)
#else
private ReadOnlyMemory<byte> buildMBAPMessage(byte unitId, ReadOnlyMemory<byte> message)
#endif
{
List<byte> modbusAPMessage = new List<byte>();

Expand Down
4 changes: 2 additions & 2 deletions RICADO.Modbus/Channels/IChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ namespace RICADO.Modbus.Channels
{
internal interface IChannel : IDisposable
{
public Task InitializeAsync(int timeout, CancellationToken cancellationToken);
Task InitializeAsync(int timeout, CancellationToken cancellationToken);

public Task<ProcessRequestResult> ProcessRequestAsync(RTURequest request, int timeout, int retries, int? delayBetweenMessages, CancellationToken cancellationToken);
Task<ProcessRequestResult> ProcessRequestAsync(RTURequest request, int timeout, int retries, int? delayBetweenMessages, CancellationToken cancellationToken);
}
}
4 changes: 4 additions & 0 deletions RICADO.Modbus/Channels/ReceiveMessageResult.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,11 @@ namespace RICADO.Modbus.Channels
{
internal struct ReceiveMessageResult
{
#if NETSTANDARD
internal byte[] Message;
#else
internal Memory<byte> Message;
#endif
internal int Bytes;
internal int Packets;
}
Expand Down
44 changes: 43 additions & 1 deletion RICADO.Modbus/Channels/SerialOverLANChannel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,11 @@ internal bool IsInitialized
}
}

#if NETSTANDARD
internal HashSet<Guid> RegisteredDevices
#else
internal IReadOnlySet<Guid> RegisteredDevices
#endif
{
get
{
Expand Down Expand Up @@ -158,13 +162,18 @@ public async Task InitializeAsync(int timeout, CancellationToken cancellationTok
public async Task<ProcessRequestResult> ProcessRequestAsync(RTURequest request, int timeout, int retries, int? delayBetweenMessages, CancellationToken cancellationToken)
{
int attempts = 0;
Memory<byte> responseMessage = new Memory<byte>();
int bytesSent = 0;
int packetsSent = 0;
int bytesReceived = 0;
int packetsReceived = 0;
DateTime startTimestamp = DateTime.UtcNow;

#if NETSTANDARD
byte[] responseMessage = Array.Empty<byte>();
#else
Memory<byte> responseMessage = new Memory<byte>();
#endif

while (attempts <= retries)
{
try
Expand All @@ -177,7 +186,11 @@ public async Task<ProcessRequestResult> ProcessRequestAsync(RTURequest request,
}

// Build the Request into a Message we can Send
#if NETSTANDARD
byte[] requestMessage = request.BuildMessage();
#else
ReadOnlyMemory<byte> requestMessage = request.BuildMessage();
#endif

TimeSpan timeSinceLastMessage = DateTime.UtcNow.Subtract(_lastMessageTimestamp);

Expand Down Expand Up @@ -300,15 +313,23 @@ private async Task destroyAndInitializeClient(byte unitId, int timeout, Cancella
}
}

#if NETSTANDARD
private async Task<SendMessageResult> sendMessageAsync(byte unitId, byte[] message, int timeout, CancellationToken cancellationToken)
#else
private async Task<SendMessageResult> sendMessageAsync(byte unitId, ReadOnlyMemory<byte> message, int timeout, CancellationToken cancellationToken)
#endif
{
SendMessageResult result = new SendMessageResult
{
Bytes = 0,
Packets = 0,
};

#if NETSTANDARD
byte[] modbusMessage = buildSerialMessage(unitId, message);
#else
ReadOnlyMemory<byte> modbusMessage = buildSerialMessage(unitId, message);
#endif

try
{
Expand All @@ -333,12 +354,21 @@ private async Task<SendMessageResult> sendMessageAsync(byte unitId, ReadOnlyMemo

private async Task<ReceiveMessageResult> receiveMessageAsync(RTURequest request, byte unitId, int timeout, CancellationToken cancellationToken)
{
#if NETSTANDARD
ReceiveMessageResult result = new ReceiveMessageResult
{
Bytes = 0,
Packets = 0,
Message = Array.Empty<byte>(),
};
#else
ReceiveMessageResult result = new ReceiveMessageResult
{
Bytes = 0,
Packets = 0,
Message = new Memory<byte>(),
};
#endif

try
{
Expand All @@ -347,7 +377,11 @@ private async Task<ReceiveMessageResult> receiveMessageAsync(RTURequest request,

while (DateTime.UtcNow.Subtract(startTimestamp).TotalMilliseconds < timeout && receivedData.Count < RTUResponse.GetMessageLengthHint(request, receivedData) + 3)
{
#if NETSTANDARD
byte[] buffer = new byte[300];
#else
Memory<byte> buffer = new byte[300];
#endif
TimeSpan receiveTimeout = TimeSpan.FromMilliseconds(timeout).Subtract(DateTime.UtcNow.Subtract(startTimestamp));

if (receiveTimeout.TotalMilliseconds >= 50)
Expand All @@ -356,7 +390,11 @@ private async Task<ReceiveMessageResult> receiveMessageAsync(RTURequest request,

if (receivedBytes > 0)
{
#if NETSTANDARD
receivedData.AddRange(buffer.Take(receivedBytes));
#else
receivedData.AddRange(buffer.Slice(0, receivedBytes).ToArray());
#endif

result.Bytes += receivedBytes;
result.Packets += 1;
Expand Down Expand Up @@ -401,7 +439,11 @@ private async Task<ReceiveMessageResult> receiveMessageAsync(RTURequest request,
return result;
}

#if NETSTANDARD
private byte[] buildSerialMessage(byte unitId, byte[] message)
#else
private ReadOnlyMemory<byte> buildSerialMessage(byte unitId, ReadOnlyMemory<byte> message)
#endif
{
List<byte> serialMessage = new List<byte>();

Expand Down
8 changes: 4 additions & 4 deletions RICADO.Modbus/RICADO.Modbus.csproj
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
<Project Sdk="Microsoft.NET.Sdk">

<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<TargetFrameworks>net6.0;netstandard2.0</TargetFrameworks>
<Authors>RICADO Group</Authors>
<Company>RICADO Group LP</Company>
<Description>A Modbus Communication Library for .NET 6 Applications</Description>
<Copyright>Copyright © RICADO Group LP 2009 - 2021</Copyright>
<Description>A Modbus Communication Library for .NET 6 and .NET Standard 2.0 Applications</Description>
<Copyright>Copyright © RICADO Group LP 2009 - 2022</Copyright>
<PackageLicenseFile>LICENSE</PackageLicenseFile>
<PackageIcon>packageIcon.png</PackageIcon>
<RepositoryUrl>https://github.com/ricado-group/dotnet-modbus</RepositoryUrl>
Expand All @@ -27,7 +27,7 @@
</ItemGroup>

<ItemGroup>
<PackageReference Include="RICADO.Sockets" Version="1.1.1" />
<PackageReference Include="RICADO.Sockets" Version="1.2.0" />
</ItemGroup>

</Project>
9 changes: 8 additions & 1 deletion RICADO.Modbus/Requests/RTURequest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,11 @@ protected RTURequest(ModbusRTUDevice device)

#region Internal Methods

#if NETSTANDARD
internal byte[] BuildMessage()
#else
internal ReadOnlyMemory<byte> BuildMessage()
#endif
{
List<byte> message = new List<byte>();

Expand All @@ -55,8 +59,11 @@ internal ReadOnlyMemory<byte> BuildMessage()
// Request Data
message.AddRange(BuildRequestData());


#if NETSTANDARD
return message.ToArray();
#else
return new ReadOnlyMemory<byte>(message.ToArray());
#endif
}

#endregion
Expand Down
Loading

0 comments on commit 5af5154

Please sign in to comment.