【发布时间】: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 是的,就是这样! “在发送进一步请求之前处理设备响应”。谢谢!