# OPC Variablen via C++ lesen und schreiben



## AkrapovicSPS (10 September 2013)

Hallo Leute,

ich bin neu in diesem Forum (bitte seid nachsichtig, wenn ich irgendwie gegen eine Forumsregel verstoße ). Ich arbeite zur Zeit an einem Prüfstand welcher mit einer sehr alten BOSCH Rexroth IndraLogic L40 SPS betrieben wird. Der Hauptteil der Steuerung (also der Prüfablauf) wird momentan noch über LabView abwickelt. Dafür tauscht die SPS den Hauptteil ihrer Variablen mit einem CoDeSys OPC - Server aus. Dieser läuft auf einem Hostrechner direkt am Prüfstand. 

Meine Aufgabe ist es nun den ganzen Prüfablauf auf ein C++ - Programm umzustellen, das auf einem separaten Rechner im gleichen Netzwerk läuft. Dazu muss ich eben auch auf die OPC - Variablen auf dem CoDeSys - Server zugreifen können - also lesen und schreiben. Ich dachte es wäre dafür am sinnvollsten, einen OPC Client in C++ zu realisieren, der sich "einfach" auf den Server hängt.
Ich habe im Internet auch schon einige Beispielprogramme gefunden, allerdings sind diese alle in Visual Studio programmiert und scheinen auch einige windowsspezifische Libraries zu verwenden. 

Ich hingegen verwende zum Programmieren den QtCreator und die entsprechende QtLibrary. Da ich damit jetzt auch schon einiges für diese Anwendung programmiert habe, möchte ich nur ungern auf ein anderes SDK wechseln. 

Hat jemand eine Idee bzw. einen Samplecode mit dem ich - unter den genannten Voraussetzungen - möglichst simpel auf die OPC - Variablen zugreifen kann? Ich bin auch gerne für andere Lösungsvorschläge offen, allerdings muss ich wohl bei C++ bleiben.

Meine Idealvorstellung wäre irgendeine Library z.B. für einen bereits existierenden Client, bei der ich dann im Code nur noch 
	
	



```
OPCServer.write(variable,"Wert")
```
 oder sowas in der Art schreiben müsste.

Vielen Dank schonmal im Voraus!


----------



## Dr. OPC (11 September 2013)

C++ ist natürlich eine gute Wahl, (ebenso wie QT für deine Oberfläche). Es gibt einige Beispiele im Internet, aber alle basieren auf VisualStudio da es speziell für die COM Technologie von MS nur im Studio entsprechende Unterstützung gab (z.B. ATL, active template library). Die "alten" OPC DA Server sind ja allesamt COM Server (entsprechend der COM Definition von MS). Ein entsprechnder Wizzard im Visual Studio führt durch die Erstellung eines COM Clients (ATL Projekt).

Eine von vielen Sammlungen von C++ Beispielen, gibt es auf der SimaticNET CD und sie liegt nach der Installation hier: (C:\Program Files\Siemens\SIMATIC.NET\opc2\samples\Custom). Sehr einfaches, leicht verständliches Beispiel, verbinden, lesen, schreiben, einmal sychron und einmal asynchron (für "Fortgeschrittene" mit Callback-Implementierung).


----------



## AkrapovicSPS (11 September 2013)

Hallo Dr. OPC,

vorab vielen Dank für deine schnelle Antwort. Ich habe leider keine SimaticNET CD zur Hand. Könntest Du eventl. die Samples hier posten?


----------



## Dr. OPC (11 September 2013)

support.automation.siemens.com: Beitrags-ID:77378184

Das ist das Handbuch Band 2 von SimaticNET, da liest du dir am besten mal Kapitel 6.2 durch und danach gleich 6.3 (das sollte reichen, um einen C++ Client zu programmieren). Anstelle CoCreateInstance() musst du natürlich CoCreateInstanceEx() nehmen, denn du willst den Server ja remote aufrufen (aber vielleicht fängst du erstmal "local" an).

Wie gesagt es gibt auch noch viele andere Beispiele, aber ich kenne keins das besser dokumentiert ist und auch die "OPC Hintergründe" besser erklärt. Wenn du es noch einfacher brauchst (library) dann gibt es einige kommerzielle Toolkits, die viele Funktionen vereinfachen und kapseln und "automatisch" wiederverbinden, nach Netzwerk fehlern, usw., etc.


----------



## AkrapovicSPS (12 September 2013)

Ok, dann probiere ich es mal damit. Vielen Dank schonmal!


----------

