TwinCat3 - Auslesen einer CSV-Datei

MerlinBerlin

Level-1
Beiträge
35
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute,
ich bin relativ neu in der TwinCat-Programmierung und soll nun Daten (Zahlenwerte) aus einer CSV-Datei auslesen und im Code als Variable speichern. Ich habe mir dazu auch die Dokumentation durchgelesen, insbesondere die Befehle FB_FILEGETS und FB_FILEOPEN. Allerdings weiß ich nicht so recht was damit anzufangen ist. Ich wäre sehr an einem BeispielCode interessiert.
Ich bekomme immer, wenn ich versuche die Datei mit FB_FILEOPEN zu öffnen den Fehlercode 070C (Datei nicht gefunden), das passiert auch wenn ich den nMode verändere. Der DateiPfad ist definitiv korrekt. Kann das an der sNetId liegen? In dem Beispiel in der Dokumentation sind hier nur zwei Hochkomma angegeben. Ist das korrekt?
Kann mir jemand helfen, wie ich diese Funktionen aufrufe? Ich wäre euch sehr dankbar.

PS: Mir ist bewusst, dass es bereits andere Beiträge zu dem Thema gibt, jedoch gehen diese auch nicht über allgemeine Informationen hinaus soweit ich das erkennen konnte.




MerlinBerlin
 
Zuletzt bearbeitet:
Der FileCopy Baustein im Beispiel ist in keiner Bibliothek von Beckhoff enthalten. Er dient nur als praktisches Beispiel zum demonstrieren der FileOpen, FileRead, FileWrite und FileClose Bausteine.
Diese Grundfunktionen sind die gleichen wie in TwinCAT 2.
 
Dann beantwortet das leider nicht meine Frage.
Ich habe die Funktion FileOpen ausgeführt und die Error ID wird auf 070C gesetzt (Datei nicht vorhanden).
Der Code sieht wie folgt aus.
Code:
fbFileOpen(sNetId :='' , sPathname := 'C:\Users\abcd\test1234.txt', nMode:= FOPEN_MODEREAD ,bExecute := TRUE, tTimeOut := T#3S);
bFileOpenBusy := fbFileOpen.bBusy;
bFileOpenError := fbFileOpen.bError;
nFileOpenErrId := fbFileOpen.nErrId;
hFile := fbFileOpen.hFile;
 
Nur so ein Gedanke, aber da der Pfad nach Windows aussieht: Könnte es sein, das die Benutzerrechte-Verwaltung da dazwischen grätscht? Gerade weil es das Verzeichnis "Users" ist.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Der Fehler scheint behoben, habe die erste Zeile wie im Beispiel eingefügt. Der Fehlercode wird nun nicht mehr gesetzt. Jedoch bleibt Busy durchgehend auf True und die hFile nach wie vor auf null. Woran kann das liegen?
Code:
fbFileOpen( bExecute := FALSE ); 
fbFileOpen(sNetId :='' , sPathname := 'C:\Users\buesing_m\Downloads\test1234.txt', nMode:= FOPEN_MODEREAD ,bExecute := TRUE, tTimeOut := T#3S);
bFileOpenBusy := fbFileOpen.bBusy;
bFileOpenError := fbFileOpen.bError;
nFileOpenErrId := fbFileOpen.nErrId;
hFile := fbFileOpen.hFile;
 
Für mich sieht das so auch, als ob du den FB in jedem Zyklus neu startest. Schau dir das Beispiel FileCopy genauer an. Der doppelte Aufruf des FB_FileOpen erfolgt dort nur für einen Zyklus. Danach wird im nächsten Schritt der FB nur noch so: fbFileOpen( bExecute := False) aufgerufen.
 
Edit

Ja, damit hast du Recht, ich habe den Teil, der das abfängt aber lediglich nicht mit kopiert. Im ganzen sieht es so aus:


Code:
IF Step = 0 THEN
fbFileOpen( bExecute := FALSE ); 
fbFileOpen(sNetId :='' , sPathname := 'ftp://192.168.xx.xxx/test.txt', nMode:= FOPEN_MODEAPPEND, bExecute := TRUE, tTimeOut := T#3S);
bFileOpenBusy := fbFileOpen.bBusy;
bFileOpenError := fbFileOpen.bError;
nFileOpenErrId := fbFileOpen.nErrId;
hFile := fbFileOpen.hFile;
Step := 1;
END_IF

Es gibt ein Update. Die Dateien können auf der Steuerung abgelegt werden und via FTP erreicht werden. Ich habe den Pfad entsprechend verändert, jedoch ohne Effekt. Muss ich da etwas beachten?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Kannst du nichtmal deinen ganzen Code hier posten? Dieses rumgerätsel um Bruchstücke herum bringt keinen weiter.
Fragst du Busy, Error, hFile etc. auch noch im nächsten Schritt ab? Wenn nein, erklärt das warum sich die Zustände nicht mehr ändern.

FB_FileOpen kommt schon mit Netzlaufwerken nicht klar, ich glaube da kaum das es da mit FTP Verbindungen besser aussieht.
 
Ich habe doch noch gar keine anderen Schritte. Da meine hFile immer noch 0 ist, halte ich das auch noch nicht für sinnvoll. Oder verstehe ich da was falsch?
Gehe jetzt davon aus, dass die Variable erstmal gesetzt werden muss, damit ich da dann weiter mit arbeiten kann.

Also ein ziemlich sicheres nein für FTP?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habe doch noch gar keine anderen Schritte. Da meine hFile immer noch 0 ist, halte ich das auch noch nicht für sinnvoll. Oder verstehe ich da was falsch?
Gehe jetzt davon aus, dass die Variable erstmal gesetzt werden muss, damit ich da dann weiter mit arbeiten kann.

Also ein ziemlich sicheres nein für FTP?

Na da sind wir doch schon mal einen Schritt weiter.
Wenn du keine anderen Schritte hast, wird auch dein fbFileOpen nicht mehr aufgerufen wenn Step = 1. Du musst ihn aber aufrufen damit er ausgeführt werden kann.
FileOpen braucht mehrere Zyklen um eine Datei zu öffnen.

Also nochmal von vorne. Schritt 1: fbFileOpen mit den Paramentern und einem TRUE auf bExecute ausführen um den Datei öffnen Vorgang zu starten. Dann in den nächsten Schritt springen.
Das hast du schon gemacht.
In Schritt 2 fbFileOpen weiter ausführen (mit bExecute = FALSE <== muss nicht sein aber schadet nicht) bis bBusy wieder False ist. Dann bekommst du deinen File Handler wenn alles glatt ging und die
Datei geöffnet werden konnte oder eine Fehlermeldung wenn die Datei nicht geöffnet werden konnte.

Zum Thema FTP gibt es von Beckhoff ein Supplement mit dem man einen FTP Client ins Programm einbinden kann. Allerdings ist dieses Supplement nicht kostenlos. LINK
 
Edit 2.0

Vielen Dank bis dahin erstmal.
Da FTP scheinbar keine gute Idee war, habe ich jetzt einen USB-Stick in den Beckhoff CX9020 gesteckt, mit diversen Testdateien. Allerdings weiß ich nicht wie ich auf den Dateipfad der Dateien/ des Sticks komme. Wisst ihr das zufällig?
Wenn ich das weiß, werde ich meinen Code anpassen, wie du gesagt hast.

EDIT: Laut Forum kann man "\HardDisk2\" benutzen.

Mein Code sieht also nun wie folgt aus:
Code:
IF Step = 0 THEN
    testCounterSchritt1 := 0;
    testCounterSchritt2 := 0;
END_IF

IF Step = 0 THEN
    fbFileOpen( bExecute := FALSE ); 
    fbFileOpen(sNetId :='' , sPathname := '\HardDisk2\test123.txt', nMode:= FOPEN_MODEAPPEND, bExecute := TRUE, tTimeOut := T#3S);
    bFileOpenBusy := fbFileOpen.bBusy;
    bFileOpenError := fbFileOpen.bError;
    nFileOpenErrId := fbFileOpen.nErrId;
    hFile := fbFileOpen.hFile;
    Step := 1;
    testCounterSchritt1 := testCounterSchritt1 + 1;
END_IF


IF fbFileOpen.bBusy AND Step = 1 THEN
    fbFileOpen(sNetId :='' , sPathname := '\HardDisk2\test123.txt', nMode:= FOPEN_MODEAPPEND, bExecute := FALSE, tTimeOut := T#3S);
    bFileOpenBusy := fbFileOpen.bBusy;
    bFileOpenError := fbFileOpen.bError;
    nFileOpenErrId := fbFileOpen.nErrId;
    hFile := fbFileOpen.hFile;
    testCounterSchritt2 := testCounterSchritt2 + 1;

END_IF

Die testCounter habe ich eingeführt um zu schauen, wie oft beide Schritte ablaufen. Der erste ist 1, der zweite 3 nach dem Aufruf.
Ist das so korrekt?
Es wird jetzt wieder der 070C-Fehler (Datei nicht gefunden) gesetzt und hFile bleibt 0. Da ich den FOPEN_MODEAPPEND benutze, sollte er doch aber eigentlich die Datei erstellen, sofern sie nicht existiert, oder nicht?



EDIT 2.0:
Okay, habe bei Hard Disk2 ein Leerzeichen vergessen:D Jetzt wird meine hFile initialisiert. Ich versuche mich mal an den nächsten Schritten. Vermutlich werde ich mich nochmal melden, wenn etwas nicht funktioniert.

Vielen Dank nochmal :)
 
Zuletzt bearbeitet:
Da bin ich wieder. Bin leider noch nicht wesentlich weiter gekommen. Ich möchte jetzt auf eine Spalte in einer Zeile zugreifen und den Wert speichern. (Geht im Wesentlichen um Zahlenwerte, aber das soll mal erst keine Rolle spielen). Habe jetzt folgenden Code geschrieben:

Code:
IF Step = 2 THEN
    fbFileGets(bExecute := FALSE);
    fbFileGets(sNetId := '', hFile := hFile, bExecute := TRUE, tTimeout := T#2S);
    Step := 3;
END_IF

IF (NOT fbFileGets.bBusy) AND Step = 3 THEN
    fbFileGets(bExecute := FALSE);
END_IF

Ich sehe, dass sLine gesetzt wurde und möchte nun die einzelnen Spalten der Zeilen in Variablen speichern. Wie geht das?

Es gibt im InfoSys ein Beispiel, das ich aber leider nicht öffnen kann. (Die Konvertierung von TC2 zu TC3 scheint nicht zu klappen.) Würde mich auch schon freuen, wenn jemand das Beispiel hier (zumindest zum Teil) hier posten könnte.

http://infosys.beckhoff.de/index.ph...ies/html/tcplclibutilities_csv_sample.htm&id=
 
Zuletzt bearbeitet:
Zurück
Oben