n8n + API REST + PLC Modbus: Tutorial Completo para Conectar IT y OT
Aprende a conectar un PLC Modbus con n8n mediante una API REST intermedia. Tutorial paso a paso con gateway en Python, workflows y seguridad.
n8n + API REST + PLC Modbus: Cómo Conectar tu Planta con el Mundo IT
Tienes un PLC que habla Modbus. Tienes n8n automatizando workflows en la nube o en tu servidor. Y entre los dos, un abismo: el PLC no sabe qué es una API REST, y n8n no tiene ni idea de qué es un registro Modbus. Este tutorial cierra esa brecha.
Vamos a montar un sistema donde n8n lee y escribe datos de un PLC Modbus TCP a través de una API REST intermedia. Sin software propietario de 20.000 €, sin licencias por tag, sin depender del fabricante. Solo herramientas abiertas y un poco de ingenio.
Si eres ingeniero de automatización y llevas tiempo queriendo integrar los datos de planta con tus sistemas IT — dashboards, bases de datos, alertas en Telegram, informes automáticos — esto es exactamente lo que necesitas.
Por qué necesitas un puente entre Modbus y REST
Modbus es el protocolo más extendido en automatización industrial. Lleva más de 40 años funcionando — la especificación Modbus es pública y mantenida por la Modbus Organization — y lo hablan desde PLCs de Siemens y Schneider hasta inversores de frecuencia, medidores de energía y sensores de temperatura. Es robusto, sencillo y probado.
El problema es que Modbus se diseñó para comunicaciones punto a punto en redes industriales, no para integrarse con aplicaciones web. No tiene endpoints, no devuelve JSON, no entiende de HTTP. Y aquí está la desconexión:
- El mundo OT (operaciones) habla Modbus, OPC-UA, Profinet.
- El mundo IT habla REST, GraphQL, WebSockets.
Para que n8n — o cualquier herramienta IT — interactúe con un PLC, necesitas un gateway que traduzca entre ambos mundos. Ese gateway es el puente que vamos a construir.
La arquitectura que vamos a montar
PLC Modbus TCP ←→ Gateway REST/Modbus ←→ n8n (HTTP Request)
(planta) (servidor local) (automatización)
El flujo es simple:
- El PLC expone sus registros vía Modbus TCP en la red de planta.
- Un gateway (un script en Python o Node.js) se conecta al PLC por Modbus y expone esos datos como endpoints REST.
- n8n consume esos endpoints con su nodo HTTP Request para leer datos, disparar alertas o almacenar históricos.
Qué necesitas antes de empezar
Antes de tocar una línea de código, asegúrate de tener esto listo:
Hardware y red
- PLC con Modbus TCP habilitado. Puede ser un Schneider M221/M241, un Siemens S7-1200 con módulo Modbus, un Wago, un Delta, o cualquier dispositivo que soporte Modbus TCP. Si tu PLC solo habla Modbus RTU (serie RS485), necesitarás un conversor RTU-a-TCP como los de USR-TCP232 o Moxa.
- Conectividad de red entre el PLC y el servidor donde correrá el gateway. Ambos deben estar en la misma red o tener ruta de red configurada.
- Un servidor para el gateway. Un PC industrial, una Raspberry Pi, una VM en la red de planta — cualquier máquina con Linux o Windows que pueda ejecutar Python o Node.js.
Software
- Python 3.9+ con
pymodbusyflask(ofastapi), o bien Node.js 18+ conmodbus-serialyexpress. - n8n instalado y funcionando — local, Docker o cloud.
- Mapa de registros Modbus del PLC. Esto es crítico: necesitas saber qué registros leer, de qué tipo son (holding registers, input registers, coils) y cómo interpretar los valores. Consulta la documentación de tu PLC o el proyecto de programación.
Conocimientos previos
- Nociones básicas de Modbus (qué son registros, coils, function codes).
- Saber crear workflows en n8n (si vienes de cero, revisa nuestro tutorial de n8n en español).
- Familiaridad mínima con Python o Node.js (no hace falta ser desarrollador senior, pero sí entender un script básico).
Paso 1: Entender Modbus TCP en 5 minutos
Si ya dominas Modbus, salta al paso 2. Si no, quédate un momento.
Modbus TCP es la versión de Modbus que funciona sobre redes Ethernet TCP/IP. En lugar de comunicarse por cable serie (RS485), los dispositivos se conectan por red estándar usando el puerto 502.
Los cuatro tipos de datos en Modbus
| Tipo | Dirección | Lectura/Escritura | Ejemplo |
|---|---|---|---|
| Coils | 00001-09999 | Lectura y escritura | Salidas digitales (encender motor, abrir válvula) |
| Discrete Inputs | 10001-19999 | Solo lectura | Entradas digitales (sensor de proximidad, fin de carrera) |
| Input Registers | 30001-39999 | Solo lectura | Variables analógicas de entrada (temperatura, presión) |
| Holding Registers | 40001-49999 | Lectura y escritura | Setpoints, parámetros, contadores |
Function codes que usarás
Los más habituales para integración IT/OT:
- FC 01: Leer coils.
- FC 02: Leer discrete inputs.
- FC 03: Leer holding registers (el que más usarás).
- FC 04: Leer input registers.
- FC 06: Escribir un solo holding register.
- FC 16: Escribir múltiples holding registers.
Cada petición Modbus especifica: dirección del dispositivo (Unit ID), function code, dirección de inicio del registro y cantidad de registros a leer/escribir. Así de sencillo.
Paso 2: Montar el gateway REST-Modbus con Python
Vamos a construir un gateway ligero que se conecte al PLC por Modbus TCP y exponga los datos como API REST. Usamos Python con pymodbus y FastAPI porque la combinación es limpia, rápida y fácil de mantener.
Instalar dependencias
# Crear un entorno virtual (buena práctica)
python3 -m venv modbus-gw
source modbus-gw/bin/activate
# Instalar las librerías necesarias
pip install pymodbus fastapi uvicorn
El gateway completo
Crea un archivo modbus_gateway.py:
"""
Gateway REST → Modbus TCP
Expone registros de un PLC Modbus como endpoints REST.
"""
from fastapi import FastAPI, HTTPException
from pymodbus.client import ModbusTcpClient
from pydantic import BaseModel
from contextlib import asynccontextmanager
# === CONFIGURACIÓN ===
PLC_HOST = "192.168.1.10" # IP de tu PLC
PLC_PORT = 502 # Puerto Modbus TCP estándar
UNIT_ID = 1 # Unit ID del esclavo Modbus
# Inicializar cliente Modbus
client = ModbusTcpClient(PLC_HOST, port=PLC_PORT)
@asynccontextmanager
async def lifespan(app: FastAPI):
"""Conectar al PLC al arrancar, desconectar al cerrar."""
if not client.connect():
raise RuntimeError(f"No se pudo conectar al PLC en {PLC_HOST}:{PLC_PORT}")
print(f"✅ Conectado al PLC en {PLC_HOST}:{PLC_PORT}")
yield
client.close()
print("🔌 Desconectado del PLC")
app = FastAPI(
title="Modbus REST Gateway",
version="1.0.0",
lifespan=lifespan
)
# === MODELOS ===
class WriteRequest(BaseModel):
value: int
class WriteMultipleRequest(BaseModel):
values: list[int]
# === ENDPOINTS DE LECTURA ===
@app.get("/api/holding-registers/{address}")
def read_holding_registers(address: int, count: int = 1):
"""Leer holding registers (FC 03)."""
result = client.read_holding_registers(address, count=count, slave=UNIT_ID)
if result.isError():
raise HTTPException(status_code=500, detail=f"Error Modbus: {result}")
return {
"address": address,
"count": count,
"values": result.registers,
"unit_id": UNIT_ID
}
@app.get("/api/input-registers/{address}")
def read_input_registers(address: int, count: int = 1):
"""Leer input registers (FC 04)."""
result = client.read_input_registers(address, count=count, slave=UNIT_ID)
if result.isError():
raise HTTPException(status_code=500, detail=f"Error Modbus: {result}")
return {
"address": address,
"count": count,
"values": result.registers,
"unit_id": UNIT_ID
}
@app.get("/api/coils/{address}")
def read_coils(address: int, count: int = 1):
"""Leer coils (FC 01)."""
result = client.read_coils(address, count=count, slave=UNIT_ID)
if result.isError():
raise HTTPException(status_code=500, detail=f"Error Modbus: {result}")
return {
"address": address,
"count": count,
"values": result.bits[:count],
"unit_id": UNIT_ID
}
# === ENDPOINTS DE ESCRITURA ===
@app.put("/api/holding-registers/{address}")
def write_holding_register(address: int, req: WriteRequest):
"""Escribir un holding register (FC 06)."""
result = client.write_register(address, req.value, slave=UNIT_ID)
if result.isError():
raise HTTPException(status_code=500, detail=f"Error Modbus: {result}")
return {
"address": address,
"value": req.value,
"status": "written"
}
@app.put("/api/holding-registers/{address}/multiple")
def write_multiple_registers(address: int, req: WriteMultipleRequest):
"""Escribir múltiples holding registers (FC 16)."""
result = client.write_registers(address, req.values, slave=UNIT_ID)
if result.isError():
raise HTTPException(status_code=500, detail=f"Error Modbus: {result}")
return {
"address": address,
"values": req.values,
"status": "written"
}
@app.get("/api/status")
def gateway_status():
"""Verificar conexión con el PLC."""
connected = client.connected
return {
"plc_host": PLC_HOST,
"plc_port": PLC_PORT,
"connected": connected
}
Arrancar el gateway
uvicorn modbus_gateway:app --host 0.0.0.0 --port 8484
El gateway ya está escuchando en http://tu-servidor:8484. Puedes verificar que funciona con:
# Comprobar estado de la conexión
curl http://localhost:8484/api/status
# Leer 5 holding registers empezando en la dirección 0
curl http://localhost:8484/api/holding-registers/0?count=5
# Escribir el valor 1500 en el registro 10
curl -X PUT http://localhost:8484/api/holding-registers/10 \
-H "Content-Type: application/json" \
-d '{"value": 1500}'
Si el PLC responde, ya tienes la mitad del trabajo hecho.
Paso 3: Alternativa en Node.js (si prefieres JavaScript)
Si tu entorno es Node.js o simplemente te sientes más cómodo con JavaScript, aquí tienes el equivalente:
mkdir modbus-gateway && cd modbus-gateway
npm init -y
npm install modbus-serial express
Crea gateway.js:
const express = require('express');
const ModbusRTU = require('modbus-serial');
const app = express();
app.use(express.json());
// Configuración
const PLC_HOST = '192.168.1.10';
const PLC_PORT = 502;
const UNIT_ID = 1;
const client = new ModbusRTU();
client.setID(UNIT_ID);
// Conectar al PLC
client.connectTCP(PLC_HOST, { port: PLC_PORT })
.then(() => console.log(`✅ Conectado al PLC en ${PLC_HOST}:${PLC_PORT}`))
.catch(err => console.error('❌ Error de conexión:', err.message));
// Leer holding registers
app.get('/api/holding-registers/:address', async (req, res) => {
try {
const address = parseInt(req.params.address);
const count = parseInt(req.query.count) || 1;
const data = await client.readHoldingRegisters(address, count);
res.json({ address, count, values: data.data });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
// Escribir holding register
app.put('/api/holding-registers/:address', async (req, res) => {
try {
const address = parseInt(req.params.address);
const { value } = req.body;
await client.writeRegister(address, value);
res.json({ address, value, status: 'written' });
} catch (err) {
res.status(500).json({ error: err.message });
}
});
app.get('/api/status', (req, res) => {
res.json({
plc_host: PLC_HOST,
plc_port: PLC_PORT,
connected: client.isOpen
});
});
app.listen(8484, '0.0.0.0', () => {
console.log('🚀 Gateway escuchando en http://0.0.0.0:8484');
});
Funciona igual que la versión Python. Elige la que encaje mejor en tu stack.
Paso 4: Conectar n8n con el gateway
Ahora viene la parte divertida: hacer que n8n hable con tu PLC a través del gateway.
Workflow 1: Leer datos del PLC cada 5 minutos
Este workflow lee registros del PLC periódicamente y los almacena en una base de datos o los envía a un dashboard.
Nodos del workflow:
- Schedule Trigger — Se ejecuta cada 5 minutos.
- HTTP Request — Llama al gateway para leer registros.
- Set — Procesa y formatea los datos.
- PostgreSQL / Google Sheets / Telegram — Destino final de los datos.
Configuración del nodo HTTP Request:
- Method: GET
- URL:
http://tu-servidor:8484/api/holding-registers/0?count=10 - Authentication: None (o Header Auth si añadiste seguridad al gateway)
- Response Format: JSON
El nodo devuelve algo así:
{
"address": 0,
"count": 10,
"values": [1523, 872, 0, 1, 245, 98, 3001, 50, 0, 1200],
"unit_id": 1
}
Cada valor corresponde a un registro del PLC. Por ejemplo, si tu mapa de registros dice que la dirección 0 es “temperatura horno” y la dirección 4 es “presión línea 1”, puedes usar un nodo Set para transformar esto:
// En el nodo Set (modo Expression)
{
"temperatura_horno": $json.values[0] / 10, // Escalado: 1523 → 152.3 °C
"velocidad_motor": $json.values[1], // 872 RPM
"alarma_activa": $json.values[3] === 1, // true
"presion_linea_1": $json.values[4] / 100, // 245 → 2.45 bar
"contador_piezas": $json.values[6], // 3001 piezas
"setpoint_temp": $json.values[9] / 10 // 1200 → 120.0 °C
}
Workflow 2: Alerta a Telegram si la temperatura sube demasiado
Un caso de uso clásico: que n8n vigile una variable del PLC y te avise al móvil si algo va mal.
Nodos:
- Schedule Trigger — Cada 60 segundos.
- HTTP Request — Lee el registro de temperatura:
GET /api/holding-registers/0?count=1. - IF — ¿El valor supera el límite? Condición:
{{ $json.values[0] / 10 > 160 }}. - Telegram — Envía: “⚠️ Temperatura horno en {{ $json.values[0] / 10 }} °C. Límite: 160 °C.”
Puedes añadir un nodo de debounce o una variable de estado para no recibir 60 alertas por minuto. Una forma simple: usar un nodo Set que almacene la última vez que se envió la alerta y solo dispare si han pasado más de 10 minutos.
Workflow 3: Cambiar un setpoint desde n8n
Además de leer, puedes escribir en el PLC. Esto es potente — y peligroso si no tienes cuidado.
Ejemplo: un workflow que recibe un webhook y actualiza el setpoint de temperatura.
- Webhook — Recibe una petición POST con el nuevo setpoint.
- IF — Valida que el valor está en rango seguro (por ejemplo, entre 80 y 200 °C).
- HTTP Request — Escribe en el PLC:
- Method: PUT
- URL:
http://tu-servidor:8484/api/holding-registers/9 - Body:
{"value": {{ $json.setpoint * 10 }}}(recuerda el escalado)
- Respond to Webhook — Confirma la escritura.
⚠️ Precaución importante: Escribir en un PLC desde un sistema IT no es un juego. Validaciones, rangos de seguridad, permisos de acceso y auditoría son obligatorios antes de implementar escrituras en producción. Siempre consulta con el responsable de planta.
Paso 5: Gestionar múltiples PLCs y dispositivos
En una planta real no tienes un PLC: tienes diez, más variadores, medidores de energía y sensores inteligentes. El gateway debe escalar.
Opción 1: Multi-dispositivo en el gateway
Modifica el gateway para aceptar la IP y el Unit ID como parámetros:
@app.get("/api/device/{device_ip}/holding-registers/{address}")
def read_device_registers(device_ip: str, address: int, count: int = 1, unit_id: int = 1):
"""Leer registros de un dispositivo específico."""
device_client = ModbusTcpClient(device_ip, port=502)
if not device_client.connect():
raise HTTPException(status_code=503, detail=f"No se pudo conectar a {device_ip}")
try:
result = device_client.read_holding_registers(address, count=count, slave=unit_id)
if result.isError():
raise HTTPException(status_code=500, detail=str(result))
return {"device": device_ip, "address": address, "values": result.registers}
finally:
device_client.close()
Ahora desde n8n puedes leer cualquier dispositivo de la planta:
GET /api/device/192.168.1.10/holding-registers/0?count=5 → PLC línea 1
GET /api/device/192.168.1.20/holding-registers/100?count=3 → Medidor de energía
GET /api/device/192.168.1.30/holding-registers/0?count=2 → Variador de frecuencia
Opción 2: Fichero de configuración de dispositivos
Para no hardcodear IPs y registros, usa un archivo JSON de configuración:
{
"devices": {
"horno_principal": {
"ip": "192.168.1.10",
"port": 502,
"unit_id": 1,
"registers": {
"temperatura": {"address": 0, "scale": 0.1, "unit": "°C"},
"presion": {"address": 4, "scale": 0.01, "unit": "bar"},
"contador": {"address": 6, "scale": 1, "unit": "piezas"}
}
},
"variador_bomba_1": {
"ip": "192.168.1.20",
"port": 502,
"unit_id": 1,
"registers": {
"frecuencia": {"address": 0, "scale": 0.1, "unit": "Hz"},
"corriente": {"address": 2, "scale": 0.01, "unit": "A"}
}
}
}
}
El gateway carga esta configuración y expone endpoints amigables:
GET /api/horno_principal/temperatura → {"value": 152.3, "unit": "°C", "raw": 1523}
Ya no necesitas recordar direcciones de registros ni factores de escala. n8n trabaja con nombres legibles y valores ya convertidos.
Paso 6: Seguridad — No expongas tu PLC a Internet
Este es el apartado que muchos tutoriales ignoran y que aquí no vamos a saltarnos.
Reglas no negociables
- El gateway nunca se expone a Internet. Solo debe ser accesible desde la red interna o a través de una VPN (WireGuard, Tailscale, OpenVPN).
- Autenticación en el gateway. Como mínimo, un API key en los headers:
from fastapi import Depends, Security
from fastapi.security import APIKeyHeader
API_KEY = "tu-clave-secreta-larga-y-aleatoria"
api_key_header = APIKeyHeader(name="X-API-Key")
def verify_api_key(key: str = Security(api_key_header)):
if key != API_KEY:
raise HTTPException(status_code=403, detail="API key inválida")
# Aplicar a todas las rutas
app = FastAPI(dependencies=[Depends(verify_api_key)])
- Separar lectura de escritura. Usa dos API keys diferentes: una de solo lectura para dashboards y monitorización, otra con permisos de escritura para acciones controladas.
- Rate limiting. Un ataque — o un bug — que escriba en el PLC 1.000 veces por segundo puede dañar equipos. Limita las peticiones de escritura a un máximo razonable.
- Logging de todas las escrituras. Cada valor que se escriba en el PLC debe quedar registrado con timestamp, usuario y valor anterior. Esto no es opcional en entornos industriales.
- Segmentación de red. El gateway debería tener dos interfaces de red: una en la red OT (donde están los PLCs) y otra en la red IT (donde está n8n). Esto sigue las recomendaciones del modelo Purdue y de la IEC 62443.
Configuración en n8n
En n8n, crea una credencial de tipo Header Auth:
- Name: Modbus Gateway API Key
- Header Name: X-API-Key
- Header Value: tu-clave-secreta-larga-y-aleatoria
Asígnala a todos los nodos HTTP Request que apunten al gateway. Si la clave cambia, solo la actualizas en un sitio.
Casos de uso reales en producción
Aquí van tres escenarios donde esta integración aporta valor inmediato:
1. Dashboard de producción en tiempo real
Problema: Los datos de producción están atrapados en el SCADA. El gerente de planta quiere verlos desde su portátil sin instalar software.
Solución: n8n lee los registros del PLC cada 30 segundos → los guarda en PostgreSQL → Grafana muestra un dashboard web accesible desde cualquier navegador. Para montar algo similar, puedes consultar nuestro artículo sobre n8n y Grafana para dashboards de producción.
Registros leídos: contador de piezas, velocidad de línea, estado de máquina (marcha/paro/alarma), OEE parcial.
2. Alertas de mantenimiento preventivo
Problema: Los operarios solo se enteran de los problemas cuando la máquina ya ha parado.
Solución: n8n monitoriza horas de funcionamiento, vibraciones y temperaturas de rodamientos. Cuando un valor cruza un umbral, envía una alerta a Telegram y crea automáticamente una orden de trabajo en el sistema de mantenimiento (GMAO).
Registros leídos: horas de motor, temperatura de cojinetes, contador de ciclos.
3. Registro automático de lotes para trazabilidad
Problema: La trazabilidad se lleva a mano en papel. Auditorías de calidad y normativas (ISO 9001, IFS Food) exigen registros digitales fiables.
Solución: Cuando el PLC señala fin de lote (un coil cambia de estado), n8n captura los parámetros del lote — temperaturas, tiempos, cantidades — y los archiva en una base de datos con timestamp. El registro queda inmutable y consultable.
Errores comunes y cómo solucionarlos
Después de implementar este tipo de integraciones en varias plantas, estos son los problemas que te vas a encontrar:
“Connection refused” al conectar con el PLC
- Causa habitual: El servicio Modbus TCP no está habilitado en el PLC. En Schneider (SoMachine/EcoStruxure), búscalo en la configuración de comunicaciones del proyecto. En Siemens, necesitas un bloque de comunicación MB_SERVER o configurar el módulo CM.
- Verificar:
telnet 192.168.1.10 502desde el servidor del gateway. Si no conecta, el problema está en el PLC o el firewall, no en tu código.
Los valores que lee son incorrectos o no tienen sentido
- Causa 1: Offset de dirección. Algunos PLCs usan direcciones base-0, otros base-1. Si en el programa del PLC el registro es MW100, la dirección Modbus puede ser 100 o 99 según el fabricante. Consulta el manual.
- Causa 2: Tipo de dato. Un valor flotante (REAL/FLOAT) ocupa 2 registros Modbus de 16 bits. Si lees solo uno, obtienes basura. Necesitas combinar dos registros y convertir a float IEEE 754.
- Causa 3: Byte order (endianness). Modbus es big-endian por estándar, pero algunos dispositivos lo implementan en little-endian o mid-endian. Si el valor parece correcto pero con los bytes cambiados, revisa el byte order.
El gateway se desconecta del PLC después de un tiempo
- Causa: Timeout de inactividad en el PLC. Muchos PLCs cierran la conexión Modbus TCP si no hay actividad durante un tiempo configurable (30 segundos a 5 minutos).
- Solución: Implementa un keep-alive o reconexión automática en el gateway:
import time
def get_client():
"""Obtener cliente Modbus con reconexión automática."""
if not client.connected:
print("🔄 Reconectando al PLC...")
client.connect()
time.sleep(0.5)
return client
n8n devuelve error 500 al hacer la petición HTTP
- Verificar: ¿El gateway está corriendo?
curl http://localhost:8484/api/status. - Verificar: ¿La URL en n8n es correcta? Si n8n corre en Docker,
localhostno apunta al host. Usa la IP del servidor ohost.docker.internal. - Verificar: ¿El firewall permite la conexión en el puerto 8484?
Evolución: de gateway básico a plataforma
Este tutorial te da un gateway funcional. Para llevarlo a producción real, considera estos pasos adicionales:
- Caché de lecturas. No hagas una petición Modbus por cada petición HTTP. Implementa un ciclo de polling que lea los registros periódicamente y sirva los últimos valores desde memoria. Reduce la carga sobre el PLC y mejora los tiempos de respuesta.
- Histórico con TimescaleDB. Guarda cada lectura con timestamp. Te permite crear gráficas históricas, detectar tendencias y alimentar modelos de mantenimiento predictivo.
- Cola de escrituras. Las escrituras al PLC deben ser secuenciales y controladas. Usa una cola (Redis, RabbitMQ o una simple queue en memoria) para evitar colisiones.
- Websockets para datos en tiempo real. Si necesitas actualizar un dashboard sin polling, añade un endpoint WebSocket que haga push de los cambios.
- OPC-UA como alternativa. Si tu PLC soporta OPC-UA (Siemens S7-1500, Beckhoff, B&R), considera usarlo en lugar de Modbus. OPC-UA es más rico en funcionalidad (tipos de datos complejos, suscripciones, seguridad integrada) y tiene librerías maduras como
node-opcuaoasyncuaen Python.
Conclusión
Conectar un PLC Modbus con n8n a través de una API REST no requiere software propietario ni inversiones de cinco cifras. Un gateway de 100 líneas de Python, n8n con su nodo HTTP Request y un poco de sentido común con la seguridad te dan acceso a los datos de planta desde cualquier workflow.
La clave está en el puente: un intermediario ligero que habla los dos idiomas — Modbus con los equipos de planta y REST con las herramientas IT. Una vez que ese puente existe, las posibilidades se abren: dashboards, alertas, trazabilidad, informes automáticos, integración con ERP.
Si trabajas en automatización industrial y quieres implementar este tipo de integración en tu planta — o necesitas ayuda para adaptar el gateway a tus equipos específicos — contacta con nosotros. Llevamos años conectando mundos que no se hablaban.
¿Te ha resultado útil este tutorial? Compártelo con tu equipo de ingeniería. Y si quieres recibir más guías prácticas de automatización industrial, suscríbete a nuestra newsletter.
Sigue leyendo
Python Modbus TCP: Tutorial Completo para Comunicarte con un PLC
Aprende a usar Python con Modbus TCP para leer y escribir datos de un PLC. Tutorial con PyModbus, ejemplos reales y código listo para producción.
Leer artículoBackup SCADA y Plan de Recuperación ante Desastres en la Industria: Guía Práctica
Plan de backup SCADA y recuperación ante desastres paso a paso. Qué respaldar, con qué frecuencia y cómo restaurar tu planta en horas, no en semanas.
Leer artículo