TC3: Handling großer, variabler Datenmengen aus csv-Dateien

roboticBeet

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

bislang habe ich mit STEP7/TIA Portal gearbeitet und steige nun auf TwinCAT3 (nach erster Skepsis wirklich super) um. Für mein erstes größeres Projekt habe ich nun jedoch eine konzeptionelle Frage:

Für eine Pick&Place Anlage liegen die Auftragsdaten in Form einer csv-Datei vor. Jede Zeile dieser csv-Datei beinhaltet einen für sich abgeschlossenen Auftragsteil, aus welchem sich die notwendigen Achsbewegungen etc. ableiten lassen. Um nun die die Auftragsdaten in die Steuerung zu laden, möchte ich die csv-Datei in ein Array in die SPS übertragen. Dies ist auch prinzipiell kein Problem. Jedoch ist der Umfang der csv-Datei sehr variabel. Angefangen bei wenigen (< 50) Zeilen bis hin zu 10.000 und mehr Einträge in der csv-Datei sind möglich. Die csv-Datei müsste nur einmalig zum Auftragsbeginn abgearbeitet werden, anschließend würde ich mit dem Array arbeiten wollen. Ich bin mir nun unsicher, wie ich am besten vorgehe.

Ein Array mit dynamischen Grenzen würde ich, zumindest in der S7-Welt, vermeiden wollen, um keine Zykluszeitüberschreitungen zu riskieren. Ein sehr großes Array mit ausreichend "Angst-Reserve" (bspw. 20.000 möglicher Einträge) finde ich stilistisch "ungünstig". Außerdem bin ich mir nicht sicher, ob ein solch großes Array überhaupt möglich wäre (hab ich selber noch nicht getestet). Die csv-Datei "portionsweise" als dritte Option in kleinere Arrays auslesen ist glaube ich nicht möglich.

Habt ihr noch grundsätzliche Ideen?
 
Zykluszeit-Überschreitung wirst Du nicht durch die schiere Array-Größe bekommen, sondern dann, wenn Du versuchst die csv-Datei in nur einem einzigen Zyklus in das Array einzulesen. Du könntest die Aufgabe auf mehrere Zyklen aufteilen und z.B. immer nur 500 oder 1000 Zeilen einlesen und im nächsten Zyklus weitermachen. Wie lang ist so eine csv-Zeile, wieviele Zahlen stehen da drin?

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Danke für den Ansatz. Auf die Kombination aus meinen ersten Ideen 1 und 3 hätte ich auch kommen können :p

Es befinden sich in einer Zeile 32 CHAR-Zeichen aufgeteilt in mehrere Datenfelder und zwei UINTs.
 
Eine Zykluszeitüberschreitung wirst Du nicht bekommen, weil der Dateizugriff asynchron zur zyklischen Task ausgeführt wird. Allerdings kannst Du mit dem FB_Gets immer nur eine Zeile aus einer Textdatei lesen. Du brauchst dann für jede Zeile mindestens 2 SPS-Zyklen. Einen, um den Leseauftrag zu zu starten, und den zweiten, um abzufragen, ob er fertig ist. Wenn Du es geschickt anstellst, kannst Du im zweiten Zyklus natürlich schon den nächsten Leseauftrag setzen, aber bei 10000 Zeilen zieht sich das trotzdem hin. Ich würde die Datei lieber als Binärdatei in einem Rutsch in ein genügend grosses Array of Byte einlesen und eine Funktion schreiben, die dann die einzelnen Zeilen aus dem Array ausliest.
 
Danke für die Anregungen. Habe jetzt erstmal das Einlesen der csv-Datei Zeile für Zeile implementiert, da während der Verarbeitung die Maschine bestückt wird. Sollte die Verarbeitungszeit dennoch zu lang werden, würde ich mir das Einlesen als Binärdatei nochmal anschauen.
 
Zurück
Oben