Guía completa sobre OPC-UA para la industria: arquitectura, seguridad e implementación
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?
- Arquitectura OPC-UA: conceptos fundamentales
- Seguridad en OPC-UA: la guía completa
- Implementación de OPC-UA en Python
- Implementar OPC-UA en Node.js
- OPC-UA en los principales controladores lógicos programables
- OPC-UA PubSub: la extensión para la nube
- Migración de OPC-DA a OPC-UA
- OPC-UA con el Gateway Eziwan
- Preguntas frecuentes — OPC-UA
- Para profundizar en el tema
- Recursos adicionales
¿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 1234ns=2;s=Station_1.Pression— espacio de nombres 2, identificador de cadenans=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 fabricantens=2+: espacios de nombres de aplicación (tus datos)
Formas de comunicación
| Modo | Descripción | Casos de uso |
|---|---|---|
| Read | Lectura puntual de un nodo | Sondeo cada N segundos |
| Subscription | Suscripción a cambios (MonitoredItem) | Eventos, alarmas |
| Browse | Exploración del espacio de direcciones | Configuración, descubrimiento |
| Write | Escritura de un valor | Puntos de consigna, comandos |
| Llamada a método | Llamada a método | Acciones complejas |
| Pubsub | Publicación/suscripción MQTT o UDP | Arquitecturas 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
| Modo | Confidencialidad | Integridad | Autenticación | Uso |
|---|---|---|---|---|
None | Ninguna | Ninguna | Ninguna | Pruebas, red aislada |
Sign | No | Firma | Certificado | Red segura |
SignAndEncrypt | AES-256 | Firma | Certificado | Internet, nube |
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,SignySignAndEncrypt - 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
- Blog: OPC-UA y MQTT — cómo combinar ambos en una pasarela industrial
- Blog: acceso remoto seguro a PLC y SCADA — VPN, «zero-trust» y NIS2
- Blog: cómo conectar un controlador Siemens S7 a la nube — guía técnica
- Blog: IEC 62443 — guía práctica para la ciberseguridad industrial
- Blog: Modbus TCP frente a RTU — comparativa completa para el IoT industrial
¿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
- OPC UA a MQTT — publicar datos OPC UA en un broker MQTT en la nube
- Protocolos industriales — comparación entre OPC UA, Modbus, MQTT y otros protocolos
- Pasarela IoT industrial — cómo elegir una pasarela compatible con OPC UA
- Modbus TCP a la nube — supervisión de controladores lógicos Modbus TCP desde la nube
- SCADA en la nube — arquitectura SCADA moderna con conectividad OPC UA y a la nube