Я столкнулся с любопытной ситуацией при использовании jamod для записи в Modbus. Следующий прочитанный код работает отлично:
public static void main(String[] args) throws Exception {
InetAddress address = InetAddress.getByName("host.somewhere");
TCPMasterConnection connection = new TCPMasterConnection(address);
connection.setPort(502);
connection.connect();
ReadMultipleRegistersRequest request = new ReadMultipleRegistersRequest(0, 1);
ReadMultipleRegistersResponse response = (ReadMultipleRegistersResponse)
executeTransaction(connection, request);
}
private static ModbusResponse executeTransaction(TCPMasterConnection connection,
ModbusRequest request)
throws ModbusIOException, ModbusSlaveException, ModbusException {
ModbusTCPTransaction transaction = new ModbusTCPTransaction(connection);
transaction.setRequest(request);
transaction.execute();
return transaction.getResponse();
}
Но попытка написать аналогичным образом не удалась (Jamod пытается 3 раза, каждый раз встречает SocketTimeoutException и, наконец, выдает ModbusException).
public static void main(String[] args) throws Exception {
final InetAddress address = InetAddress.getByName("host.somewhere");
final TCPMasterConnection connection = new TCPMasterConnection(address);
connection.setPort(502);
connection.connect();
Register reg = new SimpleRegister(0);
WriteMultipleRegistersRequest request = new WriteMultipleRegistersRequest(0,
new Register[]{reg});
executeTransaction(connection, request);
}
Да, я знаю, что использую многорегистрационные версии объектов запроса, но устройство, с которым я работаю, поддерживает только коды функций 3 и 16.
Я также написал тестер raw-socket для записи регистров, и, насколько я вижу, он работает правильно. Но было бы неплохо использовать jamod в обеих ситуациях.
У кого-нибудь есть опыт использования jamod, и будет ли он любезен, чтобы сказать, что я делаю неправильно? Это происходит с версиями jamod как 1.1, так и 1.2rc1. Или это, возможно, какая-то специфичная для поставщика ситуация?