Luchando con la comunicación en serie a través de RS 485 usando el protocolo modbus

Tengo alrededor de 60-70 inversores con los que quiero hablar usando arduino sobre RS-485. La conexion que estoy haciendo con arduino es segun la imagen adjunta.

¡Ahora creo que mi parte de conexión está bien! Donde me estoy quedando atrás es la parte de codificación, supongo. En cuanto a cada solicitud, no puedo hacer ni una sola solicitud exitosa.ingrese la descripción de la imagen aquí

La biblioteca modbus que estoy usando es la biblioteca SimpleModbus, aquí está el enlace: https://drive.google.com/folderview?id=0B0B286tJkafVSENVcU1RQVBfSzg&usp=drive_web

El formato de datos que utiliza el fabricante del inversor es el siguiente: byte de inicio, dirección de esclavo, código de función, datos, verificación, byte de finalización.

Mientras que la solicitud que estoy enviando a través de mi dispositivo maestro se parece a esto:

paquete1->id = 25; paquete1->función = READ_HOLDING_REGISTERS; paquete1->dirección = 3000; paquete1->nº_de_registros = 3; paquete1->registrar_matriz = regs;

No estoy incluyendo ningún byte de inicio o byte final. ¿Es por eso que no puedo recibir ninguna respuesta del dispositivo esclavo? ¿O es porque también tengo que programar la respuesta de los dispositivos esclavos?

A partir de ahora, solo estoy jugando con el código del dispositivo maestro y no he descubierto cómo recibir la respuesta del esclavo y cómo decodificarla. Cada biblioteca de modubs parece tener dos tipos de programas, uno para el maestro y otro para el esclavo. Mientras que solo uso el código maestro para enviar solicitudes a los esclavos.

¿Tengo que programar también para esclavos? en caso afirmativo, ¿cómo programar tanto para el maestro como para los esclavos juntos en mi dispositivo maestro arduino que está hablando con mis inversores?

Soy nuevo en arduino pero tengo experiencia en programación. Sólo faltan algunos conceptos básicos de electrónica y protocolo modubs sobre RS-485. Amablemente por favor ayúdame

Gracias de antemano.

PD: he cableado todos mis inversores a través de puertos RS_485 correctamente, estoy conectando el extremo negativo al pin 7 en el chip RS-485 y el cable positivo al pin 6 en el chip

Esta pregunta es demasiado amplia y vaga para dar una respuesta útil. ¿Cuál es exactamente el problema que estás teniendo? Si aún no ha intentado decodificar una respuesta, ¿cómo sabe que no está respondiendo?
Sería mejor usar una placa de controlador rs485 aislada. Puedes hacer mucho daño usando esta configuración.
Creo que esta respuesta anterior podría ser la solución para su pregunta.
@nickjohnson: tengo un código para verificar el número de solicitudes enviadas, solicitudes exitosas y errores. regs[3] = paquete1->solicitudes; regs[4] = paquete1->peticiones_exitosas; regs[5] = paquete1->total_errors; por cada solicitud que hace mi dispositivo maestro, no obtengo ninguna respuesta.
¿Qué versión de Arduino estás usando? Sé que algunas versiones usan los pines 0 y 1 para comunicarse con la PC anfitriona, lo que hace que no estén disponibles para otras comunicaciones en serie.
En primer lugar, está compartiendo los pines seriales que conectan el arduino a la PC. Vea este esquema del enlace uno: Y mi siguiente pregunta es, ¿ha intentado establecer comunicación RS485/Modbus entre uno o más inversores y una PC usando una herramienta Modbus como Modbus Poll y un adaptador USB/serie a RS485 que funcione? Yo digo empezar por ahí. Aprenda a formatear sus paquetes, direccionamiento de estaciones y cableado. Luego muévase al arduino una vez que tenga una red RS485 en funcionamiento y comunicación modbus.

Respuestas (3)

No tengo grandes conocimientos sobre la plataforma Arduino, pero he trabajado con Modbus sobre 485 líneas. Todos los procesadores que utilicé requieren resistencias pull-up en las líneas Tx-Rx al MAX485. Tal vez la placa Arduino implemente resistencias pull-up internas, ¿puedes verificar esto?

Tengo muchas dudas sobre la especificación del fabricante sobre el "byte de inicio" y el "byte final", esto no aparece en la especificación del protocolo Modbus .

Y, por último, 60-70 nodos es un gran número de nodos... tal vez deba comprobar la especificación de Modbus a través de la línea serie .

También debe tener cuidado con la forma de terminar la línea de transmisión y la forma de realizar el cableado. Verifique las especificaciones.

Aquí hay un ejemplo de un circuito que usé para Modbus sobre 485.

ingrese la descripción de la imagen aquí

En este caso, es una línea aislada, pero es el mismo principio.

Omita el chip MAX485 y comuníquese directamente entre dos arduinos; esto demuestra que puede comunicar TX a RX y viceversa; aún puede usar las mismas bibliotecas de código y sugeriría que lo que podría encontrar es que necesita ambas bibliotecas instaladas en ambos extremos pero puede probar esto más tarde: simplemente intente enviar datos de un arduino a otro y deje que el destinatario encienda un LED si recibe el mensaje predefinido correcto. Aborda el problema por etapas y la etapa final es hacer que las cosas del 485 funcionen.

aka: gracias por su sugerencia, lo haré y volveré a esto.

Supongo que no configuró las identificaciones de los dispositivos en los inversores. Debe configurar el ID del dispositivo en un número diferente en cada uno. Tu maestro arduino debe consultar cada dispositivo individualmente. Le sugiero que use una PC con un maestro mobbus gratuito para probar la conexión a los inversores. Utilicé el sitio web de simplemente modbus para obtener información para escribir un programa maestro de modbus hace unos meses, un sitio muy útil.