Integrazione OPC-UA
Presentazione
OPC-UA (Unified Architecture) è il protocollo di comunicazione industriale standard per gli scambi sicuri tra PLC, sistemi SCADA e sistemi cloud. Eziwan consente di accedere ai server OPC-UA presenti sulla vostra rete OT da qualsiasi luogo, tramite il tunnel OpenVPN protetto.
Prerequisiti
Lato PLC (server OPC-UA)
| Controllore | Server OPC-UA | Versione minima del firmware | Requisiti di sistema |
|---|---|---|---|
| Siemens S7-1500 | Nativo integrato | FW 2.0 (2017) | Attivazione in TIA Portal |
| Siemens S7-1200 | Non disponibile | — | Utilizzare Modbus TCP in alternativa |
| B&R Automation | Nativo (ArOpc) | AR 4.34 | Attivazione in Automation Studio |
| Beckhoff TwinCAT | TF6100 (TwinCAT OPC UA Server) | TwinCAT 3.1.4020 | Licenza TF6100 richiesta |
| Phoenix Contact PLCnext | Integrato | FW 2020.0 | Attivazione tramite Web Based Management |
| Schneider EcoStruxure | Nativo (M262/M580) | — | Attivazione in SoMachine |
Il punto di vista di Eziwan
- Gateway Eziwan con firmware ≥ 2.3
- Il gateway deve trovarsi sulla stessa rete Ethernet del controllore OPC-UA, oppure deve essere in grado di collegarsi ad esso (stessa VLAN, nessun firewall che blocchi la porta 4840)
- Porta OPC-UA predefinita: TCP 4840
Architettura: accesso tramite tunnel VPN
L'accesso remoto OPC-UA tramite Eziwan segue lo schema seguente:
Il gateway Eziwan funge da proxy OPC-UA: riceve le connessioni dei client remoti tramite il tunnel OpenVPN e le inoltra al server OPC-UA sulla rete OT locale. Il client remoto non ha accesso diretto alla rete OT.
Configurazione di TIA Portal: attivazione del server OPC-UA S7-1500
Passaggio 1: Aprire le proprietà della CPU
- In TIA Portal, fare doppio clic sulla CPU S7-1500 nella vista hardware
- Passare alla scheda OPC UA
Fase 2: Attivare il server
OPC UA
└── Server
[✓] Activate OPC UA server
Port: 4840
Max. sessions: 10
Session timeout: 10 000 ms
Security:
[✓] Nessuna protezione (si consiglia anche Basic256Sha256 in ambiente di produzione)
[✓] Basic256Sha256 - SignAndEncrypt
Access control:
[ ] Consenti l'accesso anonimo (disattivare in produzione)
[✓] Enable user access control
Fase 3: Creare un'interfaccia server
L'interfaccia server definisce le variabili rese disponibili tramite OPC-UA:
OPC UA
└── Server interfaces
└── [New interface] → Nom: "Monitoring_Production"
└── Trascina e rilascia dal progetto:
DB10.Temperature → verrà visualizzato come "Temperature"
DB10.Pressure → verrà visualizzato come "Pressure"
DB10.ProductCount → verrà esposto come "ProductCount"
DB10.Running → verrà visualizzato come "Running"
Fase 4: Creare un utente OPC-UA
OPC UA
└── Users
└── [Add user]
Username: eziwan_client
Password: MotDePasseStrong2026!
Ruolo: Osservatore (solo lettura) o Operatore (lettura/scrittura)
Fase 5: Compilare e caricare la configurazione hardware
Importante: occorre ricompilare e caricare solo la configurazione hardware. Il programma utente (OB, FC, FB) non subisce alcuna modifica.
Menu: Build → Build all (o Ctrl+B)
Verificare che non vi siano errori nella compilazione dell'hardware esclusivamente
Menu : Online → Download to device → Hardware configuration
Connessione da un client OPC-UA remoto
Opzione 1: Prosys OPC UA Browser (interfaccia grafica gratuita)
- Scaricare Prosys OPC UA Browser da prosysopc.com
- Avviare il software
- Inserire l'URL:
opc.tcp://[IP_TUNNEL_EZIWAN]:4840 - Fare clic su "Connect"
- Scegliere la modalità di sicurezza (None per i test, SignAndEncrypt per la produzione)
- Navigare nella struttura ad albero dei nodi per trovare le variabili
Opzione 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():
"""Connessione e lettura dei dati di produzione tramite Eziwan."""
async with Client(url=OPC_UA_URL) as client:
# Autenticazione tramite nome utente
client.set_user(USERNAME)
client.set_password(PASSWORD)
print(f"Connecté à {OPC_UA_URL}")
# Metodo 1: Accesso tramite NodeId diretto (se noto)
node_temp = client.get_node("ns=3;s=Monitoring_Production.Temperature")
temp = await node_temp.read_value()
print(f"Température : {temp} °C")
# Metodo 2: Navigazione nella struttura ad albero
root = client.get_root_node()
objects = await root.get_child(["0:Objects"])
# Elencare i nodi figli
children = await objects.get_children()
for child in children:
name = await child.read_browse_name()
print(f"Nœud trouvé : {name.Name}")
# Metodo 3: Abbonamento in base alla variazione di valore
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())
Opzione 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"}
]
}
]
Sicurezza OPC-UA: modalità e certificati
Modalità di sicurezza disponibili
| Modalità | Autenticazione | Crittografia | Raccomandazione |
|---|---|---|---|
| Nessuno | Nessuno | Nessuno | Solo per test, mai in produzione |
| Sign | Certificato X.509 | No | Medio |
| SignAndEncrypt | Certificato X.509 | AES-256 | Obbligatorio in produzione |
Politiche di sicurezza supportate
- Basic128Rsa15: RSA a 1024 bit (obsoleto, da non utilizzare)
- Basic256: RSA a 2048 bit + SHA-1 (accettabile)
- Basic256Sha256: RSA a 2048 bit + SHA-256 (consigliato)
- Aes128_Sha256_RsaOaep: AES-128 + SHA-256 (moderno)
- Aes256_Sha256_RsaPss: AES-256 + SHA-256 (il più sicuro)
Gestione dei certificati tramite Eziwan
Eziwan genera automaticamente i certificati X.509 per la connessione OPC-UA:
- Portale Eziwan → Integrazioni → OPC-UA → Certificati
- Fare clic su "Genera un certificato"
- Esportare il certificato in formato
.der - Importarlo nell’elenco dei clienti fidati del server OPC-UA (TIA Portal → OPC UA → Trusted Clients)
Risoluzione dei problemi
Problema 1: Timeout di connessione
Sintomo: ServiceResultException: BadTimeout o connessione non riuscita.
Cause e soluzioni:
| Causa | Verifica | Soluzione |
|---|---|---|
| Porta 4840 bloccata | telnet [IP_OT] 4840 dal gateway | Aprire la porta sul firewall locale OT |
| Server OPC-UA non attivato | Verificare in TIA Portal → OPC UA → Server | Attivare e scaricare nuovamente la configurazione |
| IP del gateway errato | Eseguire il ping dal gateway al PLC | Verificare la configurazione di rete del gateway |
| Timeout troppo breve | Aumentare il timeout del client | client.session_timeout = 30000 (asyncua) |
Problema 2: Certificati rifiutati
Sintomo: BadCertificateUntrusted o BadSecurityChecksFailed
Soluzioni:
- Lato server S7-1500: TIA Portal → OPC UA → Trusted Clients → Aggiungi il certificato Eziwan
- Modalità temporanea: TIA Portal → OPC UA → Server → "Accetta automaticamente tutti i certificati" (disattivare dopo la configurazione)
- Rigenerare i certificati: se il certificato è scaduto, rigenerarlo nel portale Eziwan
Problema 3: Nodi non trovati (BadNodeIdUnknown)
Sintomo: BadNodeIdUnknown durante la lettura di un nodo.
Cause:
- Il namespace (ns=X) non è corretto
- L'interfaccia server non è stata creata in TIA Portal
- Il nome del nodo è scritto in modo errato
Soluzione: utilizzare Prosys OPC UA Browser per navigare nella struttura ad albero effettiva e copiare gli NodeId esatti.
Problema 4: Disconnessioni frequenti
Sintomo: il client si disconnette regolarmente, errore BadConnectionClosed.
Soluzioni:
- Aumentare il valore
keepaliveIntervalsul lato client - Verificare la stabilità della connessione di rete (keepalive OpenVPN configurato)
- Verificare che il valore
max_sessionsdel server S7-1500 non sia stato raggiunto (TIA Portal → OPC UA → Server → Sessioni massime)
Comandi di diagnostica dal gateway
Dalla console Eziwan (SSH o interfaccia web → Terminale):
# Verifica della connettività al server OPC-UA
nc -zv 192.168.20.10 4840
# Verificare lo stato del tunnel OpenVPN
systemctl status openvpn-client@eziwan --no-pager
# Log della connessione OPC-UA (filtrati in base agli errori)
journalctl -u eziwan-opcua-client -n 50 --no-pager | grep -i error
Domande frequenti
OPC-UA o Modbus: quale scegliere per la trasmissione dei dati?
OPC-UA offre tipizzazione, unità di misura, gerarchia dei nodi e sicurezza tramite certificati; Modbus rimane più semplice per un retrofit rapido. Su un S7-1500 o su un sistema SCADA recente, è preferibile utilizzare OPC-UA; su un parco macchine eterogeneo e obsoleto, è preferibile Modbus.
Che cos'è un nodo OPC-UA?
L'unità di informazione del server: una variabile (misura, valore di riferimento), un oggetto o un metodo, identificata da un NodeId in uno spazio dei nomi. Il client Eziwan esplora l'albero e si abbona ai nodi selezionati.
Come gestire i certificati OPC-UA?
Il client e il server si scambiano certificati X.509: è necessario approvare il certificato del client Eziwan sul lato server (TIA Portal, UaExpert) e scegliere una politica di sicurezza crittografica (si consiglia Basic256Sha256).
Quali dispositivi sono esposti su un server OPC-UA?
I PLC di ultima generazione (Siemens S7-1500/S7-1200, Schneider M580, Beckhoff), i sistemi SCADA (WinCC, Ignition, AVEVA) e numerosi sensori e azionamenti di fascia alta. Per il resto del parco macchine, il gateway acquisisce i dati tramite Modbus.
Risorse correlate
- OPC UA verso il cloud industriale — la pagina dedicata alla soluzione
- OPC UA e MQTT — combinare una raccolta dati approfondita con un trasporto leggero
- Guida completa a OPC UA — l'articolo di approfondimento
- Compatibilità con Siemens S7 — attivare il server OPC UA in TIA Portal
- Protocolli industriali — l’hub dei protocolli OT