# OPC UA Node ID



## Robsi (9 April 2019)

Hallo Zusammen,

ich bin gerade dabei über ein Python Skript auf den OPC UA Server einer CPU 1511 zu zugreifen. Die Verbindung zum Server funktioniert einwandfrei und ich kann auch diverse Daten / Information abrufen aber sobald ich über mein Python Skript auf eine Datenbaustein Variable zugreifen will bekomme ich folgende Fehlermeldung :

"BadNodeIdUnknown: The node id refers to a node that does not exist in the server address space.(BadNodeIdUnknown)"

Wenn ich über OPC UA Expert auf die Variable zugreife, sehe ich die aktualisierte Variable mit der dementsprechenden Node ID (siehe Bild)





Sobald ich über mein Python Skript zugreifen will, erkennt das Skript die Node ID nicht.


```
import time
from opcua import Client

url = "opc.tcp://192.168.100.164:4840"
client = Client(url)

client.connect()
print("Client Connected")
while True:
     
    Temp = client.get_node("ns=3;s=:Daten.real_01")
    Temperature = Temp.get_value()
    print(Temperature)
    
    time.sleep(1)
```

Wäre sehr dankbar wenn mir jemand einen Tipp geben könnte wo sich hier der Fehlerteufel eingeschlichen hat...

PS: Gibt es hier im Forum Gleichgesinnte welche sich auch mit dem Thema OPC UA und Python bzw. OPC UA und Cloud Synchronisation beschäftigen....?

ROB


----------



## Dr. OPC (10 April 2019)

Hallo ROB,

Die Gänsefüßchen (siehe Bild vom UaExpert) gehören dazu. Deshalb ist deine NodeID falsch und der (Siemens)-UA-Server lehnt sie mit "BadUnknown" ab.


----------



## Robsi (10 April 2019)

Hallo Dr. OPC,

danke für deine Antwort, sobald ich die Gänsefüßchen hinzufüge ("ns=3;s="Daten"."real_01"") bekomme ich von Python einen Syntax Fehler angezeigt.


----------



## marlob (10 April 2019)

Probiere mal

```
[COLOR=#333333][FONT=Courier]('ns=3;s="Daten"."real_01"')[/FONT][/COLOR]
```
Also die äusseren "durch ' ersetzen


----------



## Robsi (11 April 2019)

Hallo Marlob,

danke für den Tipp, das war die Lösung....funktioniert jetzt einwandfrei 

Sag mal, gibt es eigentlich eine Art "Suchfunktion" wenn ich nur die Adresse vom OPC UA Server habe, welche Daten der Server zur Verfügung stellt....? wenn ja wie kann man diese Anwenden..?


----------



## Dr. OPC (11 April 2019)

Für diese Frage müsstest du eigentlich einen neuen Thread starten, aber in kurz:
1) ja gibt es, die erste Funktion heisst FindServers bzw. FindServersOnNetwork, und wird immer zum Port 4840 gerufen
2) Voraussetzung ist, dass dort ein LDS (Local Discovery Server) läuft, bei dem sich alle anderen Server registriert haben (oder dort läuft der einzige Server den es gibt, z.B. S7-1500).
3) wenn Du dann die "Kontaktdaten" von deinem Servergefunden hast (EndpointURL)
4) verbindest du dich und kannst diesen "Browsen" (mit dem BrowseService kannst du allen Referenzen folgen, wenn du den hierarchischen Referenzen folgst, kannst du durch den Addressraum "navigieren").
5) die NodeIDs, die dich interessieren, kannst du dann "beobachten" oder "schreiben", (oder "lesen"). Aber Beobachten ist immer dem Lesen vorzuziehen, da es für den Server weniger anstrengend ist).
6) zum "Beobachten", musst du CreateSubscription aufrufen und mit CreateMonitoredItems die items hinzufügen, die du lesen willst.

Das oben gezeigte Beispiel (eine einzelne Variable in einer WhileSchleife zyklisch Lesen mit einem Sleep) ist mit Abstand das Schlechteste (für den Server) was man tun kann. Ich bin nicht sicher ob die Entwickler der Phyton-Bibliothek, alle schönen OPC UA Funktionen bereits anbieten. Diese "Vereinfachung" des Read jedenfalls ist nicht optimal.

Es gibt noch eine weitere Phyton-Bibliothek auf GIT (die heisst: UAF) und diese ist ein Wrapper für die kommerzielle C++Bibliothek von Unified Automation. Das kostet dann zwar Geld, aber man kann auch alle OPC UA Features sinnvoll nutzen von Phyton aus.


----------



## Robsi (12 April 2019)

Guten morgen,

vielen Dank für die Erklärung und die Tipps.... da ich mich in Materie OPC UA und Python erst einarbeiten muss sind solche Hinweise sehr hilfreich.


----------



## innosim (19 April 2021)

Hallo,
ich habe das gleiche Problem wie TheBird nur programmiere ich in c#. Durch das ersetzen der äußeren " durch ' kam der Fehler "zu viele Zeichen im Zeichenliteral" . Wie kann ich diesen Fehler umgehen?

schonmal vielen Dank im voraus!


----------



## roboticBeet (20 April 2021)

Ich sehe jetzt deinen Code nicht, aber in C# gibtst du mit 'x' einen Char an und mit "x" einen String. Ich würde stattdessen escapen. Das geht mittels \


----------

