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)

ControladorServidor OPC-UAVersión mínima de firmwareRequisitos del sistema
Siemens S7-1500Nativo integradoFW 2.0 (2017)Activación en TIA Portal
Siemens S7-1200No disponibleUtilizar Modbus TCP en su lugar
B&R AutomationNativo (ArOpc)AR 4.34Activación en Automation Studio
Beckhoff TwinCATTF6100 (TwinCAT OPC UA Server)TwinCAT 3.1.4020Se requiere licencia TF6100
Phoenix Contact PLCnextIntegradoFW 2020.0Activación a través de Web Based Management
Schneider EcoStruxureNativo (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

  1. En TIA Portal, haz doble clic en la CPU S7-1500 en la vista de hardware
  2. 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)

  1. Descargar Prosys OPC UA Browser en prosysopc.com
  2. Iniciar el programa
  3. Introducir la URL: opc.tcp://[IP_TUNNEL_EZIWAN]:4840
  4. Hacer clic en «Connect»
  5. Selecciona el modo de seguridad («None» para pruebas, «SignAndEncrypt» para producción)
  6. 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

ModoAutenticaciónCifradoRecomendación
NoneNingunaNingunaSolo para pruebas, nunca en producción
SignCertificado X.509NoModerada
SignAndEncryptCertificado X.509AES-256Obligatorio 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:

  1. Portal Eziwan → Integraciones → OPC-UA → Certificados
  2. Hacer clic en «Generar un certificado»
  3. Exportar el certificado en formato .der
  4. 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:

CausaComprobaciónSolución
Puerto 4840 bloqueadotelnet [IP_OT] 4840 desde la pasarelaAbrir el puerto en el cortafuegos local OT
Servidor OPC-UA desactivadoComprobar en TIA Portal → OPC UA → ServidorActivar y volver a descargar la configuración
IP de la pasarela incorrectaHacer ping desde la pasarela al PLCComprobar la configuración de red de la pasarela
Tiempo de espera demasiado cortoAumentar el tiempo de espera del clienteclient.session_timeout = 30000 (asyncua)

Problema 2: Certificados rechazados

Síntoma: BadCertificateUntrusted o BadSecurityChecksFailed

Soluciones:

  1. Lado del servidor S7-1500: TIA Portal → OPC UA → Clientes de confianza → Añadir el certificado de Eziwan
  2. Modo temporal: TIA Portal → OPC UA → Servidor → «Aceptar todos los certificados automáticamente» (desactivar tras la configuración)
  3. 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 keepaliveInterval en 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_sessions del 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