Compteur de lecture Modbus de ioLogik R1210 via Java ModbusClient-Bibliothèque


J'ai un peu de mal à lire les valeurs modbus correctes.


Voici quelques informations de fond Nous avons installé un comportement virtuel, qui est connecté au serveur Commport existant et au modèle ioLogik R1210 ( https://www.moxa.com/support/sarch_result.aspx?prod_id=922&type_id=7&type=doc). Le dernier composant a attaché un bouton-poussoir propre qui augmente le compteur en de DI/Canal "0" du module ioLogik R1210. Je peux le voir à travers ioSearch-Logiciel qui est donné par la société MOXA, qui produit également le module ioLogik R1210. Le compteur augmente également si nous appuyons sur le bouton. Ainsi, le matériel est correct et la connexion de mon client à l'ioLogikModul via un comportement virtuel réglé également - sinon ioSearch n'afficherait pas le compteur correct.


Maintenant, j'essaie de lire et d'écrire le compteur dans le canal "0" via Java. J'ai essayé plusieurs bibliothèques Modbus, mais j'ai toujours le même problème que je ne sais pas lire le bon registre / bobine / Entrée.

Dans le manuel d'utilisation suivant et le chapitre "ioLogik R1210 Modbus Address and Register Map" (Page 45 ou Annexe A-3) sont donnés les registres: https://www.moxa.com/doc/man/ioLogik_R1200_Series_UM_e3.3.pdf

Alors que cette ligne semble être le seul registre que je dois lire: 0x0020; 30033; R; mot; DI-00_counterValueHigh; 04: ENTRÉE; REGISTRE; mot élevé

Mais si j'essaie avec la bibliothèque ModbusClient ( https://sourceforge.net/projects/easymodbustcp-udp-java / ) avec le registre attendu, j'ai eu une sortie bizarre.


Voici une partie de mon code:

package com.mg.moxa.modbus;

import java.io.IOException;

import de.re.easymodbus.exceptions.ModbusException;
import de.re.easymodbus.modbusclient.ModbusClient;

public class ModbusClientTest {

    public static void main(final String[] args) {
        modbusLibrary();
    }

    private static void modbusLibrary() {
        final ModbusClient modbusClient = new ModbusClient();

        try {
            // modbusClient.Connect();
            modbusClient.Connect("COM5");

//            final int[] readHolding = modbusClient.ReadHoldingRegisters(0, 32);
//            System.out.print("readHolding [");
//            for (int i = 0; i < readHolding.length; i++) {
//                System.out.print(readHolding[i] + ", ");
//            }
//            System.out.println("]");

            final boolean[] readCoils = modbusClient.ReadCoils(32, 1);
            System.out.print("readCoils [");
            for (int i = 0; i < readCoils.length; i++) {
                System.out.print(readCoils[i] + ", ");
            }
            System.out.println("]");

            final int[] readInputRegisters = modbusClient.ReadInputRegisters(30033, 16); // high value
            System.out.print("readInputRegisters [");
            for (int i = 0; i < readInputRegisters.length; i++) {
                System.out.print(readInputRegisters[i] + ", ");
            }
            System.out.println("]");

            final int[] readInputRegistersLow = modbusClient.ReadInputRegisters(30033, 8); // low Value
            System.out.print("readInputRegisters [");
            for (int i = 0; i < readInputRegistersLow.length; i++) {
                System.out.print(readInputRegistersLow[i] + ", ");
            }
            System.out.println("]");

            //modbusClient.WriteSingleCoil(0, true);

//            final boolean[] readDiscreteInputs = modbusClient.ReadDiscreteInputs(0, 32);
//            System.out.print("readDiscreteInputs [");
//            for (int i = 0; i < readDiscreteInputs.length; i++) {
//                System.out.print(readDiscreteInputs[i] + ", ");
//            }
//            System.out.println("]");

            modbusClient.Disconnect();

        } catch (final ModbusException e) {
            // TODO Auto-generated catch block
            System.err.println("Fehler beim lesen des Modbus: " + e.toString());
            e.printStackTrace();
        } catch (final IOException e) {
            // TODO Auto-generated catch block
            System.err.println("Fehler beim lesen des Modbus: " + e.toString());
            e.printStackTrace();
        } catch (final Exception e) {
            // TODO Auto-generated catch block
            System.err.println("Fehler beim lesen des Modbus: " + e.toString());
            e.printStackTrace();
        }
    }

}

La sortie de cet extrait de code est la suivante:

readCoils [false, ]
readInputRegisters [12031, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ]
readInputRegisters [12031, 0, 0, 0, 0, 0, 0, 0, ]

Où comme l'entrée enregistre les valeurs à la position 0 sont toujours différentes (principalement -18180 ou 12031 si cela aide à l'analyse)


Qu'est-ce que je fais de mal ici? Je pense que je ne comprends pas la façon de lire les registres correctement.

Existe-t-il un moyen meilleur/plus facile d'obtenir simplement la contre-valeur sur un canal spécifique.

J'ai également besoin de réinitialiser le compteur avec java. Agréable à avoir serait de définir les préférences de la chaîne.


J'espère que vous pouvez m'aider.

Author: Markus G., 2018-04-24

1 answers

Essayez de lire à partir des valeurs de la colonne "Adresse" et non de la colonne "Registre". C'est déroutant, mais dans les registres du protocole Modbus (Entrée, Maintien, etc.) sont en fait 0 basé (0-65535). Les "registres" 0xxxx (bobines), 1xxxx (entrées discrètes), 3xxxx (registres d'entrée), 4xxxx (registres de maintien) proviennent du protocole Modicon Modbus. Les adresses de "registre" Modicon sont souvent encore utilisées dans la documentation car certains systèmes BMS attendent ces valeurs, mais d'après mon expérience, elles sont généralement besoin d'être changé en une adresse Modbus:

00001-09999 -> read coils 0-9998
10001-19999 -> read discrete inputs 0-9998
30001-39999 -> read input registers 0-9998
40001-49999 -> read holding registers 0-9998

Si vous avez besoin de la valeur" DI-00_counterValueHigh", essayez:

final int[] readInputRegisters = modbusClient.ReadInputRegisters(0x20, 1);

Remarque, cela ne donne que les 16 bits supérieurs de ce compteur, pour lire la valeur entière, essayez:

final int[] readInputRegisters = modbusClient.ReadInputRegisters(0x20, 2);

Cela devrait vous donner 2 valeurs de 16 bits que vous devrez combiner en une valeur de 32 bits en faisant quelque chose comme ce qui suit (NOTE: Je n'ai pas utilisé Java depuis longtemps, donc la syntaxe pourrait ne pas être complètement correcte. En C/C++, j'utiliserais des valeurs non signées pour empêcher l'extension du signe, etc.)

int counter = (readInputRegisters[0] << 16) | (readInputRegisters[1]);
 0
Author: Marker, 2018-04-26 20:37:14