RS485 / Modbus RTU

El Eziwan Gateway dispone de un puerto RS485/RS232 nativo en la regleta de terminales. Esta interfaz permite recopilar datos de tus sensores, controladores lógicos programables y contadores mediante el protocolo Modbus RTU, y enviarlos a la nube sin necesidad de una pasarela independiente.


Conexión física

Cableado de la regleta de bornes RS485

Pines del bloque de bornes

PinSeñalDescripción
ARS485+Línea diferencial positiva
BRS485−Línea diferencial negativa
GNDMasaReferencia común
Comprobación de polaridad A/B

Una inversión de A/B provoca errores de comunicación sin dañar el equipo. Si ningún dispositivo responde, compruébalo invirtiendo A y B.

Resistencias de terminación

En un bus RS485 con varios esclavos:

  • 120 Ω en el primer y el último equipo del bus
  • El Eziwan Gateway dispone de un puente interno para activar la terminación (documentación de hardware)
  • En los dispositivos intermedios: terminación desactivada

Configuración del polling Modbus

A través del panel de control de Eziwan

Dispositivo → Configuración → RS485 / Modbus

Interfaz gráfica: añade cada esclavo y cada registro, y define el intervalo de sondeo y el tema MQTT de destino.

A través de la API / YAML

# Configuration RS485 + Modbus RTU
rs485:
enabled: true
baud_rate: 9600 # 1200, 2400, 4800, 9600, 19200, 38400, 115200
parity: none # none, even, odd
data_bits: 8 # 7 ou 8
stop_bits: 1 # 1 ou 2
polling_interval_sec: 10 # Intervalo global de sondeo (segundos)

modbus:
slaves:
- slave_id: 1
name: "Compteur énergie Schneider PM2200"
timeout_ms: 1000
retries: 3
registers:
- address: "0x0048"
type: holding # holding, input, coil, discrete_input
format: float32_abcd
tag: active_power
unit: kW
scale: 1.0
mqtt_topic: "site/usine-01/energie/puissance_active"

- address: "0x004A"
type: holding
format: float32_abcd
tag: reactive_power
unit: kVAr
scale: 1.0
mqtt_topic: "site/usine-01/energie/puissance_reactive"

- address: "0x0156"
type: holding
format: float32_abcd
tag: energy_total_kwh
unit: kWh
scale: 1.0
mqtt_topic: "site/usine-01/energie/index_kwh"

- slave_id: 2
name: "Capteur température / humidité"
timeout_ms: 500
registers:
- address: "0x0001"
type: input
format: int16
tag: temperature
unit: "°C"
scale: 0.1 # Valeur brute 245 → 24,5°C
mqtt_topic: "site/usine-01/environnement/temperature"

- address: "0x0002"
type: input
format: uint16
tag: humidity
unit: "%RH"
scale: 0.1
mqtt_topic: "site/usine-01/environnement/humidite"

- slave_id: 3
name: "Automate Schneider TM3 — Station de pompage"
polling_interval_sec: 30 # Anulación del intervalo global
registers:
- address: "0x0000"
type: holding
format: uint16
tag: pump_status
unit: ""
# 0 = apagado, 1 = encendido, 2 = fallo
mqtt_topic: "site/pompe-01/etat/pompe"

- address: "0x0001"
type: holding
format: int16
tag: pressure_bar
unit: bar
scale: 0.01
mqtt_topic: "site/pompe-01/mesures/pression"

- address: "0x0002"
type: holding
format: uint16
tag: flow_m3h
unit: "m³/h"
scale: 0.1
mqtt_topic: "site/pompe-01/mesures/debit"

Formatos de registros compatibles

FormatoDescripciónRegistros
int16Entero con signo de 16 bits1
uint16Entero sin signo de 16 bits1
int32_abcdEntero con signo de 32 bits, big-endian2
int32_cdabEntero con signo de 32 bits, little-endian2
uint32_abcdEntero sin signo de 32 bits, big-endian2
float32_abcdFlotante IEEE 754, big-endian2
float32_cdabNúmero flotante IEEE 754, little-endian (Schneider)2
float32_badcNúmero flotante IEEE 754, mid-big-endian2
coilBobina Modbus (1 bit)1 bobina
bitExtracción de un bit de un registro uint161
Orden de los bytes

Si los valores leídos parecen incoherentes (por ejemplo: 1234 leído como 12340000), prueba con float32_cdab en lugar de float32_abcd. La convención varía según los fabricantes.


Publicación MQTT

Los datos Modbus se publican automáticamente en el broker MQTT de Eziwan:

Estructura del tema

eziwan/{device_id}/modbus/{slave_id}/{tag_name}

Ejemplo:

eziwan/d_a1b2c3d4/modbus/1/active_power

Carga útil JSON

{
"value": 42.7,
"unit": "kW",
"timestamp": "2025-06-15T14:23:45.123Z",
"slave_id": 1,
"register": "0x0048",
"quality": "good"
}

El campo "quality" puede adoptar los siguientes valores:

  • "good" — lectura correcta
  • "timeout": el esclavo no ha respondido
  • "error": error de Modbus (código incluido en "error_code")

Suscríbete desde tu sistema

# Suscribirse a todas las etiquetas de una web
mosquitto_sub -h mqtt.eziwan.com -p 8883 \
--cert client.crt --key client.key --cafile ca.crt \
-t "eziwan/d_a1b2c3d4/modbus/#"

# Suscripción a una etiqueta concreta
mosquitto_sub -h mqtt.eziwan.com -p 8883 \
--cert client.crt --key client.key --cafile ca.crt \
-t "eziwan/d_a1b2c3d4/modbus/1/active_power"

Equipos probados

FabricanteModeloProtocoloNotas
Schneider ElectricPM2100, PM2200Modbus RTUContador de energía — float32
Schneider ElectricTM3, TM2Modbus RTUControlador lógico — bobinas + resistencias
SiemensSENTRON PAC 3200Modbus RTUContador de energía
Carlo GavazziEM24, EM340Modbus RTUContador trifásico/monofásico
ABBB23, B24Modbus RTUContador de energía
Wago750-xxxModbus RTUAcoplador de bus de E/S
Phoenix ContactILB ETH 2TXModbus TCPA través de puente TCP
HagerECR380DModbus RTUContador de energía
EastronSDM630Modbus RTUContador trifásico
GenéricoCualquier Modbus RTUModbus RTUID de esclavo 1–247

Solución de problemas

Prueba de comunicación desde Eziwan

Panel de control → Dispositivo → Herramientas → Prueba Modbus

Introduce el ID del esclavo, el tipo y la dirección del registro → Eziwan envía una solicitud de lectura y muestra la respuesta sin procesar en tiempo real. Ideal para realizar diagnósticos sin necesidad de acceso físico al lugar.

Códigos de error de Modbus

CódigoSignificadoSolución
TIMEOUTEl esclavo no respondeComprobar el cableado, la velocidad de transmisión, el ID del esclavo y la terminación
01Función no compatibleUtilizar holding en lugar de input (o viceversa)
02Dirección de registro no válidaComprobar el registro en la documentación del equipo
03Valor de datos no válidoValor fuera del rango permitido
04Fallo interno del esclavoConsultar el registro del equipo

Lista de comprobación del cableado

Si ningún esclavo responde:

  • Comprobar la polaridad A/B (intentar invertirla)
  • Comprobar la velocidad de transmisión (9600 es la más habitual)
  • Comprobar que los ID de los esclavos sean únicos en el bus
  • Activar la terminación de 120 Ω en el primer y el último equipo
  • Probar con un solo esclavo (aislar el problema)
  • Medir la tensión diferencial A−B: debe ser > 200 mV en reposo

Tensión diferencial de referencia

Bus en reposo (sin transmisión):
V(A−B) > +200 mV → polarisation correcte

Pendant transmission :
V(A−B) > +1.5V → signal dominant (1 logique)
V(A−B) < −1.5V → signal récessif (0 logique)

sobre Modbus TCP

¿Tienes equipos que utilizan Modbus TCP (en red Ethernet)? Eziwan también es compatible con el puente Modbus TCP → MQTT. Consulta la documentación sobre Modbus TCP →

de asistencia técnica

Preguntas frecuentes

¿Cuántos dispositivos pueden conectarse a un mismo bus RS-485?

32 esclavos por segmento sin repetidor, en una longitud máxima de unos 1 200 m a 9 600 baudios. Si se supera esta longitud, divida el sistema en varios buses o añada repetidores.

¿Es imprescindible la resistencia de terminación?

En los buses largos o rápidos, sí: 120 Ω en cada extremo evitan las reflexiones que alteran las tramas. En un bus corto (unos metros, 9 600 baudios), su ausencia suele pasar desapercibida… hasta el día en que deja de funcionar.

¿Qué velocidad de sondeo elegir?

Adapta la frecuencia a la dinámica del proceso: cada 10 a 60 s para mediciones de energía o de nivel, y cada 1 a 5 s para la supervisión de máquinas. Un sondeo demasiado agresivo en un bus lento provoca tiempos de espera en cadena.

¿Cómo se pueden combinar equipos con velocidades diferentes?

No se deben mezclar los parámetros de serie en un mismo bus: todos los esclavos deben compartir la velocidad, la paridad y los bits de parada. De lo contrario, distribúyalos entre los distintos puertos RS-485 de la pasarela.

Recursos relacionados