Introducción
La interconexión de los sistemas automatizados con los elementos de campo es una parte fundamental en cualquier instalación industrial. Los autómatas programables (PLC) necesitan comunicarse de manera eficiente y fiable tanto con los sensores (elementos de entrada) como con los actuadores (elementos de salida) para garantizar el correcto funcionamiento del proceso. Esta comunicación puede realizarse mediante conexiones directas o a través de diferentes tecnologías de red, conocidas como buses de campo.
Cableado punto a punto
La conexión tradicional entre los PLC y los elementos de campo se realiza mediante el cableado punto a punto. En este caso, cada sensor o actuador se conecta de manera individual a una entrada o salida del autómata. Aunque este método es fiable y sencillo de mantener, presenta inconvenientes cuando el número de dispositivos crece, como el aumento del cableado y la dificultad en el diagnóstico de fallos.
Buses de campo
Para optimizar la comunicación y reducir los problemas asociados al cableado tradicional, se utilizan los buses de campo. Un bus de campo es un sistema de comunicación digital que permite conectar múltiples dispositivos de campo (sensores, actuadores, módulos de entrada/salida) a un único bus de datos, facilitando la transmisión de información entre ellos y el autómata. Los buses de campo emplean topologías como la línea, el anillo o la estrella, permitiendo una mayor flexibilidad en la disposición de los elementos.
Principales buses de campo
Profibus
Es uno de los buses de campo más extendidos, especialmente en aplicaciones de automatización industrial. Permite la comunicación entre dispositivos a velocidades de hasta 12 Mbps y una distancia máxima de 1.200 metros, dependiendo de la velocidad de transmisión. Profibus ofrece variantes como Profibus-DP (para dispositivos descentralizados) y Profibus-PA (para aplicaciones de procesos).
Modbus
Se caracteriza por su simplicidad y robustez. Utiliza una arquitectura maestro-esclavo, y puede funcionar tanto sobre RS-232/RS-485 como sobre Ethernet (Modbus TCP). Es ampliamente empleado por su facilidad de integración y su compatibilidad con numerosos equipos.
CAN (Controller Area Network)
Originalmente desarrollado para la industria automotriz, el bus CAN es muy utilizado en entornos donde la fiabilidad y la inmunidad al ruido son críticas. Su arquitectura basada en mensajes y su capacidad para manejar múltiples maestros lo hacen adecuado para aplicaciones industriales y de control distribuido.
Ethernet/IP
Basado en el estándar Ethernet, este bus de campo es idóneo para aplicaciones que requieren altas velocidades de transmisión y la integración con redes informáticas. Ethernet/IP utiliza protocolos industriales sobre infraestructura Ethernet estándar y permite la conexión directa de PLC, sensores, actuadores y sistemas de supervisión.
Criterios de selección del bus de campo
La selección de la tecnología de interconexión más adecuada depende de varios factores:
- Tipo y número de dispositivos de campo: Si la instalación cuenta con muchos dispositivos distribuidos en grandes distancias, puede ser preferible un bus de campo como Profibus o CAN.
- Velocidad de comunicación requerida: Para aplicaciones que requieren respuestas rápidas o transmisión de grandes volúmenes de datos (por ejemplo, visión artificial), Ethernet/IP puede ser la mejor opción.
- Compatibilidad y estandarización: Es importante considerar la compatibilidad de los equipos existentes y la facilidad de integración de nuevos dispositivos.
- Condiciones del entorno: En ambientes industriales con alta interferencia electromagnética, el uso de buses robustos como CAN resulta beneficioso.
- Coste y facilidad de mantenimiento: Los buses de campo reducen el cableado y facilitan el diagnóstico, pero pueden requerir inversiones iniciales en formación y componentes.
La correcta elección e implementación de la tecnología de interconexión garantiza una comunicación fiable entre el autómata y los elementos de campo, lo que repercute directamente en la eficiencia, flexibilidad y seguridad de los procesos industriales.
# ============================================================
# SIMULACIÓN DE UNA RED MODBUS (MAESTRO-ESCLAVO) EN PYTHON
# ============================================================
# Este programa simula la comunicación entre un maestro (PLC)
# y varios esclavos (dispositivos de campo) usando el protocolo
# Modbus RTU. Cada esclavo tiene una dirección única y registros
# internos que el maestro puede leer o escribir.
#
# Se puede ejecutar en Thonny y entender el flujo de mensajes.
# Para una implementación real, se usarían librerías como 'pymodbus'.
# ============================================================
import time
import random
# ------------------------------------------------------------
# 1. DEFINICIÓN DE LA CLASE 'DISPOSITIVO_ESCLAVO'
# ------------------------------------------------------------
class DispositivoEsclavo:
"""Simula un dispositivo de campo (sensor/actuador) con dirección Modbus.
Cada esclavo tiene:
- Una dirección única (1-247)
- Registros internos (holding registers) de 16 bits (simulados como enteros)
"""
def __init__(self, direccion, nombre):
self.direccion = direccion # Dirección Modbus (ID del esclavo)
self.nombre = nombre # Nombre descriptivo (ej. 'Sensor Temp')
# Inicializamos algunos registros de ejemplo
self.registros = {
0: 25, # Registro 0: temperatura actual (°C)
1: 50, # Registro 1: humedad (%)
2: 0, # Registro 2: estado del actuador (0=OFF, 1=ON)
3: 100, # Registro 3: consigna de temperatura
}
print(f" [Esclavo creado] Dir:{direccion} - {nombre}")
def leer_registro(self, direccion_registro):
"""Simula la lectura de un registro (respuesta a petición Modbus)."""
if direccion_registro in self.registros:
valor = self.registros[direccion_registro]
print(f" 📤 Esclavo {self.direccion} envía: registro {direccion_registro} = {valor}")
return valor
else:
print(f" ⚠️ Esclavo {self.direccion} error: registro {direccion_registro} no existe")
return None
def escribir_registro(self, direccion_registro, valor):
"""Simula la escritura de un registro (petición de escritura Modbus)."""
if direccion_registro in self.registros:
viejo_valor = self.registros[direccion_registro]
self.registros[direccion_registro] = valor
print(f" 📥 Esclavo {self.direccion} escribe: registro {direccion_registro} = {valor} (antes {viejo_valor})")
return True
else:
print(f" ⚠️ Esclavo {self.direccion} error: registro {direccion_registro} no existe")
return False
# ------------------------------------------------------------
# 2. DEFINICIÓN DE LA CLASE 'MAESTRO_MODBUS'
# ------------------------------------------------------------
class MaestroModbus:
"""Simula un maestro Modbus (por ejemplo, un PLC) que puede
enviar peticiones de lectura/escritura a los esclavos.
"""
def __init__(self):
self.esclavos = {} # Diccionario de esclavos indexados por dirección
print("🎛️ Maestro Modbus inicializado.")
def agregar_esclavo(self, esclavo):
"""Añade un esclavo a la red."""
self.esclavos[esclavo.direccion] = esclavo
print(f" + Esclavo {esclavo.direccion} añadido a la red.")
def leer_holding_register(self, dir_esclavo, dir_registro):
"""Simula una petición de lectura Modbus (función 03)."""
print(f"\n🔍 Maestro solicita lectura: esclavo {dir_esclavo}, registro {dir_registro}")
if dir_esclavo in self.esclavos:
esclavo = self.esclavos[dir_esclavo]
valor = esclavo.leer_registro(dir_registro)
if valor is not None:
print(f" ✅ Lectura completada: valor = {valor}")
return valor
else:
print(f" ❌ Error de lectura: registro no válido")
return None
else:
print(f" ❌ Error: esclavo {dir_esclavo} no encontrado en la red.")
return None
def escribir_holding_register(self, dir_esclavo, dir_registro, valor):
"""Simula una petición de escritura Modbus (función 06)."""
print(f"\n✍️ Maestro solicita escritura: esclavo {dir_esclavo}, registro {dir_registro} = {valor}")
if dir_esclavo in self.esclavos:
esclavo = self.esclavos[dir_esclavo]
exito = esclavo.escribir_registro(dir_registro, valor)
if exito:
print(f" ✅ Escritura completada.")
else:
print(f" ❌ Error de escritura.")
return exito
else:
print(f" ❌ Error: esclavo {dir_esclavo} no encontrado.")
return False
# ------------------------------------------------------------
# 3. SIMULACIÓN DE UNA RED CON VARIOS DISPOSITIVOS
# ------------------------------------------------------------
def simulacion_red_modbus():
print("=" * 60)
print("INICIO DE SIMULACIÓN DE RED MODBUS")
print("=" * 60)
# 1. Crear el maestro (PLC)
plc = MaestroModbus()
# 2. Crear y añadir esclavos (dispositivos de campo)
sensor_temp = DispositivoEsclavo(1, "Sensor de temperatura")
sensor_humedad = DispositivoEsclavo(2, "Sensor de humedad")
actuador_valvula = DispositivoEsclavo(3, "Válvula de control")
plc.agregar_esclavo(sensor_temp)
plc.agregar_esclavo(sensor_humedad)
plc.agregar_esclavo(actuador_valvula)
print("\n" + "-" * 40)
print("CICLO DE COMUNICACIÓN 1: Lecturas")
print("-" * 40)
# El maestro lee la temperatura del esclavo 1, registro 0
temp = plc.leer_holding_register(1, 0)
# El maestro lee la humedad del esclavo 2, registro 1
hum = plc.leer_holding_register(2, 1)
print("\n" + "-" * 40)
print("CICLO DE COMUNICACIÓN 2: Escrituras (control)")
print("-" * 40)
# El maestro escribe una nueva consigna de temperatura en esclavo 1, registro 3
plc.escribir_holding_register(1, 3, 110) # Nueva consigna: 110°C
# El maestro activa la válvula (esclavo 3, registro 2 = 1)
plc.escribir_holding_register(3, 2, 1) # Abrir válvula
print("\n" + "-" * 40)
print("CICLO DE COMUNICACIÓN 3: Verificaciones")
print("-" * 40)
# Leemos de nuevo para confirmar cambios
plc.leer_holding_register(1, 3) # Debería ser 110
plc.leer_holding_register(3, 2) # Debería ser 1
print("\n" + "=" * 60)
print("FIN DE SIMULACIÓN")
print("=" * 60)
# ------------------------------------------------------------
# 4. PUNTO DE ENTRADA PRINCIPAL
# ------------------------------------------------------------
if __name__ == "__main__":
simulacion_red_modbus()
Este código simula una red Modbus con un maestro (PLC) y tres esclavos (sensores/actuadores). Se definen las clases para el maestro y los esclavos, y se simulan peticiones de lectura y escritura. Al ejecutarlo en Thonny, se verán los mensajes de comunicación y cómo cambian los registros internos. Es una base para entender el funcionamiento de un bus de campo con protocolo maestro-esclavo.
En cualquier red de bus de campo, cada dispositivo debe tener una dirección única para que el autómata pueda identificarlo y comunicarse correctamente. Configurar adecuadamente estas direcciones es esencial para evitar conflictos y asegurar que la información llegue al destino correcto. Un fallo en la asignación de direcciones puede provocar desde la pérdida de datos hasta la parada completa de la instalación, por lo que es fundamental seguir las recomendaciones del fabricante y documentar siempre la configuración de la red.
📋 Instrucciones:
- Copia el prompt y pégalo en tu IA favorita.
- Prueba el código y ajústalo a tus necesidades.
💼 Caso Práctico Industrial
Contexto: Una fábrica de automóviles tiene una línea de montaje con 200 sensores y 150 actuadores distribuidos en una superficie de 500 metros de largo. Se necesita un bus de campo que permita altas velocidades de comunicación (para sincronización precisa) y que pueda integrarse fácilmente con la red Ethernet de la planta.
Problema: ¿Qué bus de campo es el más adecuado para esta aplicación?
Pregunta: Selecciona la opción correcta:
🍓 Caso Práctico Raspberry Pi
Contexto: Quieres usar una Raspberry Pi como maestro Modbus para leer sensores de temperatura distribuidos en un invernadero. Los sensores están conectados a esclavos Modbus RTU (RS-485). Dispones de un adaptador USB-RS485.
Problema: ¿Qué paso es esencial para que la Raspberry Pi pueda comunicarse con los dispositivos?
Pregunta: Elige la opción más adecuada:
🐍 Caso Práctico Python
Contexto: En el código de simulación Modbus, la función `leer_holding_register` del maestro busca al esclavo en un diccionario `self.esclavos` usando la dirección como clave. Si la dirección no existe, devuelve `None` y muestra un error.
Problema: ¿Qué característica importante de las redes de bus de campo se está simulando con esta comprobación?
Pregunta: Selecciona la opción correcta:
📚 Recursos Técnicos y Normativos 2026
- Modbus Organization - Especificaciones del protocolo.
- Profibus International - Documentación técnica.
- CAN in Automation (CiA) - Estándares CAN.
- ODVA (Ethernet/IP) - Especificaciones.