# Datenlogger Wago



## Steve_Pokerface (16 April 2015)

Hallo liebe Forum Gemeinde,

ich bin neu im Forum, hab mich schon so durch das ein oder andre hier im Forum zu dem Thema durchgelesen aber keine Antwort gefunden.

Zur Hardware es geht um ne Wago 750-880 mit den AI 4-20mA und den AO 4-20mA

zum Problem:

Ich würde gern mehrere Messwerte und Sollwerte mit Zeit Stempel aufzeichnen und in eine .csv Datei schreiben.
Die Messwerte müssten jede Sekunde aufgezeichnet werde.

In Codesys hab ich mich ein bisschen eingearbeitet so ein richtiger Crack bin ich aber nicht.
Hab mir auch schon von Wago die Nutzung der SysLibFile.lib angeschaut nur irgendwie blick ich da nicht durch 

Hoffe mir kann einer Helfen

Grüße

Steffen


----------



## Tom... (16 April 2015)

> ...Hoffe mir kann einer Helfen...



Das sollte möglich sein?! Was genau willst Du denn wissen?

Ich schreibe meine Log-Daten schonmal vorher in ein Array, nur dass ich nicht jede Sekunde auf die SD Karte zugreifen muss.
Dann begrenze ich meine CSV-Datei auf 10000 Zeilen. Wird sonst zu groß und unübersichtlich.
Des weiteren bekommt die Datei eine fortlaufende Nummer von 0000 bis 9999, welche ich mir persistent "merke".
Wenn die Zeilennummer zum Schreiben 0 ist, dann war die Datei vorher voll, oder die CPU hat neu gestartet. In beiden Fällen wird dann eine neue Datei angefangen, um alte Daten sicher zu behalten.
Ist der Schreibzeiger ( Zeilennummer ) 0, wird eine Kopfzeile mit Namen für die folgenden Spalten generiert, damit man sieht, was die Werte in den Zeilen 1 bis 10000 zu bedeuten haben.
Sind im Array genug Daten zum Schreiben, wird in einer CASE Schrttkette die Datei geöffnet, die zu schreibenden Daten mit BOOL_TO_STRING oder INT_TO_STRING und CONCATE in einen 255 Zeichen langen String "zusammengebaut" ( als Trennzeichen verwende ich ; ), in die Datei geschrieben und dann die Datei wieder geschlossen.


----------



## Steve_Pokerface (16 April 2015)

Hallo Tom,

Ich verstehe nur Bahnhof 

Im Grunde will ich win Programm, wo ich einfach die Variablen ändern kann quasi die Variablen, die er aufzeichnen soll und so weiter. Am besten in ST. Ich bin nicht so der crack aber Bissi einlesen kann ich mich. Wäre nett wenn du mir mal dein Prog zeigst, evtl werde ich dann Bissi schlauer

Grüße

Steffen


----------



## Steve_Pokerface (16 April 2015)

Ach übrigens ich brauch 2 analoge Daten jeweils sekundenscharf und die Aufzeichnung sokm über 5 std laufen.

Heißt es kommt mit Sicherheit Bissi Datenmengen zusammen. Ist das überhaupt möglich?

Grüße


----------



## shrimps (16 April 2015)

Hallo Tom,
falls möglich, würde mich dein Baustein auch interessieren.
Ich wollte das Rad auch nicht neu erfinden...
Zwar sind einige deiner Optionen auf meiner Spielkiste nicht möglich, aber da muss ich halt tricksen...
Wenn du magst, wäre ein Exportfile prima.
Ich bin leider Twincatler und da ist mir ein Exportfile lieber.
Eine Original-Pro kann ich allerdings auch verarbeiten...

LG
Shrimps


----------



## Tom... (19 April 2015)

versuch doch das mal als Anfang...


```
CASE        iStatus        OF

    0:        strStatus :=        'warten' ;

            IF    Start_IMP    THEN        iStatus :=        10 ;
            END_IF ;

    10:        strStatus :=        'Datei öffnen ' ;

            IF        Write_Line_Nr = 0            THEN        Write_File_Nr := Write_File_Nr + 1 ;        END_IF ;
            IF         Write_File_Nr > 9999         THEN         Write_File_Nr := 0 ;                         END_IF ;
            DateiName :=                        'S:\Log\Log' ;
            IF        Write_File_Nr < 1000        THEN        DateiName :=        CONCAT (        DateiName ,        '0' ) ;        END_IF ;
            IF        Write_File_Nr < 100        THEN        DateiName :=        CONCAT (        DateiName ,        '0' ) ;        END_IF ;
            IF        Write_File_Nr < 10        THEN        DateiName :=        CONCAT (        DateiName ,        '0' ) ;        END_IF ;
            DateiName :=        CONCAT (        DateiName ,        INT_TO_STRING ( Write_File_Nr ) ) ;
            DateiName :=        CONCAT (        DateiName ,        '.csv' ) ;

            fileHandle :=        SysFileOpen (        FileName :=        DateiName ,        Mode :=    'a' ) ;

            IF        fileHandle <> 0            THEN        iStatus :=        20 ;                        END_IF ;

    20:        strStatus :=        'Kopfzeile schreiben' ;

            IF        Write_Line_Nr = 0        THEN

                    Text_Puffer :=        'Datensatz Nummer;Zeitstempel;analog01;analog02;analog03$L;' ;
                    fileWriteOK :=        SysFileWrite (        File :=            fileHandle ,        Buffer :=        ADR ( Text_Puffer ) ,        Size :=            LEN ( Text_Puffer ) );
            END_IF ;

            iStatus :=        30 ;

    30:        strStatus :=        'Daten schreiben' ;

            Text_Puffer :=                                        INT_TO_STRING ( Write_Line_Nr ) ;
            Text_Puffer :=        CONCAT ( Text_Puffer ,        ' ; ' ) ;
            Text_Puffer :=        CONCAT ( Text_Puffer ,        DT_TO_STRING ( Zeitstempel ) ) ;
            Text_Puffer :=        CONCAT ( Text_Puffer ,        ' ; ' ) ;
            Text_Puffer :=        CONCAT ( Text_Puffer ,        INT_TO_STRING ( analog01 ) ) ;
            Text_Puffer :=        CONCAT ( Text_Puffer ,        ' ; ' ) ;
            Text_Puffer :=        CONCAT ( Text_Puffer ,        INT_TO_STRING ( analog02 ) ) ;
            Text_Puffer :=        CONCAT ( Text_Puffer ,        ' ; ' ) ;
            Text_Puffer :=        CONCAT ( Text_Puffer ,        INT_TO_STRING ( analog03 ) ) ;
            Text_Puffer :=        CONCAT ( Text_Puffer ,        '$L' ) ;
            fileWriteOK :=        SysFileWrite (        File :=            fileHandle ,        Buffer :=        ADR ( Text_Puffer ) ,        Size :=            LEN ( Text_Puffer ) );

            Write_Line_Nr :=                Write_Line_Nr + 1 ;

            iStatus :=        40 ;

    40:        strStatus :=        'Datei schliessen' ;

            fileCloseOK :=            SysFileClose (        File :=        fileHandle ) ;
            IF        fileCloseOK        THEN            iStatus :=        0 ;
                                                        IF        Write_Line_Nr > Log_File_1_last_Line        THEN        Write_Line_Nr := 0 ;            END_IF ;
            END_IF ;

END_CASE ;
```

Bei weiteren Fragen: Einfach fragen!
Viel Erfolg!
Grüße Tom


----------



## Steve_Pokerface (22 April 2015)

Hallo,

ich glaub ich bin einfach zu blöd. :-( Ich hab mein Programm mal in den Anhang evtl kann mir ja einer direkt weiterhelfen.

Ich würde gerne eine Datenaufzeichnung mittels des Start Button in der Visualisierung starten welche dann die Messwerte
MR_BHKW1_Istleistung_KW und den AO_Sollwert_BHKW1 *sekundengenau *aufnimmt und in eine .csv Datei schreibt welche ich dann öffnen kann und weiterverarbeiten kann.

Hoffe mir kann einer Helfen!

Grüße

Steffen


----------



## Tom... (22 April 2015)

Steve_Pokerface schrieb:


> Hoffe mir kann einer Helfen!



Dein gepostetes Projekt funktioniert nicht, weil Du vergessen hast, den Code einzufügen?!


----------



## Tom... (22 April 2015)

importiere das mal...


----------



## Steve_Pokerface (23 April 2015)

Hallo Tom, 

danke dir für die Hilfe,

dein Prog. hab ich mal importiert, da kommt aber der Fehler, dass er die Variable "Sysfileopen" nicht deklariert ist.

Jetzt hab ich mal mein Programm exportiert. Vielleicht kannst du mir nun besser weiter helfen 

Grüße

Steffen


----------



## Steve_Pokerface (23 April 2015)

Steve_Pokerface schrieb:


> danke dir für die Hilfe,
> 
> dein Prog. hab ich mal importiert, da kommt aber der Fehler, dass er die Variable "Sysfileopen" nicht deklariert ist.



Das Problem hat sich erledigt, hab die Bibliotheken eingefügt.


----------



## Steve_Pokerface (23 April 2015)

Hallo Tom,

ich hab mich in dein Programm eingelesen, kleine Fehler korrigiert und es läuft! :TOOL: Danke dir für die Arbeit!!!

Grüße

Steffen


----------

