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)

AutomateServeur OPC-UAVersion firmware minimaleConfiguration requise
Siemens S7-1500Natif intégréFW 2.0 (2017)Activation dans TIA Portal
Siemens S7-1200Non disponibleUtiliser Modbus TCP à la place
B&R AutomationNatif (ArOpc)AR 4.34Activation dans Automation Studio
Beckhoff TwinCATTF6100 (TwinCAT OPC UA Server)TwinCAT 3.1.4020Licence TF6100 requise
Phoenix Contact PLCnextIntégréFW 2020.0Activation via Web Based Management
Schneider EcoStruxureNatif (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

  1. Dans TIA Portal, double-cliquer sur le CPU S7-1500 dans la vue matérielle
  2. 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)

  1. Télécharger Prosys OPC UA Browser sur prosysopc.com
  2. Lancer le logiciel
  3. Saisir l'URL : opc.tcp://[IP_TUNNEL_EZIWAN]:4840
  4. Cliquer sur "Connect"
  5. Choisir le mode de sécurité (None pour les tests, SignAndEncrypt pour la production)
  6. 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

ModeAuthentificationChiffrementRecommandation
NoneAucuneAucunTests uniquement, jamais en production
SignCertificat X.509NonMoyen
SignAndEncryptCertificat X.509AES-256Obligatoire 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 :

  1. Portail Eziwan → Intégrations → OPC-UA → Certificats
  2. Cliquer "Générer un certificat"
  3. Exporter le certificat au format .der
  4. 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 :

CauseVérificationSolution
Port 4840 bloquételnet [IP_OT] 4840 depuis la gatewayOuvrir le port sur le firewall local OT
Serveur OPC-UA non activéVérifier dans TIA Portal → OPC UA → ServerActiver et re-télécharger la config
IP gateway incorrectePing depuis gateway vers PLCVérifier configuration réseau gateway
Timeout trop courtAugmenter le timeout clientclient.session_timeout = 30000 (asyncua)

Problème 2 : Certificats rejetés

Symptôme : BadCertificateUntrusted ou BadSecurityChecksFailed

Solutions :

  1. Côté serveur S7-1500 : TIA Portal → OPC UA → Trusted Clients → Ajouter le certificat Eziwan
  2. Mode temporaire : TIA Portal → OPC UA → Server → "Accept all certificates automatically" (désactiver après configuration)
  3. 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 keepaliveInterval côté client
  • Vérifier la stabilité de la connexion réseau (OpenVPN keepalive configuré)
  • Vérifier que le max_sessions du 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