Pregunta

Me encontré con una situación curiosa cuando se utiliza jamod escribir en Modbus. Siguiendo código de lectura funciona perfectamente:

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();
}

Sin embargo, tratando de escribir de manera similar falla (Jamod intenta 3 veces, cada momento se encuentra con SocketTimeoutException y finalmente tiros 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);
}

Sí, ya sé que estoy usando versiones de la solicitud de objetos multi-registro, pero el dispositivo que estoy trabajando sólo es compatible con los códigos de función 3 y 16.

También escribí probador prima sockets para escribir registros, y por lo que puedo ver que funciona correctamente. Sin embargo, sería bueno utilizar jamod en ambas situaciones.

¿Alguien tiene experiencia cualquier persona que utilice jamod y habría que uno tenga la amabilidad de decir lo que estoy haciendo mal? Esto sucede con las dos versiones 1.1 y 1.2rc1 de jamod. ¿O se trata, posiblemente, alguna situación específica del proveedor?

¿Fue útil?

Solución

Al final escribí mi propia aplicación Modbus. Yo sólo tenía que soportar 2 códigos de función diferentes, por lo que la ejecución era simple.

A pesar de que más tarde descubrí otra biblioteca Modbus de código abierto para Java. Yo otra persona se encuentra con el mismo problema utilizando modbus4j podría ayudar.

Otros consejos

peticiones Modbus tienen unidad de id = 0 por defecto. Por lo que cualquier otra identificación debe ser ajustado a solicitar, por ejemplo:.

WriteCoilRequest writeCoilRequest = new WriteCoilRequest(ref, bool);
writeCoilRequest.setUnitID(unitid);

Wasted unas horas tratando de resolver el mismo problema que se describe en la pregunta.

Mi método que escribí en base a su pregunta funciona!

try {
            ModbusTCPTransaction trans = null; // the transaction

            String refe = "0";// HEX Address
            int ref = Integer.parseInt(refe, 16);// Hex to int
            // int count = 1; // the number Address to read

            ReadMultipleRegistersRequest ainReq = new ReadMultipleRegistersRequest(
                    ref, count);
            ReadMultipleRegistersResponse ainRes = new ReadMultipleRegistersResponse();

            // 3. Start Transaction
            trans = new ModbusTCPTransaction(con);
            trans.setRetries(5);
            trans.setReconnecting(true);
            trans.setRequest(ainReq);

            int k = 0;
            do {
                trans.execute();
                ainRes = (ReadMultipleRegistersResponse) trans.getResponse();
                Register reg = new SimpleRegister(ertekInt);
                WriteMultipleRegistersRequest request = new WriteMultipleRegistersRequest(0,
                        new Register[]{reg});
                System.out.println("Állított AOUT:  " + request.getRegisterValue(k));
                lista.add(createPlanet("AOUT",
                        "" + k + "    " + request.getRegisterValue(k)));
                k++;
            } while (k < count);
} catch (ModbusIOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ModbusSlaveException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ModbusException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

Yo tenía un problema similar, que estaba tratando de escribir un valor en un registro que se definió en el "trabajo del dispositivo" como un registro de la bobina. Así que utilicé:

WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)

y que resolvió el problema. Tal vez esto ayuda.

Bye!

Me he encontrado con este problema en Android.

Debido a que esta tarea puede llevar algún tiempo significativo, ya que espera una respuesta desde un dispositivo externo, la solución que encontré fue la de ejecutar la escritura y la lectura en otro hilo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top