1 // Rutina para función escribir de MODBUS. Código de función 16. 2 public boolean Escribir_Multiples_Registros ( 3 int unidad, // Identificador de unidad (nº esclavo - PC) 4 int direccion, // Dirección de memoria 5 int cantidad, // Cantidad de registros a escribir (max 126) 6 int registros[]) { // Buffer valores a escribir 7 8 int c, i; 9 boolean resultado=false; 10 11 try { 12 // Construir la trama Modbus/TCP (leer registros) 13 for ( i=0; i<5; i++ ) 14 buffer[i] = 0; 15 buffer[6] = (byte) unidad; 16 buffer[7] = 16; //3: leer; 16: escribir 17 buffer[8] = (byte) (direccion >> 8); // desplaza 8 bits a la derecha 18 buffer[9] = (byte) (direccion & 0xFF); // resto 19 buffer[10] = 0; 20 buffer[11] = (byte) cantidad; 21 buffer[12] = (byte) (cantidad * 2); 22 for ( i=0; i<cantidad; i++ ) { 23 buffer[13 + 2*i] = (byte) (registros[i] >> 8); 24 buffer[13 + 2*i + 1] = (byte) (registros[i] & 0xFF); 25 } 26 buffer[5] = (byte) (7 + cantidad*2); // nº de bytes que siguen 27 28 // Enviar la solicitud al servidor 29 output.write(buffer, 0, buffer[5] + 6); 30 //System.out.println ("write"); 31 // Esperar y leer la respuesta 32 c = input.read(buffer, 0, buffer.length); 33 //System.out.println ("read"); 34 // Verificar la respuesta y extraer los valores leídos 35 if (c == 12 && buffer[7] == 16) { 36 // Número de bytes recibidos 37 System.out.println (c + " ok" + "\n"); 38 resultado=true; 39 } 40 else { 41 System.out.println ("Respuesta recibida erronea" + "\n"); 42 resultado=false; 43 } 44 45 } 46 catch (Exception e) { 47 System.out.println ( e.getMessage( ) ); 48 System.out.println ("excepcion"); 49 resultado=false; 50 } 51 52 return resultado; 53 }