Guida completa all'OPC-UA per l'industria: architettura, sicurezza, implementazione
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?
- Architettura OPC-UA: i concetti fondamentali
- Sicurezza OPC-UA: la guida completa
- Implementazione di OPC-UA in Python
- Implementazione di OPC-UA in Node.js
- OPC-UA sui principali controllori industriali
- OPC-UA PubSub: l'estensione per il cloud
- Migrazione da OPC-DA a OPC-UA
- OPC-UA con il gateway Eziwan
- Domande frequenti — OPC-UA
- Per approfondire
- Risorse aggiuntive
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 1234ns=2;s=Station_1.Pression— namespace 2, identificatore stringans=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 produttorens=2+: spazi dei nomi applicativi (i vostri dati)
Modalità di comunicazione
| Modalità | Descrizione | Casi d'uso |
|---|---|---|
| Read | Lettura puntuale di un nodo | Polling ogni N secondi |
| Subscription | Abbonamento alle modifiche (MonitoredItem) | Eventi, allarmi |
| Browse | Esplorazione dello spazio degli indirizzi | Configurazione, discovery |
| Write | Scrittura di un valore | Setpoint, comandi |
| Method Call | Chiamata di metodo | Azioni complesse |
| Pubsub | Pubblicazione/sottoscrizione MQTT o UDP | Architetture 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à | Riservatezza | Integrità | Autenticazione | Utilizzo |
|---|---|---|---|---|
None | Nessuna | Nessuna | Nessuna | Test, rete isolata |
Sign | No | Firma | Certificato | Rete protetta |
SignAndEncrypt | AES-256 | Firma | Certificato | Internet, cloud |
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
- Blog: OPC-UA e MQTT — come combinare i due su un gateway industriale
- Blog: accesso remoto sicuro a PLC e SCADA — VPN, zero-trust e NIS2
- Blog: collegare un PLC Siemens S7 al cloud — guida tecnica
- Blog: IEC 62443 — guida pratica alla sicurezza informatica industriale
- Blog: Modbus TCP vs RTU — confronto completo per l’IoT industriale
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
- Da OPC UA a MQTT — pubblicazione di dati OPC UA su un broker MQTT cloud
- Protocolli industriali — confronto tra OPC UA, Modbus, MQTT e altri protocolli
- Gateway IoT industriale — come scegliere un gateway compatibile con OPC UA
- Da Modbus TCP al cloud — monitoraggio dei controllori Modbus TCP dal cloud
- SCADA cloud — architettura SCADA moderna con connettività OPC UA e cloud