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)

ControlloreServer OPC-UAVersione minima del firmwareRequisiti di sistema
Siemens S7-1500Nativo integratoFW 2.0 (2017)Attivazione in TIA Portal
Siemens S7-1200Non disponibileUtilizzare Modbus TCP in alternativa
B&R AutomationNativo (ArOpc)AR 4.34Attivazione in Automation Studio
Beckhoff TwinCATTF6100 (TwinCAT OPC UA Server)TwinCAT 3.1.4020Licenza TF6100 richiesta
Phoenix Contact PLCnextIntegratoFW 2020.0Attivazione tramite Web Based Management
Schneider EcoStruxureNativo (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

  1. In TIA Portal, fare doppio clic sulla CPU S7-1500 nella vista hardware
  2. 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)

  1. Scaricare Prosys OPC UA Browser da prosysopc.com
  2. Avviare il software
  3. Inserire l'URL: opc.tcp://[IP_TUNNEL_EZIWAN]:4840
  4. Fare clic su "Connect"
  5. Scegliere la modalità di sicurezza (None per i test, SignAndEncrypt per la produzione)
  6. 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àAutenticazioneCrittografiaRaccomandazione
NessunoNessunoNessunoSolo per test, mai in produzione
SignCertificato X.509NoMedio
SignAndEncryptCertificato X.509AES-256Obbligatorio 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:

  1. Portale Eziwan → Integrazioni → OPC-UA → Certificati
  2. Fare clic su "Genera un certificato"
  3. Esportare il certificato in formato .der
  4. 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:

CausaVerificaSoluzione
Porta 4840 bloccatatelnet [IP_OT] 4840 dal gatewayAprire la porta sul firewall locale OT
Server OPC-UA non attivatoVerificare in TIA Portal → OPC UA → ServerAttivare e scaricare nuovamente la configurazione
IP del gateway erratoEseguire il ping dal gateway al PLCVerificare la configurazione di rete del gateway
Timeout troppo breveAumentare il timeout del clientclient.session_timeout = 30000 (asyncua)

Problema 2: Certificati rifiutati

Sintomo: BadCertificateUntrusted o BadSecurityChecksFailed

Soluzioni:

  1. Lato server S7-1500: TIA Portal → OPC UA → Trusted Clients → Aggiungi il certificato Eziwan
  2. Modalità temporanea: TIA Portal → OPC UA → Server → "Accetta automaticamente tutti i certificati" (disattivare dopo la configurazione)
  3. 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 keepaliveInterval sul lato client
  • Verificare la stabilità della connessione di rete (keepalive OpenVPN configurato)
  • Verificare che il valore max_sessions del 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