FOR TIPS, gUIDES & TUTORIALS

subscribe to our Youtube

GO TO YOUTUBE

14455 questions

17168 answers

28195 comments

0 members

We are migrating to our new platform at https://community.teltonika.lt. Moving forward, you can continue discussions on this new platform. This current platform will be temporarily maintained for reference purposes.
0 votes
744 views 4 comments
by anonymous
When I send a packet with 2 Modbus requests to the RUT240 router with persistent TCP connections enabled it simply closes the connection. However, if I disable Nagle's algorithm on the sending side and ensure they are sent as separate packets the requests are handled as expected.

This looks like a bug in the router's Modbus TCP implementation not handling the possibility of a packet including more than one Modbus frame.
Will this be fixed in a future firmware version?

1 Answer

0 votes
by anonymous
Hello,

Modbus TCP specifications does not talk about support of multiple request in single TCP/IP packet. This functionality looks like a custom Modbus TCP implementation, which would require additional development and is not planned in future releases.

Tomas
by

Hello, thanks for the response!

Modbus TCP specifications does not talk about support of multiple request in single TCP/IP packet. 

That makes sense, as TCP is stream-based not packet-based (unlike say SCTP). A single request may well arrive as a single TCP/IP packet, or multiple, or as single byte packets due to networking equipment, OS behaviour, etc.

The receiving end has to handle the buffering and reconstruction of requests/messages/units of the application-level protocols as appropriate and necessary. The Modbus TCP specification only describes the application-level protocol and the buffering/reconstruction is implied as it's a necessity for any application protocol built on top of stream-based protocols.
Note the Modbus TCP header includes the length of the packet to make this buffering and reconstruction easier, as is typical for application protocols built on top of stream-based protocols.

Quoting the Modbus TCP specifcation:

When MODBUS is carried over TCP, additional length information is carried in the MBAP header to allow the recipient to recognize message boundaries even if the message has been split into multiple packets for transmission.

This matches what I said above. Many modbus messages may be sent in one TCP/IP packet. Or they might happen to be split up at random places and arrive in multiple separate chunks (albeit in order). It's up to the application implementation to handle this.

Currently sending multiple Modbus ADUs, even if as separate TCP/IP packets (ensured by for example disabling Nagle's algorithm on the sending side), results in the router closing the connection. I believe this goes against the Modbus TCP specification allowing multiple requests in-flight at the same time. Besides, that's the transcation identifier is for.
It seems Teltonika's Modbus TCP implementation assumes an underlying packet-based protocol and doesn't handle incoming data as a stream.

Let me know if you need any further clarifications. I'd be happy to help!

by anonymous

Hello,

Yes, but in the same specification implementation rules it advised not to go with multiple requests in same TCP PDU.

A TCP frame must transport only one MODBUS ADU. It is advised against sending multiple MODBUS requests or responses on the same TCP PDU

The connection closing was implemented to avoid situation, when single client occupies router Modbus slave and prevents other clients to established connection. Of course if user want to persist connection, it can enable this in Modbus TCP slave window.

by anonymous
But I will forward this information to RnD for additional analysis.
by anonymous

Hi, thanks for forwarding the information!
Let me know if RnD has any further questions. I'd love to have this improved.

Of course if user want to persist connection, it can enable this in Modbus TCP slave window.

In my case the connection persistence was enabled.