OPC-UA-integratie

Inleiding

OPC-UA (Unified Architecture) is het standaardprotocol voor industriële communicatie voor beveiligde gegevensuitwisseling tussen PLC's, SCADA-systemen en cloudsystemen. Met Eziwan kunt u vanaf elke locatie toegang krijgen tot OPC-UA-servers in uw OT-netwerk via de beveiligde OpenVPN-tunnel.


Vereisten

Aan de automatiseringszijde (OPC-UA-server)

PLCOPC-UA-serverMinimale firmwareversieSysteemvereisten
Siemens S7-1500Native geïntegreerdFW 2.0 (2017)Activering in TIA Portal
Siemens S7-1200Niet beschikbaarGebruik in plaats daarvan Modbus TCP
B&R AutomationNative (ArOpc)AR 4.34Activering in Automation Studio
Beckhoff TwinCATTF6100 (TwinCAT OPC UA-server)TwinCAT 3.1.4020TF6100-licentie vereist
Phoenix Contact PLCnextGeïntegreerdFW 2020.0Activering via Web Based Management
Schneider EcoStruxureNative (M262/M580)Activering in SoMachine

Eziwan-kant

  • Eziwan-gateway met firmware ≥ 2.3
  • De gateway moet zich op hetzelfde Ethernet-netwerk bevinden als de OPC-UA-controller, of hiermee verbinding kunnen maken (zelfde VLAN, geen firewall die poort 4840 blokkeert)
  • Standaard OPC-UA-poort: TCP 4840

Architectuur: toegang via een VPN-tunnel

De OPC-UA-toegang op afstand via Eziwan verloopt als volgt:

De Eziwan-gateway fungeert als OPC-UA-proxy: hij ontvangt verbindingen van externe clients via de OpenVPN-tunnel en stuurt deze door naar de OPC-UA-server op het lokale OT-netwerk. De externe client heeft geen directe toegang tot het OT-netwerk.


Configuratie van TIA Portal: de OPC-UA-server van de S7-1500 inschakelen

Stap 1: De eigenschappen van de CPU openen

  1. Dubbelklik in TIA Portal op de S7-1500-CPU in de hardwareweergave
  2. Ga naar het tabblad OPC UA

Stap 2: De server inschakelen

OPC UA
└── Server
[✓] Activate OPC UA server

Port: 4840
Max. sessions: 10
Session timeout: 10 000 ms

Security:
[✓] Geen beveiliging (Basic256Sha256 wordt ook aanbevolen in de productieomgeving)
[✓] Basic256Sha256 - SignAndEncrypt

Access control:
[ ] Anonieme toegang toestaan (in de productieomgeving uitschakelen)
[✓] Enable user access control

Stap 3: Een serverinterface maken

De serverinterface definieert de variabelen die via OPC-UA beschikbaar worden gesteld:

OPC UA
└── Server interfaces
└── [New interface] → Nom: "Monitoring_Production"
└── Slepen en neerzetten vanuit het project:
DB10.Temperature → wordt weergegeven als "Temperature"
DB10.Pressure → wordt weergegeven als "Pressure"
DB10.ProductCount → wordt weergegeven als "ProductCount"
DB10.Running → wordt weergegeven als "Running"

Stap 4: Een OPC-UA-gebruiker aanmaken

OPC UA
└── Users
└── [Add user]
Username: eziwan_client
Password: MotDePasseStrong2026!
Rol: Waarnemer (alleen lezen) of Operator (lezen/schrijven)

Stap 5: De hardwareconfiguratie compileren en downloaden

Belangrijk: alleen de hardwareconfiguratie moet opnieuw worden gecompileerd en gedownload. Het gebruikersprogramma (OB, FC, FB) wordt niet gewijzigd.

Menu: Build → Build all (of Ctrl+B)
Controleer of er geen fouten zijn bij het compileren van de hardware alleen
Menu : Online → Download to device → Hardware configuration

Verbinding maken vanaf een OPC-UA-client op afstand

Optie 1: Prosys OPC UA Browser (gratis grafische interface)

  1. Download Prosys OPC UA Browser van prosysopc.com
  2. Start het programma
  3. Voer de URL in: opc.tcp://[IP_TUNNEL_EZIWAN]:4840
  4. Klik op "Connect"
  5. Kies de beveiligingsmodus (None voor tests, SignAndEncrypt voor productie)
  6. Blader door de knooppuntboomstructuur om uw variabelen te vinden

Optie 2: Python met 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():
"""Verbinding en uitlezing van productiedata via Eziwan."""

async with Client(url=OPC_UA_URL) as client:
# Authenticatie op basis van gebruikersnaam
client.set_user(USERNAME)
client.set_password(PASSWORD)

print(f"Connecté à {OPC_UA_URL}")

# Methode 1: Directe toegang via NodeId (indien bekend)
node_temp = client.get_node("ns=3;s=Monitoring_Production.Temperature")
temp = await node_temp.read_value()
print(f"Température : {temp} °C")

# Methode 2: Navigeren door de boomstructuur
root = client.get_root_node()
objects = await root.get_child(["0:Objects"])

# De onderliggende knooppunten weergeven
children = await objects.get_children()
for child in children:
name = await child.read_browse_name()
print(f"Nœud trouvé : {name.Name}")

# Methode 3: Abonnement op koerswijzigingen
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())

Optie 3: Node-RED met 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"}
]
}
]

OPC-UA-beveiliging: modi en certificaten

Beschikbare beveiligingsmodi

ModusAuthenticatieVersleutelingAanbeveling
GeenGeenGeenAlleen voor testdoeleinden, nooit in productie
SignX.509-certificaatNeeGemiddeld
SignAndEncryptX.509-certificaatAES-256Verplicht in productie

Ondersteunde beveiligingsbeleidsregels

  • Basic128Rsa15: RSA 1024 bits (verouderd, niet gebruiken)
  • Basic256: RSA 2048 bits + SHA-1 (aanvaardbaar)
  • Basic256Sha256: RSA 2048 bits + SHA-256 (aanbevolen)
  • Aes128_Sha256_RsaOaep: AES-128 + SHA-256 (modern)
  • Aes256_Sha256_RsaPss: AES-256 + SHA-256 (het veiligst)

Certificaatbeheer via Eziwan

Eziwan genereert automatisch X.509-certificaten voor de OPC-UA-verbinding:

  1. Eziwan-portaal → Integraties → OPC-UA → Certificaten
  2. Klik op "Certificaat genereren"
  3. Exporteer het certificaat in het formaat .der
  4. Importeer het in de lijst met vertrouwde clients van de OPC-UA-server (TIA Portal → OPC UA → Trusted Clients)

Problemen oplossen

Probleem 1: Time-out bij het verbinden

Symptoom: ServiceResultException: BadTimeout of verbinding mislukt.

Oorzaken en oplossingen:

OorzaakControleOplossing
Poort 4840 geblokkeerdtelnet [IP_OT] 4840 vanaf de gatewayOpen de poort op de lokale OT-firewall
OPC-UA-server niet geactiveerdControleer in TIA Portal → OPC UA → ServerActiveer en download de configuratie opnieuw
Verkeerd IP-adres van de gatewayPing vanaf de gateway naar de PLCControleer de netwerkconfiguratie van de gateway
Time-out te kortVerhoog de client-time-outclient.session_timeout = 30000 (asyncua)

Probleem 2: Afgewezen certificaten

Symptoom: BadCertificateUntrusted of BadSecurityChecksFailed

Oplossingen:

  1. S7-1500-serverzijde: TIA Portal → OPC UA → Trusted Clients → Het Eziwan-certificaat toevoegen
  2. Tijdelijke modus: TIA Portal → OPC UA → Server → "Accept all certificates automatically" (na configuratie uitschakelen)
  3. Certificaten opnieuw genereren: als het certificaat is verlopen, genereer het dan opnieuw in het Eziwan-portaal

Probleem 3: Knooppunten niet gevonden (BadNodeIdUnknown)

Symptoom: BadNodeIdUnknown bij het lezen van een knooppunt.

Oorzaken:

  • De naamruimte (ns=X) is onjuist
  • De serverinterface is niet aangemaakt in TIA Portal
  • De naam van het knooppunt is verkeerd gespeld

Oplossing: gebruik de Prosys OPC UA Browser om door de daadwerkelijke boomstructuur te navigeren en de exacte NodeIds te kopiëren.

Probleem 4: Regelmatige verbroken verbindingen

Symptoom: de klant wordt regelmatig losgekoppeld, foutmelding BadConnectionClosed.

Oplossingen:

  • Verhoog de keepaliveInterval aan de clientzijde
  • Controleer de stabiliteit van de netwerkverbinding (OpenVPN keepalive geconfigureerd)
  • Controleer of de max_sessions van de S7-1500-server niet is bereikt (TIA Portal → OPC UA → Server → Max. sessies)

Diagnosecommando's via de gateway

Via de Eziwan-console (SSH of webinterface → Terminal):

# De verbinding met de OPC-UA-server testen
nc -zv 192.168.20.10 4840

# De status van de OpenVPN-tunnel controleren
systemctl status openvpn-client@eziwan --no-pager

# OPC-UA-verbindingslogboeken (gefilterd op fouten)
journalctl -u eziwan-opcua-client -n 50 --no-pager | grep -i error

Veelgestelde vragen

OPC-UA of Modbus: wat is de beste keuze voor het doorsturen van gegevens?

OPC-UA biedt typecontrole, eenheden, knooppunthierarchie en beveiliging via certificaten; Modbus blijft eenvoudiger voor een snelle retrofit. Bij een S7-1500 of een recent SCADA-systeem verdient OPC-UA de voorkeur; bij een oud, heterogeen systeem is Modbus de betere keuze.

Wat is een OPC-UA-knooppunt?

De informatie-eenheid van de server: een variabele (meting, instelwaarde), een object of een methode, geïdentificeerd door een NodeId in een naamruimte. De Eziwan-client doorloopt de boomstructuur en abonneert zich op de gekozen knooppunten.

Hoe beheer je OPC-UA-certificaten?

De client en de server wisselen X.509-certificaten uit: het certificaat van de Eziwan-client moet aan de serverzijde (TIA Portal, UaExpert) worden goedgekeurd en er moet een versleutelingsbeleid worden gekozen (aanbevolen: Basic256Sha256).

Welke apparatuur maakt een OPC-UA-server beschikbaar?

De nieuwste PLC’s (Siemens S7-1500/S7-1200, Schneider M580, Beckhoff), SCADA-systemen (WinCC, Ignition, AVEVA) en talrijke hoogwaardige sensoren en regelaars. Voor de overige apparatuur verzamelt de gateway gegevens via Modbus.

Gerelateerde bronnen