# Siemens SIMATIC NET Opc Ua Server



## trialanderror (23 Oktober 2012)

*Siemens SIMATIC NET Opc Ua Server - Knoten hinzufügen*

Hi @all,

ich arbeite im Moment an einem OPC Projekt und zum test muesste ich eigentlich ein paar neue Knoten am Server erstellen. Nur hab ich bisher mit der mitgelieferten Software keine Möglichkeit hierzu gefunden. 
Mir wäre arg geholfen wenn da jemand Bescheid wüsste 

Vielen Danke für eure Zeit.


----------



## trialanderror (24 Oktober 2012)

Also wenn das keiner weis ist das offensichtlich eine Fehlkonstruktion von Siemens (und der Opc Foundation sowieso)


----------



## trialanderror (31 Oktober 2012)

Kann mir keiner auch nur irgendeine Hilfestellung hierzu geben? Irgendein Tipp, irgendwas?


----------



## Dr. OPC (5 November 2012)

Nur weil Du es nicht kappierst, ist es ja noch nicht gleich schlecht.

Knoten werden (fast) automatisch angelegt, wenn Du eine S7 programmierst (und symbolische Namen verwendest) werden diese auch im OPC Server sichtbar (wenn du eine S7-Verbindung zu dieser S7 hast). Anders gesagt das Tool mit dem man das macht ist Step7.

Man kann auch Symbole manuell anlegen, dazu gibt es den Symboldateikonfigurator, dann muss man allerdings wissen was man tut, bzw. wo genau die Daten liegen.


----------



## trialanderror (6 November 2012)

Das Problem ist, das ich mich durch die Doku hangle und es trotzdem nicht kapiere, was sicher nicht an meinem Verstand liegt. <= schlecht
(Gilt übrigens erst recht fuer die API)

Trotzdem Danke für die Antwort.


----------



## Dr. OPC (6 November 2012)

OK, versuchen wir das mal zu trennen. Du willst Knoten anlegen im OPC UA Server, wo und welche? Nimm den Symbolkonfigurator und lege sie an. Der Adressraum ist statisch und ein UA Client kann beim SimaticNET Server keine Knoten zur Laufzeit anlegen.

Die API ist vermutlich von der uastack.dll das ist eine C API und die solltest du natürlich NICHT verwenden, die ist "intern" und natürlich nicht dokumentiert. Die API ist identisch der C API der OPC Foundation, wenn du dort Mitglied wirst, kriegst du die Quellen (nützt dir aber vermutlich wenig).

Die Stack API ist also ABSICHTLICH nicht dokumentiert, sondern es gibt stattdessen bei SiematicNET einfache Beispiele und es gibt sogar einige Beispiele im Customer Support (allerdings in C#), die die Verwendung von OPC UA ausführlich beschreiben und dort sind Assemblies dabei, die UA Zugriffe auch stark vereinfachen.

Wenn Du einen Client in C++ schreiben willst, kannst du a) die C Stack API nehmen und einen C++ wrapper für alle Datenstrukturen selber schreiben und die Hantierung von Verbindungen (Secure Channel, Session) und Zertifikaten, deren Prüfung und die Verwaltung von Subscriptions und Publishes, Du kannst die Dienste in komfortable C++ Klassen kapseln. Oder b) du kaufst dir ein Toolkit wo genau diese Arbeit schon von jemandem erledigt wurde, der sich damit auskennt und dann kannst du eine C++ API verwenden (die auch dokumentiert ist). Solche gibt es bei z.B. Unified Automation GmbH oder Softing oder anderen.


----------



## trialanderror (6 November 2012)

Also das ist jetzt endlich mal ne Antwort mit der ich was anfangen kann.
Das Anlegen von (Test-)Knoten also über den Symboleditor. Schonmal n guter Hinweis.



> Die API ist vermutlich von der uastack.dll das ist eine C API und die solltest du natürlich NICHT verwenden


Tja ich habe leider keine Wahl. Aber ich denke ein Standard (bzw. eine nonprofit Organisation, die einen solchen bereitstellt) muss doch kostenfrei eine API bieten (auf niedrigstem Level wenigstens), die dokumentiert ist, oder siehts du das anders?



> ...sondern es gibt stattdessen bei SiematicNET einfache Beispiele...


Die bei weitem nicht alles abdecken und die ebenfalls sehr spärlich dokumentiert sind.
Wenn ich einen C++ Wrapper fuer einfachen Kanalaufbau, Lese- und Schreibeoperationen bauen will. Bringt mir das schon was, aber man muss Stunden mit dem Debugger schauen, was da eigentlich übergeben wird, bzw. was zurückkommt.



> ...Die Stack API ist also ABSICHTLICH nicht dokumentiert...


Das glaub ich gern, da gehts wohl um Geld.

Naja, mittlerweile kann ich mit der API umgehen, aber ich finde die ganze Dokumentation (auch die über den SIMATIC OPC-Server, sehr dürftig)

Danke.


----------



## Dr. OPC (6 November 2012)

Ich sehe schon dass Du nicht richtig gesucht hast. Eine bessere Doku als bei SimaticNET findest du sicher bei keinem anderen OPC Produkt (PDF Band1 und 2). Doku findest du hier C:\Program Files\Siemens\SIMATIC.NET\doc\pc-produkte\opc\mn 
In Band 1 ist eine Beschreibung von UA Grundlagen
In Band 2 sind die Beispiele beschrieben (das einfache in c und die c# auch)

Beispiele sind mitinstalliert unter C:\Program Files\Siemens\SIMATIC.NET\opc2\samples\ua\c
dort ist sogar der source code kommentiert.

Für C# gibt es sogar eine Art einfaches Toolkit mit dem jeder Anfänger in 3 stunden einen UA Client programmieren kann.

Weiterhin gibt es noch Customer Support Beispiele (in C#) dort werden auch nochmal die Grundlagen von UA und auch die Grundlagen zu S7 Kommunikation beschrieben und auch wie man den OPC Server mit Step7 richtig konfiguriert. 

Die OPC Foundation bietet sogar 3 UA Kommunikations-Stacks an (C, C# und Java) und stellt sicher das diese der Spezifikation entsprechen (in Part 4 und Part 6 kannst du genau nachlesen wie das funktionieren soll). Der Vorteil ist das Dich als Programmierer das eigentlich nicht kratzt (das wäre in etwas so als wenn du bei Microsoft fragen würdest wo die Doku zu DCOM ist), die OPC Foundation will, kann, und wird keine Toolkits zur Verfügung stellen, das ist die Aufgabe der Hersteller, und an dieser Stelle erscheint dann erst die API die für dich nutzbar sein soll.

Aber egal, was willst du denn jetzt überhaupt nachen?


----------



## trialanderror (7 November 2012)

Die Dokumente hab ich durch.

Wenn ich nen C++ Wrapper schreiben muss bringt mir C# nicht viel.
Ist auch egal. Die Funktionsweise der API habe ich mir mittlerweile selbst zusammengereimt.
Ich denke wir verstehen unterschiedliche Dinge unter "gut kommentiert", aber da will ich jetzt auch keine Diskussion anfangen.

Im Prinzip besteht mein jetziges Problem aus der Tatsache das ich keine Testknoten anlegen kann um diverse Methoden des (einfachen) Wrappers zu testen (Das muss ja gehen, auch ohne projektierte Verbindungen, mit einer Art Testkonfiguration).
Aber wenn du sagst, dass das eindeutig in den Dokumenten steht, die du aufgeführt hast muss ich halt nochmals schauen. Dann bin ich vllt. doch zu doof gewesen.


----------



## trialanderror (7 November 2012)

> ... die OPC Foundation will, kann, und wird keine Toolkits zur Verfügung  stellen, das ist die Aufgabe der Hersteller, und an dieser Stelle  erscheint dann erst die API die für dich nutzbar sein soll.



Das macht Siemens aber nicht. Oder möchtest du die kleinen Beispielprogrämmchen als "API" bezeichnen?
Ich meine, das ist doch nicht sonderlich professionell, dass man sich die "API" _ausschließlich_ aus den Beispielprogrammen zusammenreimen muss. Oder ist das die Regel unter den Herstellern.


----------



## Dr. OPC (7 November 2012)

OK, alles klar, es geht also "nur" noch im die Knoten und du hast keine "echte" S7 hinter deinem OPC Server sitzen.

Dann nimmst du einfach die "@LOCALSERVER" Verbindung und verwendest Nodes direkt:
"S7:[@LOCALSERVER]DB1.0,b"
"S7:[@LOCALSERVER]DB1.2,dw"
Notation für weiter Datentypen steht im Band 2 der PDF Doku.

Wenn Du diese Nodes "browsen" können willst, musst du sie im Symbolkonfigurator anlegen und ihnen schicke symbolische Namen geben.


----------



## Dr. OPC (7 November 2012)

> Das macht Siemens aber nicht. Oder möchtest du die kleinen Beispielprogrämmchen als "API" bezeichnen?
> Ich meine, das ist doch nicht sonderlich professionell, dass man sich  die "API" _ausschließlich_ aus den Beispielprogrammen zusammenreimen  muss. Oder ist das die Regel unter den Herstellern.



Siemens ist ja auch kein Hersteller von Toolkits und SDKs (obwohl sie für C# ein (kleines) OPC Toolkit (kostenlos) mit ausliefern). Richtige OPC Toolkits und SDKs gibt es von den bekannten Herstellern: Unified Automation, Softing, Terxasoft, ... und vielen anderen --> google hilft.


----------



## trialanderror (7 November 2012)

Das ist jetzt glaube ich genau die Antwort die ich so verzweifelt gesucht habe.

Es ist also so, das auch Knoten existieren, die nicht im Namensraum beim browsen auftauchen?
Ich konnte die bisherigen Knoten, mit denen ich getestet habe bisher über zwei Möglichkeiten ansprechen:
1. Numerische ID
  Beispiel: 2255 für den Namespacearray
2. Namespace ID + String ID
  Beispiel: Namespace ID = 3 (S7) + String ID = DEMO.i.0,b
  getrennt voneinander in das Struct eingefügt und der API-Funktion übergeben

Warum macht das Sinn nicht alle Knoten über einen identifiziertyp anzusprechen? Zum Beispiel alle über eine numerische ID?

Deine Variante kann ich jetzt nicht testen, da mein Wrapper sich im Umbau befindet und ich nicht Compilieren kann 

Ich dachte, da Siemens Hersteller der irgendwann vorhandenen SPS und auch des OPC-Servers(?) ist, meintest du genau das mit "Hersteller".


----------



## trialanderror (7 November 2012)

Die Hersteller der SDKs kenne ich.


----------



## Dr. OPC (7 November 2012)

> Es ist also so, das auch Knoten existieren, die nicht im Namensraum beim browsen auftauchen?



das hast du genau richtig erkannt. Browsen kann man "Symbole" (und Alias Namen, ein Relikt aus früheren Tagen, gibt es bei UA nicht mehr). Wenn man die NodeID kennt braucht man nicht browsen. Es kann NodeIDs geben, die nicht browsbar sind bzw. die nicht im Adressraum auftauchen.



> Ich konnte die bisherigen Knoten, mit denen ich getestet habe bisher über zwei Möglichkeiten ansprechen


das ist nicht ganz richtig, es gibt nur EINE Möglichkeit eine Node anzusprechen sie besteht immer aus "NameSpace + Typ + ID", die ID ist im Namespace eindeutig, der Typ kann "String" ODER "Numeric" sein (oder GUID oder Opaque, allerdings nicht bei Siemens). 

Also es gibt einen durch OPC Foundation definierten Namensraum (namespace index 0) in dem sind numeric IDs eindeutig durch die OPCF spezifiziert, alle UA Server dieser Welt MÜSSEN diesen namespace 0 haben, die ID darin sind FEST und können nicht verändert werden:
ns=0; i(numeric)=2212

und dann gibt es von Siemens definierte/konfigurierte NodeIDs, die sind vom Typ "String" und folgen einer Syntax, die vom Namespace abhängt in dem sie existieren.
ns=3(S7); s(string)="S7:[Verb1]DB1.0,b"
ns=4(S7Com); s(string)="S7:[Verb1]DB1,b0,1"
ns=5(SYM); s(string)="MeinSymbol"
Wobei "SYM" die Symbolik ist und (relativ) frei gestaltbar in ihrer Syntax (einige Soderzeichen sind nicht erlaubt). SYM wird "normalerweise" automatisch von Step7 erzeugt und enthält die symbolischen Namen, die bei der Programmierung der SPS in Step7 verwendet wurden.

Nur DU musst die Symbole nun händisch anlegen, weil du keine SPS hast, sondern einen "internen" DB verwendetst.



> Warum macht das Sinn nicht alle Knoten über einen identifiziertyp anzusprechen? Zum Beispiel alle über eine numerische ID?


NEIN, das macht überhaupt keinen Sinn, das Konzept mit Namespaces ist das EINZIGE das Sinn macht (flexibel und erweiterbar), und deshalb wurde es auch so umgesetzt.


----------



## trialanderror (7 November 2012)

Danke erstmal für die Zeit die du in mich investiert hast 
Du hast mein Verständnis hierfür deutlich verbessert. (Scheint nicht viele zu geben, die sich damit richtig auskennen)

Das heißt in dem Beispiel:


> ...Beispiel: Namespace ID = 3 (S7) + String ID = DEMO.i.0,b...


ist "DEMO.i.0,b" ein Symbol für irgendeine Adresse die sich nach der von dir benannten Synthax richtet?


----------



## Dr. OPC (7 November 2012)

> ist "DEMO.i.0,b" ein Symbol für irgendeine Adresse die sich nach der von dir benannten Synthax richtet?



Also das ist kein Symbol sondern eine "direkte Addresse" in der ns=3 (S7) Syntax:
DEMO = Name der Verbindung zur SPS (es kann 8 - 64 Verbindungen zu "echten" SPSen geben)
i = Datenbereich INPUT
0 = Offest Byteadresse innerhalb des Datenbereichs
b = Datentyp Byte (8Bit)
Es wird also das Eingangsbyte 0 der SPS Steuerung addressiert, die sich an der Verbindung "Demo" befindet.

"S7_Verbindung_1.DB1.10,dw"
Es wird ein DWord im Datenbaustein 1 ab der Byteoffsetadresse 10 addressiert, das sich in der SPS befindet, die über die Verbindung "S7-Verbindung_1" configuriert ist.

Weitere Beispiele und Datentypen findest du im Band 2 Handbuch Kapitel "Syntax der S7 Variablen"

Um das auch browsen zu können, musst du eine Symboldatei anlegen und der Adresse einen "symbolischen" Namen geben:
"MeineTemperatur" = "S7_Verbindung_1.DB1.10,dw" (// falls in der SPS an de Stelle der Messwert abgelegt ist)
"MeinEingangsByte" = "DEMO.i.0,b"
Die Symboldatei kannst du zusammenbauen wie du willst (Ordnerhierarchie und Variablennamen), oder aber sie wird automatisch erzeugt von Step7 (was der "Normalfall" ist), denn Step7 weiss was an welchen Datenbereich der SPS angeschlossen ist und kann somit auch die Symboldatei einfach (und konsistent zum Programmcode in der SPS) erzeugen.


----------



## trialanderror (8 November 2012)

> Also das ist kein Symbol sondern eine "direkte Addresse" in der ns=3 (S7) Syntax:


Achso. Ich dachte weil sich das nicht direkt an die Synthax hält, mit den eckigen Klammern.

Ich werd mal schauen, was ich mit dem Symboleditor hinbekommen.


----------



## Dr. OPC (8 November 2012)

Die eckige Klammer ist in der "S7Com" Syntax im anderen nameSpace ns4=S7COM. Es handelt sich hierbei um die (alte) "kompatible" Syntax von früher (aus den Zeiten des OPC DA Servers).

Dort war die direkte Adresse "S7:[S7Verbindung_1]DB1,B0,1" also etwas anders. Der Unterschied ist das die neue Syntax "schneller" ist, die alte wird nur noch aus Gründen der Kompatibilität "mitgeschleppt".


----------



## Samber (21 Juni 2017)

Hello,
Thanks a lot for the help,
Can you also provide me the link from where i can download the Simatic Net OPC UA Server.
With Best regards
Saurabh Samber


----------



## volker (23 Juni 2017)

Hello

The Server is not freeware. You must buy it
https://mall.industry.siemens.com/mall/de/WW/Catalog/Products/9300174?tree=CatalogTree


----------



## Samber (24 Juni 2017)

Hello 

Thanks for the reply.

Actually i want to buy Siemens Simatic net OPC UA Server and i am using S7 300 PLC, Can you please
gimme the link of this Opc ua which support these details


----------

