Prüfe, ob Datei auf FTP Server vorhanden ist (Wago 750-849)

Tenobaal

Level-1
Beiträge
6
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo! Ich beschäftige mich seit geraumer Zeit mit der Messwerterfassung auf der Wago 750-849. Da der Speicherplatz auf der SPS nicht ausreicht, wollte ich nun in geeigneten Abständen meine Daten per FTP verschicken. Das gelingt mir auch soweit... Ich möchte nun eine Abfrage integrieren, die VOR dem versenden der Datei prüft, ob schon eine Datei XYZ auf dem Server vorhanden ist. In der Bibliothek "WagoLibFtp" habe ich die Funktion gefunden.
Code:
    Action STATUS:
        This action returns the status of the entity defined by 'PATH'. The status information is returned in 'BUFFER', with a maximum length of 'BUFF_SIZE'.
        An error is returned if the entity in 'PATH' does not exist.

Leider hab ich es nicht geschafft diese richtig zu implementieren. Ich habe mich am Beispielcode von Wago orientiert und versucht zusätzlich die "Action STATUS" einzubinden. In der Variable bError erscheint die Fehlermeldung "FTP_INVALID_PARM".
Code:
VAR_INPUT
    filename_source: STRING;                    (* Quelldatei *)
    filename_destination: STRING;                (* Zieldatei *)
    send: BOOL;                                    (* lokale Datei an Server verschicken (anschließend in 'file_write' löschen) *)
    ftpServer_ip_adr: ARRAY[1..4] OF BYTE;        (* ftp-Server-IP-Adresse *)
    username: STRING;                            (* Username für Login *)
    password: STRING;                            (* Passwort für Login *)
END_VAR
VAR_OUTPUT
    file_send: BOOL;                        (* Datei erfolgreich verschickt *)
    bError: FTP_ret;                        (* Fehlerprotokoll *)
END_VAR
VAR
    test:BOOL;
    buffer:DWORD;




    state: INT := 1;
    f1: FTP_CLIENT;                        (* zum Versenden der Datei *)
    i: INT;
END_VAR

Code:
IF send THEN
    f1();                                            (* Instanz vom FB 'FTP_CLIENT *)
    CASE state OF
        1:                                            (* setzen der Ziel-IP-Adresse *)
            f1.EN := TRUE;
            FOR i:=1 TO 4 DO
                f1.HOST_IP[i] := ftpServer_ip_adr[i];
            END_FOR
            f1.PORT_NUM := 21;                    (* Port für ftp = 21 *)


            f1.OPEN;                                (* stellt Verbindung zum Server her *)
            IF f1.ENO THEN
                IF f1.ERROR=0 THEN
                    f1.EN := FALSE;
                    state := 10;
                ELSE
                    bError := f1.ERROR;
                    state := 30;
                END_IF
            END_IF


        10:                                            (* login, öffnet den angegebenen account auf dem Server *)
            f1.LOGIN(EN := TRUE, USERNAME := username, PASSWORD := password);
            IF f1.ENO THEN
                IF f1.ERROR=0 THEN
                    f1.EN := FALSE;


                        state := 11;




                ELSE
                    bError := f1.ERROR;
                    state := 30;
                END_IF
            END_IF


        11:                                            (* datei prüfen *)
            f1.STATUS(EN := TRUE, PATH:='E:\Downloads\Modul1.csv');
            IF f1.ENO THEN
                IF f1.ERROR=0 THEN
                    f1.EN := FALSE;
                    f1.BUFF_SIZE:=300;
                    buffer:=f1.BUFFER;


                    state := 30;
                ELSE
                    bError := f1.ERROR;
                    state := 30;
                END_IF
            END_IF






        20:                                            (*Nicht verwendet! datei-transfer von lpath nach rpath *)
            f1.PUT(EN := TRUE, rpath := filename_destination, lpath := filename_source);
            IF f1.ENO THEN
                IF f1.ERROR=0 THEN
                    f1.EN := FALSE;
                    state := 30;
                ELSE
                    bError := f1.ERROR;
                    state := 30;
                END_IF
            END_IF






        30:                                            (* schließt die Verbindung zwischen Server und Client *)
            f1.CLOSE(EN := TRUE);
            IF f1.ENO THEN
                IF f1.ERROR=0 THEN
                    f1.EN := FALSE;
                    state := 1;


                    file_send := TRUE;


                ELSE
                    bError := f1.ERROR;
                END_IF
            END_IF
        40:;                                        (*waiting for new command*)
    END_CASE
ELSE                                                (*Im Fehlerfall wird die FTP-Verbindung zurückgesetz t*)
    f1.EN := FALSE;
    state := 1;
    file_send := FALSE;


END_IF
 
Was ich mir gut vorstellen könnte, dass du deine "\" Backslashes escapen musst.
Versuch mal den Pfad so zu schreiben:

Code:
f1.STATUS(EN := TRUE, PATH:='E:\\Downloads\\Modul1.csv');
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich habs aufgegeben mit der STATUS Aktion. Hab alles an Parametern ausprobiert und läuft nicht.
Nutze jetzt eine "unsaubere" Lösung mittels der RENAME Aktion. Falls keine Datei mit dem entsprechenden Namen gefunden wurde, gibt es eine spezielle Fehlermeldung.
Die Abfrage der Fehlermeldung gibt daher Aufschluss darüber, ob die entsprechende Datei vorhanden ist.
 
Zurück
Oben