OPC - Client programmieren mit Microsoft Visual Studio 2008

Beiträge
17
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,

ich habe follgende Problemstellung:
Es soll an Siemens SPS Steuerungen über 1x S5-Lan & 1x S7-Lan - Stecker von Process-Informatik, über den OPC - Server (OPC-Manager) von Process-Informatik E/A/M etc. beobachtet werden können.

Über diesen OPC Manager komme ich bereits an die Steuerungen Online und kann die Variable auch beobachten / schreiben.

Doch nun brauche ich das Sprungbrett von meinem Visual Studio 2008 C# Projekt raus auf den OPC - Server.

Ich suche den Quelcode eines Client, damit ich den OPC-Server ansprechen kann.

Kann mir jemand weiterhelfen?
 
Opc da

Hallo,

Ralle schrieb:
allerdings nicht kostenlos und ob mit Quellcode???

Nicht kostenlos, aber noch relativ günstig. Jedenfalls wenn man den Arbeitsaufwand zur Erstellung eines zuverlässig funktionierenden OPC-Clients in Relation setzt.

Und die Quelltexte werden vom Herrn Kassl mitgeliefert ...

Natürlich nicht bei der Demoversion :ROFLMAO:, aber wer eine Lizenz kauft bekommt auch die Quelltexte. Und einen absolut sauber funktionierenden OPC-Client dazu.

Gruß

Question_mark
 
Von der OPC Foundation gibt es (auch für Nicht-Mitglieder) verschiedene Komponenten zum Download. Oft werden diese ins Setup des Servers integriert und befinden sich somit schon auf der Maschine.

Die OPC Schnittstelle ist als sogenanntes "Custom-Interface" definiert. Dabei handelt es sich um eine C++ Schnitstelle, die den Regeln des COM (Component Object Model) von Microsoft unterliegt. Zum "direkten" Zugriff auf Schnittstelle muss auch der Client in C++ geschrieben sein.

Um aber auch Clients mit anderen Sprachen entwickeln zu können, gibt es das sogenannte "Automation-Interface" eine Schnittstelle für VisualBasic V6 (bzw. VBA von Excel). Dabei handelt es sich um eine DLL, die vom Client geladen wird und dann die Aufrufe an den Server "weiterleitet" (daher auch gerne "Automation-Wrapper" genannt).

Für die (neuen) .NET Sprachen C# und VB.NET gibt es die RCW (Runtime Callable Wrapper) die zwischen managed und unmanaged Code "vermitteln".

http://www.opcfoundation.org/Downloads.aspx?CM=1&CN=KEY&CI=286&CU=7

Für Mitglieder der OPC Foundation gibt es weitere Komponenten, Beispiele und auch Source Code. Unter anderem die ".NET API" eine Schnittstelle, die direkt in .NET verwendet werden kann und quasi die COM und die .NET Technologie verbindet.

http://www.opcfoundation.org/Downloads.aspx?CM=1&CN=KEY&CI=281&CU=16

Darüber hinaus gibt es die schon erwähnten Drittanbieter, die zum Teil die ".NET API" der OPC Foundation weiter vereinfacht haben oder sie als Basis benutzen. Es gibt natürlich auch komplette Neuentwicklungen und sogar Tools, bei denen man nicht mal mehr programmieren muss. (das eignet sich meist nur für einfache Anwendungen)

http://www.kepware.com/Products/OPC_ClientAce.asp

Eine recht große Liste an Anbietern gibt es hier:
http://www.opcconnect.com/dotnet.php
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Verweis auf OPC Manager

Ich habe nun wie im Anhang beigefügt einen Verweis auf den OPC Manager gefunden.

Hierbei gibt es die Methode Conect mit Übergabeparameter,
kann mir jemand genau beschreiben, wie ich nun eine Verbindung zu dem OPC Manager aufbaue?

Übergabe 1(string) = Name des OPC Servers
Übergabe 2 (object) was ist das?

------------------------------------------------------
Steht die Verbindung zum Server,
wie spricht man dann die Groups / Items an?
 

Anhänge

  • OPC.JPG
    OPC.JPG
    169,3 KB · Aufrufe: 161
Kleines Beispiel...

Hi, anbei findest du ein kleines Beispiel aus dem Internet. Dieses benötigt eine Interface-DLL: OPCAutomation.dll.
Ansonsten hat Dr. OPC, ich denke, alles relevante erwähnt. OPC ist meines erachtens ein recht komplexes Gebilde, was doch einige Einarbeitung benötigt.
Gruß
Stefan
 

Anhänge

  • opcclientvbnet.zip
    33 KB · Aufrufe: 274
Eine Datenkommunikation mit einem OPC Server (DataAccess) sieht prinzipiell immer gleich aus. Es sind (vereinfacht gesagt) nur 4 Schritte erforderlich:

1) Connect
hier Name des Servers (ProgID) und optional Name des Rechners (Node) angeben falls er auf einer anderen Maschine läuft als der Client

2) AddGroup
die Gruppe ist eine "Organisationseinheit", hier stellt man wichtige Dinge ein wie "UpdateRate" und "Deadband", an diesem Objekt meldet man sich für DataChange-Events an (ähnlich wie ein Button, der feuert einen Event wenn drauf geklickt wird)

3) <Browse> optional, nur wenn man die ItemIDs nicht kennt
Wenn man die "Syntax" der ItemsID (Item = Variable = Prozesswert-Repräsentant) nicht genau kennt, kann man den Server durchbrowsen, StefanK hat sich das gespart und die ItemsIDs in einem ini-File hinterlegt.

4) AddItems
Die Items die einen interessieren, müssen zu der Gruppe hinzugefügt werden, beim Hinzufügen sollte die Gruppe "passiv" sein, da sonst sofort Events kommen können

5) Anmelden und Aktivieren der Gruppe
wird die Gruppe "scharf" geschaltet, holt der Server die Daten vom Prozess (meistens pollend aus der SPS) und prüft ob sie sich, im Vergleich zum letzten mal, (um mehr als "Deadband") geändert haben, falls ja feuert das Gruppen-Objekt beim Erreichen der nächsten "UpdateRate" einen DataChanged-Event, der NUR die geänderten Werte enthält (die anderen kennt man ja schon vom letzten mal). Um rauszufinden zu welchen Items die Werte gehören gibt es die ClientHandles (eine Indexnummer, die man dem Server beim AddItems bekanntgegeben hat) diese Nummer schickt er beim Event mit den geänderten Daten zurück.

>> warten auf Daten-Änderungs-Meldungen
Im Eventhandler muss man nun (möglichst schnell) die gemeldeten Daten weg kopieren oder verarbeiten. Kleiner Hinweis: niemals im Eventhandler wieder den OPC Server rufen oder in andere Komponenten (z.B. Datenbank) reinrufen, sonst kann sich das Ganze ineinander verschachteln und klemmt.

6) <SyncWrite> optional, wenn man es will
mit den ServerHandles, die man beim AddItems bekommen hat, kann man auf die Items schreiben. Diese Indexnummern dienen dem Server dazu herauszufinden um welches Item es sich handelt, dass ist viel einfacher (und schneller) als jedesmal wieder die Namen (strings) zu prüfen.

Also im Prinzip ist das ganz einfach. Die ganzen anderen Funktionen von OPC braucht man nur wenn man spezielle Dinge tun will.
 
Zuletzt bearbeitet:
Obwohl ein funktionierendes Beispiel für die beschriebene Aufgabe mit ca. 1 Din A4 Seite Code programmierbar ist, muss man zugeben, dass mit Fehlerbehandlung und zuverlässiger Handhabung von Verbindungsunterbrechungen, etc. es sicher deutlich aufwendiger wird.

Mit einer professionellen Bibliothek (oder auch ActiveX) spart man sich sicher viel Arbeit.

Das einfachste mir bekannte Produkt ist "ClientACE" von Kepware (http://www.kepware.com/Products/OPC_ClientAce.asp). Hier kann man sogar ohne eine Zeile Code zu schreiben einen Client in .NET erstellen, einfach zusammenklickern. Für die "Poweruser" ist aber auch eine schicke .NET API dabei.

Aber es gibt noch ca. ein Dutzend andere, viele davon aufgelistet bei www.opcconnect.com
 
Hallo, ich befasse mich gerade auch mit der Kommunikation mit einem WebIO der Firma Wiesemann und Theis.
Der Verbindungsaufbau funktioniert soweit einwandfrei.
Sobald ich aber die Methode .OPCGroups der Klasse OPCAutomation.OPCServer aufrufe kommt folgender Fehler.
"Das Objekt des Typs OPCAutomation.OPCServerClass kann nicht in Typ OPCAutomation.IOPCGroups umgewandelt werden."
Wollte ma Fragen ob einer von euch weiß woran das liegen könnte.

Und beim Versuch diese RCW von der OPC Foundation ist ja eine .msm datei. Wie kann ich diese in mein Programm einbinden, als Verweis oder so hab ichs ned hinbekommen...

Vielen Dank schon mal im Vorraus!!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Das msm Paket ist ein Mergemodul, das in msi Installer eingebunden wird, wenn du also ein msi Setup mit dem VS-Studio erstellst, einfach "hinzufügen>Mergemodul" und fertig. Auch andere Setup z.B. NSIS können solche Mergemodule einbinden und aufrufen. Es ist also quasi ein Sub-Setup das von einem anderen Setup aufgerufen wird. Es gibt auch noch ein msi Paket von der OPC Foundation z.B. CoreComponents.msi das auch als eigenstängiges Setup (stand alone) aufgerufen werden kann.

Das OPCGroups Objekt ist eine Collection (ein Collection Objekt). Diese Collection enthält dan ein oder mehrere OPCGroup (ohne s) Objekte, die mit new angelegt werden müssen. An diesm OPCGroup Objekt werden wiederum Methoden aufgerufen. Das OPCServer Objekt ist ein eigenständiges Objekt mit eigenen Methoden. Ein impliziter Cast ist nicht möglich, das scheint der Fehler zu sein den du bekommst.
 
Okay, das mit den msm Dateien ist dann soweit klar. Vielen dank schon mal hierzu.

Nun zur Programmierung:
Geht man beim Aufbau einer OPC Verbindung nicht folgendermaßen vor?

1. OPCMyServer = New OPCAutomation.OPCServer
2. OPCMyServer.Connect(txtSvrName.Text,
"")
3. OPCMyGroups = OPCMyServer.OPCGroups
4. OPCMyGroup = OPCMyGroups.Add(
"Group1")

das bedeutet Zeile 3 ist nicht Zulässig weil ein impliziter Cast nicht möglich ist. Aber wie sage ich meinem Groups Objekt dann, dass es die Items vom OPCServer verwenden soll?
 
1 und 2 ist ok.

3 kannste weglassen

stattdessen die Updaterate aller Gruppen erstmal auf 1 sec setzen
3) OPCMyServer.OPCGroups.DefaultGroupUpdateRate = 1000

bei 4 gleich das Objekt erzeugen und zuweisen
4) Set OPCMyGroup1 = OPCMyServer.OPCGroups.Add("Group1")
der Server besitzt nun eine Collection mit einer Gruppe, du verwendest das Gruppenobjekt für weitere Aufrufe. Die Collection benötigst du nicht.

5) dann erstmal die Callbacks abschalten
OPCMyGroup1.IsActive = False
OPCMyGroup1.IsSubscribed = False

6) nun die Items hinzufügen (alle auf einen Streich)
'bla,bla, parameter befüllen und dann
Call OPCMyGroup1.OPCItems.AddItems(bla,bla, parameter)

7) nun die Gruppe "scharf" schalten (sie liefert dann callbacks)
OPCMyGroup1.IsActive = True
OPCMyGroup1.IsSubscribed = True

8 ) im Eventhandler die Daten abholen, oder Read(fromCache, x, x) aufrufen oder Write()
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Dr. OPC

ich habe es grade so ausprobiert wie du es mir empfohlen hast.
jetzt kommt eine Fehlermeldung bei
OPCMyServer.OPCGroups.DefaultGroupUpdateRate = 1000
und zwar wieder
"Das Objekt des Typs OPCAutomation.OPCServerClass kann nicht in Typ OPCAutomation.IOPCGroups umgewandelt werden."
kann es sein dass irgendwas an meiner OPCAutomation.OPCServer nicht stimmt?

Danke
 
Private WithEvents OPCMyServer As OPCAutomation.OPCServer
Private WithEvents OPCMyGroup1 As OPCAutomation.OPCGroup

OPCMyServer = New OPCAutomation.OPCServer
Call OPCMyServer.Connect("ProgID1", "Node1")
OPCMyServer.OPCGroups.DefaultGroupUpdateRate = 1000
Set OPCMyGroup1 = OPCMyServer.OPCGroups.Add("Group1")

funktioniert bei mir ohne Probleme, die Collection gibt es sobald es das Serverobjekt gibt.

Das setzen der DefaultUpdaterate verhindert dass "0" genommen wird (Parameter nicht gesetzt, bedeutet 0). Die UpdateRate=0 hat bei OPC eine "Sonderbedeutung" und bedeutet "so schnell wie der Server kann". Das ist in den meisten Fällen schlecht, denn es wird unnötig Last auf der SPS erzeugt und die Werte mit 50-100 ms gepollt.
 
Zuletzt bearbeitet:
des ist ja merkwürdig, ich habe genau den gleichen Quelltext und bei mir bekomm ich ne InvalidCastExeption.

Das Objekt des Typs "OPCAutomation.OPCServerClass" kann nicht in Typ "OPCAutomation.IOPCGroups" umgewandelt werden.

Mhh... woran könnte das liegen :cry:
Ich programmiere mit Visual Basic 2008 Express Editon...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
mir ist grad aufgefallen, dass ich noch den OpcDAuto.dll Version 2.0.1.0 verwende. Können die Fehler daher kommen?
Habe jetzt schon ein paar mal gelesen, dass Version 2.0.2.0 verwendet wird.
 
Habe gerade mal geschaut. Die Dateiversion meiner Automation DLL ist 2.02.5.30
Es würde mich wundern wenn das eine Rolle spielt, denn das Teil ist auch schon sehr alt und an der Stelle hat sich bestimmt nichts geändert. Ich vermute eher das es an .NET liegt denn da müssen Objekte erst erzeugt und initialisiert werden bevor man etwas zuweisen kann.

Mein Code ist mit Visual Basic 6 geschrieben, ohne .NET und RCW, und funktioniert auch in Excel VBA.

Kommst du denn weiter wenn du die DefaultUpdaterate nicht setzt sondern direkt die Gruppe anlegst? Die "Add" Methode an der "Groups"-Collection des Server Objekts gibt ein Objekt vom Typ OPCGroup zurück und dieses kann damit direkt meinem OPCMyGroup Objekt zugewiesen werden.

Das OPCGroup Objekt hat dann wiederum eine OPCItems-Collection, der man mit der Methode "AddItems" dann die gewünschen Items hinzufügt.
 
Zuletzt bearbeitet:
Nein, dann kommt der Fehler in der Zeile, in der ich MyServer.OPCGroups.Add("Group) verwende.
Hier mein Quelltext:

MyServer = New OPCAutomation.OPCServer
MyServer.Connect(
"Wiesemann-Theis.DigitalEA.1", "")
MyGroup = MyServer.OPCGroups.Add(
"Group") 'Hier kommt der Fehler:
'Das Objekt des Typs "OPCAutomation.OPCServerClass" kann nicht in Typ "OPCAutomation.IOPCGroups" umgewandelt werden.
MyGroup.IsActive = False
MyGroup.IsSubscribed = False
MyItem = MyGroup.OPCItems.AddItem("box_1.A.", 1234)
MyGroup.IsActive =
True
MyGroup.IsSubscribed = True
MyItem.Write(1)
MyServer.Disconnect()
MyServer =
Nothing

Aber dass man mit VB6 programmieren muss kann ja fast ned sein, denke dann liegt es eher an meinem veralteten dll, nur ist es ja unglaublich schwer an die dlls zu kommen wenn man kein Mitglied in der OPC Foundation ist...
 
Zurück
Oben