1 // Rutina para función leer de MODBUS. Código de función 03. 2 public int []Leer_Multiples_Registros ( 3 int unidad, // Identificador de unidad (nº esclavo - PC) 4 int direccion, // Direccion de memoria 5 int cantidad) { // Cantidad de registros a leer (max 126) 6 7 int registros[] = new int [126]; // Buffer para colocar los valores leídos 8 int c, i; 9 10 try { 11 // Construir la trama Modbus/TCP ?leer registros? 12 for ( i=0; i<5; i++ ) 13 buffer[i] = 0; 14 buffer[6] = (byte) unidad; 15 buffer[7] = 3; //3: leer; 16: escribir 16 buffer[8] = (byte) (direccion >> 8); // MSB desplaza 8 bits a la derecha 17 buffer[9] = (byte) (direccion & 0xFF); // LSB resto 18 buffer[10] = 0; 19 buffer[11] = (byte) cantidad; 20 buffer[5] = 6; // nº de bytes que siguen 21 22 // Enviar la solicitud al servidor 23 output.write(buffer, 0, buffer[5] + 6); 24 25 // Esperar y leer la respuesta 26 c = input.read(buffer, 0, buffer.length); 27 28 // Verificar la respuesta y extraer los valores le?dos 29 if (c == (9+2*cantidad) && buffer[7] == 3) { 30 for (i=0;i<cantidad;i++) { 31 // Construir el valor de registro de los bytes alto y bajo 32 /* 33 * buffer de 261 bytes [0..260] 34 * Sólo admite 256 [0..255] bytes de envío => 35 * 126 integer [0..125] 36 */ 37 registros[i] = (((int) buffer[9+2*i]) << 8) & 0xFF00 | 38 ((int) buffer[10+2*i] & 0xFF); 39 40 System.out.print(String.valueOf(registros[i]) + " "); 41 } 42 } 43 else { 44 System.out.println ("Respuesta recibida erronea leer" + "\n"); 45 registros[0] = 0; // Hacemos que no coincida el primer elemento 46 } 47 } 48 catch (Exception e) { 49 System.out.println ( e.getMessage( ) ); 50 registros[0] = 0; // Hacemos que no coincida el primer elemento 51 } 52 53 return registros; 54 }