Guía completa sobre OPC-UA para la industria: arquitectura, seguridad e implementación

· 12 min de lectura
12 min read
Equipo Eziwan
Infraestructura IoT

OPC-UA (OPC Unified Architecture) se ha convertido en el protocolo de referencia para la interoperabilidad en la Industria 4.0. Sin embargo, su aparente complejidad sigue frenando muchas implementaciones. Esta guía práctica desmitifica OPC-UA: arquitectura, seguridad, NodeId, implementación en Python/Node.js e integración en la nube.


¿Qué es OPC-UA y por qué es importante?

OPC-UA (IEC 62541) es un protocolo de comunicación independiente de la plataforma, diseñado para el intercambio seguro de datos industriales. A diferencia de su predecesor, OPC-DA (solo para Windows, DCOM), OPC-UA funciona en cualquier sistema operativo (Linux, Windows, RTOS embebidos) y en cualquier red (Ethernet, 4G, Wi-Fi).

¿Por qué OPC-UA domina la Industria 4.0?

  • Interoperabilidad: cualquier cliente compatible puede leer un servidor Siemens S7-1500 OPC-UA sin necesidad de un controlador propietario
  • Modelo de información: los datos tienen un significado (unidad, descripción, historial), no solo un valor
  • Seguridad nativa: cifrado, autenticación y certificados, integrados en el protocolo
  • Perfiles de conformidad: un subconjunto ligero para pequeños equipos embebidos
  • Pubsub y MQTT: extensión Pub/Sub de OPC-UA para arquitecturas en la nube (IEC 62541-14)

Arquitectura OPC-UA: conceptos fundamentales

Cliente-servidor

El modelo básico de OPC-UA es cliente-servidor:

  • Servidor OPC-UA: proporcionado por el equipo (PLC, HMI, servidor de datos)
  • Cliente OPC-UA: consume los datos (SCADA, pasarela, aplicación en la nube)

Un mismo equipo puede actuar como servidor y como cliente al mismo tiempo (por ejemplo, una pasarela que agrupa varios PLC y muestra los datos consolidados).

Espacio de direcciones y NodeId

El Address Space es el árbol de información que expone un servidor OPC-UA. Cada nodo tiene un NodeId único:

Formato NodeId:

  • ns=2;i=1234 — espacio de nombres 2, identificador entero 1234
  • ns=2;s=Station_1.Pression — espacio de nombres 2, identificador de cadena
  • ns=0;i=2258 — espacio de nombres 0 (estándar), ServerStatus

Espacios de nombres:

  • ns=0: espacio de nombres estándar de OPC-UA (tipos, métodos)
  • ns=1: suele ser el espacio de nombres del fabricante
  • ns=2+: espacios de nombres de aplicación (tus datos)

Formas de comunicación

ModoDescripciónCasos de uso
ReadLectura puntual de un nodoSondeo cada N segundos
SubscriptionSuscripción a cambios (MonitoredItem)Eventos, alarmas
BrowseExploración del espacio de direccionesConfiguración, descubrimiento
WriteEscritura de un valorPuntos de consigna, comandos
Llamada a métodoLlamada a métodoAcciones complejas
PubsubPublicación/suscripción MQTT o UDPArquitecturas en la nube a gran escala

Las suscripciones son el enfoque adecuado para la supervisión en tiempo real: en lugar de realizar consultas cada segundo, el cliente se suscribe a un nodo y recibe una notificación únicamente cuando el valor cambia por encima de un umbral configurable (DeadbandValue).


Seguridad en OPC-UA: la guía completa

La seguridad es uno de los puntos fuertes de OPC-UA, y también una de las fuentes de complejidad. A continuación se presentan los conceptos fundamentales.

Modos de seguridad

ModoConfidencialidadIntegridadAutenticaciónUso
NoneNingunaNingunaNingunaPruebas, red aislada
SignNoFirmaCertificadoRed segura
SignAndEncryptAES-256FirmaCertificadoInternet, nube
precaución

No utilices nunca SecurityMode: None en un entorno de producción en una red accesible desde el exterior.

Certificados X.509

OPC-UA utiliza certificados X.509 para la autenticación mutua entre cliente y servidor:

Creación de un certificado autofirmado para pruebas:

# Avec OpenSSL
openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout client_key.pem -out client_cert.pem \
-subj "/CN=EziwanGateway/O=Eziwan/C=FR" \
-extensions v3_req \
-config <(cat /etc/ssl/openssl.cnf; echo "[v3_req]"; echo "subjectAltName=URI:urn:eziwan:gateway:client")

En producción: utilizar una PKI interna o una CA reconocida. Los certificados deben intercambiarse manualmente entre el cliente y el servidor la primera vez.

Autenticación de usuario

Además de los certificados de máquina, OPC-UA gestiona la autenticación de usuario:

  • Anónimo: sin autenticación (si lo permite el servidor)
  • Nombre de usuario/Contraseña: inicio de sesión en la aplicación
  • Certificado: certificado de usuario X.509
  • IssuedToken: token JWT o Kerberos

Implementación de OPC-UA en Python

La biblioteca python-opcua (o su bifurcación asyncua) es la referencia en Python.

Instalación

pip install asyncua

Cliente OPC-UA en Python: lectura de datos

import asyncio
from asyncua import Client

async def main():
url = "opc.tcp://192.168.1.10:4840/freeopcua/server/"

async with Client(url=url) as client:
# Leer un nodo por NodeId
node = client.get_node("ns=2;s=Station_1.Pression")
value = await node.read_value()
print(f"Pression: {value} bar")

# Leer varios nodos por lotes
nodes = [
client.get_node("ns=2;s=Station_1.Pression"),
client.get_node("ns=2;s=Station_1.Debit"),
client.get_node("ns=2;s=Station_1.Defaut"),
]
values = await client.read_values(nodes)
for node, val in zip(nodes, values):
print(f" {node}: {val}")

asyncio.run(main())

Cliente OPC-UA para Python — suscripción (Subscription)

import asyncio
from asyncua import Client
from asyncua.common.subscription import SubHandler

class DataChangeHandler(SubHandler):
def datachange_notification(self, node, val, data):
print(f"[CHANGE] {node} = {val}")

def event_notification(self, event):
print(f"[EVENT] {event}")

async def main():
url = "opc.tcp://192.168.1.10:4840"

async with Client(url=url) as client:
handler = DataChangeHandler()
subscription = await client.create_subscription(500, handler) # 500ms

nodes = [
client.get_node("ns=2;s=Station_1.Pression"),
client.get_node("ns=2;s=Station_1.Debit"),
]

monitored_items = await subscription.subscribe_data_change(nodes)
print("Subscriptions actives, attente changements...")

await asyncio.sleep(30) # escuchar 30 segundos
await subscription.unsubscribe(monitored_items)

asyncio.run(main())

Conexión segura con certificado

from asyncua.crypto.security_policies import SecurityPolicyBasic256Sha256
from asyncua.crypto.cert_man import CertificateManager

async def connect_secure():
client = Client("opc.tcp://192.168.1.10:4840")

await client.set_security(
SecurityPolicyBasic256Sha256,
certificate="./client_cert.der",
private_key="./client_key.pem",
server_certificate="./server_cert.der"
)

await client.connect()
# ... vuestras operaciones
await client.disconnect()

Implementar OPC-UA en Node.js

La biblioteca node-opcua es la referencia en JavaScript/TypeScript.

npm install node-opcua

Lectura de datos

const opcua = require("node-opcua");

const client = opcua.OPCUAClient.create({
endpointMustExist: false,
connectionStrategy: { maxRetry: 5, initialDelay: 2000 }
});

const endpointUrl = "opc.tcp://192.168.1.10:4840";

async function main() {
await client.connect(endpointUrl);
const session = await client.createSession();

const nodeToRead = {
nodeId: "ns=2;s=Station_1.Pression",
attributeId: opcua.AttributeIds.Value
};

const dataValue = await session.read(nodeToRead);
console.log(`Pression: ${dataValue.value.value} bar`);
console.log(`Timestamp: ${dataValue.serverTimestamp}`);

await session.close();
await client.disconnect();
}

main().catch(console.error);

OPC-UA en los principales controladores lógicos programables

Siemens S7-1500 / S7-1200

El S7-1500 es compatible con el servidor OPC-UA nativo a partir de la versión 2.0 del firmware:

  • Puerto: 4840 (TCP)
  • Configuración en TIA Portal: Device Configuration → OPC UA → Server
  • Activar los nodos deseados en la configuración de acceso
  • Autenticación: certificados o nombre de usuario/contraseña

El S7-1200 es compatible con OPC-UA a partir de la versión 4.1 del firmware.

Schneider Electric M580 / M340

M580: OPC-UA a través del módulo BMENOC0311 (firmware ≥ V2.0) M340: no admite OPC-UA de forma nativa → Se recomienda Modbus TCP o una pasarela de OPC-UA a Modbus (p. ej., Kepware KEPServerEX)

Allen-Bradley / Rockwell (EtherNet/IP)

Los controladores Rockwell no son compatibles de forma nativa con OPC-UA. Opciones:

  • KEPServerEX (Kepware): puente EtherNet/IP → OPC-UA
  • FactoryTalk Linx Gateway: servidor OPC-UA para el ecosistema Rockwell
  • Eziwan Gateway: conexión directa EtherNet/IP/Modbus, exposición a la API REST

Beckhoff TwinCAT 3

TwinCAT 3 integra un servidor OPC-UA nativo a través de TF6100 (módulo OPC-UA). La configuración se realiza mediante TwinCAT System Manager.

Wago / Phoenix Contact / Pilz

La mayoría de los PLC modernos de estos fabricantes son compatibles con OPC-UA. Comprueba el firmware y activa el servidor en la configuración de red.


OPC-UA PubSub: la extensión para la nube

OPC-UA PubSub (IEC 62541-14) es la extensión que hace que OPC-UA sea compatible con las arquitecturas de IoT en la nube:

  • Editor: el equipo publica sus datos en un middleware orientado a mensajes
  • Suscriptor: la nube o el sistema SCADA se suscribe al flujo

Protocolos compatibles:

  • AMQP (puerto 5672)
  • MQTT (puerto 1883 u 8883) — el más utilizado en el IoT
  • UDP Multicast (red local)

Formatos de codificación:

  • JSON (legible, fácil de depurar)
  • UADP (binario, compacto, integrado)

Ejemplo de mensaje OPC-UA PubSub en formato JSON:

{
"MessageId": "abc123",
"PublisherId": "urn:station1:plc",
"DataSetWriterId": 1,
"MetaDataVersion": {"MajorVersion": 1, "MinorVersion": 0},
"Timestamp": "2026-08-14T10:30:00.000Z",
"Payload": {
"Station_1.Pression": {"Value": 4.2, "StatusCode": 0, "SourceTimestamp": "2026-08-14T10:29:59.950Z"},
"Station_1.Debit": {"Value": 125.3, "StatusCode": 0, "SourceTimestamp": "2026-08-14T10:29:59.950Z"}
}
}

Migración de OPC-DA a OPC-UA

Si dispone de instalaciones bajo OPC-DA (OPC Classic, Windows DCOM), la migración a OPC-UA ofrece:

  • Eliminación de la dependencia de Windows/DCOM
  • Compatibilidad con Linux, Raspberry Pi y PLC con Linux
  • Cifrado (ausente en OPC-DA)
  • Acceso directo a Internet (imposible con DCOM sin una VPN compleja)

Herramienta de migración: OPC UA Wrapper (p. ej., Kepware) crea un servidor OPC-UA que expone los datos de un servidor OPC-DA ya existente, lo que permite una migración progresiva.


OPC-UA con el Gateway Eziwan

El Eziwan Gateway incorpora un cliente OPC-UA capaz de conectarse a los servidores OPC-UA de tus equipos:

  • Conexión Siemens S7-1500 OPC-UA (puerto 4840)
  • Conexión a cualquier servidor OPC-UA conforme a la norma IEC 62541
  • Compatibilidad con los modos de seguridad None, Sign y SignAndEncrypt
  • Configuración de los NodeIds en la interfaz en la nube (búsqueda automática del espacio de direcciones)
  • Transmisión de datos a la plataforma en la nube Eziwan mediante MQTT/TLS

Ventaja clave: no es necesario que desarrolles tú mismo un cliente OPC-UA. La pasarela se encarga de ello y ofrece una API REST para tu sistema SCADA o ERP.


Preguntas frecuentes — OPC-UA

¿Es OPC-UA más complejo que Modbus? Sí, pero está justificado en instalaciones con equipos de distintos fabricantes y en proyectos de Industria 4.0. Para una instalación con 2 o 3 controladores del mismo fabricante, Modbus TCP puede ser suficiente. OPC-UA resulta imprescindible cuando se dispone de equipos heterogéneos, se tienen requisitos de seguridad o se necesitan interoperabilidad entre ERP y MES.

¿Debo abrir el puerto 4840 en mi cortafuegos? En una arquitectura «zero-inbound-port» (como Eziwan), la pasarela inicia la conexión con el servidor OPC-UA de forma interna. No hay ningún puerto abierto desde el exterior. El túnel VPN cifrado transporta los datos a la nube.

¿Puede OPC-UA sustituir a MQTT en una arquitectura de IoT? OPC-UA PubSub con transporte MQTT combina lo mejor de ambos: el modelo de información semántica de OPC-UA con la ligereza y la escalabilidad de MQTT. Esta es la dirección que marcan los marcos de referencia de la Industria 4.0 (Industrie 4.0 Architecture Reference Model, IDS-R).

¿Qué rendimiento cabe esperar de un servidor OPC-UA integrado? Una CPU 1515 del Siemens S7-1500 puede procesar unos 10 000 nodos OPC-UA en lectura por segundo. En el caso de los PLC menos potentes (M221, WAGO pequeños), se recomienda limitar el sondeo OPC-UA a entre 100 y 500 nodos por segundo. Las suscripciones (Subscription) son mucho más eficaces que el sondeo cuando se trata de grandes volúmenes.

¿Existen servidores OPC-UA gratuitos para realizar pruebas? Sí: ProsysOPC UA Simulation Server (gratuito, Windows), Node-RED con node-red-contrib-opcua (gratuito, multiplataforma), python-opcua en modo servidor (ejemplo en la documentación de GitHub). Permiten probar un cliente sin necesidad de disponer de un PLC físico.


Para profundizar en el tema

¿Necesitas ayuda para conectar tus servidores OPC-UA a la nube? Solicita una demostración gratuita: nuestro equipo te acompañará desde la prueba de concepto hasta la implementación.


Recursos adicionales