Frage

Ich kam in einer kuriosen Situation, wenn jamod mit zu modbus schreiben. Nach gelesenen Code funktioniert perfekt:

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

Doch der Versuch, auf ähnliche Weise zu schreiben versagt (Jamod versucht 3 Mal, jedes Mal begegnet SocketTimeoutException und schließlich wirft 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);
}

Ja, ich weiß, dass ich mehr registrieren Versionen der Anfrage-Objekte verwenden, aber ich Gerät mit nur gerade arbeite unterstützt Funktionscodes 3 und 16.

Ich schrieb auch raw-Socket-Tester Register zu schreiben, und soweit ich es funktioniert richtig sehen kann. Aber es wäre schön, jamod in beiden Situationen zu verwenden.

Hat jemand jemand Erfahrung jamod verwenden und würde so freundlich, dass man zu sagen, was mache ich falsch? Dies geschieht sowohl mit 1.1 und 1.2rc1 Versionen von jamod. Oder ist dies möglicherweise einige herstellerspezifische Situation?

War es hilfreich?

Lösung

Am Ende ich meine eigene modbus Implementierung geschrieben hat. Ich brauchte nur 2 verschiedene Funktionscodes zu unterstützen, so Umsetzung war einfach.

Obwohl ich später eine andere Open-Source-Modbus-Bibliothek für Java. Ich jemand anderes kommt über das gleiche Problem mit modbus4j helfen könnte.

Andere Tipps

Modbus-Anfragen haben Einheit id = 0 voreingestellt. So andere id gesetzt werden müssen, um zu fordern, z.

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

vergeudete ein paar Stunden versucht, das gleiche Problem lösen Sie in der Frage beschrieben.

Meine Methode, die ich auf Ihre Frage basiert schrieb funktioniert!

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

Ich hatte ein ähnliches Problem, ich habe versucht, einen Wert in einem Register zu schreiben, die in dem „-Gerät Job“ als Spule Register definiert wurden. So habe ich:

WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)

und dass das Problem gelöst. Vielleicht diese Hilfe.

Bye!

Ich habe dieses Problem auf Android aufgetreten.

Da diese Aufgabe einige bedeutende Zeit in Anspruch nehmen kann, wenn er auf eine Antwort von einem externen Gerät wartet, fand die Lösung, die ich war das Schreiben und Lesen in einem anderen Thread ausgeführt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top