TIA Excel Tabelle als CSV einlesen und verarbeiten

Azrael666

Level-1
Beiträge
239
Reaktionspunkte
18
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,

ich sitze aktuell an einem etwas größeren Problem.

Folgende Hardware/Software ist aktuell vorhanden:
- CPU 1500 (noch nicht näher spezifiziert)
- Panel (noch offen evtl. PC-System mit Runtime)

- TIA Portal S7 Professional V14
- WinCC Basic (vermute ohne Advanced wird es nix)

Nun das Problem:

Ich muss eine CSV Datei per VISU einlesen. Diese CSV Datei beinhaltet 13 Spalten mit unterschiedlichen Datentypen (Bool, Int, Real). Des weiteren besteht die Datei aus insgesamt bis zu 50000 (fünfzigtausend) Zeilen.
Das alles soll mit WinCC eingelesen werden und muss dann in einem DB gespeichert werden.

Ich bin aktuell zumindest schonmal soweit dass ich mir eine UDT mit der Struktur aufgebaut habe und einen DB mit Array [0..50000] of UDT aufgebaut habe. Das scheint soweit schonmal zu funktionieren (wenn die CPU potent genug ist)

Jetzt steh ich allerdings vor der Frage, wie das Ganze einlesen? Ich habs mit der Rezepturverwaltung ausprobiert, mit der kann ich aber scheinbar keine Dateien öffnen. Scripte stehen in der WinCC Basic auch nicht zu Verfügung.

Hat da jemand ne Idee oder funktioniert das nur per VBSkripts?

MFG Azrael
 
Theoretisch kann die Aufgabe mit der Rezepturverwaltung gelöst werden, falls eine Rezeptur-Datei 50000 Datensätze enthalten kann und die csv-Datei exakt das von der Rezepturverwaltung erwartete Format hat. Ich weiß aber nicht, ob man das nacheinander einlesen von 50000 Datensätzen ohne VBS automatisieren kann. Ich glaub' da nicht dran.

Vernünftig geht es wohl nur per VBSkript, wobei da noch sein kann, daß das Panel sehr lange für brauchen wird. Zweitens besteht da noch das Problem, die Datenwerte sicher in die CPU zu bekommen, was im Prinzip nur als Rezeptur geht (Systemfunktion SetDataRecordTagsToPLC) und Mithilfe des SPS-Programms erfordert (Handshake für Übertragung einzelner UDT und kopieren an den richtigen Platz im DB-Array), damit die Rezeptur nur die Größe des UDT haben muß.

Alternative: die Daten von einem PC in die SPS schreiben geht schneller als per WinCC Runtime. Dazu braucht man eine S7-Kommunikationsbibliothek (Libnodave, Snap7, oder ACCON AG-Link oder ...) oder ein fertiges Tool. Eine direkte TCP-Verbindung zwischen der CPU 1500 und einem PC wäre auch noch möglich.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
- WinCC Basic (vermute ohne Advanced wird es nix)

Damit könntest du auf alle Fälle schon mal anfangen.

Hinsichtlich der Datenübergabe an die SPS teile ich die schon von Harald angeführten Bedenken im vollen Umfang.

Ich muss aber trotzdem mal fragen :
- wozu sollen die 50.000 Datensätze alle auf ein Mal in die SPS ?
- was sagen diese Daten aus ?

Gruß
Larry
 
Wie Larry frage ich mich auch: wozu sollen die 50.000 Datensätze auf einmal in die SPS? Und wie schnell/häufig soll die SPS in den Datensätzen etwas finden?

zur Übertragung der Datensätze mit einer WinCC Runtime:
optimistisch gesehen wird man nicht mehr als 5 Handshakes pro Sekunde zwischen SPS und WinCC Runtime hinbekommen (niedrigste Variablen-Aktualisierungsrate 100ms) ---> bei nur 1 Datensatz pro Handshake übertragen dauert das knapp 3 Stunden ---> bei 200 Datensätzen pro Handshake übertragen dauert das ca. 3,5 Minuten : ich würde es nur im äußersten Notfall mit einer WinCC Runtime machen, ich würde ein PC-Tool schreiben.

Harald
 
In der CSV-Datei bzw in den einzelnen Zeilen stehen Variablenzustände. Im Grunde genommen stellt die CSV-Datei eine "Ablaufsteuerung" dar. Die Daten der Datei sollen später in der SPS Zeile für Zeile abgearbeitet werden, wobei jede Zeile den Zustand für bestimmte Ventile sowie die Zeit beinhaltet, die der Schritt dauern soll (die Schritte sind in der Regel < 0,5sec). Deswegen hätte ich auch gerne den kompletten Datensatz in der SPS.

PS: Die Datei kann 50000 Zeilen enthalten, muss aber nicht. Die Anforderung an das Programm sind eben Bedienung über VISU und dass die Datei 0 - 50000 Zeilen enthalten soll. Die CSV-Datei wird vermutlich später auch zum Einlesen auf dem Panel/PC liegen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
... dann sehe ich eigentlich nur das als Ansatz :

Alternative: die Daten von einem PC in die SPS schreiben geht schneller als per WinCC Runtime. Dazu braucht man eine S7-Kommunikationsbibliothek (Libnodave, Snap7, oder ACCON AG-Link oder ...) oder ein fertiges Tool. Eine direkte TCP-Verbindung zwischen der CPU 1500 und einem PC wäre auch noch möglich.

Bei alles Anderem wirst du nicht die Konsistens (also die Zusammengehörigkeit) der Daten und sicher den Zeitpunkt, wann alles in der SPS ist, sicherstellen können ...

Gruß
Larry
 
Wenn ich es richtig verstehe, dann kann ich die Alternative per TCP-Verbindung bzw. S7-Kommunikationsbibliothek nicht von der Visu aus bedienen oder?

Irgendwie fehlt mir aktuell so ein bisschen die Fantasie, wie ich das ganze angehen kann. Irgendwie brauch ich ja ne Eingabemaske mit der ich die Datei auswählen kann und dann müsste das ganze in einen DB rübergeschaufelt werden.
Alles was sich so in den Weiten des WWW findet und auch nur ansatzweise damit zu tun hat, basiert immer auf einem VBScript.

PS: aso ganz vergessen zu erwähnen, erlaubt sind mir nur Bausteine aus der Siemens Standard Bibliothek zu verwenden!
 
Zuletzt bearbeitet:
Tja ... dazu fällt mir nichts mehr ein ...
Wenn dein Datenblock WESENTLICH kleine wäre dann würde man da mit Scripten etc. etwas machen können - so aber nicht.
Du kannst das m.E. nur über eine selbstgeschriebene Applikation (also ein EXE-File) lösen, die die Daten dann, wie vorgewählt, in die SPS überträgt.

Vielleicht solltest du dazu noch einmal mit deinem Kunden oder deinem Chef (oder beiden) sprechen ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ich verstehe es nicht.
Mußt du jetzt die erwähnten 50 000 Datensätze immer übertragen oder brauchst du nur die Voraussetzung soviele Daten zu handln?
Wenn du die Daten immer komplett übertragen musst, dann würde ich die Daten in einen temporeren Datenbereich übertragen. In der *.csv eine Checksumme erzeugen und diese in der PLC abgleichen. Wenn die Summe stimmt, dann in den ArbeitsDB rumkopieren. Jeden Datensatz mit Handshake, so lange lebt keine CPU. ;)

Wie groß ist ein Datensatz? Macht es nicht ggF Sinn den Datensatz auf mehrere Datenbausteine zu verteilen, so dass du mit einem Pointer darauf zugreifen kannst?
Auch musst du dir Gedanken machen, wie du diese Masse an Daten konsistent und aktuell hälst und sicherst.

Zunächst brauchst du noch keinen Baustein der PLC, sondern ein Konzept wie du die Daten organisieren willst.


bike
 
Daß Du nur VBS-Skripte findest liegt daran, daß die WinCC Advanced Runtime nur VBS-Skripte kann. Bei Deiner exorbitanten Datenmenge ist das kopieren der Daten aus einer Datei in die SPS aber nicht mehr vernünftig mit der WinCC RT machbar.

Diesen TCP-Fileserver und S7-Controller als Client könnte man als Vorlage nehmen und um die gewünschte Dateiauswahl-Funktionalität und das Schreiben in die SPS erweitern und dann von der SPS bzw. der HMI aus fernsteuern.

Alternativ könnte man mit der HMI (WinCC RT) per VBS-Skript die vorhandenen Dateinamen eines freigegebenen Ordners im Netzwerk (oder eines Ordners des Host-PC) auslesen, den HMI-Bediener irgendwie aus der Dateiliste auswählen lassen und einem TCP-Server auf einem PC (oder dem Host-PC der WinCC RT) Kommandos mit dem Dateiname senden. Wenn die WinCC RT auf einem PC läuft könnte man dem TCP-Server ein GUI spendieren und ihn aus der WinCC RT aufrufen und der HMI-Bediener steuert direkt die Dateiauswahl und den Start der Übertragung.


PS: Falls direkt von außen in den Ziel-DB in der S7-1500 geschrieben wird, dann sollte (oder muß sogar?) der Ziel-DB auf "Standard Zugriff" eingestellt werden. Falls da jemand "optimierten Zugriff" verlangt, dann wird es vermutlich richtig haarig ... (dürfen DB mit Standard-Zugriff überhaupt groß genug werden?)

Harald
 
Kann die S7-1500 eigentlich auf Dateien in der MemoryCard der CPU zugreifen und kann man von außen Dateien in die MemoryCard schreiben?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Dein Vorschlag auf einen freigegebenen Ordner zu zugreifen finde ich problematisch.
Wenn aus einer Datei die Daten gelesen sollen, dann kann das ggF länger dauern oder die Verbindung ist gestört.
Was dann?
Dann muss der Fertigungsprozess Pause machen. Ob das gewollt ist?

Ich denke, wenn bekannt ist wie die einzelnen Datensätze ausschauen, kann man nach einer sinnvollen Lösung suchen.
Auch ist mir noch nicht klar, was mit den Daten geschieht und wie die entsprechend aus- bzw angewählt werden.
50 000 Datensätze können auch 50 000 String mit 256 Char sein und dann wird es auch in der 1500 eng.


bike
 
Wenn du WinCC Scada (also z.B. V7.4) verwendest, dann kannst du große Datenmengen per Rohdatenblock (d.h. wie BSend/BRcv) an die SPS schicken. Das geht auch mit großen Mengen einigermaßen schnell. Auch ohne Rohdatenblöcke hast du mit WinCC mehr Möglichkeiten so etwas umzusetzen.
 
Hallo Leute,

erst schonmal vielen Dank für die Ideen und Vorschläge zu meinem Problem.
Die Daten setzen sich wie folgt zusammen:
13 Spalten mit bis zu (gefordert) 50.000 Zeilen

Spalte 1 : Int
Spalte 2 : String
Spalte 3 : Int
Spalte 4 : Real
Spalte 5 - 13 : Bool

Die in dieser Datei enthaltenen Daten müssen einmalig in die CPU übertragen werden und stellen im Prinzip eine Art "Rezept" dar. In jeder Zeile stehen Anweisungen die bearbeitet werden müssen. Das Programm soll dann zeilenweise bis zum Ende durchgearbeitet werden. Also im Grunde genommen ein Programmablauf der in einer CSV Datei vorbereitet und hinterlegt ist.
 
Ich muss hier und jetzt mal einen vollkommen anderen Vorschlag loswerden - der geht aber voll an deinem aktuellen Konzept vorbei :
Wie wäre es denn, wenn der PC die Daten hält und nur den jeweils aktuellen Schritt mit seinen Bedingungen in die SPS spielt ?
Wenn das allerdings halbwegs performant ablaufen soll dann ist hier die Standard-Visu m.E. auch schon an ihrer Grenze - ich würde hier zu einem "echten" PC-Programm tendieren ... da hättest du dann aber auch wieder alle Freiheitsgrade ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich muss hier und jetzt mal einen vollkommen anderen Vorschlag loswerden - der geht aber voll an deinem aktuellen Konzept vorbei :
Wie wäre es denn, wenn der PC die Daten hält und nur den jeweils aktuellen Schritt mit seinen Bedingungen in die SPS spielt ?
Wenn das allerdings halbwegs performant ablaufen soll dann ist hier die Standard-Visu m.E. auch schon an ihrer Grenze - ich würde hier zu einem "echten" PC-Programm tendieren ... da hättest du dann aber auch wieder alle Freiheitsgrade ...

Gruß
Larry

Die Überlegung hatte ich auch schon. Nur stell ich mir die Frage, was ist wenn die Netzwerkverbindung abbricht? Dann werden logischerweise keine Daten mehr übertragen.
Der weitere Punkt der mir zu Denken gibt ist die Tatsache, dass die einzelnen Schritte relativ schnell abgearbeitet werden. Ich hab hier eine Beispiel da dauern die Schritte zwischen 250 und 500ms. Gut möglich dass das nicht das schnellste sein soll.

Was mir jetzt auch noch Sorge bereitet ist mein "Test"-DB den ich mir in der CPU schonmal vordefiniert habe. Ich hab dort nen Array[0..50000] of UDP angelegt. Den schluckt die CPU aber nur wenn ich ihn in optimierter Version liegen habe. Wenn ich das richtig Verstehe, dann kann ich den nur noch symbolisch Ansprechen und nur mehr per direkter Adresse.

Das Ganze Ding hier bereitet mir echte Kopfzerbrechen, besonder weil ich aktuell immer noch nicht weiß in welche Richtung ich gehen soll bzw wie ich damit am besten überhaupt anfange.

PS: Echtes PC Programm gestaltet sich auch wieder schwierig. Kann ich nicht per HMI bedienen und ich hab noch nie mit C++ und Konsorten gearbeitet.
 
Hallo,

ich würde eine Mischlösung machen, also z.B.
  • 100 Schritte in Wechselpuffer_1 übertragen und Start der Schrittkette
  • die nächsten 100 Schritte in Wechselpuffer_2 laden
  • Schrittzähler zu Wechselpuffer_2 umschalten
  • die nächsten 100 Schritte in Wechselpuffer_1 laden
  • usw. ...

Vorteil: Du hast immer einige Schritte in Reserve und kannst noch reagieren, falls die Verbindung abbricht.

im DB_Ablaufkette_csv:

Wechselpuffer_1 Array[1..100] UDT_Datensatz
Wechselpuffer_2 Array[1..100] UDT_Datensatz

Dann musst Du nur den Index berechnen und kannst symbolisch zugreifen.
 
Die Daten setzen sich wie folgt zusammen:
13 Spalten mit bis zu (gefordert) 50.000 Zeilen

Spalte 1 : Int
Spalte 2 : String
Spalte 3 : Int
Spalte 4 : Real
Spalte 5 - 13 : Bool
Das sind 2 MB (mega-byte) !

Zum Beispiel, ein 1515-2 hat bis 3 MB Datenspeicher.

Vielleicht geht es trotzdem mit Rezepte.
Das sind die System-Grenzen bei WinCC RT Advanced:
WinCC Runtime Advanced
Device version prior to 13
WinCC Runtime Advanced
Device version as of 13
Number of recipes9991000
Number of elements per recipe[SUP]1)[/SUP]20002000
User data length in KB per data record256512
Number of data records per recipe50005000
1)
If arrays are used, each array element counts as one recipe element

Also, man konnte ein Haufen Daten in ein Record von 512 kB sammeln. Dann muss man 4-mal records übertragen so das man sämtliche 2MB Daten bekommt.
Das kann man relativ einfach testen.
 
Zurück
Oben