Überprüfen on Datei Vorhanden(TwinCat 3)

Minehunter

Level-1
Beiträge
25
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Forum,

wie der Titel schon verrät benötige ich Hilfe bei einem kleinem Programm.
Ich erfasse mithilfe einer Beckhoff SPS verschiedene Messdaten und speichere diese als CSV Datei.
Jede Woche wird entsprechend eine Neue, für jeden Prüfling eigens, eine Datei angelegt.

Das Modul ist eigens geschrieben und wird in einer Schleife (CASE [Schreibe Datei], [warte bis fertig],[erhöhe prüflingszahl]), entsprechend der Anzahl an Prüflingen aufgerufen und abgearbeitet.
Soweit so gut, und es funktioniert eigentlich auch alles.

Mein Problem was ich nun habe, gibt es eine elegante Möglichkeit , schnell und ohne viele Zyklen zu überprüfen, ob eine Datei um Ordner schon vorhanden ist?

Aktuell gehe ich wie folgt vor.
(egal ob Datei vorhanden oder nicht, wird dies bei jedem schreiben der Datei aufgerufen)

1. Zyklus
Öffne Datei im Lesemodus
2. Zyklus
Warte bis Datei geöffnet ist => ist Datei vorhanden, dann Error=0, Datei nicht vorhanden, Error=1
Gehe in schritt zum erzeugen der Neuen Datei
3. Zyklus
schließe Datei wieder wenn vorhanden.
4. Zyklus
Warte bis Datei geschlossen ist

Das sind insgesamt 4Zykles, welche jedes Mal in einer CASE Anweisung ausgeführt werden.
40ms Zykluszeit bei z.B. 30 Prüflingen, macht schon was her.

gibt es hierfür eine bessere Möglichkeit?



Idee:
1. einlesen des gesamten Verzeichnisses und überprüfen der eingelesenen Daten auf Existenz (Nachteil, da nicht die Anzahl der Dateien vorhersehbar ist, und entsprechend großes Array vorgehalten werden muss)
2. Instanziierung des Moduls für jeden Prüfling mit Speicherung ob Datei vorhanden (Speicherplatzbedarf wächst je nach Anzahl der Prüflinge)


Über Hilfe würde ich mich sehr freuen und sage schon einmal DANKE im voraus

Code:
20: 
  //********************************************
  // Überprüfen ob Datei vorhanden ist
  //********************************************
  fbFileOpen( bExecute := FALSE, bError => bError, nErrID => nErrID, hFile => hFile );
  fbFileOpen(
   sNetId:= NetIdZielAdr, 
   sPathName:= sFileName, 
   nMode:= Tc2_System.FOPEN_MODEREAD, 
   ePath:= Tc2_System.PATH_GENERIC, 
   bExecute:= TRUE, 
   tTimeout:= T#100MS, 
  );
  iState := 21;
21:
  //********************************************
  // Warten bis überprüft wurde, ob datei vorhanden ist
  //********************************************
  fbFileOpen( bExecute := FALSE, bError => bError, hFile => hFile );
  IF NOT fbFileOpen.bBusy THEN 
   IF NOT fbFileOpen.bError THEN
    iState := 22;    // Datei vorhaden, dann schließe datei wieder, !!! ACHTUNG, datei befindet sich im Lese Modus, daher vorher schließen
    bFileExists := TRUE;  // Merker: Datei existiert
   ELSE
    iState := 30;    // Datei nicht vorhaden, dann Datei Neu anlegen und Kopfzeilen schreiben 
    bFileExists := FALSE;  // Merker Datei existiert nicht
   END_IF 
  END_IF
 
// !!!!!!!!!!!!!!!!!!!!!!!
// Datei muss geschlossen werden, da sich diese im LESE MODUS befindet 
// !!!!!!!!!!!!!!!!!!!!!!!
22:
  //********************************************
  // schließe datei
  //********************************************
  fbFileClose( bExecute := FALSE, bError => bError, nErrID => nErrID );
  fbFileClose(
   sNetId:= NetIdZielAdr, 
   hFile:= hFile, 
   bExecute:= TRUE, 
   tTimeout:= T#100MS, 
  );
  iState := 23;
23:
  //********************************************
  // warte bis datei geschlossen ist
  //********************************************
  fbFileClose( bExecute := FALSE );
  IF NOT fbFileClose.bBusy THEN
   fbFileClose.bExecute := FALSE;
   
  END_IF
 
Zuletzt bearbeitet:
Moin Minehunter,

ich benutze bei TC2 FB_EnumFindFileList zum Dateien suchen. Vll funktioniert das auch bei TC3 wovon ich aus gehe.

Ich hoffe die Funktion bringt dich schon weiter =)
Zum Thema Zyklus - Du hast zwar 4 Case aber die Bausteine wie zum Beispiel erstellen einer Datei benötigen unter umständen auch mehrerer Zyklusdurchgänge. Deine Brechnung geht also leider nicht auf wenn du Pech hast kann du vom 2-3 fachen von dem ausgehen. Wenn es schneller gehen muss, musst du dir vll einen Temporären Datenspeicher schaffen und gesammelt alles wegschreiben. Oder du benötigst eine andere Hardware mit der du einen schnelleren Zyklus fahren kannst.

MfG Hendrik
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Hendrik,

vielne dank für deinen Tip, habe dies so umgesetzt, dass ich mir vor beginn, entsprechend eine Liste mit den Dateien suchen lasse und entsprechend vergleiche.

Danke noch einmal
 
Zurück
Oben