dejar listo un maestro Modbus RTU para leer RS485
Implementado:
- Proyecto ESP-IDF completo.
- UART2 en
GPIO17TX yGPIO16RX. - Maestro Modbus RTU.
- Lectura por funcion
0x03o0x04. - Sincronizacion de trama por
slave_idyfunction_code. - Validacion de longitud y
CRC16. - Descarte de ruido de bus flotante.
- Configuracion por
idf.py menuconfig. - Scripts PowerShell y POSIX para build, flash y monitor.
No para implementado todavia:
- MQTT.
- Telegraf / TimescaleDB.
- Dashboard Superset.
- Lectura directa del cargador FoxESS por CAN o WiFi.
| ESP32 | Modulo TTL-RS485 |
|---|---|
| GPIO17 / TX2 | RXD |
| GPIO16 / RX2 | TXD |
| GND | GND |
| 3V3 o 5V | VCC |
| Modulo TTL-RS485 | Dispositivo RS485 |
|---|---|
| A | A / D+ / RS485+ |
| B | B / D- / RS485- |
Nota tecnica: si el modulo esta alimentado a 5 V, verifica que TXD del modulo no entregue 5 V al GPIO16 del ESP32. El ESP32 usa logica de 3.3 V.
Desde ESP-IDF PowerShell:
idf.py buildO con script:
.\scripts\build.ps1idf.py -p COM17 flash monitorO con script:
.\scripts\flash_monitor.ps1 -Port COM17Salir del monitor:
Ctrl + ]
Abrir menuconfig:
idf.py menuconfigRuta:
SCADAESP32 Modbus RTU
Parametros configurables:
UART2 TX GPIO: default17.UART2 RX GPIO: default16.Modbus RTU baudrate: default9600.Parity:8N1,8E1o8O1.Slave ID: default1.Function code:0x03holding registers o0x04input registers.Start register: default0x0000.Register count: default2.Polling interval: default2000 ms.
Con A/B desconectado, es normal ver:
RX: timeout. No hay respuesta valida.
Tambien puede aparecer ruido descartado:
RX ruido descartado: E0 30 80 80 83 E6 FC
Sin inicio de trama valido: esperado slave_id=0x01.
Lectura fallida. Codigo=-1
O una trama detectada pero corrupta:
Error: CRC invalido
Lectura fallida. Codigo=-3
Eso indica que RX recibe actividad electrica, pero no una trama Modbus valida.
TX Modbus RTU: 01 03 00 00 00 02 C4 0B
RX bruto: 01 03 04 00 E6 00 00 9B 3A
Trama Modbus valida.
Registro 0x0000 = 230 / 0x00E6
Registro 0x0001 = 0 / 0x0000
Lectura OK.
Si no hay respuesta:
- Intercambia
AyB. - Verifica
slave_id. - Verifica baudrate.
- Verifica paridad:
8N1,8E1o8O1. - Verifica si el dispositivo usa funcion
0x03o0x04. - Verifica la direccion inicial del registro.
- Usa resistencia de 120 ohm entre
AyBsolo si corresponde a extremo de bus. - Si
A/Bestan sin conectar y aparece ruido repetido, agrega polarizacion/fail-safe solo para prueba: pull-up en A, pull-down en B y 120 ohm entre A/B.
No conectes este modulo MAX485 a terminales marcados CANH y CANL. CAN bus no es RS485. Para CAN se requiere un transceptor CAN y el protocolo CAN del fabricante.
El protocolo FoxESS EV Charger disponible es Modbus TCP por red IP. Este firmware es para Modbus RTU por RS485, util para medidores o dispositivos externos RS485.