【问题标题】:Can not send multiple Modbus requests on the same TCP connection无法在同一个 TCP 连接上发送多个 Modbus 请求
【发布时间】:2021-12-29 20:45:57
【问题描述】:

我正在使用 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。

哪个更好? 为了使第二个工作正常,我该怎么做?

【问题讨论】:

  • 使用伪代码很难回答。您是否对每个请求使用不同的事务标识符?
  • @Brits 是的,我正在为每笔交易增加交易 ID
  • @Brits 实际上它不是伪代码,而不是注释,而是用于更改特定地址和特定从站 id 处的线圈值的必要字节。例如:无符号字符字节[12] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x01, 0x05, 0x00, 0x04, 0xFF, 0x00 };
  • 我将术语 /*set coil 5 to 1*/ 伪代码(它不是 c++),这就是我不得不询问事务 ID 的原因。 modbus TCP standard 声明“建议保持与远程设备的 TCP 连接打开,而不是为每个 MODBUS/TCP 事务打开和关闭它”,因此 1 个连接是可行的方法。我建议在发送进一步请求之前处理设备响应(并非所有设备都支持多个同时请求)。
  • @Brits 是的,就是这样! “在发送进一步请求之前处理设备响应”。谢谢!

标签: tcp poco modbus


【解决方案1】:

根据 cmets,它值得在发送进一步请求之前处理设备响应。 spec 声明:

服务器接受的请求数量取决于它在资源数量和 TCP 窗口大小方面的容量。同样,客户端同时初始化的事务数量也取决于其资源容量。 此实现参数称为“NumberMaxOfClientTransaction”,必须描述为 MODBUS 客户端功能之一。根据设备类型,此参数的取值范围为 1 到 16。

因此,某些设备可能仅不支持多个同时请求。

无论上述情况如何,都值得处理响应,因为设备可能会响应错误。

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

【讨论】:

    猜你喜欢
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-03
    • 1970-01-01
    • 2021-12-17
    • 2011-08-05
    • 1970-01-01
    相关资源
    最近更新 更多