我正在使用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。
哪一个更好?我能做些什么才能让第二个发挥作用?
根据评论,在发送进一步请求之前处理设备响应是值得的。规范规定:
服务器接受的请求数量取决于其资源数量和TCP窗口大小方面的容量。同样,客户端同时初始化的事务数量也取决于其资源容量。这个实现参数被称为";NumberMaxOfClientTransaction";并且必须被描述为MODBUS客户端特征之一。根据设备类型的不同,此参数可以取1到16之间的值。
因此,某些设备可能只支持多个同时请求。
不管以上情况如何,都值得处理响应,因为设备可能正在以错误进行响应。
注意:虽然您可以自己实现Modbus协议(这是一个相当简单的协议(,但您可能会发现许多可用的有益库之一(例如macchina.io、EasyModbusTCP.NET(。