Datei nicht per FTP zu laden, obwohl Datei mit fbFileClose geschlossen

mv08

Level-1
Beiträge
32
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Beckhoff CX: Datei nicht per FTP zu laden, obwohl Datei mit fbFileClose geschlossen

Hallo,

ich habe mit TwinCat PLC und Beckhoff CX8093 folgendes Problem.

Im Code schließe ich die Datei und bin eigentlich davon ausgegangen, dass nun ein löschen, bearbeiten oder herunterladen möglich ist.
Code:
fbFileClose( bExecute := FALSE );
fbFileClose( sNetId := sNetId, hFile := hFile, bExecute := TRUE );

Wenn ich danach in Filezilla die Datei herunterladen möchte, erhalte ich diese Meldung:
Code:
Status:    Starte Download von /Ausgabe - 2013-07-04-11-36-55.csv
Befehl:    PASV
Antwort:    227 Entering Passive Mode (192,168,2,120,192,18).
Befehl:    RETR Ausgabe - 2013-07-04-11-36-55.csv
Antwort:    550 File unavailable (e.g., file not found, no access).
Fehler:    Kritischer Dateiübertragungsfehler

Leider kann ich bis zum Neustart nichts an der Datei machen. Erst nach einem Neustart ist die Datei verwendbar.

Hat jemand eine Idee?

LG,
Dennis
 
Zuletzt bearbeitet:
Packe mal dein Problem Code bezüglich des close fb hier rein. B execute musst du auf true setzen und den fb solange aufrufen bis busy false ist. Hfile muss der pointer aus deinem fb open sein. Wenn du immer wieder den fb mit execute false und execute true aufrufst, passiert nichts weil fbclose mehrere Zyklen braucht.
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo soma,

hier der komplette Teil:

Code:
    10:    (* Close source file *)
        fbFileClose( bExecute := FALSE );
        fbFileClose( sNetId := sNetId, hFile := hFile, bExecute := TRUE );
        step := 11;

    11:(* Wait until close not busy *)
        fbFileClose( bExecute := FALSE, bError => bError, nErrID => nErrID );
        IF ( NOT fbFileClose.bBusy ) THEN
            hFile := 0;
            step := 100;
        END_IF
        step := 12;

100: (* Error or ready step => cleanup *)
        IF ( hFile <> 0 ) THEN
            step := 10; (* Close the source file *)
        ELSE
            bBusy := FALSE;
            step := 101;    (* Ready *)
        END_IF
 
Zuletzt bearbeitet:
Das Programm wird ja nur für einen Zyklus mit Step=11 durchlaufen, dann setzt Du schon Step:=12, und bei Step=12 passiert offensichtlich nichts mehr.
 
Hier der Rest :)

Code:
startNewRowTON(IN:= startNewRow, PT:=t#10s , Q=> , ET=> );

CASE step OF
	0:	(* Wait for rising edge at bWrite variable *)

			bWrite 		:= FALSE;
			bError		:= FALSE;
			nErrId		:= 0;
			hFile		:= 0;

		(* Open source file *)
		(*Aktuelle Zeit auswerten und in eine Variable schreiben*)
		fbGetSystemTime(timeLoDW=>fileTime.dwLowDateTime, timeHiDW=>fileTime.dwHighDateTime );

		(*Jetzt noch die Zeitzone anpassen*)
		fbToLocal( in := fileTime, tzInfo := WEST_EUROPE_TZI );

		(*Und die aktuelle Zeit in die Variable schreiben.*)
		sAktuelleZeit :=LEFT(SYSTEMTIME_TO_STRING( FILETIME_TO_SYSTEMTIME(fbToLocal.out ) ),19);

		REPEAT

  		iPos := FIND(sAktuelleZeit,':');          (*Findet den ersten : im String und speichert seine Position in iPos*)
		  IF iPos > 0 THEN                               (*iPos > 0 wenn : im String gefunden*)
 		  sAktuelleZeit := REPLACE(sAktuelleZeit, '-', 1, iPos); (*ersetzt das Zeichen an Stelle iPos (:) durch - *)
  			END_IF

		UNTIL
 			  iPos = 0        (*mach das ganze solange bis kein : mehr im String gefunden wird*)
		END_REPEAT

		sFileName := CONCAT('\Hard Disk\test\Ausgabe - ',CONCAT(sAktuelleZeit,'.csv'));

		step 		:= 1;


	1:
		bBusy 		:= TRUE;
		fbFileOpen(  bExecute := FALSE  );
		fbFileOpen( 	sNetId := sNetId, sPathName := sFileName, nMode := FOPEN_MODEAPPEND OR FOPEN_MODEPLUS, ePath := PATH_GENERIC, bExecute := TRUE );
		step := 2;

	2:(* Wait until open not busy *)
		fbFileOpen( bExecute := FALSE, bError => bError, nErrID => nErrID, hFile => hFile );
		IF NOT fbFileOpen.bBusy THEN
			IF NOT fbFileOpen.bError THEN
				step := 3;
			ELSE(* Error: file not found? *)
				step := 100;
			END_IF
		END_IF

	3:	step :=4;

	4:	(* Eine Textzeile generieren *)
		fbFilePuts( bExecute := FALSE );

		fTemp1 := INT_TO_REAL(TEMP1)/10;
		sTemp1 := LREAL_TO_FMTSTR(fTemp1,1,TRUE);
		iPosTemp := FIND(sTemp1,'.');
		sTemp1 :=  REPLACE(sTemp1, ',', 1, iPosTemp);

		(*Aktuelle Zeit auswerten und in eine Variable schreiben*)
		fbGetSystemTime(timeLoDW=>fileTime.dwLowDateTime, timeHiDW=>fileTime.dwHighDateTime );

		(*Jetzt noch die Zeitzone anpassen*)
		fbToLocal( in := fileTime, tzInfo := WEST_EUROPE_TZI );

		(*Und die aktuelle Zeit in die Variable schreiben.*)
		sAktuelleZeit :=LEFT(SYSTEMTIME_TO_STRING( FILETIME_TO_SYSTEMTIME(fbToLocal.out ) ),19);
		sAktuellesDatum := LEFT(sAktuelleZeit,10);
		sAktuelleUhrzeit :=  RIGHT(sAktuelleZeit,8);;

		(*Jetzt wird die Zeile zusammengesetzt*)
		sZeile :=  CONCAT('"',CONCAT(sAktuellesDatum,CONCAT('";"',CONCAT(sAktuelleUhrzeit,CONCAT('";"',CONCAT(sTemp1,'"$n' ))))));
		fbFilePuts( sNetId := sNetId, hFile := hFile, sLine := sZeile, bExecute := TRUE );
		step := 5;

	5:(* Warten, wenn der Writer noch beschäftigt ist *)
		fbFilePuts( bExecute := FALSE, bError => bError, nErrID => nErrID );
		IF NOT fbFilePuts.bBusy THEN
			IF NOT fbFilePuts.bError THEN
			step :=10;
			ELSE(* Error *)
				step := 100;
			END_IF
		END_IF

	10:	(* Close source file *)
		fbFileClose( bExecute := FALSE );
		fbFileClose( sNetId := sNetId, hFile := hFile, bExecute := TRUE );
		step := 11;

	11:(* Wait until close not busy *)
		fbFileClose( bExecute := FALSE, bError => bError, nErrID => nErrID );
		IF ( NOT fbFileClose.bBusy ) THEN
			hFile := 0;
			step := 100;
		END_IF
		step := 12;

	12:	(*Jetzt wird 10 Sekunden gewartet, bis es weitergeht*)
		tonDelay(IN := xStartDelay, PT := T#10000MS);
		xStartDelay := NOT tonDelay.Q;
		IF tonDelay.Q THEN
		step := 1; (*Wieder zurück zu Step1 damit es von vorne beginnt*)
		ELSE
		bBusy := FALSE;
		step :=12; (*Wenn die 10 Sekunden noch nicht rum sind, wieder am Anfang von Step 12 die Schleife durchlaufen.*)
		END_IF



	100: (* Error or ready step => cleanup *)
		IF ( hFile <> 0 ) THEN
			step := 10; (* Close the source file *)
		ELSE
			bBusy := FALSE;
			step := 101;	(* Ready *)
		END_IF
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Schau dir mal Schritt 11 an. So wie es jetzt bei dir steht, springt deine Schrittkette sofort in Schritt 12 ohne zu warten bis das Schließen der Datei beendet wurde....

step := 12 muss in die IF NOT fbFileClose.bBusy THEN Verzweigung mit rein. Dann brauchst du noch eine zusätzliche Bedingung die angibt ob die Schrittkette nach dem Schließen der Datei zu Schritt 100 springen soll oder es mit Schritt 12 weitergeht.
 
Zuletzt bearbeitet:
Hallo MasterOhh,

danke für deine prompte Antwort.
Ich habe mir deinen Text gefühlte 20x durchgelesen aber leider nicht verstanden, was ich jetzt machen muss. Kannst du mir ein Beispiel an meinem Code nennen?
Vielen Dank!
LG,
Dennis
 
OK, also das deine Schrittkette sofort von Schitt 11 nach Schritt 12 weiterspringt ohne zu warten bis die Datei geschlossen wurde erkennst du, oder?

Nach dem Schließen der Datei hast du ja 2 Möglichkeiten. Du gehst zu Schritt 12 und startest den ganzen Ablauf nach 10s wieder von vorne (übrigens, 10s kann man auch als T#10s statt T#10000ms darstellen ;) ) oder du beendest den ganzen Ablauf indem du über Schitt 100 in Schritt 101 springst und READY meldst....

Also brauchst du noch eine Variable die Anzeigt, wie es nach Schritt 11 weitergehen soll.

Code:
	11:(* Wait until close not busy *)
		fbFileClose( bExecute := FALSE, bError => bError, nErrID => nErrID );
		IF ( NOT fbFileClose.bBusy ) THEN
			hFile := 0;[b]
                        IF bStop THEN
                                step := 100;      (*wenn bStop gesetzt ist, wird die Kette beendet*)
                        ELSE
         			step := 12;     (*wenn bStop nicht gesetzt ist, wird die Schittketten wieder von vorne gestartet *)
                        END_IF[/b]
		END_IF

(*Schritt 100*)
	100: (* Error or ready step => cleanup *)
		IF ( hFile <> 0 ) THEN
			step := 10; (* Close the source file *)
                        [b]bStop := TRUE;[/b]
		ELSE
			bBusy := FALSE;
                        [b]bStop := FALSE;[/b]
			step := 101;	(* Ready *)
		END_IF
 
Zurück
Oben