Intégration OPC-UA
Présentation
OPC-UA (Unified Architecture) est le protocole de communication industrielle standard pour les échanges sécurisés entre automates, SCADA et systèmes cloud. Eziwan permet d'accéder à des serveurs OPC-UA situés sur votre réseau OT depuis n'importe où, via le tunnel OpenVPN sécurisé.
Prérequis
Côté automate (serveur OPC-UA)
| Automate | Serveur OPC-UA | Version firmware minimale | Configuration requise |
|---|---|---|---|
| Siemens S7-1500 | Natif intégré | FW 2.0 (2017) | Activation dans TIA Portal |
| Siemens S7-1200 | Non disponible | — | Utiliser Modbus TCP à la place |
| B&R Automation | Natif (ArOpc) | AR 4.34 | Activation dans Automation Studio |
| Beckhoff TwinCAT | TF6100 (TwinCAT OPC UA Server) | TwinCAT 3.1.4020 | Licence TF6100 requise |
| Phoenix Contact PLCnext | Intégré | FW 2020.0 | Activation via Web Based Management |
| Schneider EcoStruxure | Natif (M262/M580) | — | Activation dans SoMachine |
Côté Eziwan
- Gateway Eziwan avec firmware ≥ 2.3
- La gateway doit être sur le même réseau Ethernet que l'automate OPC-UA, ou capable de le joindre (même VLAN, pas de firewall bloquant le port 4840)
- Port OPC-UA par défaut : TCP 4840
Architecture : accès via tunnel VPN
L'accès OPC-UA distant via Eziwan suit le schéma suivant :
La gateway Eziwan agit comme proxy OPC-UA : elle reçoit les connexions des clients distants via le tunnel OpenVPN et les relaie vers le serveur OPC-UA sur le réseau OT local. Le client distant n'a pas accès direct au réseau OT.
Configuration TIA Portal : activer le serveur OPC-UA S7-1500
Étape 1 : Ouvrir les propriétés du CPU
- Dans TIA Portal, double-cliquer sur le CPU S7-1500 dans la vue matérielle
- Aller dans l'onglet OPC UA
Étape 2 : Activer le serveur
OPC UA
└── Server
[✓] Activate OPC UA server
Port: 4840
Max. sessions: 10
Session timeout: 10 000 ms
Security:
[✓] No security (Basic256Sha256 également recommandé en production)
[✓] Basic256Sha256 - SignAndEncrypt
Access control:
[ ] Allow anonymous access (désactiver en production)
[✓] Enable user access control
Étape 3 : Créer une interface serveur
L'interface serveur définit les variables exposées via OPC-UA :
OPC UA
└── Server interfaces
└── [New interface] → Nom: "Monitoring_Production"
└── Drag & Drop depuis le projet :
DB10.Temperature → sera exposé comme "Temperature"
DB10.Pressure → sera exposé comme "Pressure"
DB10.ProductCount → sera exposé comme "ProductCount"
DB10.Running → sera exposé comme "Running"
Étape 4 : Créer un utilisateur OPC-UA
OPC UA
└── Users
└── [Add user]
Username: eziwan_client
Password: MotDePasseStrong2026!
Role: Observer (lecture seule) ou Operator (lecture/écriture)
Étape 5 : Compiler et télécharger la configuration hardware
Important : seule la configuration hardware doit être recompilée et téléchargée. Le programme utilisateur (OB, FC, FB) n'est pas modifié.
Menu : Build → Build all (ou Ctrl+B)
Vérifier l'absence d'erreurs dans la compilation hardware uniquement
Menu : Online → Download to device → Hardware configuration
Connexion depuis un client OPC-UA distant
Option 1 : Prosys OPC UA Browser (interface graphique gratuite)
- Télécharger Prosys OPC UA Browser sur prosysopc.com
- Lancer le logiciel
- Saisir l'URL :
opc.tcp://[IP_TUNNEL_EZIWAN]:4840 - Cliquer sur "Connect"
- Choisir le mode de sécurité (None pour les tests, SignAndEncrypt pour la production)
- Naviguer dans l'arborescence des nœuds pour trouver vos variables
Option 2 : Python avec 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():
"""Connexion et lecture des données de production via Eziwan."""
async with Client(url=OPC_UA_URL) as client:
# Authentification par nom d'utilisateur
client.set_user(USERNAME)
client.set_password(PASSWORD)
print(f"Connecté à {OPC_UA_URL}")
# Méthode 1 : Accès par NodeId direct (si connu)
node_temp = client.get_node("ns=3;s=Monitoring_Production.Temperature")
temp = await node_temp.read_value()
print(f"Température : {temp} °C")
# Méthode 2 : Navigation dans l'arborescence
root = client.get_root_node()
objects = await root.get_child(["0:Objects"])
# Lister les nœuds enfants
children = await objects.get_children()
for child in children:
name = await child.read_browse_name()
print(f"Nœud trouvé : {name.Name}")
# Méthode 3 : Abonnement sur changement de valeur
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())
Option 3 : Node-RED avec 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"}
]
}
]
Sécurité OPC-UA : modes et certificats
Modes de sécurité disponibles
| Mode | Authentification | Chiffrement | Recommandation |
|---|---|---|---|
| None | Aucune | Aucun | Tests uniquement, jamais en production |
| Sign | Certificat X.509 | Non | Moyen |
| SignAndEncrypt | Certificat X.509 | AES-256 | Obligatoire en production |
Politiques de sécurité supportées
- Basic128Rsa15 : RSA 1024 bits (obsolète, ne pas utiliser)
- Basic256 : RSA 2048 bits + SHA-1 (acceptable)
- Basic256Sha256 : RSA 2048 bits + SHA-256 (recommandé)
- Aes128_Sha256_RsaOaep : AES-128 + SHA-256 (moderne)
- Aes256_Sha256_RsaPss : AES-256 + SHA-256 (le plus sécurisé)
Gestion des certificats via Eziwan
Eziwan génère automatiquement les certificats X.509 pour la connexion OPC-UA :
- Portail Eziwan → Intégrations → OPC-UA → Certificats
- Cliquer "Générer un certificat"
- Exporter le certificat au format
.der - Importer dans la liste de confiance du serveur OPC-UA (TIA Portal → OPC UA → Trusted Clients)
Troubleshooting
Problème 1 : Timeout de connexion
Symptôme : ServiceResultException: BadTimeout ou connexion qui n'aboutit pas.
Causes et solutions :
| Cause | Vérification | Solution |
|---|---|---|
| Port 4840 bloqué | telnet [IP_OT] 4840 depuis la gateway | Ouvrir le port sur le firewall local OT |
| Serveur OPC-UA non activé | Vérifier dans TIA Portal → OPC UA → Server | Activer et re-télécharger la config |
| IP gateway incorrecte | Ping depuis gateway vers PLC | Vérifier configuration réseau gateway |
| Timeout trop court | Augmenter le timeout client | client.session_timeout = 30000 (asyncua) |
Problème 2 : Certificats rejetés
Symptôme : BadCertificateUntrusted ou BadSecurityChecksFailed
Solutions :
- Côté serveur S7-1500 : TIA Portal → OPC UA → Trusted Clients → Ajouter le certificat Eziwan
- Mode temporaire : TIA Portal → OPC UA → Server → "Accept all certificates automatically" (désactiver après configuration)
- Re-générer les certificats : si le certificat est expiré, le régénérer dans le portail Eziwan
Problème 3 : Nœuds introuvables (BadNodeIdUnknown)
Symptôme : BadNodeIdUnknown lors de la lecture d'un nœud.
Causes :
- Le namespace (ns=X) est incorrect
- L'interface serveur n'a pas été créée dans TIA Portal
- Le nom du nœud est mal orthographié
Solution : utiliser Prosys OPC UA Browser pour naviguer dans l'arborescence réelle et copier les NodeIds exacts.
Problème 4 : Déconnexions fréquentes
Symptôme : le client se déconnecte régulièrement, erreur BadConnectionClosed.
Solutions :
- Augmenter le
keepaliveIntervalcôté client - Vérifier la stabilité de la connexion réseau (OpenVPN keepalive configuré)
- Vérifier que le
max_sessionsdu serveur S7-1500 n'est pas atteint (TIA Portal → OPC UA → Server → Max. sessions)
Commandes de diagnostic depuis la gateway
Depuis la console Eziwan (SSH ou interface web → Terminal) :
# Tester la connectivité vers le serveur OPC-UA
nc -zv 192.168.20.10 4840
# Vérifier le statut du tunnel OpenVPN
systemctl status openvpn-client@eziwan --no-pager
# Logs de la connexion OPC-UA (filtrés sur les erreurs)
journalctl -u eziwan-opcua-client -n 50 --no-pager | grep -i error
Questions fréquentes
OPC-UA ou Modbus : que choisir pour remonter des données ?
OPC-UA apporte le typage, les unités, la hiérarchie des nœuds et la sécurité par certificats ; Modbus reste plus simple pour du retrofit rapide. Sur un S7-1500 ou un SCADA récent, préférez OPC-UA ; sur un parc hétérogène ancien, Modbus.
Qu'est-ce qu'un nœud OPC-UA ?
L'unité d'information du serveur : une variable (mesure, consigne), un objet ou une méthode, identifiée par un NodeId dans un espace de noms. Le client Eziwan parcourt l'arborescence et s'abonne aux nœuds choisis.
Comment gérer les certificats OPC-UA ?
Le client et le serveur échangent des certificats X.509 : il faut approuver le certificat du client Eziwan côté serveur (TIA Portal, UaExpert) et choisir une politique de sécurité chiffrée (Basic256Sha256 recommandé).
Quels équipements exposent un serveur OPC-UA ?
Les automates récents (Siemens S7-1500/S7-1200, Schneider M580, Beckhoff), les SCADA (WinCC, Ignition, AVEVA) et de nombreux capteurs et variateurs haut de gamme. Pour le reste du parc, la gateway collecte en Modbus.
Ressources associées
- OPC UA vers le cloud industriel — la page solution
- OPC UA et MQTT — combiner collecte riche et transport léger
- Guide OPC-UA complet — l'article de fond
- Compatibilité Siemens S7 — activer le serveur OPC-UA dans TIA Portal
- Protocoles industriels — le hub des protocoles OT