Dateien auf externe Festplatte speichern

RonnyF
2009-08-13
2009-09-02
1 2 > >> (Page 1 of 2)
  • RonnyF - 2009-08-13

    Hallo,

    Ich nutze eine Wago 750-841 und möchte gerne Messdaten auf eine externe Festplatte kopieren.

    Dazu gibt es die Bibliothek SysLibFile.

    Jetzt habe ich eine kleine Frage zum Verständnis.

    Meine einzelnen Messdaten fasse ich in einem Array zusammen.

    Würde ich jetzt das Array in einer Datei speichern und an die Festplatte senden, schreibt dann die Wago bei jedem neuen Array (neuer Messzeitpunkt) immer eine neue Datei auf die Festplatte? Oder gibt es eine Möglichkeit die neuen Messdaten an die vorhandene Datei hinzu zufügen, sodass nur pro Tag immer eine neue Datei erstellt wird, welche 24 Messzeitpunkte aufweist?

    Danke für eure Hilfe

    Gruß

    Ronny

     
  • Matze001 - 2009-08-13

    Hallo,

    such mal nach dem Begriff CSV.

    Wenn du auf der Festplatte xampp installierst kannst du das ganze auch mit PHP / MySql lösen. Ist für den Anfänger schwerer, aber die grafische Auswertung ist leichter, ich habe es auf diese Art umgesetzt.

    MfG

    Marcel

     
  • RonnyF - 2009-08-13

    Hallo,

    habe einige Threads gefunden zu CSV. Es wurden die Daten auf ein Medium, PC gespeichert, welches/r direkt an der Wago angeschlossen war. Geht dies eigentl. auch wenn sich z.B. mehrer PC im Netzwerk befinden? Man müsste doch dann nur die IP des jeweiligen Rechners vor den Dateipfad schreiben, oder?

    Gruß

    Ronny

     
  • Matze001 - 2009-08-13

    Du erstellst die CSV Datei lokal auf dem Speicher der SPS, und versendest diese dann via FTP. Das ist auch beschrieben in einem der Beiträge

    z.B. hier

    l viewtopic.php?t=108&highlight=ftp l

    MfG

    Marcel

     
  • RonnyF - 2009-08-14

    Hallo,

    ich habe jetzt ein bisschen rumexperimentiert.

    Hier mal mein Code:

    IF PT100_8=300 THEN

    Messdaten[0]:=Zeitstempel; Messdaten[1]:=PT100_1String;

    Messdaten[2]:=PT100_2String; Messdaten[3]:=PT100_3String;

    Messdaten[4]:=PT100_4String; Messdaten[5]:=PT100_5String;

    Messdaten[6]:=PT100_6String; Messdaten[7]:=PT100_7String;

    Messdaten[8]:=PT100_8String;

    END_IF;

    Trenner:=',';

    IF PT100_1>=300 THEN

    hFile:= SysFileOpen('test.csv', 'w');

    dwWritten:=SysFileWrite(hfile, ADR(Messdaten),SIZEOF(Messdaten));

    (SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));)

    SysFileClose(hFile);

    END_IF;

    Die If-Bwedingungen wurden eingefügt, um über die Temp_sensoren das Dateispeichern zu steuern.

    Für hFile wird mir nach dem schreiben der Wert 1 geliefert und dwWritten liefert 891. Was haben diese Werte eigentlich zu bedeuten.

    Gebe ich als Pfad C:\test.csv an, um auf meine PC-Festplatte zu speichern, so liefert hFile=0 und dwWritten=0. -> Fehler

    Eine Datei auf C: wird auch nicht erzeugt. Wie müsste so ein Pfad aussehen.

    Und noch eine Frage zum Array. Ist das unten angegebene jetzt ein Array mit einer Zeile und 11 Spalten oder mit 11 Zeilen und einer Spalte?

    Messdaten:ARRAY [0..10] OF STRING;

    Wie müsste ein Array definiert werden mit X-Spalten und Y-Zeilen?

    Array [x0..x10, y0..y10] oder Array [y0..y10, x0..x10]

    Gruß

    Ronny

     

    Related

    Talk.ru: 1
    Talk.ru: 2
    Talk.ru: 3
    Talk.ru: 5
    Talk.ru: 7
    Talk.ru: 8

  • Matze001 - 2009-08-14

    Hallo,

    du speicherst zunächst auf der SPS... also z.B. \PLC\Messwerte...

    das hat nix mit deinem PC zu tun.

    X und Y gibts auch nicht beim array, sondern nur index...

    array[index1][index2][index3] ...

    MfG

    Marcel

     
  • RonnyF - 2009-08-14

    Hallo,

    ich möchte gerne auf eine externe Festplatte speichern. In anderen Threads wurde der Pfad C:... ebenfalls verwendet. Ist es nun möglich auf ein Externes Medium zu speichern ohne die SysLibFtp nutzen zu müssen?

    Zu dem Array.

    Ich stelle mir ein zweidimensionales array so vor:

    Text11 Text12 Text13

    Text21 Text22 Text32

    Wie müsste dann das Array lauten Array [1..2, 1..3] oder [1..3, 1..2]

    Wie Sieht das Array [1..3] aus -> Text1 Text2 Text3 ?

     
  • Matze001 - 2009-08-14

    Hallo,

    erstmal zum Array...

    Das Array müsste lauten: Array [1..2, 1..3].

    ein Array[index] sieht so aus:

    Array {

    Eintrag 1

    Eintrag 2

    Eintrag 3

    ...

    }

    ein array[index1][index2]

    sieht so aus:

    array {

    Index 1 {

    Eintrag 1.1

    Eintrag 1.2

    Eintrag 1.3

    }

    index 2 {

    Eintrag 2.1

    Eintrag 2.2

    Eintrag 2.3

    }

    }

    Mit der CSV hast du noch nicht ganz verstanden. Du musst sie erst lokal auf der SPS speichern, und dann mit dem FTP Baustein versenden. Woher soll denn die SPS wissen welcher PC gemeint ist wenn du C:/... angibst... wenn z.B. 20 im Netzwerk sind.

    Also:

    CSV Datei erzeugen und lokal speichern

    CSV Datei mit einem FTP-Baustein an den PC senden

    MfG

    Marcel

    P.S: halt dich einfach dran:

    http://www.wago.com/wagoweb/documentati ... 100d_f.htm m

     
  • RonnyF - 2009-08-14

    Hallo,

    danke für die Erklärung mit dem Array, ich glaube das habe ich jetzt verstanden.

    Meine Wago speichert auch eine Datei ab. Bei der ersten erzeugten Datei wurde das Array ordentlich hintereinander geschreiben. Beim zweiten Versuch habe ich die "Trenner" Befehlszeile mit in den Programmablauf genommen und es kam sowas bei raus

    2009-08-14-15:13:3328.5º'X'26.4''28.7''28.8èи 27.2ˆpX28.9èи 30.5ˆpX30.0(#'(#

    Nachdem ich die Trenner Zeile wieder raus genommen hatte, blieben trotzdem die Zeichen.

    Code:

    Trenner:=';';

    IF PT100_1>=300 THEN

    hFile:= SysFileOpen('mess1.csv', 'w');

    dwWritten:=SysFileWrite(hfile, ADR(Messdaten),SIZEOF(Messdaten));

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));

    (dwWritten:= SysFileWrite(hFile, ADR(wNewLine), SIZEOF(wNewLine));)

    SysFileClose(hFile);

    END_IF;

    Das mit der NewLine und statt 'w' 'a' eingesetzt funktioniert ebenfalls, sodass die Wago die neuen Arrays anhängt an die Datei. Nur das mit dem Trenner funktioniert nicht.

    Habt ihr vielleicht einen Tipp wo mein Fehler liegt?

    Gruß

    Ronny

    (PS: Das mit dem FTP-Versand muss ich später probieren erstmal muss das schreiben der Dateien ordentlich funktionieren.)

     
  • gravieren - 2009-08-14

    Hi

    Es fehlen Codezeilen.

    Probiere doch mal:

    Das hier -->

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));

    auf -->

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),LEN(Trenner));

    Also LEN anstelle von SIZEOF

    ABER nur dort, wo es SINNVOLL ist.

    (Wie in der o.g. Zeile)

    Gruß Karl

     
  • RonnyF - 2009-08-17

    Hallo,

    das Ändern von Sizeof auf LEN hat keine Änderung gebracht. Es sind immer noch die Zeichen vorhanden.

    Wo könnte der Fehler noch liegen.

    Gruß

    Ronny

    Edit: Setzte ich für Trenner nicht das ";" sondern eine 100 so wird diese 100 nicht zwischen die Messwerte gesetzt sondern nur einmal an das Ende des Arrays, also der Messwerte.

    Edit2: Das mit dem FTP senden funktioniert. Ich habe aber noch eine Frage. z.Z. ist mein Rechner der FTP-Server und mit der Wago über Crossover verbunden. Wenn jetzt der FTP Server irgenwo im Internet sich befindet und man über einen Router oder GPRS-Modem ins Internet geht, müsste man im Web-based Management der Wago unter TCP/IP die Gatewayadresse angeben richtig?

     
  • Matze001 - 2009-08-17

    nein,

    der Port im Webmanagement ist für die FTP-Server den dir die SPS stellt, denn über FTP://IPDERSPS kommst du auf einen kleinen FTP-Server, der die Daten auf deiner SPS beherbergt.

    Du musst das Gateway nur in deinem Programm angeben... entweder durch nen extra eingang an baustein oder bei der ip anhängen, etwa so:

    IP:GATEWAY

    MfG

    Marcel

     
  • RonnyF - 2009-08-18

    Hallo,

    hat noch jemand eine Idee zwecks des Trennzeichens?

    Gruß

    Ronny

     
  • Uwe - 2009-08-18

    Hi Ronny,

    dein Problem ist fogendes

    du hast ein ARRAY[0..n] OF STRING deklariert.

    Das kannst du dier vorstellen wie eine Tabelle mit n Zeilen.

    In jeder Zeile ist Platz für 80 Zeichen reserviert

    wenn du nun in deine erste Zeile (Messdaten[0]) etwas hineinschreibst,

    dann bleiben dahinter noch unbenutzte Schreibstellen in denen noch irgendetwas steht,

    klar dein Eintrag in die Zeile ist ja kürzer als die 80 reservierten Zeichen.

    In der zweiten und den weiteren Zeilen passiert das Gleiche.

    Das bedeutet du hast am Ende der Zeilen immer irgend einen Müll oder alte Zeichen.

    Wenn du nun beim Schreiben die Adresse deines Arrays und die Größe (SIZEOF)

    deines Arrays angibst, dann wird natürlich die komplette Tabelle inkl. der Müllzeichen

    am Ende geschrieben, in einem Write-Auftrag.

    Erst in deinem zweiten Auftrag am Ende wird EIN Trenner geschrieben.

    Ich denke nicht das du das so wolltest.

    Versuch mal folgenden Aufbau

    Trenner := ','; ( Trennzeichen zwischen den Spalten )

    SysFileWrite(hFile, ADR(Messdaten[0]), LEN(Messdaten[0]) ; ( nur den tatsächlichen Zeitstempel schreiben )

    SysFileWrite(hFile, ADR(Trenner), LEN(Trenner) ; ( nun ein Trenner -> neue Spalte )

    SysFileWrite(hFile, ADR(Messdaten[1]), LEN(Messdaten[1]) ; ( nur den tatsächlichen 1. PT_100 )

    SysFileWrite(hFile, ADR(Trenner), LEN(Trenner) ; ( nun ein Trenner -> neue Spalte )

    .

    .

    .

    SysFileWrite(hFile, ADR(Messdaten[1]), LEN(Messdaten[8]) ; ( nur den tatsächlichen 8. PT_100 )

    Trenner := '$R$N'; ( Zeilenumbruch)

    SysFileWrite(hFile, ADR(Trenner), LEN(Trenner) ; ( nun noch eine Zeilenumbruch -> neue Zeile )

    Uwe

     

    Related

    Talk.ru: 1
    Talk.ru: 8

  • RonnyF - 2009-08-20

    Hallo,

    danke jetzt funktioniert es super.

    Gruß

    Ronny

     
  • RonnyF - 2009-08-24

    Hallo,

    ich habe noch ein Problem.

    Ich möchte die Dateien über einen Router versenden. Wo muss ich die Gatewayadresse in dem Wago-Quellcode angeben.

    Mit IP:Gateway wird mir eine Fehlermeldung ausgegeben.

    Nutze diesen Softwarebaustein von Wago:

    http://www.wago.com/wagoweb/documentati ... 100d_f.htm

    Bei diesem Baustein kann man aber nur die IP angeben, hat jemand eine Ahnung wie man diesen Baustein umschreiben müsste?

    Gruß

    Ronny

     
  • Uwe - 2009-08-25

    Hallo Ronny,

    Zitat:
    Ich möchte die Dateien über einen Router versenden. Wo muss ich die Gatewayadresse in dem Wago-Quellcode angeben.

    nirgends, ...

    das Gateway kannst du einfach im WBM einstellen
    Benutzer : user
    Passwort : user

    Uwe[/quote]

     
  • RonnyF - 2009-08-25

    Hallo,

    hatte ich gemacht, aber es wurde keine Datei versendet. Habe den Fehler gefunden.

    Beim Senden war ich mit Filezilla mit dem selben Benutzerdaten für den FTP, welche auch in der Wago stehen mit dem FTP-Server verbunden. Somit konnte die Wago gar nicht auf den FTP zugreifen.

    Gruß

    Ronny

     
  • RonnyF - 2009-08-25

    Hallo nochmal,

    irgendwie wird an das Array immer noch irgendwelcher mist angehangen.

    Die ersten beiden Index Array[0] und [1] sind fehlerfrei ab ab dem [2] wird mit dem Datum und Uhrzeit (Array[1]) aufgefüllt. Kann mir bitte mal einer Erklären warum? Ich kann doch nicht alles mit Leerzeichen auffüllen?

    Code:

    IF Minute = 15 AND Sekunde = 00

    OR Minute = 30 AND Sekunde = 00

    OR Minute = 45 AND Sekunde = 00

    OR Minute = 00 AND Sekunde = 00

    THEN

    Messdaten[0]:=WKA;

    Messdaten[1]:=Zeitstempel;

    Messdaten[2]:=PT100_1String;

    Messdaten[3]:=PT100_2String;

    Messdaten[4]:=PT100_3String;

    Messdaten[5]:=PT100_4String;

    Messdaten[6]:=PT100_5String;

    Messdaten[7]:=PT100_6String;

    Messdaten[8]:=PT100_7String;

    Messdaten[9]:=PT100_8String;

    END_IF;

    Trenner:=',';

    IF Minute = 00 AND Sekunde = 01

    OR Minute = 30 AND Sekunde = 01

    OR Minute = 45 AND Sekunde = 01

    OR Minute = 00 AND Sekunde = 01

    THEN file_write:=TRUE;

    END_IF;

    datei:= 'mess.csv';

    (Datei Schreiben)

    IF file_write = TRUE THEN

    hFile:= SysFileOpen(datei, 'a');

    dwWritten:=SysFileWrite(hfile, ADR(Messdaten[0]),SIZEOF(Messdaten[0]));

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));

    dwWritten:=SysFileWrite(hfile,ADR(Messdaten[1]),SIZEOF(Messdaten[1]));

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));

    dwWritten:=SysFileWrite(hfile,ADR(Messdaten[2]),SIZEOF(Messdaten[2]));

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));

    dwWritten:=SysFileWrite(hfile,ADR(Messdaten[3]),SIZEOF(Messdaten[3]));

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));

    dwWritten:=SysFileWrite(hfile,ADR(Messdaten[4]),SIZEOF(Messdaten[4]));

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));

    dwWritten:=SysFileWrite(hfile,ADR(Messdaten[5]),SIZEOF(Messdaten[5]));

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));

    dwWritten:=SysFileWrite(hfile,ADR(Messdaten[6]),SIZEOF(Messdaten[6]));

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));

    dwWritten:=SysFileWrite(hfile,ADR(Messdaten[7]),SIZEOF(Messdaten[7]));

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));

    dwWritten:=SysFileWrite(hfile,ADR(Messdaten[8]),SIZEOF(Messdaten[8]));

    dwWritten:=SysFileWrite(hfile, ADR(Trenner),SIZEOF(Trenner));

    dwWritten:=SysFileWrite(hfile,ADR(Messdaten[9]),SIZEOF(Messdaten[9]));

    dwWritten:= SysFileWrite(hFile, ADR(wNewLine), SIZEOF(wNewLine));

    SysFileClose(hFile);

    file_write:=FALSE;

    END_IF;

    csv-Datei

    V12345,2009-08-25-10:35:09,26.8.8-25-10:35:09..................................................,26.809-08-25-10:35:,28.808-25-10:35:09,29.109-08-25-10:35:,27.68-25-10:35:09,29.609-08-25-10:35:,27.408-25-10:35:09,30.009-08-25-10:35:

    Gruß

    Ronny

     

    Related

    Talk.ru: 1
    Talk.ru: 2
    Talk.ru: 3
    Talk.ru: 5
    Talk.ru: 7
    Talk.ru: 8

  • gravieren - 2009-08-25

    Hi

    Es wurde hier schon mehrfach gesagt:

    Nimm den LEN().

    Z.b.

    dwWritten:=SysFileWrite(hfile,ADR(Messdaten[9]),SIZEOF(Messdaten[9]));

    durch

    dwWritten:=SysFileWrite(hfile,ADR(Messdaten[9]),LEN(Messdaten[9]));

    Gruss Karl

     
  • RonnyF - 2009-08-25

    Hallo,

    es funktioniert.

    Vor lauter rumexperimentiererei habe ich es gar nicht auf LEN geändert.

    Danke nochmals.

    Gruß

    Ronny

     
  • RonnyF - 2009-08-28

    Hallo,

    noch eine Frage.

    Ich speichere pro Tag eine Datei in der PLC. Besteht die Möglichkeit die Dateinamen, welche sich auf der PLC befindet, auszulesen und die Daternamen einer String-Variablen zuzuweisen, welche die Quelldatei für das Versenden angibt? Also irgenwie zu schauen was für Dateien auf der PLC sind.

    Code als Beispiel:

    IF datei_send = datei THEN

    IF Input_1 = TRUE OR Stunde = 23 AND Minute = 50 THEN
    
    send_ftp:= TRUE;
    
    ELSE
    
    send_ftp:= FALSE;
    
    END_IF;
    

    END_IF;

    IF datei_send <> datei THEN

    IF Input_2 = TRUE OR  Stunde = 12 AND Minute = 15 THEN
    
    send_ftp:= TRUE;
    
    ELSE
    
    send_ftp:= FALSE;
    
    END_IF;
    

    END_IF;

    datei_send-> zu versendende Datei

    datei-> aktuelle Tagesdatei

    In dem Code wird immer die zuletzt aktuellste Datei versendet. Ist dies geschehen, springt das Prog. immer auf die aktuellste Datei.

    Wenn jetzt der FTP-Server für 3 ausfällt, dann werden 2 Dateien nicht versendet.

    Bessere wäre es auf die PLC zu schauen und die Dateien, welche vor der aktuellen Tagesdatei liegen, zu versenden.

    Gruß

    Ronny

    PS: die Dateien sind im Dateinamen mit dem Datum versehen

     
  • gravieren - 2009-08-28

    Hi

    Ja, es ist möglich, das Verzeichnis auszulesen.

    Also alle Dateinamen zu finden.

    Leider habe ich KEIN Example hierfür.

    Ich hätte diese Funktion auch gene, leider fehlt mir momentan die Zeit.

    Schau doch mal die "SysLibDir" an.

    Bei Fragen hier im Forum.

     
  • RonnyF - 2009-08-31

    Hallo,

    ich hab mal ein bisschen experimentiert mit der SysLibDir.

    verzeichnis: STRING;

    ergebnis: DWORD;

    result: BOOL;

    Dir_Handle : DWORD;

    eintraege : ARRAY [1..5] OF STRING;

    i: INT;

    strTemp: STRING;

    Code:

    (Datei Schreiben)

    verzeichnis:='\plc\daten';

    (Unterverzeichnis \daten erstellen falls nicht vorhanden)

    ergebnis:=SysDirOpen(verzeichnis);

    IF ergebnis=0 THEN

    result := SysDirCreate(verzeichnis);

    END_IF;

    (Verzeichnis auslesen)

    Dir_Handle := SysDirOpen('\plc\daten');

    i := 0;

    WHILE SysDirRead(Dir_Handle,strTemp,0) <> 0 DO

    i := i+1;

    eintraege[i]:= strTemp;

    END_WHILE;

    Ich habe eine Datei in dem Verzeichnis gespeichert. Für i wird 3 angezeigt und bei Dir_Handle werden Zahlen aufwärts gezählt. (vermute mal Speicherplatz) Nach ein paar Sekunden hängt sich die Wago aber auf (alle LED's an der Wago blinken grün rot). Ich vermute mal die Steuerung läuft sich in der while-Schleife tot. Für das Array "eintraege" wird auch nichts angezeigt.

    Hat jemand eine Idee wo der Fehler liegt?

    Im Voraus schonmal vielen Dank für eure Hilfe.

    Gruß

    Ronny

     
  • gravieren - 2009-08-31

    Hi

    Hat jemand eine Idee wo der Fehler liegt?

    Nö, jedoch lass doch mal vorerst den "Schrott" mit der Verzeichnisabfrage ob vorhanden und erzeugen des Verzeichnisses raus.

    Das können alles Fehlerquellen sein.

    Frage doch mal den Inhalt z.b. des vorhandenen PLC-Verzeichnisses ab.

     
1 2 > >> (Page 1 of 2)

Log in to post a comment.