Integración OPC-UA
Presentación
OPC-UA (Unified Architecture) es el protocolo estándar de comunicación industrial para el intercambio seguro de datos entre controladores lógicos programables (PLC), sistemas SCADA y sistemas en la nube. Eziwan permite acceder a los servidores OPC-UA ubicados en tu red OT desde cualquier lugar, a través del túnel seguro de OpenVPN.
Requisitos previos
En cuanto al autómata (servidor OPC-UA)
| Controlador | Servidor OPC-UA | Versión mínima de firmware | Requisitos del sistema |
|---|---|---|---|
| Siemens S7-1500 | Nativo integrado | FW 2.0 (2017) | Activación en TIA Portal |
| Siemens S7-1200 | No disponible | — | Utilizar Modbus TCP en su lugar |
| B&R Automation | Nativo (ArOpc) | AR 4.34 | Activación en Automation Studio |
| Beckhoff TwinCAT | TF6100 (TwinCAT OPC UA Server) | TwinCAT 3.1.4020 | Se requiere licencia TF6100 |
| Phoenix Contact PLCnext | Integrado | FW 2020.0 | Activación a través de Web Based Management |
| Schneider EcoStruxure | Nativo (M262/M580) | — | Activación en SoMachine |
El lado de Eziwan
- Pasarela Eziwan con firmware ≥ 2.3
- La pasarela debe estar en la misma red Ethernet que el controlador OPC-UA, o poder conectarse a ella (misma VLAN, sin cortafuegos que bloqueen el puerto 4840)
- Puerto OPC-UA por defecto: TCP 4840
Arquitectura: acceso a través de un túnel VPN
El acceso remoto a OPC-UA a través de Eziwan sigue el siguiente esquema:
La pasarela Eziwan actúa como proxy OPC-UA: recibe las conexiones de los clientes remotos a través del túnel OpenVPN y las reenvía al servidor OPC-UA de la red OT local. El cliente remoto no tiene acceso directo a la red OT.
Configuración de TIA Portal: activar el servidor OPC-UA S7-1500
Paso 1: Abrir las propiedades de la CPU
- En TIA Portal, haz doble clic en la CPU S7-1500 en la vista de hardware
- Ve a la pestaña OPC UA
Paso 2: Activar el servidor
OPC UA
└── Server
[✓] Activate OPC UA server
Port: 4840
Max. sessions: 10
Session timeout: 10 000 ms
Security:
[✓] Sin seguridad (también se recomienda Basic256Sha256 en producción)
[✓] Basic256Sha256 - SignAndEncrypt
Access control:
[ ] Permitir el acceso anónimo (desactivar en entorno de producción)
[✓] Enable user access control
Paso 3: Crear una interfaz de servidor
La interfaz del servidor define las variables expuestas a través de OPC-UA:
OPC UA
└── Server interfaces
└── [New interface] → Nom: "Monitoring_Production"
└── Arrastrar y soltar desde el proyecto:
DB10.Temperature → se mostrará como «Temperature»
DB10.Pressure → se mostrará como «Pressure»
DB10.ProductCount → se mostrará como «ProductCount»
DB10.Running → se mostrará como «Running»
Paso 4: Crear un usuario OPC-UA
OPC UA
└── Users
└── [Add user]
Username: eziwan_client
Password: MotDePasseStrong2026!
Rol: Observador (solo lectura) u Operador (lectura/escritura)
Paso 5: Compilar y descargar la configuración de hardware
Importante: solo hay que recompilar y cargar la configuración de hardware. El programa de usuario (OB, FC, FB) no se modifica.
Menú: Build → Build all (o Ctrl+B)
Comprobar que no haya errores únicamente en la compilación del hardware
Menu : Online → Download to device → Hardware configuration
Conexión desde un cliente OPC-UA remoto
Opción 1: Prosys OPC UA Browser (interfaz gráfica gratuita)
- Descargar Prosys OPC UA Browser en prosysopc.com
- Iniciar el programa
- Introducir la URL:
opc.tcp://[IP_TUNNEL_EZIWAN]:4840 - Hacer clic en «Connect»
- Selecciona el modo de seguridad («None» para pruebas, «SignAndEncrypt» para producción)
- Navega por el árbol de nodos para encontrar tus variables
Opción 2: Python con asyncua
import asyncio
from asyncua import Client
from asyncua import ua
# Configuration de connexion
OPC_UA_URL = "opc.tcp://[IP_TUNNEL_EZIWAN]:4840"
USERNAME = "eziwan_client"
PASSWORD = "MotDePasseStrong2026!"
async def lire_donnees_production():
"""Conexión y lectura de los datos de producción a través de Eziwan."""
async with Client(url=OPC_UA_URL) as client:
# Autenticación mediante nombre de usuario
client.set_user(USERNAME)
client.set_password(PASSWORD)
print(f"Connecté à {OPC_UA_URL}")
# Método 1: Acceso directo mediante el NodeId (si se conoce)
node_temp = client.get_node("ns=3;s=Monitoring_Production.Temperature")
temp = await node_temp.read_value()
print(f"Température : {temp} °C")
# Método 2: Navegación por el árbol de directorios
root = client.get_root_node()
objects = await root.get_child(["0:Objects"])
# Mostrar los nodos hijos
children = await objects.get_children()
for child in children:
name = await child.read_browse_name()
print(f"Nœud trouvé : {name.Name}")
# Método 3: Suscripción por variación de valor
handler = ChangementValeurHandler()
sub = await client.create_subscription(period=1000, handler=handler)
nodes_a_surveiller = [
client.get_node("ns=3;s=Monitoring_Production.Temperature"),
client.get_node("ns=3;s=Monitoring_Production.Pressure"),
client.get_node("ns=3;s=Monitoring_Production.Running"),
]
await sub.subscribe_data_change(nodes_a_surveiller)
print("Abonnement actif. Ctrl+C pour arrêter.")
try:
while True:
await asyncio.sleep(1)
except KeyboardInterrupt:
pass
finally:
await sub.delete()
class ChangementValeurHandler:
"""Gestionnaire des notifications OPC-UA."""
def datachange_notification(self, node, val, data):
print(f"[{data.monitored_item.Value.SourceTimestamp}] {node}: {val}")
asyncio.run(lire_donnees_production())
Opción 3: Node-RED con node-opcua
[
{
"id": "opc-ua-input",
"type": "OpcUa-Client",
"endpoint": "opc.tcp://[IP_TUNNEL_EZIWAN]:4840",
"action": "subscribe",
"deadbandtype": "a",
"deadbandvalue": "1",
"time": "1",
"timeUnit": "s",
"certificate": "n",
"item": [
{"name": "Temperature", "nodeId": "ns=3;s=Monitoring_Production.Temperature"},
{"name": "Pressure", "nodeId": "ns=3;s=Monitoring_Production.Pressure"}
]
}
]
Seguridad OPC-UA: modos y certificados
Modos de seguridad disponibles
| Modo | Autenticación | Cifrado | Recomendación |
|---|---|---|---|
| None | Ninguna | Ninguna | Solo para pruebas, nunca en producción |
| Sign | Certificado X.509 | No | Moderada |
| SignAndEncrypt | Certificado X.509 | AES-256 | Obligatorio en producción |
Políticas de seguridad compatibles
- Basic128Rsa15: RSA de 1024 bits (obsoleto, no utilizar)
- Basic256: RSA de 2048 bits + SHA-1 (aceptable)
- Basic256Sha256: RSA de 2048 bits + SHA-256 (recomendado)
- Aes128_Sha256_RsaOaep: AES-128 + SHA-256 (moderno)
- Aes256_Sha256_RsaPss: AES-256 + SHA-256 (el más seguro)
Gestión de certificados a través de Eziwan
Eziwan genera automáticamente los certificados X.509 para la conexión OPC-UA:
- Portal Eziwan → Integraciones → OPC-UA → Certificados
- Hacer clic en «Generar un certificado»
- Exportar el certificado en formato
.der - Importarlo a la lista de confianza del servidor OPC-UA (TIA Portal → OPC UA → Clientes de confianza)
Solución de problemas
Problema 1: Tiempo de espera de conexión agotado
Síntoma: ServiceResultException: BadTimeout o conexión fallida.
Causas y soluciones:
| Causa | Comprobación | Solución |
|---|---|---|
| Puerto 4840 bloqueado | telnet [IP_OT] 4840 desde la pasarela | Abrir el puerto en el cortafuegos local OT |
| Servidor OPC-UA desactivado | Comprobar en TIA Portal → OPC UA → Servidor | Activar y volver a descargar la configuración |
| IP de la pasarela incorrecta | Hacer ping desde la pasarela al PLC | Comprobar la configuración de red de la pasarela |
| Tiempo de espera demasiado corto | Aumentar el tiempo de espera del cliente | client.session_timeout = 30000 (asyncua) |
Problema 2: Certificados rechazados
Síntoma: BadCertificateUntrusted o BadSecurityChecksFailed
Soluciones:
- Lado del servidor S7-1500: TIA Portal → OPC UA → Clientes de confianza → Añadir el certificado de Eziwan
- Modo temporal: TIA Portal → OPC UA → Servidor → «Aceptar todos los certificados automáticamente» (desactivar tras la configuración)
- Regenerar los certificados: si el certificado ha caducado, regenerarlo en el portal de Eziwan
Problema 3: Nodos no encontrados (BadNodeIdUnknown)
Síntoma: BadNodeIdUnknown al leer un nodo.
Causas:
- El espacio de nombres (ns=X) es incorrecto
- La interfaz del servidor no se ha creado en TIA Portal
- El nombre del nodo está mal escrito
Solución: utilizar Prosys OPC UA Browser para navegar por el árbol real y copiar los NodeIds exactos.
Problema 4: Desconexiones frecuentes
Síntoma: el cliente se desconecta con frecuencia; error BadConnectionClosed.
Soluciones:
- Aumentar el valor de
keepaliveIntervalen el lado del cliente - Comprobar la estabilidad de la conexión de red (keepalive de OpenVPN configurado)
- Comprobar que no se haya alcanzado el
max_sessionsdel servidor S7-1500 (TIA Portal → OPC UA → Servidor → Sesiones máximas)
Comandos de diagnóstico desde la pasarela
Desde la consola de Eziwan (SSH o interfaz web → Terminal):
# Comprobar la conectividad con el servidor OPC-UA
nc -zv 192.168.20.10 4840
# Comprobar el estado del túnel de OpenVPN
systemctl status openvpn-client@eziwan --no-pager
# Registros de la conexión OPC-UA (filtrados por errores)
journalctl -u eziwan-opcua-client -n 50 --no-pager | grep -i error
Preguntas frecuentes
OPC-UA o Modbus: ¿qué elegir para transmitir datos?
OPC-UA ofrece tipado de datos, unidades de medida, jerarquía de nodos y seguridad mediante certificados; Modbus sigue siendo más sencillo para una adaptación rápida. En un S7-1500 o un SCADA reciente, es preferible utilizar OPC-UA; en un parque de equipos antiguo y heterogéneo, Modbus.
¿Qué es un nodo OPC-UA?
La unidad de información del servidor: una variable (medida, valor de consigna), un objeto o un método, identificado mediante un NodeId en un espacio de nombres. El cliente Eziwan recorre el árbol y se suscribe a los nodos seleccionados.
¿Cómo gestionar los certificados OPC-UA?
El cliente y el servidor intercambian certificados X.509: es necesario validar el certificado del cliente Eziwan en el servidor (TIA Portal, UaExpert) y seleccionar una política de seguridad cifrada (se recomienda Basic256Sha256).
¿Qué equipos se conectan a un servidor OPC-UA?
Los controladores lógicos programables (PLC) más recientes (Siemens S7-1500/S7-1200, Schneider M580, Beckhoff), los sistemas SCADA (WinCC, Ignition, AVEVA) y numerosos sensores y variadores de alta gama. Para el resto del parque, la pasarela recopila datos mediante Modbus.
Recursos relacionados
- OPC UA hacia la nube industrial — la página de soluciones
- OPC UA y MQTT — combinar una recopilación exhaustiva con un transporte ligero
- Guía completa de OPC-UA — el artículo de fondo
- Compatibilidad con Siemens S7 — activar el servidor OPC-UA en TIA Portal
- Protocolos industriales — el centro de protocolos OT