Guida completa all'OPC-UA per l'industria: architettura, sicurezza, implementazione

· 11 minuti di lettura
11 min read
Team Eziwan
Infrastruttura IoT

OPC-UA (OPC Unified Architecture) è diventato il protocollo di riferimento per l'interoperabilità nell'Industria 4.0. Tuttavia, la sua apparente complessità continua a frenare molte implementazioni. Questa guida pratica fa luce su OPC-UA: architettura, sicurezza, NodeId, implementazione in Python/Node.js e integrazione nel cloud.


Che cos'è l'OPC-UA e perché è importante?

OPC-UA (IEC 62541) è un protocollo di comunicazione indipendente dalla piattaforma, progettato per lo scambio sicuro di dati industriali. A differenza del suo predecessore OPC-DA (solo Windows, DCOM), OPC-UA funziona su qualsiasi sistema operativo (Linux, Windows, RTOS embedded) e su qualsiasi rete (Ethernet, 4G, Wi-Fi).

Perché l'OPC-UA domina l'Industria 4.0

  • Interoperabilità: un server Siemens S7-1500 OPC-UA è leggibile senza driver proprietario da qualsiasi client conforme
  • Modello informativo: i dati hanno un significato (unità, descrizione, cronologia), non solo un valore
  • Sicurezza nativa: crittografia, autenticazione, certificati — integrati nel protocollo
  • Profili di conformità: un sottoinsieme snello per le piccole apparecchiature embedded
  • Pubsub e MQTT: estensione OPC-UA Pub/Sub per architetture cloud (IEC 62541-14)

Architettura OPC-UA: i concetti fondamentali

Client-Server

Il modello di base OPC-UA è client-server:

  • Server OPC-UA: messo a disposizione dall'apparecchiatura (PLC, HMI, server dati)
  • Client OPC-UA: utilizza i dati (SCADA, gateway, applicazione cloud)

Lo stesso dispositivo può fungere contemporaneamente da server e da client (ad es. un gateway che aggrega diversi PLC e rende disponibili i dati consolidati).

Spazio di indirizzamento e NodeId

L'Address Space è l'albero di informazioni esposto da un server OPC-UA. Ogni nodo ha un NodeId univoco:

Formato NodeId:

  • ns=2;i=1234 — namespace 2, identificatore intero 1234
  • ns=2;s=Station_1.Pression — namespace 2, identificatore stringa
  • ns=0;i=2258 — namespace 0 (standard), ServerStatus

Spazi dei nomi:

  • ns=0: spazio dei nomi standard OPC-UA (tipi, metodi)
  • ns=1: spesso lo spazio dei nomi del produttore
  • ns=2+: spazi dei nomi applicativi (i vostri dati)

Modalità di comunicazione

ModalitàDescrizioneCasi d'uso
ReadLettura puntuale di un nodoPolling ogni N secondi
SubscriptionAbbonamento alle modifiche (MonitoredItem)Eventi, allarmi
BrowseEsplorazione dello spazio degli indirizziConfigurazione, discovery
WriteScrittura di un valoreSetpoint, comandi
Method CallChiamata di metodoAzioni complesse
PubsubPubblicazione/sottoscrizione MQTT o UDPArchitetture cloud su larga scala

Gli abbonamenti sono l'approccio corretto per il monitoraggio in tempo reale: invece di effettuare un polling ogni secondo, il client si abbona a un nodo e riceve una notifica solo quando il valore supera una soglia configurabile (DeadbandValue).


Sicurezza OPC-UA: la guida completa

La sicurezza è uno dei punti di forza di OPC-UA — ma anche una delle fonti di complessità. Ecco i concetti fondamentali.

Modalità di sicurezza

ModalitàRiservatezzaIntegritàAutenticazioneUtilizzo
NoneNessunaNessunaNessunaTest, rete isolata
SignNoFirmaCertificatoRete protetta
SignAndEncryptAES-256FirmaCertificatoInternet, cloud
attenzione

Non utilizzare mai SecurityMode: None in ambiente di produzione su una rete accessibile dall'esterno.

Certificati X.509

OPC-UA utilizza certificati X.509 per l'autenticazione reciproca client-server:

Creazione di un certificato autofirmato a scopo di test:

# 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")

In produzione: utilizzare una PKI interna o un'autorità di certificazione riconosciuta. La prima volta, i certificati devono essere scambiati manualmente tra client e server.

Autenticazione utente

Oltre ai certificati di sistema, OPC-UA gestisce l'autenticazione utente:

  • Anonimo: nessuna autenticazione (se consentito dal server)
  • Nome utente/Password: login applicativo
  • Certificato: certificato utente X.509
  • IssuedToken: token JWT o Kerberos

Implementazione di OPC-UA in Python

La libreria python-opcua (o il suo fork asyncua) è il punto di riferimento in Python.

Installazione

pip install asyncua

Client OPC-UA in Python — lettura dei dati

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:
# Leggere un nodo in base al NodeId
node = client.get_node("ns=2;s=Station_1.Pression")
value = await node.read_value()
print(f"Pression: {value} bar")

# Lettura di più nodi in batch
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())

Client OPC-UA per Python — abbonamento (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) # ascolta 30 secondi
await subscription.unsubscribe(monitored_items)

asyncio.run(main())

Connessione sicura con certificato

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()
# ... le vostre operazioni
await client.disconnect()

Implementazione di OPC-UA in Node.js

La libreria node-opcua è il punto di riferimento per JavaScript/TypeScript.

npm install node-opcua

Lettura dei dati

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 sui principali controllori industriali

Siemens S7-1500 / S7-1200

L'S7-1500 supporta il server OPC-UA nativo a partire dal firmware 2.0:

  • Porta: 4840 (TCP)
  • Configurazione in TIA Portal: Device Configuration → OPC UA → Server
  • Attivare i nodi desiderati nella configurazione di accesso
  • Autenticazione: certificati o nome utente/password

L'S7-1200 supporta OPC-UA a partire dalla versione 4.1 del firmware.

Schneider Electric M580 / M340

M580: OPC-UA tramite modulo BMENOC0311 (firmware ≥ V2.0) M340: nessun supporto nativo per OPC-UA → Si consiglia Modbus TCP oppure un gateway da OPC-UA a Modbus (ad es. Kepware KEPServerEX)

Allen-Bradley / Rockwell (EtherNet/IP)

I controllori Rockwell non supportano nativamente OPC-UA. Opzioni:

  • KEPServerEX (Kepware): bridge EtherNet/IP → OPC-UA
  • FactoryTalk Linx Gateway: server OPC-UA per l'ecosistema Rockwell
  • Eziwan Gateway: connessione diretta EtherNet/IP/Modbus, esposizione API REST

Beckhoff TwinCAT 3

TwinCAT 3 integra un server OPC-UA nativo tramite TF6100 (modulo OPC-UA). Configurazione tramite TwinCAT System Manager.

Wago / Phoenix Contact / Pilz

La maggior parte dei PLC moderni di questi produttori supporta OPC-UA. Verificare il firmware e attivare il server nelle impostazioni di rete.


OPC-UA PubSub: l'estensione per il cloud

OPC-UA PubSub (IEC 62541-14) è l'estensione che rende OPC-UA compatibile con le architetture IoT basate sul cloud:

  • Publisher: l'apparecchiatura pubblica i propri dati su un Message Oriented Middleware
  • Subscriber: il cloud o il sistema SCADA si abbona al flusso

Protocolli supportati:

  • AMQP (porta 5672)
  • MQTT (porta 1883 o 8883) — il più utilizzato nell'IoT
  • UDP Multicast (rete locale)

Formati di codifica:

  • JSON (leggibile, facile da debuggare)
  • UADP (binario, compatto, integrato)

Esempio di messaggio OPC-UA PubSub in 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"}
}
}

Migrazione da OPC-DA a OPC-UA

Se disponete di installazioni basate su OPC-DA (OPC Classic, Windows DCOM), la migrazione a OPC-UA offre:

  • Eliminazione della dipendenza da Windows/DCOM
  • Compatibilità con Linux / Raspberry Pi / PLC basati su Linux
  • Crittografia (assente in OPC-DA)
  • Accesso diretto a Internet (impossibile con DCOM senza una VPN complessa)

Strumento di migrazione: OPC UA Wrapper (ad es. Kepware) crea un server OPC-UA che espone i dati di un server OPC-DA esistente, consentendo una migrazione graduale.


OPC-UA con il gateway Eziwan

L'Eziwan Gateway integra un client OPC-UA in grado di connettersi ai server OPC-UA delle vostre apparecchiature:

  • Connessione Siemens S7-1500 OPC-UA (porta 4840)
  • Connessione a qualsiasi server OPC-UA conforme alla norma IEC 62541
  • Supporto delle modalità di sicurezza None, Sign, SignAndEncrypt
  • Configurazione dei NodeId nell'interfaccia cloud (scansione automatica dello spazio degli indirizzi)
  • Trasmissione dei dati alla piattaforma cloud Eziwan tramite MQTT/TLS

Vantaggio principale: non è necessario sviluppare autonomamente un client OPC-UA. Il gateway si occupa di tutto e mette a disposizione un'API REST per il vostro sistema SCADA o ERP.


Domande frequenti — OPC-UA

OPC-UA è più complesso di Modbus? Sì, ma è giustificato per gli impianti con apparecchiature di diversi produttori e per i progetti dell’Industria 4.0. Per un impianto con 2-3 controllori dello stesso produttore, Modbus TCP può essere sufficiente. OPC-UA è la scelta obbligata in presenza di apparecchiature eterogenee, requisiti di sicurezza o esigenze di interoperabilità ERP/MES.

Devo aprire la porta 4840 sul mio firewall? Nell'architettura "zero-inbound-port" (come Eziwan), il gateway avvia la connessione al server OPC-UA internamente. Nessuna porta è aperta dall'esterno. Il tunnel VPN crittografato trasporta i dati verso il cloud.

OPC-UA può sostituire MQTT in un'architettura IoT? OPC-UA PubSub con trasporto MQTT combina il meglio dei due: il modello informativo semantico di OPC-UA con la leggerezza e la scalabilità di MQTT. È questa la direzione intrapresa dai modelli di riferimento dell’Industria 4.0 (Industrie 4.0 Architecture Reference Model, IDS-R).

Quali prestazioni ci si può aspettare da un server OPC-UA integrato? Una CPU 1515 del Siemens S7-1500 è in grado di elaborare circa 10.000 nodi OPC-UA in lettura al secondo. Per i PLC meno potenti (M221, piccoli WAGO), limitare il polling OPC-UA a 100-500 nodi/s. Le sottoscrizioni (Subscription) sono molto più efficienti del polling per volumi elevati.

Esistono server OPC-UA gratuiti da provare? Sì: ProsysOPC UA Simulation Server (gratuito, Windows), Node-RED con node-red-contrib-opcua (gratuito, multipiattaforma), python-opcua in modalità server (esempio nella documentazione su GitHub). Questi strumenti consentono di testare un client senza disporre di un PLC fisico.


Per approfondire

Hai bisogno di aiuto per collegare i tuoi server OPC-UA al cloud? Richiedi una demo gratuita — il nostro team ti affiancherà dal POC all'implementazione.


Risorse aggiuntive