jamodライブラリを使用して Java で Modbus/TCP マスター アプリケーションを開発しています。スレーブ デバイスからの連続読み取り中に、接続が突然閉じられます。
私のコード:
import net.wimpi.modbus.io.ModbusTCPTransaction;
import net.wimpi.modbus.msg.ReadMultipleRegistersRequest;
import net.wimpi.modbus.msg.ReadMultipleRegistersResponse;
import net.wimpi.modbus.net.TCPMasterConnection;
public static void main(String[] args) throws Exception {
TCPMasterConnection connection = new TCPMasterConnection(InetAddress.getByName("192.168.0.111"));
connection.setPort(502);
connection.connect();
if (!connection.isConnected())
return;
System.out.println(readIntFromIntAddr(connection, 256));
System.out.println(readIntFromIntAddr(connection, 256));
System.out.println(readIntFromIntAddr(connection, 256));
System.out.println(readIntFromIntAddr(connection, 256));
System.out.println(readIntFromIntAddr(connection, 256));
System.out.println(readIntFromIntAddr(connection, 256));
}
private static synchronized int readIntFromIntAddr(TCPMasterConnection connection, int address) throws Exception {
ReadMultipleRegistersRequest Rreq = new ReadMultipleRegistersRequest(address, 1); // reading one register
Rreq.setUnitID(1); // slaveAddress
ModbusTCPTransaction trans = null;
trans = new ModbusTCPTransaction(connection);
trans.setRetries(3);
trans.setReconnecting(true);
trans.setRequest(Rreq);
trans.execute();
ReadMultipleRegistersResponse Rres = (ReadMultipleRegistersResponse) trans.getResponse();
return Rres.getRegisterValue(0);
}
6回目の読み取り中にスローされるエラー
net.wimpi.modbus.ModbusIOException: Premature end of stream (Header truncated).
at net.wimpi.modbus.io.ModbusTCPTransport.readResponse(ModbusTCPTransport.java:190)
at net.wimpi.modbus.io.ModbusTCPTransaction.execute(ModbusTCPTransaction.java:192)
at cz.jlochman.marklar.drivers.connection.modbustcp.ModBusTcpConnection.readIntFromIntAddr(ModBusTcpConnection.java:280)
at cz.jlochman.marklar.drivers.connection.modbustcp.ModBusTcpConnection.main(ModBusTcpConnection.java:267)
このエラーの後、接続を復元できません。アプリケーション スレッドを終了し、アプリケーションを再起動する必要があります。私はいくつかの回避策を見つけました: 5 回目の読み取り後に追加Thread.sleep(500)
すると、この例外が削除されます。Thread.sleep(200)
各読み取りの後も同様に機能します。残念ながら、これらの回避策は、スレーブ デバイスから連続して読み取るという私の要求を満たすには十分ではありません。
何が起こっているのか、誰にも分かりませんか?