TIA CSV Datei in DB einlesen

TechnikerGerd

Level-1
Beiträge
9
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo liebe Community.
Im Zuge einer Technikerabschlußprüfung sind wir auf eine Problematik gestoßen bei der ihr uns hoffentlich helfen könnt.
Wir haben eine Siemens S7 1200 (1214c) kombiniert mit einem TP 900 Comfort HMI.
Das Ziel ist es eine CSV Datei mit hilfe eines USB Sticks auf das HMI zu Speichern und die Werte der CSV Datei in einen Datenbaustein Zu schreiben.
Besten Dank schonmal.

Gerd
 
Dankeschön und Entschuldigung für meine "schlechte" Formulierung.
Einlesen über VBSkript hab ich grob verstanden. Doch wie bekomme ich diese Daten in einen Datenbaustein um damit meine Prozesswerte zu steuern?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bilder muss ich noch passen da es im Moment noch keine Komponenten gibt.
Zuerst muss die Frage der Realisierbarkeit möglichst genau geklärt werden bevor die Steuerung bestellt wird.

LG
 
Wie groß wird diese CSV-Datei denn sein? Also wie viele Zeilen an Informationen werden es sein?

Realisierbar ist das mit Sicherheit. Ich habe so etwas schon für einen Kunden programmiert. Dabei ging es um eine CSV-Datei mit bis zu 50000 Zeilen.
Hatte dafür aber eine 1516 und WinCC Professional benutzt. Wenn du weniger als 24000 Zeilen in deiner CSV hast, dann wird das auch mit WinCC Advanced funktionieren.

Ich hatte des damals so realisiert, dass es für jede mögliche CSV-Zeile einen eigenen Powertag gab (deswegen WinCC Professional). Es wird sicher auch möglich sein, das alles über einen einzigen Powertag zu machen und zeilenweise die CSV-Daten auf diesen schreiben. Wird dann aber sicher sehr viel mehr Zeit benötigen für die Übertragung und du muss eine Art "Kommunikation" aufbauen. Sprich SPS und WinCC müssen miteinander kommunizieren wann die nächste Zeile geschrieben werden darf.

Bei WinCC Professional gibts dann wohl noch die Variante mit den RAW-Daten. Damit hatte ich mich aber nicht beschäftigt.
 
Um wieviele Datenpunkte (Variablen) geht es denn?

Du könntest eine Rezeptur mit allen Variablen (und ein "Neue Daten"-Meldebit) projektieren, dann in einem Skript die Werte aus der CSV-Datei lesen und in die Rezepturvariablen schreiben und die Systemfunktion SetDataRecordTagsToPLC aufrufen. Dadurch werden alle Werte in die PLC-Variablen (Dein DB) geschrieben.

Falls Du sehr viele Variablen hast und Du nicht so eine große Rezeptur projektieren willst, und Du die Daten irgendwie als Datensätze (ARRAY OF STRUCT oder ARRAY OF BYTE) organisieren kannst, dann könntest Du die Daten in mehreren Blöcken in eine Rezeptur lesen und eine Blockkennung/Blocknummer dazupacken und mit SetDataRecordTagsToPLC in die SPS schreiben. Die Variable für den SetDataRecordTagsToPLC-Bearbeitungsstatus legst Du in die SPS, dann weiß die SPS wann ein Datensatz von der HMI empfangen wurde und kann den Datensatz anhand der Blocknummer zur eigentlichen Zieladresse kopieren. Anstatt der Bearbeitungsstatus-Variable kann die SPS auch die Blocknummer auswerten und nach dem Kopieren die Blocknummer löschen (auf 0 setzen).

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es handelt sich voraussichtlich um etwa 5000 Datenpunkte da damit die Schritt-kette gefüttert werden soll.
Hab mich da mal in VBSkript versucht klappt aber nicht so wie erhofft.
Bitte nicht steinigen hab mit VB nicht viel zu tun also quasi nichts und mich sehr an der Siemens Anleitung orientiert
VBSkriptPT1.PNGVBSkriptPT2.PNG
 
Also wenn ich deinen "Script-Versuch" richtig verstehe, dann hat ein Datensatz 15 Felder.

Sollen nun alle Datensätze in den DB übertragen werden oder nur ein Datensatz?
Wenn du alle übertragen willst, dann solltest du dir mal Array, Struct und UDT anschauen.
 
klappt aber nicht so wie erhofft
Aha, Du weißt vermutlich was Du damit meinst, wir aber leider nicht... was genau klappt oder klappt denn nicht und wie soll es denn funktionieren?

Dein VBS-Code liest zuerst Zeile für Zeile alle Zeilen der csv-Datei in immer den selben Puffer (data) ein und nachdem das Ende der Datei erreicht wurde wird die zuletzt eingelesenen Zeile (die letzte Zeile der Datei) in hoffentlich 15 Werte gesplittet und 15 HMI-Variablen zugewiesen. Willst Du tatsächlich immer nur den allerletzten Datensatz/Zeile aus der csv-Datei in die SPS übernehmen? Oder müsstest Du nicht vielmehr nach jeder Zeile den Datensatz in die SPS schreiben? (dann ist Deine Schleife falsch/das "Wend" steht an falscher Stelle, das Daten splitten und in die SPS schreiben müsste innerhalb der Schleife stehen)
Sind die 15 HMI-Variablen Rezeptur-Variablen? Wenn nicht, dann dauert es noch eine ungewisse Zeit, bis die Werte in der SPS ankommen. Falls Rezeptur-Variablen: die kommen normalerweise gar nicht in der SPS an, die werden erst mit SetDataRecordTagsToPLC in die SPS geschrieben.

PS: mit "etwa 5000 Datenpunkte" meinst Du: die csv-Datei hat ca. 330 Zeilen, die jeweils einen Datensatz mit 15 Werten enthalten? Der Aufbau jeder Zeile ist gleich?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok das ist Beispielhaft mit den 15 Werten.
Prinzipiell sollen die einzelnen Werte der CSV Datei in jeweils eine HMI-Variable gelesen werden die dann mit der Variablen im Datenbaustein der SPS Verbunden ist. Das Feld (Dateiname) im Aufruf ist ein E/A Feld auf der Oberfläche in der der Dateiname eingegeben werden soll aus der die Werte gelesen werden.
Wenn ich den Ansatz mal habe kann ich ja das Skript weiterführen bis zur gewünschten Anzahl an Werten.
Hab da mal einen Ausschnitt aus der CSV-Datei Eingefügt. Vielleicht wird es dann deutlicher.
Anhang anzeigen 40975
 
Zuletzt bearbeitet:
Dein Anhang funktioniert nicht.

Und kannst Du vielleicht mal mit einfachen Worten auf die Frage nach den 5000 Datenpunkten eingehen und erklären wie die zustande kommen?
Oder willst Du das Skript soweit "weiterführen" bis es 5000 Werte aus der csv-Datei in 5000 einzelne HMI-Variablen (Tags) einliest?

Harald
 
Dein Anhang funktioniert nicht.

Und kannst Du vielleicht mal mit einfachen Worten auf die Frage nach den 5000 Datenpunkten eingehen und erklären wie die zustande kommen?
Oder willst Du das Skript soweit "weiterführen" bis es 5000 Werte aus der csv-Datei in 5000 einzelne HMI-Variablen (Tags) einliest?

Harald
Ui das wird dan aber teuer. Man müsste dann die 8192 Powertags Runtime nehmen... :)

Gesendet von meinem BLN-L21 mit Tapatalk
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok Etwa 5000 Punkte kommt daher Zustande das zuerst die Motorsteuerung eingelesen wird Also 2 Motoren jeweils Beschleunigung und Geschwindigkeit. Dann einmal 0 oder 1 für rechts oder links lauf Dann Drahtstärke und Biegeradius zum Internen berechnen eines Master/Slave Übersetzungsverhältnis dann 15 Unterschiedliche Längen und 10 Verschiedene Winkel mit jeweils Unterschiedlichen Korrekturwerten. Und dann wird das alles noch Zusammengebracht zum Beispiel: Fahre länge 1 Biege Winkel 4. Dann Fahre Länge 3 Biege Winkel 9 usw...... Theoretisch Könnte man das auch mit 10.000 oder 100.000 Daten machen haben uns allerdings auf maximal 5.000 Daten geeinigt um die ganze Sache zumindest etwas zu Begrenzen.
Im Endeffekt ja ich würde gerne Maximal 5000 Werte auf einzelne Variable schreiben.
 
Flexibler bist du vermutlich, wenn du dir eine einfache Befehlssprache dafür ausdenkst (so was wie G-Code) und dieser dann in der SPS in einem kleinen Interpreter verarbeitet wird. Also sowas wie:
P 001 // Start Programm 1
F 001 // Fahre Länge 1
B 004 // Biege Winkel 4
F 003 // Fahre Länge 3
E 001 // Ende Programm 1

Hängt davon ab wie viele Befehle du hast, wenn es viele sind dann hast du bei deiner Vorgehensweise ja immer eine Menge ungenutzer Variablenwerte was das Ganze eben extrem aufbläht.
 
Das mit dem Interpreter ist dem Kunden zu Kompliziert.

Hab das Skript jetzt soweit das das einlesen Funktioniert. Allerdings liest er immernoch nur die Letzte Zeile ein.
Kann mir da jemand sagen was ich ändern muss.

VBSkriptZeile.PNG
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Zum einen wird immer auf die Elemente 0 bis 3 von splitdata zugegriffen, egal welcher "internen" Variablen dieser Wert zugewiesen wird. Zum anderen werden in der Schleife nacheinander alle Zeilen eingelesen und bearbeitet. Und dabei die Werte der vorigen Zeile überschrieben. Zum Schluss bleiben somit nur noch die Werte der letzten Zeile übrig bzw. stehen.
 
Gibt es denn eine möglichkeit das die Letzten werte nicht überschrieben werden also das quasi alle Werte aus allen Zeilen in Variablen wiederzufinden sind?
Wenn ja kann mir jemand vllt. erklären wie?
 
Hallo, DU mußt doch wissen wo Du die Werte hinhaben willst und warum Du mehrere Zeilen in der csv-Datei hast.
Es ist sooo schwer Dir aus der Nase zu ziehn was Du denn willst, wenn Du es nicht erklären kannst.

Noch einmal nachgefragt: willst Du aus ca. 330 Zeilen mit je 15 Werten Werte in 5000 verschiedene Variablen einlesen oder in 15 Variablen? Wenn das in 5000 verschiedene Variablen gehen soll, dann mußt Du auch 5000 verschiedene Variablen im Skript angeben.

PS: Es ist nicht so daß die letzten Werte überschrieben werden, sondern bei jeder eingelesenen Zeile wird allen 15 Variablen ein Wert zugewiesen, bei jeder Zeile wieder in die selben 15 Variablen, so daß am Ende die Werte der letzten Zeile in den 15 Variablen stehen - einfach deshalb weil es jeweils die letzte Zuweisung war.

Harald
 
Zurück
Oben