1 2 import java.io.* ; 3 import java.net.* ; 4 5 public class ClienteModbusTCP { 6 7 private final int PUERTO = 502 ; 8 private Socket socket = null; 9 private OutputStream output = null; 10 private BufferedInputStream input = null; 11 private byte buffer[] = new byte [261]; 12 13 14 public ClienteModbusTCP(){} 15 16 // Rutina para abrir conexión de MODBUS 17 public boolean AbrirConexion (String dns) { 18 boolean resultado=false; 19 try { 20 // Crear el socket y establecer las conexiones de flujo respectivas 21 socket = new Socket (dns, PUERTO); 22 output = socket.getOutputStream(); 23 input = new BufferedInputStream(socket.getInputStream()); 24 resultado=true; 25 } 26 catch (Exception e) { 27 System.out.println (e.getMessage( ) ); 28 resultado=false; 29 } 30 return resultado; 31 } 32 33 // Rutina para cerrar conexión de MODBUS 34 public boolean CerrarConexion () { 35 boolean resultado=false; 36 try { 37 // Cerrar la conexi?n socket 38 socket.close( ); 39 resultado=true; 40 } 41 catch (Exception e) { 42 System.out.println (e.getMessage()); 43 resultado=false; 44 } 45 return resultado; 46 } 47 48 // Rutina para función leer de MODBUS. Código de función 03. 49 public int []Leer_Multiples_Registros ( 50 int unidad, // Identificador de unidad (nº esclavo - PC) 51 int direccion, // Direccion de memoria 52 int cantidad) { // Cantidad de registros a leer (max 126) 53 54 int registros[] = new int [126]; // Buffer para colocar los valores leídos 55 int c, i; 56 57 try { 58 // Construir la trama Modbus/TCP ?leer registros? 59 for ( i=0; i<5; i++ ) 60 buffer[i] = 0; 61 buffer[6] = (byte) unidad; 62 buffer[7] = 3; //3: leer; 16: escribir 63 buffer[8] = (byte) (direccion >> 8); // MSB desplaza 8 bits a la derecha 64 buffer[9] = (byte) (direccion & 0xFF); // LSB resto 65 buffer[10] = 0; 66 buffer[11] = (byte) cantidad; 67 buffer[5] = 6; // nº de bytes que siguen 68 69 // Enviar la solicitud al servidor 70 output.write(buffer, 0, buffer[5] + 6); 71 72 // Esperar y leer la respuesta 73 c = input.read(buffer, 0, buffer.length); 74 75 // Verificar la respuesta y extraer los valores le?dos 76 if (c == (9+2*cantidad) && buffer[7] == 3) { 77 for (i=0;i<cantidad;i++) { 78 // Construir el valor de registro de los bytes alto y bajo 79 /* 80 * buffer de 261 bytes [0..260] 81 * Sólo admite 256 [0..255] bytes de envío => 82 * 126 integer [0..125] 83 */ 84 registros[i] = (((int) buffer[9+2*i]) << 8) & 0xFF00 | 85 ((int) buffer[10+2*i] & 0xFF); 86 87 System.out.print(String.valueOf(registros[i]) + " "); 88 } 89 } 90 else { 91 System.out.println ("Respuesta recibida erronea leer" + "\n"); 92 registros[0] = 0; // Hacemos que no coincida el primer elemento 93 } 94 } 95 catch (Exception e) { 96 System.out.println ( e.getMessage( ) ); 97 registros[0] = 0; // Hacemos que no coincida el primer elemento 98 } 99 100 return registros; 101 } 102 103 // Rutina para función escribir de MODBUS. Código de función 16. 104 public boolean Escribir_Multiples_Registros ( 105 int unidad, // Identificador de unidad (nº esclavo - PC) 106 int direccion, // Dirección de memoria 107 int cantidad, // Cantidad de registros a escribir (max 126) 108 int registros[]) { // Buffer valores a escribir 109 110 int c, i; 111 boolean resultado=false; 112 113 try { 114 // Construir la trama Modbus/TCP (leer registros) 115 for ( i=0; i<5; i++ ) 116 buffer[i] = 0; 117 buffer[6] = (byte) unidad; 118 buffer[7] = 16; //3: leer; 16: escribir 119 buffer[8] = (byte) (direccion >> 8); // desplaza 8 bits a la derecha 120 buffer[9] = (byte) (direccion & 0xFF); // resto 121 buffer[10] = 0; 122 buffer[11] = (byte) cantidad; 123 buffer[12] = (byte) (cantidad * 2); 124 for ( i=0; i<cantidad; i++ ) { 125 buffer[13 + 2*i] = (byte) (registros[i] >> 8); 126 buffer[13 + 2*i + 1] = (byte) (registros[i] & 0xFF); 127 } 128 buffer[5] = (byte) (7 + cantidad*2); // nº de bytes que siguen 129 130 // Enviar la solicitud al servidor 131 output.write(buffer, 0, buffer[5] + 6); 132 //System.out.println ("write"); 133 // Esperar y leer la respuesta 134 c = input.read(buffer, 0, buffer.length); 135 //System.out.println ("read"); 136 // Verificar la respuesta y extraer los valores leídos 137 if (c == 12 && buffer[7] == 16) { 138 // Número de bytes recibidos 139 System.out.println (c + " ok" + "\n"); 140 resultado=true; 141 } 142 else { 143 System.out.println ("Respuesta recibida erronea" + "\n"); 144 resultado=false; 145 } 146 147 } 148 catch (Exception e) { 149 System.out.println ( e.getMessage( ) ); 150 System.out.println ("excepcion"); 151 resultado=false; 152 } 153 154 return resultado; 155 } 156 }