Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 9 additions & 3 deletions src/FluentModbus/Client/ModbusTcpClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -219,16 +219,18 @@ protected override Span<byte> TransceiveFrame(byte unitIdentifier, ModbusFunctio

writer.Seek(0, SeekOrigin.Begin);

var requestTransactionIdentifier = GetTransactionIdentifier();

if (BitConverter.IsLittleEndian)
{
writer.WriteReverse(GetTransactionIdentifier()); // 00-01 Transaction Identifier
writer.WriteReverse(requestTransactionIdentifier); // 00-01 Transaction Identifier
writer.WriteReverse((ushort)0); // 02-03 Protocol Identifier
writer.WriteReverse((ushort)(frameLength - 6)); // 04-05 Length
}

else
{
writer.Write(GetTransactionIdentifier()); // 00-01 Transaction Identifier
writer.Write(requestTransactionIdentifier); // 00-01 Transaction Identifier
writer.Write((ushort)0); // 02-03 Protocol Identifier
writer.Write((ushort)(frameLength - 6)); // 04-05 Length
}
Expand Down Expand Up @@ -291,7 +293,11 @@ protected override Span<byte> TransceiveFrame(byte unitIdentifier, ModbusFunctio
if (!isParsed) // read MBAP header only once
{
// read MBAP header
_ = reader.ReadUInt16Reverse(); // 00-01 Transaction Identifier
var responseTransactionIdentifier = reader.ReadUInt16Reverse(); // 00-01 Transaction Identifier
if (requestTransactionIdentifier != responseTransactionIdentifier)
{
throw new ModbusException(ErrorMessage.ModbusClient_InvalidTransactionIdentifier);
}
var protocolIdentifier = reader.ReadUInt16Reverse(); // 02-03 Protocol Identifier
bytesFollowing = reader.ReadUInt16Reverse(); // 04-05 Length
_ = reader.ReadByte(); // 06 Unit Identifier
Expand Down
18 changes: 12 additions & 6 deletions src/FluentModbus/Client/ModbusTcpClientAsync.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,26 @@ protected override async Task<Memory<byte>> TransceiveFrameAsync(byte unitIdenti
var frameBuffer = _frameBuffer;
var writer = _frameBuffer.Writer;
var reader = _frameBuffer.Reader;

// build request
writer.Seek(7, SeekOrigin.Begin);
extendFrame(writer);
var frameLength = (int)writer.BaseStream.Position;

writer.Seek(0, SeekOrigin.Begin);

var requestTransactionIdentifier = GetTransactionIdentifier();

if (BitConverter.IsLittleEndian)
{
writer.WriteReverse(GetTransactionIdentifier()); // 00-01 Transaction Identifier
writer.WriteReverse(requestTransactionIdentifier); // 00-01 Transaction Identifier
writer.WriteReverse((ushort)0); // 02-03 Protocol Identifier
writer.WriteReverse((ushort)(frameLength - 6)); // 04-05 Length
}

else
{
writer.Write(GetTransactionIdentifier()); // 00-01 Transaction Identifier
writer.Write(requestTransactionIdentifier); // 00-01 Transaction Identifier
writer.Write((ushort)0); // 02-03 Protocol Identifier
writer.Write((ushort)(frameLength - 6)); // 04-05 Length
}
Expand Down Expand Up @@ -95,10 +97,14 @@ protected override async Task<Memory<byte>> TransceiveFrameAsync(byte unitIdenti
if (!isParsed) // read MBAP header only once
{
// read MBAP header
_ = reader.ReadUInt16Reverse(); // 00-01 Transaction Identifier
var responseTransactionIdentifier = reader.ReadUInt16Reverse(); // 00-01 Transaction Identifier
if (requestTransactionIdentifier != responseTransactionIdentifier)
{
throw new ModbusException(ErrorMessage.ModbusClient_InvalidTransactionIdentifier);
}
var protocolIdentifier = reader.ReadUInt16Reverse(); // 02-03 Protocol Identifier
bytesFollowing = reader.ReadUInt16Reverse(); // 04-05 Length
_ = reader.ReadByte(); // 06 Unit Identifier
bytesFollowing = reader.ReadUInt16Reverse(); // 04-05 Length
_ = reader.ReadByte(); // 06 Unit Identifier

if (protocolIdentifier != 0)
throw new ModbusException(ErrorMessage.ModbusClient_InvalidProtocolIdentifier);
Expand Down
9 changes: 9 additions & 0 deletions src/FluentModbus/Resources/ErrorMessage.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions src/FluentModbus/Resources/ErrorMessage.resx
Original file line number Diff line number Diff line change
Expand Up @@ -165,6 +165,9 @@
<data name="ModbusClient_InvalidProtocolIdentifier" xml:space="preserve">
<value>The protocol identifier is invalid.</value>
</data>
<data name="ModbusClient_InvalidTransactionIdentifier" xml:space="preserve">
<value>The transaction identifier is invalid.</value>
</data>
<data name="ModbusClient_InvalidResponseFunctionCode" xml:space="preserve">
<value>The responsed function code is invalid.</value>
</data>
Expand Down