不能在同一个 TCP 连接上发送多个 Modbus 请求

Can not send multiple Modbus requests on the same TCP connection

我正在使用 POCO C++ 库进行套接字和 TCP 连接。

当我为每个请求打开和关闭连接时,一切正常:

Poco::Net::SocketAddress sa("192.168.2.55", 502);
Poco::Net::StreamSocket socket;

socket.connect(sa);
socket.sendBytes(/*set coil 5 to 1*/, 12);
socket.close();

socket.connect(sa);
socket.sendBytes(/*set coil 6 to 1*/, 12);
socket.close();

socket.connect(sa);
socket.sendBytes(/*set coil 7 to 1*/, 12);
socket.close();

线圈5、6、7正常置1。

但是当我通过同一个 TCP 连接发送 3 个请求时,只有第一个被采用:

Poco::Net::SocketAddress sa("192.168.2.55", 502);
Poco::Net::StreamSocket socket;

socket.connect(sa);

socket.sendBytes(/*set coil 5 to 1*/, 12);
socket.sendBytes(/*set coil 6 to 1*/, 12);
socket.sendBytes(/*set coil 7 to 1*/, 12);

socket.close();

只有5号线圈设置为1

哪个更好? 我该怎么做才能使第二个工作正常?

根据评论,在发送进一步请求之前处理设备响应是值得的。 spec 状态:

The number of requests accepted by a server depends on its capacity in term of number of resources and size of the TCP windows. In the same way the number of transactions initialized simultaneously by a client depends also on its resource capacity. This implementation parameter is called "NumberMaxOfClientTransaction" and must be described as one of the MODBUS client features. Depending of the device type this parameter can take a value from 1 to 16.

所以有些设备可能只是不支持多个同时请求。

尽管如此,处理响应还是值得的,因为设备可能正在响应错误。

注意:虽然您可以自己实施 Modbus 协议(这是一个相当简单的协议),但您可能会发现许多可用的库之一(例如 macchina.io,EasyModbusTCP.NET)。