[OPC] Items hinzufügen schlägt fehl (OPC_E_UNKNOWNITEMID) mit SIMATIC OPC Server

namX

Level-1
Beiträge
2
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo SPS-Freunde,

ich bin gerade dabei mit einer .NET-Bibliothek über OPC auf die Datenbausteine in einer SPS zuzugreifen.
OPC-Client und SIMATIC OPC Server laufen auf dem gleichen PC. Mit dem OPC Scout v10 und dem Matrikon OPC Explorer ist es möglich, über die bekannte ItemID ("S7:[OPC_1]DB50,DINT38") auf die Werte zuzugreifen.

In meiner eigenen OPC-Implementation in C#/.NET bekomme ich allerdings nach erfolgreichem Verbindungsaufbau und hinzufügen einer Gruppe bei der AddItems-Methode am IOPCItemMgt-Interface für die kopierte ItemID
den Fehlercode OPC_E_UNKNOWNITEMID (-1073479673/C0040007). Die übergebene ItemID ist soweit richtig, allerdings macht der Aufruf trotzdem Probleme.

Der Aufruf der Methode erfolgt mit den folgenden Parametern:
Anzahl der Items - 1 (es wird immer nur ein Item einzeln angefordert)
Item-Definition:
- ItemID - wie oben beschrieben die gewählte ItemID nach SIMATIC-Standard.
- Access Path - Ist erneut die ItemID.
- Active - true
- Client-Handle - 50
- Blobsize/Blob - 0 und ein leerer Int-Poitner
- Requested Data Type - wird über einen Aufruf von "GetItemProperties" vor dem hinzufügen herausgefunden.
- Reserved - 0

Die .NET-Bibliothek basiert auf dem folgenden Quellcode: http://www.codeproject.com/Articles/1135/OPC-and-NET-with-COM-Interoperability
Kann es vllt. damit zusammenhängen, dass ich den Access Path gleich der ItemID verwende und der SIMATIC OPC Server damit Probleme hat? Ich werde mal probieren mit einem leeren Access Path zu arbeiten.

Vielen Dank für weitere Anregungen im Voraus!
 
Habe es jetzt mit einem leeren/nicht gesetzten Access Path probiert und es hat funktioniert! Manchmal muss man sein Problem wohl einfach mal runterschreiben um das bedeutende Detail zu bemerken. ;)
Ich hoffe ich kann damit anderen Personen in der Zukunft helfen nicht dem gleichen Problem zu erliegen. Im Falle des SIMATIC OPC-Verbindung ist der Access Path wohl u.U. bedeutend, deswegen einfach frei lassen. Ich habe aber schon andere OPC Server erlebt, wo es keine Probleme macht den Access Path auf irgendetwas (und sei es die ItemID) zu setzten und widerum andere, die eine besondere Angabe erfordern.

Liebe Grüße,

namX
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo namX,

es ist immer hilfreich "sich das Problem mal von der Seele zu schreiben", dann kommt man selber auf die besten Ideen, das geht mir genauso.:D

Wie Du richtig erkannt hast, wird der "AccessPath" von (fast) allen Server ignoriert (daher kannst du auch irgend einen Mist reinschreiben), die meisten brauchen keinen "AccessPath" denn die ItemID ist bereits ein sogenannter "fully qualified identifyer". Der SIMATICNET OPC Sever braucht den AccessPath auch nicht, aber er ignoriert ihn auch nicht, daher muss er "leer" bleiben.

Aber ich habe noch einen weiteren Tip für dich. Es ist sicher immer besser "mehrere" Items gleichzeitig in einem AddItems hinzuzufügen, denn der OPC Server fängt ja "sofort" an und versucht das neue Item aus der S7 zu beschaffen, wenn du also weißt das es "mehrere" werden, dann füge sie möglischst "in einem Rutsch" hinzu. Die Gruppe solltest du erst "hinterher" aktivieren.
Angenommen du fügst 100 Items "nacheinander" hinzu, dann ist das für Dich vielleicht nicht schlimm, aber es kann sehr anstrengend für den Server werden. Du musst dir das so vorstellen: er muss ein Telegramm an die S7 schicken um Daten zu beschaffen, das macht er zyklisch, er fügt EIN Item in seinen zyklischen Transport ein, dann bekommt er den Wert, dann baut er den zyklischen Transport komplett ab, fügt das ZWEITE Item in den Zyklus, dann bekommt er 2 Werte, dann baut er zyklischen Transport wieden komplett ab, und fügt das DRITTE hinzu, usw.
Du machst ihm das Leben viel leichter, wenn du erst die Gruppe deaktivierst, dann ein einem Ruscht alle 100 Items einfügst und anschließend die Gruppe aktivierst. Der Server baut dann einmalig nur einen zyklischen Transport zusammen und startet diesen erstwenn die Gruppe aktiviert wurde.

Weiterhin deutlich beschleunigen könntest du die ganze Sache wenn du den GetItemProperties weglässt:
- Requested Data Type - wird über einen Aufruf von "GetItemProperties" vor dem hinzufügen herausgefunden.
Das ist eigentlich nicht erforderlich und es "kostet" auch Zeit denn es ist ein "einzelner" Aufruf für jedes Item. Typischer weise wird als "RequestedDataType" einfach VT_EMPTY angegeben, dann weiß der Server, dass er den Wert genau in dem DatenTyp liefern darf, in dem er ihn aus der S7 bekommen hat, dem sogenannten "Cannonical DataType". Man gibt hier nur dann ertwas an wenn man möchte, dass der Server den Wert in einem ANDEREN DatenTyp konvertieren soll, also z.B. als "String" liefern soll obwohl es eingentlich ein DINT ist, dann könntest Du deinen DINT38 gleich direkt in eine TextBox zuweisen. Wie gesagt ist das (meistens) nicht nötig, da du es ohnehin selber casten kannst.
 
Zurück
Oben