Java - Uso del RS485

 
Vista:
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Uso del RS485

Publicado por Juan De Celis (70 intervenciones) el 07/06/2019 11:45:42
Hola buenas, estoy intentando conectar un módem programable en java MIDlet, que se conecta con otro dispositivo a través del puerto RS485. Soy la persona mas novata en electronica y conexiones de estas, y comunicaciones seriales.

La cosa es que quisiera que me orientaran un poco, se que hay que abrir un puerto de comunicacion (Que depende del dispositivo, en mi caso es COM1) y a través de ese puerto enviar mensajes al otro dispositivo(Depende del dispositivo se envía un mensaje u otro). En mi caso el dispositivo es un Wellpro WP8028AADAM. quiero hacer algo como esto https://www.youtube.com/watch?v=9BAQp6lBv0Q

el manual del wellpro es este:
https://www.wy-international.com/images/wff_images/pdf/WP8028ADAM%20User's%20Manual.pdf

No pretendo que me resuelvan el programa, simplemente que me orienten un poco, porque en el manual puedo leer que dicen que envie esto: 01 05 00 00 FF 00 8C 3A (example/hexadecimal)con una tabla explicando que es cada numero. pero no se como enviarlo o que tengo que enviar.

la clase que uso es la CommConnection porque es un MIDLet. pero en la escritura de datos, solo me deja enviar byte o cadena de bytes, si quiero encender la primera entrada digital por ejemplo. que envió? paso los 01 05 00 00 FF 00 8C 3A todos a binario, y los mando como byte. tengo que enviar una sola vez el mensaje, o para que se mantenga encendido debo hacer un ciclo que mientras se ejecute y envié el mensaje se mantiene encendido.

Si alguien me puede orientar un poco se lo agradecería mucho. encuentro poco material para rs485 en java
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Uso del RS485

Publicado por Juan De Celis (70 intervenciones) el 07/06/2019 12:50:51
Vale les cuento, la comunicación por el puerto serie en COM1 si funciona. Y por lo visto mande varios mensajes, y uno de ellos contenía una cadena de byte, con esta cadena me encendió en rojo el puerto DO1 del Wellpro. osea que imagino que tendré que convertir esos mensajes en una cadena de byte y pasarla.

byte[] ch2={01,05,00,00,(byte) 255,00,(byte) 140,58};
outStream.write(ch2);

No me pregunten porque esos números jeje, simplemente estuve inventando varias cosas y con esos se me encendió el led rojo, creo que debería encender amarillo, pero al menos es un avance, ya se que el puerto esta bien y que reacciona con la cadena de byte jeje, el tema ahora es como convertir el mensaje correcto en esa cadena.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Uso del RS485

Publicado por juan (70 intervenciones) el 08/06/2019 12:14:28
Nadie me esta ayudando pero no importa yo insisto jeje.

según el manual del dispositivo debo enviar: 01 05 00 00 FF 00 8C 3A para activar la salida 1. si quiero activar otra salida cambio los numeros que corresponden a la dirección de la salida, que son: 01 05 00 00 FF 00 8C 3A.
lo cambio a la entrada 2: 01 05 00 01 FF 00 8C 3A
entrada 3: 01 05 00 02 FF 00 8C 3A
entrada 4: 01 05 00 03 FF 00 8C 3A
etc.
porque eso dice el manual. No me enciende ninguna, solo la salida 1. las demás no sirven.

Luego dice que si quiero hacer lo contrario, desactivarlo. cambie los números que corresponden con esa acción. que son los números 01 05 00 00 FF 00 8C 3A. y coloque 00 00. lo hago pero tampoco me lo desactiva. no entiendo que pueda pasar. si alguno tiene una idea de que pueda pasar lo agradecería.

los códigos los paso en byte, paso el hexadecimal a decimal, y el decimal a byte.

byte[] ch2={01,05,00,00,(byte) 255,00,(byte) 140,58};
outStream.write(ch2);

Esto me enciende la salida 1 (Si funciona)

byte[] ch12={01,05,00,01,(byte) 255,00,(byte) 140,58};
outStream.write(ch12);

Esto debería encender la salida 2 (No funciona)

solo me funcionan los códigos que en el manual salen como ejemplo, pero al yo cambiar esos números de los que hable antes, como dice en el manual. no me funciona. a lo mejor estoy entendiendo mal el manual.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Uso del RS485

Publicado por Tom (1831 intervenciones) el 08/06/2019 18:12:36
A ver, tener que leerse el manual y sin poder comprobar nada es un dolor para cualquiera que quiera echarte una mano. Eres tú el que tiene que hacer un esfuerzo.
¿ Has configurado los parámetros de velocidad bits y paridad de la conexión serial -apartado 5 del manual- en el CommConnection ?
¿ Te has molestado en buscar qué es eso del CRC que va al final de cada comando ? Lógicamente el CRC tienes que recalcularlo si el contenido del mensaje cambia.

https://en.wikipedia.org/wiki/Cyclic_redundancy_check
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Uso del RS485

Publicado por Tom (1831 intervenciones) el 08/06/2019 18:40:44
Esta rutina te vale en tu caso, copiada de:
https://introcs.cs.princeton.edu/java/61data/CRC16.java

Para hacerlo de la misma forma que dice el manual, hay que inicializar el crc a 0xffff (todo 1), por lo visto hay quien lo hace así.
Además, obtienes un resultado al que debes cambiar el orden de los bytes. Parece que esa electrónica funciona en big endian.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class CRC {
	static int[] table = {
		0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
		0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
		0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
		0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
		0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
		0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
		0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
		0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
		0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
		0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
		0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
		0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
		0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
		0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
		0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
		0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
		0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
		0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
		0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
		0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
		0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
		0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
		0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
		0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
		0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
		0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
		0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
		0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
		0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
		0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
		0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
		0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040};
	/* */
	public static int getCRC(byte bytes[]) {
		int crc = 0xffff;
		for(byte b : bytes) {
			crc = (crc >>> 8) ^ table[(crc ^ b) & 0xff];
		}
		return crc;
	}
	/* */
	public static void main(String args[]) {
		byte t1[] = {0x01, 0x05, 0x00, 0x00, (byte)0xff, 0x00};
		byte t2[] = {0x00, 0x06, 0x00, 0x64, 0x00, 0x01};
		int crc = getCRC(t1);
		System.out.println(Integer.toHexString(crc));
		crc = getCRC(t2);
		System.out.println(Integer.toHexString(crc));
	}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Uso del RS485

Publicado por Juan (70 intervenciones) el 10/06/2019 10:00:57
Hola Tom, muchísimas gracias por tu ayuda. lo de que nadie me ha ayudado lo dije en plan broma por eso puse (jeje), me imagine que no seria tan fácil. nunca he hecho nada de electrónica y quería una pequeña orientación de que estaba haciendo mal.

si había configurado los parámetros de velocidad y paridad, y había investigado lo del CRC pero por encimita, no le di mucha importancia, pensé que seria el mismo para cada acción. y la verdad es que no lo investigue lo suficiente.

Con decirme que el CRC había que cambiarlo en cada código ya era suficiente, dije que no necesitaba que me resolvieran el problema si no que me dieran una orientación de por donde ir, ya me hubiese encargado yo de investigar mejor lo del CRC. pero igual te agradezco que te hayas tomado la molestia de haber enviado la solución (aunque no era necesario). he probado lo que me has pasado y funcionan perfectamente, menos en las entradas 2 y 5, estará calculando mal el CRC para esas dos entradas, pero te lo digo mas para que sepas que para que lo resuelvas, ya me encargare yo de resolverlo y pongo la solución. Nuevamente muchas gracias por tomarte la molestia.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 186
Ha disminuido su posición en 2 puestos en Java (en relación al último mes)
Gráfica de Java

Uso del RS485

Publicado por Juan (70 intervenciones) el 10/06/2019 10:41:29
Vale, los CRC si estaban bien, cambie esos últimos hexadecimales a decimales y ha funcionado, no se la razón, debería funcionar de ambas maneras, pero bueno.

byte[] ch2={0x01, 0x05, 0x00, 0x01, (byte)0xff, 0x00,(byte) 0xDD,(byte) 0xFA}
byte[] ch5={0x01, 0x05, 0x00, 0x04, (byte)0xff, 0x00,(byte) 0xCD,(byte) 0xFB}

así no funciono, sin embargo al pasarlos a decimal de esta forma:

byte[] ch2={0x01, 0x05, 0x00, 0x01, (byte)0xff, 0x00,(byte) 221,(byte) 250}
byte[] ch5={0x01, 0x05, 0x00, 0x04, (byte)0xff, 0x00,(byte) 205,(byte) 251}

si ha funcionado. Así que bueno ya me funciona todo perfectamente, nuevamente muchas gracias Tom, por tomarte la molestia de pasarme la solución. Pero la próxima solo dime que había que cambiar los CRC, que si no me dejas sin trabajo jeje. muchísimas gracias enserio
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar