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)
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;
}
}