Autor Tema: Java dónde colocar datos modbus tcp ip conexion cliente master servidor slave  (Leído 3161 veces)

lucas_05

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Buenas, soy nuevo en esto de la programacion en java, pero surgio una necesidad de hacer un proyecto con java y modbus tcp.

Estuve viendo un par de ejemplos y a la misma vez aprovechando esta web para estudiar e ir comprendiendo los ejemplos, pero me falta bastante.

Consegui ejemplos de conexiones modbus master con java pero son medio complejas, como ser javamod.

Este ejemplo que encontre al parecer no necesita librerias, ya esta declarado el puerto 502 y me faltaria lo principal agregar la direccion de ip del esclavo de donde leere los datos.
Adjunto el codigo, a mi parecer tendria que cambiar la parte en donde se abre la conexion en una parte dice abrir conexion (String dns)

Código: [Seleccionar]
import java.io.* ;
import java.net.* ;
 
public class ClienteModbusTCP {

    private final int PUERTO = 502 ;
    private Socket socket = null;
    private OutputStream output = null;
    private BufferedInputStream input = null;
    private byte buffer[] = new byte [261];
 
   
    public ClienteModbusTCP(){}
   
    // Rutina para abrir conexión de MODBUS
    public boolean AbrirConexion (String dns) {
        boolean resultado=false;
        try {
            // Crear el socket y establecer las conexiones de flujo respectivas
            socket = new Socket (dns, PUERTO);
            output = socket.getOutputStream();
            input = new BufferedInputStream(socket.getInputStream());
            resultado=true;
        }
       catch (Exception e) {
            System.out.println (e.getMessage( ) );
            resultado=false;
        }       
       return resultado;
    }

    // Rutina para cerrar conexión de MODBUS
    public boolean CerrarConexion () {     
        boolean resultado=false;
        try {
            //  Cerrar la conexi?n socket
            socket.close( );
            resultado=true;
        }
       catch (Exception e) {
            System.out.println (e.getMessage());
            resultado=false;
        }       
       return resultado;
    }

    // Rutina para función leer de MODBUS. Código de función 03.
    public  int []Leer_Multiples_Registros (
            int unidad,                // Identificador de unidad (nº esclavo - PC)
            int direccion,             // Direccion de memoria
            int cantidad) {            // Cantidad de registros a leer (max 126)
       
        int registros[] = new int [126];     // Buffer para colocar los valores leídos
        int c, i;
 
        try {
            //  Construir la trama Modbus/TCP ?leer registros?
            for ( i=0; i<5; i++ )
            buffer[i] = 0;
            buffer[6] = (byte) unidad;
            buffer[7] = 3; //3: leer; 16: escribir
            buffer[8] = (byte) (direccion >> 8); // MSB desplaza 8 bits a la derecha
            buffer[9] = (byte) (direccion & 0xFF); // LSB resto
            buffer[10] = 0;
            buffer[11] = (byte) cantidad;
            buffer[5] = 6; // nº de bytes que siguen

            //  Enviar la solicitud al servidor
            output.write(buffer, 0, buffer[5] + 6);

            //  Esperar y leer la  respuesta
            c = input.read(buffer, 0, buffer.length);

            //  Verificar la respuesta y extraer los valores le?dos
            if (c == (9+2*cantidad) && buffer[7] == 3) {
                for (i=0;i<cantidad;i++) {
                    //  Construir el valor de registro de los bytes alto y bajo
                    /*
                     * buffer de 261 bytes [0..260]
                     * Sólo admite 256 [0..255] bytes de envío =>
                     * 126 integer [0..125]
                     */
                    registros[i] = (((int) buffer[9+2*i]) << 8) & 0xFF00 |
                                   ((int) buffer[10+2*i] & 0xFF);
                   
                    System.out.print(String.valueOf(registros[i]) + " ");
                }
            }
            else {
                System.out.println ("Respuesta recibida erronea leer" + "\n");
                registros[0] = 0; // Hacemos que no coincida el primer elemento
            }   
        }
       catch (Exception e) {
            System.out.println ( e.getMessage( ) );
            registros[0] = 0; // Hacemos que no coincida el primer elemento
        }
       
       return registros;
    }

    // Rutina para función escribir de MODBUS. Código de función 16.
    public boolean Escribir_Multiples_Registros (
            int unidad,                // Identificador de unidad (nº esclavo - PC)
            int direccion,             // Dirección de memoria
            int cantidad,              // Cantidad de registros a escribir (max 126)
            int registros[]) {         // Buffer valores a escribir
       
        int c, i;
        boolean resultado=false;
 
        try {
            //  Construir la trama Modbus/TCP (leer registros)
            for ( i=0; i<5; i++ )
                buffer[i] = 0;
            buffer[6] = (byte) unidad;
            buffer[7] = 16; //3: leer; 16: escribir
            buffer[8] = (byte) (direccion >> 8); // desplaza 8 bits a la derecha
            buffer[9] = (byte) (direccion & 0xFF); // resto
            buffer[10] = 0;
            buffer[11] = (byte) cantidad;
            buffer[12] = (byte) (cantidad * 2);
            for ( i=0; i<cantidad; i++ ) {
                buffer[13 + 2*i] = (byte) (registros[i] >> 8);
                buffer[13 + 2*i + 1] = (byte) (registros[i] & 0xFF);
            }
            buffer[5] = (byte) (7 + cantidad*2); // nº de bytes que siguen

            //  Enviar la solicitud al servidor
            output.write(buffer, 0, buffer[5] + 6);
            //System.out.println ("write");
            //  Esperar y leer la  respuesta
            c = input.read(buffer, 0, buffer.length);
            //System.out.println ("read");
            //  Verificar la respuesta y extraer los valores leídos
            if (c == 12 && buffer[7] == 16) {
                // Número de bytes recibidos
                 System.out.println (c + " ok" + "\n");
                resultado=true;
            }
            else {
                System.out.println ("Respuesta recibida erronea" + "\n");
                resultado=false;
            }
           
        }
        catch (Exception e) {
            System.out.println ( e.getMessage( ) );
            System.out.println ("excepcion");
            resultado=false;
        }
       
       return resultado;
    }
}
« Última modificación: 25 de Junio 2017, 20:42 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2660
    • Ver Perfil
Buenas, es un tema complejo que no domino, en este ejemplo que he encontrado para leer registros de un servidor, el nombre del servidor (o su ip) parece que se introducen commo argumentos al ejecutar el programa (argumentos del main)


Código: [Seleccionar]
// test3.java 7/23/97 - JAVA program to read registers via gateway
// compile as
// javac test3.java
// run as
// java test3 aswales1.modicon.com 1 2 3


import java.io.* ;
import java.net.* ;
import java.util.*;

class test3 {
  public static void main(String argv[]) {
    if (argv.length < 4) {
      System.out.println("usage: java test3 dns_name unit reg_no num_regs");
      System.out.println("eg java test3 aswales8.modicon.com 5 0 10");
      return;
    }
    try {
      String ip_adrs = argv[0];
      int unit = Integer.parseInt(argv[1]);
      int reg_no = Integer.parseInt(argv[2]);
      int num_regs = Integer.parseInt(argv[3]);
      System.out.println("ip_adrs = "+ip_adrs+" unit = "+unit+" reg_no = "+
      reg_no+" num_regs = "+num_regs);

      // set up socket
      Socket es = new Socket(ip_adrs,502);
      OutputStream os= es.getOutputStream();
      FilterInputStream is = new BufferedInputStream(es.getInputStream());
      byte obuf[] = new byte[261];
      byte ibuf[] = new byte[261];
      int c = 0;
      int i;

      // build request of form 0 0 0 0 0 6 ui 3 rr rr nn nn
      for (i=0;i<5;i++) obuf[i] = 0;
      obuf[5] = 6;
      obuf[6] = (byte)unit;
      obuf[7] = 3;
      obuf[8] = (byte)(reg_no >> 8);
      obuf[9] = (byte)(reg_no & 0xff);
      obuf[10] = (byte)(num_regs >> 8);
      obuf[11] = (byte)(num_regs & 0xff);

      // send request
      os.write(obuf, 0, 12);

      // read response
      i = is.read(ibuf, 0, 261);
      if (i<9) {
        if (i==0) {
          System.out.println("unexpected close of connection at remote end");
        } else {
          System.out.println("response was too short - "+i+" chars");
        }
      } else if (0 != (ibuf[7] & 0x80)) {
        System.out.println("MODBUS exception response - type "+ibuf[8]);
      } else if (i != (9+2*num_regs)) {
        System.out.println("incorrect response size is "+i+

            " expected"+(9+2*num_regs));
      } else {
        for (i=0;i<num_regs;i++) {
          int w = (ibuf[9+i+i]<<8) + ibuf[10+i+i];
          System.out.println("word "+i+" = "+w);
        }
      }

      // close down
      es.close();
    } catch (Exception e) {
      System.out.println("exception :"+e);
    }
  }
}

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".