WinCC Daten aus DB in csv-Datei schreiben

Earny

Level-1
Beiträge
422
Reaktionspunkte
38
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich muss 1000 Realwerte, die während einer schnellen Messwertaufzeichnung in einen Datenbaustein geschrieben wurden, nach der Aufzeichnung in eine csv-Datei schreiben. Ich arbeite mit der WinCC RT für PC (V13.1) und habe TIA V13.1.
Ich denke im Moment daran beim Klick auf die Schaltfläche "Messwerte übernehmen" einen VB-Skript aufzurufen und dann den Lesevorgang (aus dem DB) und den Schreibvorgang (in die csv-Datei) in einer FOR-Schleife auszulösen.

Oder gibt es einen einfacheren Weg.

Ich wäre für eine stichwortartige Beschreibung der Vorgehensweise dankbar.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Mit VB.NET + libnodave habe ich das auch schon gemacht.
Ich würde aber die Messwertübernahme lieber durch die ohnehin vorhandene WinCC-Visu machen lassen.

Vielleicht werde ich es mal mit VB-Skript versuchen.
 
@Earny:
Das Problem ist nicht, mit der Siemens-Visu, Daten aus einem DB in eine CSV-Datei zu schreiben. Das geht genau so, wie du es angedeutet hast (Schleife).
Das Problem ist, dass du die Daten in deine CSV-Datei geschrieben bekommst, die wirklich in dem DB stehen (also nicht die, die vor ein paar Sekunden noch darin waren). Stichwort hier : Konsistenz.
Gerade bei der von dir genannten großen Anzahl sehe ich das doch schon als problematisch an - das wars es auch, was Harald dir mitteilen wollte ...

Gruß
Larry
 
Ich denke Konsistenz ist gegeben: Ich zeichne Messwerte mit z.B. 10ms Zeittakt (OB35) im DB10 auf. Es werden 1000 Messwerte als Real-Werte in die ersten 4000 Bytes des DB10 geschrieben. Die Aufzeichnungsdauer beträgt 10s. Mich interessiert nicht der absolute Zeitwert, zu dem der jeweilige Messwert angefallen ist, sondern ich will mir nur den Messwertverlauf in die csv-Datei schreiben und mir dann später in Excel anschauen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also.. Du willst 10 Sek lang alle 10ms Daten aufzeichnen, und anschließend ganz in Ruhe in eine CSV Datei kopieren?

Hier ein Codebeispiel für eine Zeile :)

Code:
Sub DATENLOGGING_MESSWERTE(ByRef Text, ByRef Variable1_Text, ByRef Variable1_Wert, ByRef Variable2_Text, ByRef Variable2_Wert, ByRef Variable3_Text, ByRef Variable3_Wert)
Dim fs
Dim f
Dim mode
Dim pfad



' pfad festlegen
pfad = "Storage Card SD\Logs\"

' Objekt fuer Filehandling erstellen
Set fs = CreateObject("filectl.filesystem")
Set f= CreateObject("filectl.file")
    
' Pruefen ob Verzeichnis existiert und sonst erstellen
If fs.dir(pfad) = "" Then fs.mkdir(pfad)
                            
' Daten in Datei schreiben
' Format in etwa: 2016.06.05 14:53:31, Dies ist ein Beispieltext, Variable 1, Variable 2
f.open pfad + "messwerte.csv", 8
f.LinePrint CStr(Now) & ";" & Text & ";" & Variable1_Text  & ";" & Variable1_Wert  & ";" & Variable2_Text  & ";" & Variable2_Wert  & ";" & Variable3_Text  & ";" & Variable3_Wert  & ";"
f.Close
End Sub

Grüße

Marcel
 
In WinCC (V6/V7) würde ich das mit einer Rohdatenvariable lösen, und dann den gesamten Datenblock per BSEND von der SPS zum WinCC schicken. Das lässt sich dann relativ einfach und konsistent per Skript zerlegen und in eine Datei schreiben.

Was ist denn WinCC RT? Ist das TIA WinCC Professional, also ein abgewandeltes WinCC Scada? Oder Nachfolger von WinCC flexible.
 
Zuletzt bearbeitet:
@Thomas:
Es hört sich für mich nach dem Flex-Nachfolger in TIA an ...

@Earny:
Das du die Daten in deinem DB konsistent hast habe ich nicht einen Moment bezweifelt. Das würde auch noch mit einer sehr viel schnelleren Taktung des OB35 funktionieren.
Das Problem (und da hast du mich nicht richtig verstanden) ist die Übergabe der Daten von der SPS in die Visu. Wenn du nicht die von Thomas angesprochene Visu hast sondern vielmehr die von mir vermutete dann kannst du dein Array nicht als ein Element (und somit konsistent) an die Visu übergeben - die Visu holt sich den Inhalt mehr oder weniger "nach Gutdünken" - bei LibNoDave hingegen (da du damit ja schon gearbeitet hast) würdest du das Array wieder als einen kompletten Block einlesen.
Wenn du .Net und LibNoDave kannst - was spricht dann nach deiner Ansicht dagegen, das einzusetzen ?

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Die WinCC Runtime (RT) für PC ermöglicht es, Visualisierungen für einen Standard-PC zu erstellen.

Normalerweise wird WinCC (V13) dazu benutzt, Parametrierungen für Siemens-Panels zu erstellen. Es gibt aber auch die Möglichkeit, Visualisierungen für einen Standard-PC zu erstellen. Ich weiß, es gibt auch WinCC als Leitsystem. Das ist aber ein anderes Softwarepaket.

Das WinCC, das ich meine und einsetze wird typischerweise integriert im TIA eingesetzt.
 
... also der Flex-Nachfolger ... ist ja nicht das Problem.
Was sagst du nun zu dem Rest, den ich geschrieben habe ...
 
Das Problem (und da hast du mich nicht richtig verstanden) ist die Übergabe der Daten von der SPS in die Visu. Wenn du nicht die von Thomas angesprochene Visu hast sondern vielmehr die von mir vermutete dann kannst du dein Array nicht als ein Element (und somit konsistent) an die Visu übergeben - die Visu holt sich den Inhalt mehr oder weniger "nach Gutdünken"
Ich hab' meinen DB aus einem udt erstellt und auch an das HMI nur als eine Variable vom Typ udt... übergeben. Ist das von Dir beschriebene Verhalten auch noch so, wenn man auf die einzelnen Untervariablen zugreift oder wird so jeweils der komplette Stamm übertragen?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also libnodave liest prinzipiell nicht konsistenter oder inkonsistenter als z.B. WinCC flexible oder TIA WinCC. Ein WinCCflex-Array in Größe der PDU wird genauso gelesen wie ein gleich großer Datenblock durch libnodave oder einer anderen Bibliothek. Und bei optimierter BuB-Kommunikation ist nichteinmal so ein Block konsistent.

Ein wie auch immer geartetes Handshake-Signal benötigst du also in jedem Fall, mit dem die SPS der Visu signalisiert dass die Daten abholbereit sind, und in der Zeit in diesem nicht mehr hineinschreibt. Oder du verwendest so etwas wie double buffering, also zwei Datenblöcke, und von Datenblock a nach b wird wenn fertig mit ublkmov kopiert. Aber das sollte nicht das große Problem sein.

Da der Sendevorgang mit dem erwähnten BSEND auch über mehrere Zyklen andauern kann, muss der Sende-DB innerhalb dieser Zeit ebenfalls zur Bearbeitung gesperrt werden. Da das alles innerhalb der SPS geschieht ist das aber einfacher handzuhaben. Im WinCC ist der Datensatz dann immer vollständig konsistent. Aber diese Option entfällt bei deinem System eh.
 
Es ging mir nicht darum, wie der Datenblock gelesen wird (da hast du natürlich vollkommen Recht, Thomas) sondern DAS er gelesen wird und man weiß wann er gelesen worden ist.
Bei Flex ist es so (und sehr wahrscheinlich auch noch in TIA-Flex), dass es sein kann, dass Teile des Array's noch gar nicht aktualisiert worden sind und auch durch den Durchlauf der Schleife im Script nicht aktualisiert werden. Dieses Verhalten ist nach meiner Beobachtung umso wahrscheinlicher je größer der einzulesende Datenbereich ist/wird.

Gruß
Larry
 
Was WinCC Flex unter Step7 classic war (ist), das ist WinCC unter TIA. Die Versionsnummern stehen zur Zeit bei V13.1 oder 13.2, wenn ich richtig informiert bin.
Das WinCC unter TIA hat meines Wissens nichts mit dem Leitsystem WinCC zu tun.

@Larry
Ich verstehe Dich nicht. Ich weiß nicht, was Du als Konsistenzproblem ansiehst.
Nochmal: Ich zeichne im DB10 Messwerte mit 10ms Zeittakt auf. Die Aufzeichnung erfolgt mit exaktem Zeittakt, weil der Schreibvorgang durch den OB35 gesteuert wird. Mich interessiert nicht die Absolut-Zeit, zu der der Messwert angefallen ist.
Wenn ich nach Beendigung der Aufzeichnung, also nach 10s keinen weiteren Schreibzugriff auf den DB10 mehr zulasse, dann bleiben die Messwerte unverändert im DB10 erhalten. Es spielt dann keine Rolle, ob ich alle 1000 Realwerte quasi gleichzeitig als Block auslese, oder ob ich heute die ersten 100 und morgen die nächsten 900 Messwerte auslese.

Matze hat es richtig beschrieben. Ich werde es morgen mal mit seinem Code versuchen.


Wie gesagt, mit VB.NET und libnodave habe ich das auch schon gemacht. Vielleicht werde ich dabei bleiben.
Mir würde es aber besser gefallen, wenn ich meine bereits vorhandenen WinCC-Visu um die Messwertübernahme und Aufzeichnung ergänzen könnte, weil dann alles in einer Visu ist.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Was WinCC Flex unter Step7 classic war (ist), das ist WinCC unter TIA. Die Versionsnummern stehen zur Zeit bei V13.1 oder 13.2, wenn ich richtig informiert bin.
Das WinCC unter TIA hat meines Wissens nichts mit dem Leitsystem WinCC zu tun.

Es gibt noch WinCC Professional im TIA-Portal, das soll von der Funktion her ähnlich wie das WinCC Scada (aktuell V7) sein, darum denke ich mal, dass es da auch Rohdatenvariablen gibt.
Ich steig' da aber auch nicht mehr überall durch. Es gibt mittlerweile mindestens 4 völlig unterschiedliche Systeme, die Siemens alle WinCC nennt.
 
Schade ... du hast es immer noch nicht verstanden.
Es geht mir nicht um dein SPS-Programm (das hatte ich schon erwähnt) - das wird seine Aufgabe schon korrekt erfüllen.
Davon, dass du die Daten korrekt in dem DB stehen hast, hast du sie noch lange nicht in der Visu.
Was ich sagen wollte ist : du hast mit Flex KEINEN Einfluß darauf, wann die Werte, die du in der SPS in dem DB stehen hast, in die Visu übergeben worden sind. Das kann sein, dass alle 1000, die zusammengehören, nach ein paar Millisekunden zur Visu aktualisiert worden sind ... oder erst nach einigen Sekunden. Das, was im DB steht, das steht noch lange nicht in der Visu in deren Speicher. Die in der Visu deklarierte Variable ist NICHT die Variable der SPS sondern ein vollkommen eigenständiger Speicher auf den die Daten aus der SPS (nach Gutdünken der Visu) irgendwann draufkopiert werden. Das hat übrigens auch nicht sehr viel mit der Aktualisierungsrate der Variablen zu tun.

Gruß
Larry
 
Wie gesagt, mit VB.NET und libnodave habe ich das auch schon gemacht. Vielleicht werde ich dabei bleiben.
Mir würde es aber besser gefallen, wenn ich meine bereits vorhandenen WinCC-Visu um die Messwertübernahme und Aufzeichnung ergänzen könnte, weil dann alles in einer Visu ist.

Siehst du ... und ich würde das zu einem eigenständigen Programm oder vielleicht sogar zu einem Service machen, der vollkommen eigenständig läuft und die Visu nicht in irgendeiner Form belastet.
 
@Larry
Ich glaube, ich habe jetzt verstanden, wo das Problem liegen könnte.
Vielleicht hast Du Lust, Dir wenigstens 2 Themen aus meiner Linkliste aus #2 mit der Beschreibung des Variablen-Lese-Problems durchzulesen?

Das Problem:
WinCC flexible Skript Daten archivieren: Aktualisierungszeit der Variablen
Und eine Lösungsbeschreibung (ab Beitrag #12):
Prozessdaten einer CPU 317 auf Speicherkarte eines TP277 6" speichern

Für Deine "WinCC Advanced (TIA Portal) PC Runtime" gilt genau wie bei WinCC flexible:
WinCC flexible liest Variablenwerte aus der Steuerung nur dann, wenn es von deren Verwendung für aktuell angezeigte Objekte weiß oder extra zum Aktualisieren aufgefordert wird oder wenn die Aktualisierung der Variable auf "zyklisch fortlaufend" steht. Wird der Variablenname erst im Skript zusammengesetzt oder kann WinCC flexible den Trigger des Skriptes nicht vorhersehen, dann werden die Variablenwerte erst NACH Ausführung der entsprechenden Skriptzeile gelesen, egal wie kurz die Aktualisierungszeit der Variable eingestellt ist. Das Skript wartet NICHT auf das Lesen der Variablen. Es gibt auch keine Rückmeldung, wann eine "normale" PLC-Variable gelesen wurde. Nur Rezepturvariablen kann man so lesen, daß man eine Rückmeldung erhält, wenn alle Variablen gelesen wurden. Wie Helmut schon schrieb: konsistentes Lesen von PLC-Variablen ins HMI geht nur mit Rezepturen. Alles Andere ist mehr oder weniger Zufall.


Siemens-Beispiel (es erwähnt allerdings nicht dieses essentielle Konsistenzproblem):
Wie speichern Sie mit der WinCC (TIA Portal) PC Runtime Informationen mit einem Skript in eine Datei?


Wenn die Aufgabe denn unbedingt mit der WinCC Advanced RT gelöst werden soll, dann würde ich nicht eine Rezeptur mit 1000 Variablen anlegen, sondern die 1000 Werte als Array von 20 Structs mit je 50 Werten organisieren und mittels Übergabepuffer und Handshake mit der SPS 20 mal nacheinander jeweils einen Struct (mit den 50 Werten) in eine Rezeptur lesen und die Werte der Rezepturvariablen in die csv-Datei schreiben (oder 10 mal 100 Werte). Siehe obige Lösungsbeschreibung.

Harald
 
Ohne das ich jetzt alles haarklein gelesen habe.

Das funktioniert über vbs in der visu. Haben wir bei uns im Einsatz

ABER... Die Daten MÜSSEN über eine Rezeptur geladen werden um konsistent zu sein.
Das einlesen der Rezeptur kann bei der Datenmenge schon einen Moment länger dauern.
 
Zurück
Oben