连续6次读取后,Modbus连接关闭

时间:2016-03-23 16:06:08

标签: java modbus modbus-tcp

我正在使用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)也有效。不幸的是,这些解决方法还不足以满足我对从设备连续读取的需求。

有没有人有任何想法,可能会发生什么?

0 个答案:

没有答案