Textdatei von USB in Arrays lesen (Beckhoff)

flar2000

Level-1
Beiträge
23
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
komme derzeit leider bei einem FileHandling-Problem nicht weiter. Eine Maschine erhält von mir auf einem USB Stick eine Textdatei die Befehle enthält... nun soll jede einzelne Zeile in ein Array gelesen werden, das dann noch einmal geparst werden sollte...
Stehe leider komplett an, das ganze läuft ja zyklisch ab auf einer Beckhoff Steuerung und daher fehlt mir schon er erste Ansatz...

Vielen Dank für eure Hilfe!
LG flar2000
 
Eine Maschine erhält von mir auf einem USB Stick eine Textdatei die Befehle enthält... nun soll jede einzelne Zeile in ein Array gelesen werden, das dann noch einmal geparst werden sollte...
Was denn für "Befehle"? ST- oder AWL-Anweisungen??? Oder "G-Code"?
Ich fürchte, Du wirst Dir einen BefehlsSatz für Deine Anwendung ausdenken und die Befehle in der SPS interpretieren müssen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Was denn für "Befehle"? ST- oder AWL-Anweisungen??? Oder "G-Code"?
Ich fürchte, Du wirst Dir einen BefehlsSatz für Deine Anwendung ausdenken und die Befehle in der SPS interpretieren müssen.

Also das ganze sind Winkel, und Geschwindigkeiten direkt in Zahlen getrennt durch "$" und ":" einem Endsymbol "&", wedr AWL- noch ST und G-Code, das wird vollständig von mir selbst interpretiert... Es geht hauptsächlich um das auslesen aller Daten aus dem Textfile in ein Array
 
Also das ganze sind Winkel, und Geschwindigkeiten direkt in Zahlen getrennt durch "$" und ":" einem Endsymbol "&", wedr AWL- noch ST und G-Code, das wird vollständig von mir selbst interpretiert... Es geht hauptsächlich um das auslesen aller Daten aus dem Textfile in ein Array
Du willst also irgendwelche "vorbereitete Stellen" im Programm mit aktuell eingelesenen Parametern versorgen.
Wo ist Dein Problem und was hat das mit der zyklischen Bearbeitung zu tun?
Irgendeine Form von Handshake wirst Du vermutlich benötigen, um die neuen Parameter im richtigen Augenblick zu aktivieren bzw. anzufordern.
 
Ok kurze Beschreibung des ganzen Programmes...
es gibt vorbereitete Winekl und aktuelle, die vorbereiteten stehen alle in einem Array das sind für einen kompletten Arbeitsablauf an die knapp 4000 Positionen und diese möchte ich zu erst in ein Array lesen in der eine gesamte Zeile steht. Z.B.: 48$30$20:5$2$1&. Also bis zum ":" sind es Winkel und bis zum Endzeichen & fogen die Geschwindigkeiten, mit denen diese Positionen angefahren werden sollen.
Danach bekommt jede Länge ein einzelnes Array jeweils für Geschwindigkeit und Sollwinkel.

Bedeutet insgesamt 7 Arrays. Eines das jeweils eine Zeile enthält, und darauf 3 Sollwinkel-Arrays und 3 Geschwindigkeits-Array.

Vor die Maschine das erste Mal anläuft soll das komplette File gelesen werden und alle Zeilen in die Arrays geladen werden und darauf auf die 6 einzelnen Arrays aufteilen, damit anschließen nur noch beim Erreichen der Werte der Index erhöht werden muss und dann die nächsten Positionen verwendet werden soll.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Woran scheiterst Du?
- Einlesen der TextDatei? (Vermutlich über die BedienOberfläche/Visu gesteuert)
- Auswerten des TextDateiInhaltes und Aufteilen auf die ArrayElemente?
- Zuführen der auf die ArrayElemente aufgeteilten "Befehle" zur Interpretation im Ablauf des ausführenden Programms?
 
Ich scheitere an folgendem:
Einlesen der Textdatei, und an dem Lesen der einzelnen Zeilen und einlesen in die einzelnen Arrays...
Also an den ersten beiden, von dir angeführten, Punkten...
 
Ich hoffe, dass hier jemand mitliest, der sich mit CodeSys auskennt und helfend einspringen kann! ;)

Ich kann momentan nur noch fragen: warum 7 Arrays? Ist es die Vielzahl der Arrays, die Dich vor dem Durchblick bewahrt?
Könnte mir vorstellen, dass Du mit einem (oder zwei?) Array of Struct besser zu Rande kommst.
Das dürfte dann der Fall sein, wenn alle Elemente der Arrays mit demselben Index auch inhaltlich zusammen gehören.
Z.B.
Array[x].Winkel1
Array[x].Feed1
Array[x].Winkel2
Array[x].Feed2
...
Mach Dir einen benutzerdefinierten DatenTyp, der die inhaltlich zusammen gehörenden Daten umfasst und leg Dir ein Array mit diesem DatenTyp an.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich kann momentan nur noch fragen: warum 7 Arrays? Ist es die Vielzahl der Arrays, die Dich vor dem Durchblick bewahrt?
Könnte mir vorstellen, dass Du mit einem (oder zwei?) Array of Struct besser zu Rande kommst.
Das dürfte dann der Fall sein, wenn alle Elemente der Arrays mit demselben Index auch inhaltlich zusammen gehören.
Z.B.
Array[x].Winkel1
Array[x].Feed1
Array[x].Winkel2
Array[x].Feed2
...
Mach Dir einen benutzerdefinierten DatenTyp, der die inhaltlich zusammen gehörenden Daten umfasst und leg Dir ein Array mit diesem DatenTyp an.


Super viel Dank auf die Idee bin ich noch nicht gekommen, aber eigentlich offensichtlich.. Sind dann also 2 Arrays, einmal jede Zeile aus dem Textfile für sich und das zweite Structarray, welches meine Daten dannn geparst und richtig gespeichtert enthält...

Hast du eventuell eine Idee wie ich alle Zeilen aus dem Textfile in ein Array (Eine Zeile ist ein Arrayeintrag) bekomme?
 
Hast du eventuell eine Idee wie ich alle Zeilen aus dem Textfile in ein Array (Eine Zeile ist ein Arrayeintrag) bekomme?
Leider sind meine Ideen zu vage und mir fehlen die Kenntnisse, welche Möglichkeiten in CodeSys geboten werden (Anweisungen, Bibliotheken, ...) für:
- Datei "finden" bzw. "identifizieren"
- Datei öffnen
- Info erhalten, ob DateiÖffnen erfolgreich erledigt ist
- 1 Satz lesen
- Info erhalten, ob DateiEnde erreicht ist
- Datei schliessen.
Zur Zerlegung eines Strings in seine Bestandteile (definiert über Trennzeichen) dürfte es eine Funktion geben. Müsste ggfs mehrfach für die verschiedenen Trennzeichen angewendet werden.
Kann man aber auch "zu Fuss" machen, indem man die Positionen der Trennzeichen sucht (in VBA z.B. mit Instr) und den String dann zerlegt (in VBA z.B. mit Mid).

Ich hoffe weiterhin angestrengt, dass sich hier mal ein CodeSys-Experte einmischt!!! ;)
 
Zuviel Werbung?
-> Hier kostenlos registrieren
In der 'Standard.lib' habe ich die Funktionen FIND und MID gefunden, die für die Zerlegung der TextZeilen benutzt werden könnten.
Für die DateiZugriffe könnte es auch etwas in irgendeiner lib geben.
Wo leierst Du denn das Lesen einer Datei an? In der Visu? Kannst Du dort ein Script verwenden? VBS?
 
Prinzipiell brauchst Du dafür Beckhoff-FBs aus der Tc2System Bibliothek:
FB_FileOpen zum Öffnen der Datei
FB_FileGets zum Lesen der Textzeilen
FB_FileClose zum Schliessen der Datei
Der FB_FileGets liest allerdings immer nur eine Zeile pro Aufruf, und jeder Aufruf braucht mindestens 2 SPS-Zyklen, den ersten zum Starten des Dateibefehls und den zweiten zum Prüfen, ob der FB seine Aufgabe erledigt hat. Bei 4000 Zeilen also mindestens 8000 SPS-Zyklen. Hast Du soviel Zeit?
 
Zuletzt bearbeitet:
Also so viel Zeit habe ich. Müsste also zuerst ein Programm haben, dass mir das ganze in Globale Variablen einspeichert und erst, wenn alles fertig gelesen ist, dass MAIN startet?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bei 4000 Zeilen also mindestens 8000 SPS-Zyklen. Hast Du soviel Zeit?
Bei einer ZyklusZeit von 10 ms wären das 80 Sekunden. Kann man sicherlich verknusen. Evtl. fallen gleichzeitig RüstArbeiten an der Maschine an und mit der ersten Handvoll Parameter kann die Maschine schon mal anfangen zu wirken, während die restlichen Daten noch eingelesen werden?

Also so viel Zeit habe ich. Müsste also zuerst ein Programm haben, dass mir das ganze in Globale Variablen einspeichert und erst, wenn alles fertig gelesen ist, dass MAIN startet?
Ob zuerst alles eingelesen sein muss, bevor Du den Startschuss geben kannst, das darfst Du uns nicht fragen - das musst Du uns sagen! ;)
 
Zuletzt bearbeitet:
Sehe ich hier auch nicht als Problem da die Maschine daraufhin mehrere Stunden arbeitet und diese Zeit durchaus gerechtfertigt ist.
 
Nein, das kannst Du im MAIN machen. Die File-FBs arbeiten asynchron zum SPS-Zyklus, halten Dich also nicht auf. Wenn Du ein Datei-Kommando starten willst, rufst Du den FB mit allen erforderlichen Parametern auf und setzt dabei seinen bExecute-Eingang auf True. Im nächsten SPS-Zyklus rufst Du den FB wieder auf, entweder ohne die Parameter zu ändern oder noch besser ohne ihm überhaupt Parameter zu übergeben. Nach dem Aufruf prüfst Du, ob der bBusy-Ausgang des FBs wieder false ist. Falls nicht, wiederholst Du das Ganze im folgenden Zyklus. Im Zyklus, in dem bBusy false wird, rufst Du den FB dann noch einmal mit bExecute:=false auf, und prüfst den bError-Ausgang. Wenn der false ist, hat der FB seine Aufgabe fehlerfrei erledigt, und seine Eregbnis-Ausgänge sind gültig.
 
@flar2000:
Zeit hin oder her, ich mache solche langwierigen Dateizugriffe nur ungern. Habe immer Angst, dass jemand zu ungeduldig ist und den Rechner aus- und wieder einschaltet.
 
Zurück
Oben