Domanda

mi sono imbattuto in una situazione curiosa quando si utilizza jamod di scrivere Modbus. A seguito di codice letto funziona perfettamente:

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

Ma cercando di scrivere maniera simile fallisce (Jamod prova per 3 volte, ogni volte incontra SocketTimeoutException ed infine tiri 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ì, lo so che sto usando multi-registrarsi versioni di richiesta-oggetti, ma dispositivo sto lavorando con supporta solo i codici funzione 3 e 16.

Ho anche scritto prime presa tester di scrivere i registri, e, per quanto posso vedere che funzioni correttamente. Ma sarebbe bello utilizzare jamod in entrambe le situazioni.

Qualcuno ha esperienza chiunque utilizzi jamod e come vorrei che un essere così gentile da dire che cosa sto facendo male? Questo accade sia con 1.1 e versioni di 1.2rc1 jamod. O è questo forse qualche situazione specifica del fornitore?

È stato utile?

Soluzione

Alla fine ho scritto il mio propria implementazione Modbus. Ho solo bisogno di supportare 2 diversi codici funzione, così attuazione era semplice.

Anche se successivamente ho scoperto un'altra libreria fonte Modbus aperto per Java. I qualcun altro incontra lo stesso problema utilizzando modbus4j potrebbe aiutare.

Altri suggerimenti

richieste Modbus hanno unità id = 0 per impostazione predefinita. Quindi, qualsiasi altra id deve essere impostato per richiedere, per esempio:.

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

sprecato un paio d'ore cercando di risolvere lo stesso problema che hai descritto nella domanda.

Il mio metodo che ho scritto, sulla base di domanda funziona!

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

Ho avuto un problema simile, stavo cercando di scrivere un valore in un registro che è stato definito nel "lavoro dispositivo" come registro bobina. Così ho usato:

WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)

e che ha risolto il problema. Forse questo aiuto.

Ciao!

Ho riscontrato questo problema su Android.

Poiché questa operazione può richiedere un certo tempo significativo mentre attende una risposta da un dispositivo esterno, la soluzione che ho trovato è stato quello di eseguire la scrittura e la lettura in un altro thread.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top