Question

Je suis tombé sur une situation curieuse lors de l'utilisation jamod écrire à modbus. Suite à un code de lecture fonctionne parfaitement:

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

Mais en essayant d'écrire de manière similaire ne fonctionne pas (Jamod essaie 3 fois, chaque fois rencontre SocketTimeoutException et lancers francs enfin 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);
}

Oui, je sais que je suis en utilisant des versions multi-registre de la demande-objets, mais l'appareil que je travaille avec des supports que les codes de fonction 3 et 16.

J'ai également écrit testeur-raw socket pour écrire des registres, et pour autant que je peux voir qu'il fonctionne correctement. Mais ce serait bien d'utiliser jamod dans les deux situations.

Quelqu'un at-il une expérience de toute personne qui utilise jamod et que l'on serait assez aimable pour dire ce que je fais mal? Cela se produit avec les deux 1.1 et 1.2rc1 versions de jamod. Ou est-ce peut-être une situation spécifique au fournisseur?

Était-ce utile?

La solution

A la fin, j'ai écrit ma propre implémentation modbus. Je ne devais supporter 2 différents codes de fonction, donc la mise en œuvre est simple.

Bien que je trouve plus tard une autre bibliothèque modbus open source pour Java. Je quelqu'un d'autre vient à travers le même problème en utilisant modbus4j pourrait aider.

Autres conseils

requêtes Modbus ont id unité = 0 par défaut. Ainsi, toute autre pièce d'identité doit être de demander, par exemple:.

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

Wasted quelques heures à essayer de résoudre le même problème que vous avez décrit dans la question.

Ma méthode que j'ai écrit en fonction de votre question fonctionne!

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

J'ai eu un problème similaire, je tentais d'écrire une valeur dans un registre qui a été défini dans le « travail de l'appareil » en tant que registre de la bobine. Alors je:

WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)

et résolu le problème. Peut-être que cette aide.

Au revoir!

Je l'ai rencontré ce problème sur Android.

Parce que cette tâche peut prendre un certain temps important, car il attend une réponse d'un dispositif externe, la solution que j'ai trouvé d'exécuter l'écriture et la lecture dans un autre thread.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top