# Größere Datenmengen aufzeichnen?



## logo78 (3 Februar 2010)

Hi,
Ich muss mehrere struktruierte DBs extern mitaufzeichnen können.
Es sind recht große Datenmengen (Bits, Bytes, Words etc..). 
20 Datenbausteine pro Anlage mit jeweils ca. 1Kbyte.

Wir hätten noch eine Autem Lizenz hier herumfliegen, aber für mein Zweck sehr unkomfortabel einzurichten (da keine Strukturen und pro Tag maximal ein Doppelwort aufgezeichnet werden kann) und es ist zu bezweifeln, ob er diese Datenmengen überhaupt schafft. 

Libnodave und Konsorten fallen Aufgrund der Komplexität vorerst mal weg.


Der Siemens OPC macht schon einmal einen vernünftigeren Eindruck (Brecv). Wenn es denn am Schluß funktioniert;

welchen Client (als Logger zum Aufzeichnen) könnte ich nehmen
wie schnell wäre dieser? Ist das Vorhaben machbar?
Ändert sich irgendwie die Zykluszeit der S7 CPU dadurch?
komme ich irgendwie an die Strukturen/UDTs der DBs dran oder kann ich die irgendwie importieren, damit auch diese so aufgezeichnet werden?
was wäre die Alternative zu diesem Vorhaben?


----------



## ronnie.b (3 Februar 2010)

Hallo,
wie sollen die Daten denn aufgezeichnet werden?Zyklusgenau oder in bestimmten Zeitintervallen???
Was willst du denn mit den Daten dann machen? In ne Datei/Datenbank schreiben etc.??
Ich persönlich würde da auf eine Individuelle Lösung, sprich was selbst programmiertes in einer Hochsprache in Verbindung mit z.B. Prodave oder einem anderen Produkt.

Ronnie


----------



## Dr. OPC (3 Februar 2010)

Bei der Verwendung der sogenannten "Blockdienste" ist zu beachten dass diese zwar schnell und für große Datenmengen geeignet sind aber die Datenkonsistenz nur dann gesichert ist, wenn man bestimmte Dinge beachtet.

Der OPC Server stellt ein Item bereit (Name=brecv, Länge=blocklänge, Typ=Array of Byte) in diesen "Empfangspuffer" sendet die SPS die Daten beim Aufruf des bsend. Der OPC Server benachtichtigt den Client und schickt das ganze Array weiter wenn sich irgendein Element geändert hat, hat sich das Array geändert.

Auf Seite des OPC Servers weiß aber niemand ob der Client die Daten "verarbeitet" hat, schickt die SPS inzwischen wieder einen Datenblock, wird der "Empfangspuffer" überschrieben und der Server schickt dem Client den neuen Datenblock.

Die "Interpretation" des Inhalts dieses ByteArray muss der Client wissen (das kann man nicht auslesen, aus Sicht des Client ist das einfach ein ByteArray). 

Nun gibt es aber die Möglichkeit den OPC Server zu "konfigurieren" und innerhalb des "Empfangspuffers" wiederum selber Items zu definieren. Es kann dadurch Bytes und Words geben, die ab einem Offset im Empfangspuffer zu interpretieren sind. Diese selber definierten Items sind "Ansichten" auf den Empfangspuffer und sind für den Client als Einzelvariablen sichtbar. Sie werden vom OPC Server auch einzeln gemeldet, falls sie sich ändern.

Kurzum mit brecv ist das nicht so einfach. Konsistenz ist nur innerhalb eines Typs sichergestellt.

Mein Vorschlag: die "Variablendienste" nehmen (die Struktur der DBs und UDTs wird im OPC Server Adressraum in Ordner und Unterordner abgebildet, dazu die Symbolik des OPC Servers einschalten http://www.sps-forum.de/showthread.php?t=32881) und dann die zu einem DB gehörenden "Einzelvariablen" komplett mit einem Read-Aufruf lesen. Um sicherzustellen dass sie sich währenddessen nicht ändern, einfachen ein Handshake über zwei Merkerbits fahren. Die SPS setzt Bit1= "Daten bereit zum lesen, werden nicht mehr geändert" und der Client setzt Bit2="fertig mit lesen, darf wieder geändert werden".

Die Zykluszeit der CPU ändert sich nicht (solange die 20% nicht überschritten werden), der "Sende-Auftrag" wird an den CP abgegeben und dort separat behandelt, der Sendebaustein prüft in jedem Zyklus ob der Auftrag fertig ist, nur dann wird das DONE Flag gesetzt.

Fertige OPC Clients die auf "Trigger" (also die Änderung eines Bits) ganze "Datensätze" lesen und in Excel oder Datenbanken schreiben gibt es einige, man konfiguriert das Triggerbit (ein OPCItem) und man konfiguriert was dann gelesen werden soll (viele OPC Items) und konfiguriert wo die Daten landen sollen. z.B. IndustrialDataBridge von Siemens oder auch DataLogger von Softwaretoolbox.


----------



## logo78 (3 Februar 2010)

Erstmal vielen Dank für die kompetenten Antworten.

Ich möchte eigentlich so schnell wie möglich miterfassen (Siemens OPC Server >= 250ms), Daten müssen aber mehr oder minder konsistent sein. Mir ist schon klar, das dies riesige Datenmengen sind, aber wir haben zum Teil unerklärbare Phänomene.
Probleme mit angrenzenden Anlagen oder mit der MFR können natürlich auch nicht ausgeschlossen werden, weswegen ein Aufzeichnen relevanter Daten umso wichtiger wird.

Es geht um mehrere EHB-Anlagen mit dutzenden Fahrzeugen, die Fahraufträge von einem übergeordneten Materialflussrechner Aufträge (Ascii-Telegramme) bekommen.
Wir haben recht viele Schnittstellen mit angrenzenden Anlagen, die allesamt bis auf ein paar wenige DP-Slaves, per TCP/IP (leider kein TCP-ISO) kommunizieren. Kurzum, bei einer Störung, muss an vielen Stellen nachgeschaut werden, was nach dem Auftritt des Fehler zu meist unmöglich wird, noch irgendetwas zu finden.

Die reine MFR<->SPS Kommunikation protokolliere ich dank WireShark mit.
Nun habe wir noch die SchnittstellenDBs und die FahrzeugDBs die ich allesamt mitaufzeichnen möchte.

Eine individuelle Lösung kommt aufgrund mangelnder Zeit und mangelnder Flexibilität (bzw. anpassbarkeit) vorerst nicht in Betracht; so gern ich das auch versuchen würde.
Wir beissen mal jetzt in den sauren Apfel & kaufen ein paar Lizenzen, so lange es nicht 5-stellig wird 

@Dr. OPC,
deinen Link hatte ich schon gestern Nacht verinnerlicht 
Irgendwie hat es aber mit dem Koppeln des OPC-Projekts mit dem eigentlichen S7-Projekt noch nicht so richtig geklappt.
Werden wirklich alles Symbole auch aus DB importiert? (WinCCFlexibleStyle?)

Deine berechtigten Anliegen zu dem Konsistenzproblem habe ich soweit verstanden. Nach gründlicher Überlegung, finde es auch etwas umständlich die Daten später auszuwerten, da ja alles als ein Packet versendet wird.
Ich denke ich mache mir die Arbeit und bilde ich die Strukturen als Ordner und Unterordner ab und habe es später bei der Auswertung dafür umso leichter.

Soll ich die Struktur direkt im OPC Server schon abbilden, oder doch lieber im OPC-Client. Ich habe heute etwas mit der Trial von DataLogger experimentiert. Sieht sehr komfortabel aus. Auch die Import/Export Funktionen der Tags find ich klasse.
Wenn ich deinen Text richtig lese, wird ein Abruf an den OPC-Server mit dem entspr. Alias genügen und die vorhandene Struktur vom OPC-Server auslesen zu lassen. Wenn ich das im Client mit direkten Adressen mache, wären es dann mehrere Aufrufe, richtig?

Könntest du das mit den 20% nochmal genauer erläutern?
Angenommen ich werde alle 250ms 20mal 1Kbyte an Daten anfordern; dass muss sich doch irgendwie auf die Zykluszeit bemerkbar machen. 
Bei sovielen Daten werden die 250ms wohl nicht mehr langen. Was denkste mit welcher realistischen Frequenz an Aktualität ich bei einer 416 per S7-Verbindung ich rechnen darf?

Kann man eigentlich mit DataLogger so triggern, das vor und nach dem Triggerereignis ein gewissen Gap mitaufgezeichnet wird (quasi TimeShifting) so wie Autems Sps Analyzer?

Das mit dem HandShake wird schwierig werden da sich die DBs eine sehr hohe Fluktuation haben. Der wird mir wohl der Umweg über einen zusätzlichen BufferDB nicht erspart bleiben.

Danke für die Aufmerksamkeit; jetzt darf geschlagen werden


----------



## Dr. OPC (4 Februar 2010)

Um die Symboilik zu Verwenden:
1) "SimaticPC Station" in das Step7-Projekt (indem die SPSen sind) hinzufügen
2) in HWKonfig: "OPC Server" und "IE-Allgemein" reinstecken
3) in NetPro: S7-Verbindungen zu den SPSen projektieren vom OPCServer zur SPS, nicht umgekehrt, die Verbindungen sollten aktiv, permanent, schnelle Rückmeldung angeschaltet haben
4) dann OPCServer doppelklicken und in der S7-Lasche die Symbolik einschalten bzw. konfigurieren.
5) speichern/übersetzen und in den OPC Server laden (oder auch XDB Import)

Ja, es kommen alle "Bezeichner" aller DBs und UDTs als Ordner und Unterordner raus, sie müssen natürlich einen Namen besitzen (also Symboltabelle aufmachen und für alle DBs und UDTs schicke Namen vergeben)

Im DataLogger klickerst Du dann einfach zusammen was du brauchst. Leider kann man keine "komplette Struktur" lesen sonden man muss "OPCItems" lesen (diese sind allerdings nur "einfache Datentypen" oder "Arrays von einfachen Typen" aber eben nicht "komplexe Strukturen") daher wird ein UDT auch (nur) wie ein Ordner abgebildet und nicht wie ein "Objekt vom Typ Struktur". Aber man muss diese nicht "einzeln" lesen sonder macht einen "Mengenaufruf" also EIN Leseauftrag der dann 100 oder 1000 OPCItems auf einen Schlag liest. 

OPC hat zwar auch eine Spezifikation über "Complex Data" erlassen aber diese wurde von keinem Hersteller in OPC Servern umgesetzt, daher gibt es nur Scalare und Arrays. Beim neuen OPC UA wird das natürlich anders dort gibt es "Objekte" die "alles" sein können.

Die SPS "reserviert" üblicherweise ca 20% ihrer Leistung für Kommunikationsaufgaben. Bei der Berechung der Geschwindigkeit gehe ich mal von Daumenwerten aus (genaues muss man dann messen). Ein einigenmaßen neuer CP443-1 kann so zwischen 150 und 250 "Aufträge" pro Sekunde verarbeiten. Nun kommt es darauf an was in einem "Auftrag" angefordert wird (enn Du über OPC zyklisch Read auf ein einzigen Item (das auch noch ein Boolscher Typ ist) machts dann schafftst du ca. 200 Bit/sec. Wenn Du aber die "Mengenaufrufe" nutzt und in einem Read ca. 500 Items oder mehr vom Typ Byte anforderst, dann kann der OPC Server zur SPS schön die PDU voll machen und ca. 100k/sec sind machbar. Diese Lese/Schreib-Optimierung funktioniert aber wie gesagt nur wenn du (der Client) dem OPC Server die Chance dazu lässt und immer möglichst viele Items auf eine Schalg liest/schreibt.

Leider kann man sich das nicht immer so optimal aussuchen und daher rechne ich im Schnitt mit 5k-10k pro sec.

OPC macht immer einen sogenannten "snapshot", das bedeutet du bekommst den Wert zum Zeitpunkt als er gelesen wurde (der Zeitstempel, der bei einem Wert immer mitgeliefert wird, ist der Zeitpunkt an dem der OPC Server "Kenntniss" von dem betreffenden Wert erlangt hat, in der SPS kann mitlerweile schon ein andere Wert sein) Das ist im Prinzip auch nicht schlimm solange die Werte, die Dich interessieren, alle den selben Zeitstempel haben.

Da es sich bei Dir um "zusamenhängende" Auftragdaten handelt wirst du diese wohl komplett und konsistent umkopieren müssen und dann (in Ruhe) und über ein Handshake gesichert vom PufferDB zum OPC Client übertragen müssen.


----------



## Jochen Kühner (5 Februar 2010)

*Konsistent aufzeichen...*

Schau dir mal meinen protokoller und die Bausteine dazu an!
Der macht eigendlich genau das was du willst.

Meine Bausteine kopieren die Daten vorher in einen Puffer DB, und aus diesem werden dann die Daten an den PC (mit Handshake) übertragen.

Für diese große Datenmenge klappt das abholen der Daten mit LibNoDave warscheinlich nicht schnell genug, da hier immer nur max die PDU größe gelesen werden kann. Habe aber auch eine Datenübertragung per TCP/IP Kopplung in meinem Protokoller realisiert! Und in der neuen Version (welche Ich gleich hochlade) können auch mehrere Datensätze zusammengefasst auf einmal über die TCP/IP Kopplung übertragen werden!

Schau dirs mal an! (Quelltexte sind dabei)

http://sps-forum.de/showthread.php?t=29131


----------



## logo78 (11 Februar 2010)

Hmm, obwohl ich gestern Abend geschrieben hatte, scheint mein Posting verloren gegangen zu sein; nun denn.

@Dr.,
vielen Dank für Walkthrough, mit dem es dann auch geklappt hat. Leider etwas zu spät sah ich auch die Verfahrensanleitung von Siemens. Dort ist alles auch beschrieben.
Die Symbolik (\Sym) wird nun angezeigt, allerdings kriege ich beim Versuch es zu importieren den Fehler im Anhang.
Ich habe es versucht zu ergooglen, fand' aber nichts. Ich dachte zuerst, dass es womöglich an den Sonderzeichen (Space, Dot, Underscore etc..) liegen könnte, aber im Siemens Beispiel sieht es genauso aus.

Wenn ich mehrere Steuerung mit mehreren unterschiedlichen Symbolik Dateien hinzufügen wollte, müsste ich dann ein Multiprojekt anlegen?
Edit: Lt. Beschreibung würde könnte man nur mit einer Symbolik arbeiten.

Muss ich die Konfiguration im NetPro auch auf die Steuerung übertragen, oder dient sie nur dem OPC-Server wegen der Symbolik und Pfaden (Adressen)?
Edit: Bei einer einseitigen S7-Verbindung ist das wohl nicht notwendig. (Adressendetails/Verbindungsressource(hex)=03)

@JFK,
vielen Dank für den Hinweis, welches ich mir bei Erstbester Gelegenheit anschauen werde.


----------

