TIA CSV in 2D Array

kw_f14

Level-2
Beiträge
7
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

ich möchte eine CSV-Datei mit 1500 Zeilen und 6 Spalten in DB schreiben.

Meine Suche führte mich zu WINCC und HMI. Ich habe einige Beispiele gefunden und ausprobiert.

Lesen der letzten CSV-Zeile funktioniert. Die Lösung ist, so wie ich gelesen habe die CSV-Datei in einer Schleife zu lesen und in einem lokalen Array zu schreiben.

Nach meiner Information kann aber in HMI nur 1D Array erzeugt werden. Ist diese Info richtig?

Meine CSV-Dateien liegen eigentlich auf einem Netzlaufwerk und müssen von dort gelesen werden. Aber für den ersten Schritt habe ich sie auf die SD-Karte kopiert.

Gibt es eine intelligente Lösung um eine CSV-Datei (1000x6) in DB zu schreiben? Gibt es eine Liste aller Befehle für VBScript?


Schöne Grüße

Carlos
 
In einem VBS-Skript kann ein Array auch mehrere Dimensionen haben.
Andererseits: Wenn Du die csv-Datei zeilenweise oder mehrzeilenweise liest und dann die Zeile/Block in den DB schreibst, dann brauchst Du dafür kein zweidimensionales Array.

Ist der DB irgendwie wiederkehrend strukturiert (Array of Struct)?
1500 Zeilen je 6 Spalten bedeutet in erster Näherung: Du bräuchtest 9000 HMI-Variablen (PowerTags), wenn Du die csv-Datei in einem Stück lesen und in den DB schreiben willst. Oder ein sehr großes Array of STRUCT mit 9000 Teil-Variablen. Ein großes Array kann man aber nicht so einfach mit WinCC Adv. RT in die SPS schreiben.
Eine Lösung mit WinCC Advanced Runtime oder Comfort Panel müsste so aussehen, daß die csv-Datei stückweise in einen Rezeptur-Datensatz eingelesen wird und dann der Rezeptur-Datensatz in den DB geschrieben wird. Das SPS-Programm müsste die Rezepturen entgegennehmen und zur eigentlichen DB-Zieladresse kopieren. Zum Sparen von HMI-Variablen könntest Du ggf. kleinere BYTE-Arrays in der Rezeptur verwenden. In WinCC Professional Runtime könntest Du mit Rohvariablen arbeiten.
Wie oft soll die csv-Datei in den DB geschrieben werden?
Hast Du schon die WinCC Runtime/Visu? Welches WinCC? Hast Du schon ein HMI? Welches?

Programmbeispiele für Daten aus csv-Datei in DB schreiben mit WinCC Runtime und Hinweise zu den Fallstricken und Problemen gibt es hier schon viele. Verwende mal die Forumssuche mit dem Suchbegriff "SetDataRecordTagsToPLC", da findest Du z.B. folgende Threads:
CSV Datei in DB einlesen
TP1900 Comfort VB Script für textbasierte Datei auslesen
Excel Tabelle als CSV einlesen und verarbeiten

Ziemlich einfach zu lösen wäre die Aufgabe mit einer selbstprogrammierten PC-Anwendung oder z.B. Excel und Libnodave.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es ist relativ einfach, am Comfortpanel mit VB-Script eine solche Datei zeilenweise einzulesen und in einen DB zu packen, dauert nur vermutlich ein paar Sekunden, wo das Panel nicht reagiert.

Das Parsen, also das Zerlegen nach Trennzeichen und Zuordnen auf die einzelnen Variablen habe ich meist in der SPS anschließend per SCL gemacht, weil da das Debugging für mich einfacher ist. Bei 1500 Zeilen muß man sowas natürlich in mehreren Zyklen machen, (z.B. immer 100 Zeilen) sonst gibt es eine Zykluszeitüberschreitung.

Beispiel für Einlesen:

f.Open Dateiname,1 'Input-Mode

'Datei Einlesen
Zeilenzahl = -1
Do While Not (f.EOF Or (Zeilenzahl>1500))
zeile = f.LineInputString
Zeilenzahl = Zeilenzahl + 1
SmartTags("Auftrag(" & Zeilenzahl & ")") = zeile
Loop

f.Close
 
Es ist relativ einfach, am Comfortpanel mit VB-Script eine solche Datei zeilenweise einzulesen und in einen DB zu packen, dauert nur vermutlich ein paar Sekunden, wo das Panel nicht reagiert.
Na, das würde mich jetzt echt mal interessieren, wie man mit einem Comfort Panel 9000 Variablen oder gar eine ganze csv-Datei mit 1500 Zeilen ca. 64 kB "in ein paar Sekunden" sicher in die SPS schreibt...
Hast Du das schon mal gemacht?

Harald
 
... das Zerlegen nach Trennzeichen und Zuordnen auf die einzelnen Variablen habe ich meist in der SPS anschließend per SCL gemacht ...
Das ist aber im VB-Script deutlich einfacher umzusetzen als in der SPS - VB-Script kennt dafür den Befehl SPLIT, in SCL mußt du dir dazu erst einmal etwas bauen, das m.E. erheblich mehr Arbeitszeit beansprucht als im PC.
Ein weiteres Problem, das ich da sehe ist die Sache mit dem String, den du dann der SPS übergibst - was machst du, wenn der eingelesene String länger als 254 Zeichen ist ...? Ich kann mir sehr gut vorstellen, dass das beim TE so der Fall ist ...

Na, das würde mich jetzt echt mal interessieren, wie man mit einem Comfort Panel 9000 Variablen oder gar eine ganze csv-Datei mit 1500 Zeilen ca. 64 kB "in ein paar Sekunden" sicher in die SPS schreibt ...
Tja ... man unterschätzt das gerne mit der Anzahl (wie schon von dir angemerkt).

@TE:
Muss es denn wirklich so ablaufen ?
Du hast bei dieser Form der Übertragung an die SPS (und bei dieser Menge an Daten) grundsätzlich das Problem mit der Konsistenz der Daten und der Aktualisierung zur SPS.
Der Vorschlag von Harald entkrampft das etwas - es ist trotzdem in der Umsetzung in deinem Fall nicht unbedingt ein Pappenstiel ...
Mir würde hier eher etwas wie LibNoDave oder AGLink o.ä. als Ansatz einfallen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ok, mit 1500 Zeilen habe ich es noch nicht gemacht. Bisher waren es nur ein paar Dutzend Zeilen auf einmal aus dem File in die SPS zu bringen. Da gab es noch keine ernsthaften Wartezeiten.
Also mein Vorschlag war, den DB als Array[1..1500] of String[40] aufzubauen und eben die CSV-Datei da zeilenweise reinzulesen. Wenn die Zeilen der CSV-Datei länger sind, geht das natürlich nicht mehr.
 
Ich habe das Parsen aus drei Gründen auf die SPS verlegt:
- Ich habe sehr viele verschiedene Schreibweisen für meine Werte, die alle abfangen muß.
- Ich habe noch keine vernünftige Möglichkeit zum Debuggen von VB-Script gefunden. Auch alle Fehlermeldungen landen ja nur als Systemmeldung im Display. Oder kennt hier jemand etwas?
- Das Schreiben von 10 Einzelvariablen in die SPS dauert vermutlich länger als das Schreiben eines Strings.

Natürlich ist so etwas niemals echtzeitfähig, sondern nur zum Einlesen von Einstellungen oder so geeignet.

War ja auch nur ein Vorschlag.
 
Hallo PN/DP,

es wäre vielleicht hilfreich zu erwähnen was ich mit den CSV-Daten vorhabe. In der CSV-Datei stehen die Roboterpositionen. Diese Daten benötige ich um mit dem Optionspacket "mxAutomation" von KUKA den Industrieroboter über SPS zu steuern. Ich setzte TIA Portal V15.1 mit WINCC Advance ein. Als HMI habe ich zur Zeit das Modell Comfort 700 zum Testen.
Die DB ist wiederkehrend strukturiert. Die Anzahl der Spalten sind fest. Die Anzahl der Zeilen (Roboterpositionen ) kann variieren. Alle 30 min gibt es eine komplett neue CSV-Datei zu lesen. Allerdings darf das Lesen und Schreiben der Daten in DB auch ein bisschen dauern (ca. 1-2 min). Es wäre natürlich besser wenn es nicht lange dauern würde. Ist HMI in der Lage mit so viele PowerTags unzugehen? Da die Länge der CSV-Datei variiert dürfen die Tags evtl. leer bleiben?

Da dem Roboter die Zielpositionen übergeben werden müssen, bin ich mir nicht so sicher ob es möglich wäre zyklisch die Daten zu lesen. Aus diesem Grund bevorzuge ich zunächst Lesen und Schreiben der kompletten CSV-Datei.

Die Idee mit externem PC finde ich auch gut. Allerdings gibt es bei meinem Kunde strikte Sicherheitspolicy. Muss für diese Lösung die Firewall deaktiviert werden? Hier wird ein FTP-Server usw. nicht zugelassen.

Schöne Grüße
DB-Struktur.PNG
Carlos
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Carlos:
Du mußt es selbst wissen.
Es hilft dir auch nichts, wenn du das Schreiben der daten in deine Struktur nicht wirklich kontrollieren kannst - im Gegenteil : in deinem Fall mußt du dich eigentlich schon darauf verlassen können ... 8)
Als Anmerkung an deinen Kunden : Ein Comfort-Panel (oder eigentlich jede HMI) ist auch ein PC - sogar mit Windows als Betriebssystem ...

Gruß
Larry
 
Hallo Ingmar64,

vielen Dank für den Tipp.

Wenn ich in HMI das Parsen erledigen will muss Lesen und splitten in dem Loop erfolgen? In etwa so:

'Datei Einlesen


Zeilenzahl = -1
Do While Not (fo.EOF Or (Zeilenzahl>10))


data = fo.LineInputString
splitline=Split(data,delimiter)


Zeilenzahl = Zeilenzahl + 1


SmartTags("Datenbaustein_4(" & Zeilenzahl & ")") = splitline
Loop

Oder muss man hier mit Temp_Array arbeiten?
 
@TE:
Das wird so nicht funktionieren.
Wie schon von Harald benannt ... du mußt JEDES Element deines Datenbausteins als Variable in deiner Visu angelegt haben. Die Zuweisung MUSS dann entsprechend auf diese (angelegten) Variablen erfolgen ...

Gruß
Larry
 
Zurück
Oben