Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 9 von 9

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

  1. #1
    Registriert seit
    22.03.2013
    Beiträge
    32
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    Geändert von mv08 (04.07.2013 um 12:33 Uhr)
    Zitieren Zitieren Beckhoff CX: Datei nicht per FTP zu laden, obwohl Datei mit fbFileClose geschlossen  

  2. #2
    Registriert seit
    08.01.2007
    Beiträge
    54
    Danke
    1
    Erhielt 10 Danke für 8 Beiträge

    Standard

    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.
    Geändert von soma (04.07.2013 um 19:55 Uhr)

  3. #3
    mv08 ist offline Benutzer
    Themenstarter
    Registriert seit
    22.03.2013
    Beiträge
    32
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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
    Geändert von mv08 (05.07.2013 um 07:05 Uhr)

  4. #4
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    757
    Danke
    27
    Erhielt 166 Danke für 144 Beiträge

    Standard

    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.

  5. #5
    mv08 ist offline Benutzer
    Themenstarter
    Registriert seit
    22.03.2013
    Beiträge
    32
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  6. #6
    Registriert seit
    24.02.2009
    Beiträge
    1.244
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    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.
    Geändert von MasterOhh (05.07.2013 um 08:13 Uhr)

  7. #7
    mv08 ist offline Benutzer
    Themenstarter
    Registriert seit
    22.03.2013
    Beiträge
    32
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  8. #8
    Registriert seit
    24.02.2009
    Beiträge
    1.244
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    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;
                            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
    		END_IF
    
    (*Schritt 100*)
    	100: (* Error or ready step => cleanup *)
    		IF ( hFile <> 0 ) THEN
    			step := 10; (* Close the source file *)
                            bStop := TRUE;
    		ELSE
    			bBusy := FALSE;
                            bStop := FALSE;
    			step := 101;	(* Ready *)
    		END_IF

  9. #9
    mv08 ist offline Benutzer
    Themenstarter
    Registriert seit
    22.03.2013
    Beiträge
    32
    Danke
    6
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Tatsache Es klappt! Vielen Dank!

Ähnliche Themen

  1. B&R Kopieren einer Datei auf einen FileZilla FTP-Server
    Von gaiskasimir im Forum Sonstige Steuerungen
    Antworten: 21
    Letzter Beitrag: 20.03.2015, 19:14
  2. Antworten: 8
    Letzter Beitrag: 26.12.2012, 15:56
  3. FTP-Server Datei Operationen
    Von Christian Schröder im Forum CODESYS und IEC61131
    Antworten: 1
    Letzter Beitrag: 23.03.2012, 11:12
  4. VBA: Warum wird die Excel-Datei nicht geschlossen?
    Von Jan im Forum Hochsprachen - OPC
    Antworten: 15
    Letzter Beitrag: 26.09.2010, 12:01
  5. ftp-Datei und Byte/Real-Wandelung
    Von jan820813 im Forum Simatic
    Antworten: 6
    Letzter Beitrag: 19.06.2009, 15:57

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •