Minehunter
Level-1
- Beiträge
- 25
- Reaktionspunkte
- 4
-> 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
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: