Loggingprogramm- Loggingzeit und -Name ändern



  • Hi,
    nachdem ich´s schon in´s falsche Unterforum geschrieben hab, versuch ich´s hier nochmal 🙄
    Ich habe ein Problem und hoffe hier ein paar Tips zu bekommen, da ich einfach kein Licht sehe...

    Wir habe eine neue Wasserkraftanlage bekommen, die die Daten automaitsch aufnimmt (Wasserhöhe, Leistung usw.)
    Ich würde diese Daten gern auswerten. Dazu habe ich ein Programm gefunden, die .csv Daten visualisieren kann.
    Das aktuelle Programm gibt mir die Daten, die an einem Tag gesammelt werden in einer csv. datei aus. Jeden Tag eine neue.
    Nun würde ich gern das Programm soweit ändern, dass es mir eine Datei schreibt, in der die Daten fortlaufend (Jahresanfang bis Jahresende) aufgezeichnet werden um es besser auswerten zu können.
    Die Jahresdatei soll auch automatisch mit dem Namen z.B. 2012-Jahresdatei angelegt werden.
    Die Loggingabstände sollen variabel sein.

    Nur finde ich die dementsprechenden Zeilen nicht, die geändert werden müssen...

    Das größte Problem ist erstmal, dass ich beim Programmieren nur die Grundkenntnisse in C habe/hatte. Leider fällt es mir zunächst schwer, das Programm einer Sprache zuzuordnen. Der größte Anteil dürfte wohl C++ sein. Leider sind auch viele Begriffe drin, die ich nicht finden kann (C/C++ Referenzbuch).

    /*#include "FileSystem.h"*/ 
    ... 
    
    /* wenn in der nächsten Zeile "0" nach #if steht, KEIN LOGGING */ 
    #if 0 
      static LONG LastLoggingTime = 0; 
        /* -- Im Moment sind Vielfache von 1 sec Logging-Zeit eingestellt. -- */ 
        if( LastLoggingTime + tm_tickcount( VariableLoggingTimeJahr * 1 * _sec_ ) <  tm_ticktime() ) 
         { 
          FILEHANDLE File = NULL; 
          char DatumBuffer[15]; 
          char ZeitBuffer[15]; 
          char Filename[25]; 
          int Tag = 0, Monat = 0, Jahr = 0; 
          BOOL NewFile = FALSE; 
    
          /* -- Aufbau des Zeit- u. Datums-Strings -- */ 
          SystemDateToString( SysDatum, DatumBuffer, NULL ); 
          SystemTimeToString( SysZeit, ZeitBuffer, NULL, FALSE ); 
    
          sscanf( DatumBuffer, "%d.%d.%d", &Tag, &Monat, &Jahr ); 
          /* -- ev. Erstellen des Monatsverzeichnisses -- */ 
          sprintf( Filename, "d:\\%04d-%02d", Jahr, Monat ); 
          sfs_mkdir( Filename ); 
    
          sprintf( Filename, "d:\\%04d-%02d\\%04d-%02d-%02d.csv", Jahr, Monat, Jahr, Monat, Tag ); 
    
          if( sfs_findfile(Filename) == 0 ) 
             { 
               /* -- Keine Datei mit diesem Namen vorhande -- */ 
               NewFile = TRUE; 
             } 
    
            /* -- Bereitstellung der Datumsangaben für die SPS --*/ 
            Paneljahr = Jahr; 
            Panelmonat= Monat; 
            Paneltag = Tag; 
            UPDATE( Paneljahr ); 
            UPDATE( Panelmonat ); 
            UPDATE( Paneltag ); 
    
            /* -- Öffnen des Files -- */ 
            File = sfs_fopen( Filename, "a" ); 
            if( File != NULL ) 
              { 
               char LoggingBuffer[100]; 
               short TempVariable1; 
               ... 
               LONG TempVariableA; 
               if( NewFile ) 
               { 
            /* -- Zunächst Header in neue Datei schreiben -- */ 
            sprintf( LoggingBuffer, "Datum;Zeit;Wasser;Öffnung;Leistung;Wehr;Leerschuss;RRM-Zyklen;kWh\r\n"); 
            sfs_fwrite( LoggingBuffer, 1, strlen( LoggingBuffer ), File ); 
            /* -- Loggingbuffer löschen -- */ 
            memset( &LoggingBuffer, 0, sizeof(LoggingBuffer) ); 
           } 
    
          /* -- Aufbau des Zeit- u. Datums-Strings -- */ 
          /*SystemDateToString( SysDatum, DatumBuffer, NULL );*/ 
          SystemTimeToString( SysZeit, ZeitBuffer, NULL, FALSE ); 
    
          /* -- Skalierung der Variablen -- */ 
          TempVariable1 = Variable1 * 1; /* Wasser */ 
          ... 
          TempVariableA = VariableA / 100; /* kWh */ 
    
          /* -- Schreiben des Logging-Strings in das File -- */ 
          /*ZeitBuffer[5] = '\0'; */ 
          sprintf( LoggingBuffer, "%s;%s;%4d;%4d;%4d;%4d;%4d;%4d;%4d\r\n", 
          DatumBuffer, 
          ZeitBuffer,
          ... 
          TempVariableA ); 
          sfs_fwrite( LoggingBuffer, 1, strlen( LoggingBuffer), File ); 
         } 
        else 
        printf( "Fehler beim Öffnen des Files\n" ); 
    
        /*FFS_fclose( File );*/ 
        sfs_fclose( File ); 
    
        /* -- Ablegen des letzten Loggings -- */ 
        LastLoggingTime = tm_ticktime(); 
       } 
      #else 
      static LONG LastLoggingTime = 0; 
    
      /* -- Im Moment sind Vielfache von 1 sec Logging-Zeit eingestellt. -- */ 
      if( LastLoggingTime + tm_tickcount( VariableLoggingTimeJahr * 1 * _sec_ ) < tm_ticktime() ) 
     { 
    char DatumBuffer[15]; 
    int Tag = 0, Monat = 0, Jahr = 0; 
    
    /* -- Aufbau des Zeit- u. Datums-Strings -- */ 
    SystemDateToString( SysDatum, DatumBuffer, NULL ); 
    
    sscanf( DatumBuffer, "%d.%d.%d", &Tag, &Monat, &Jahr ); 
    /* -- Bereitstellung der Datumsangaben für die SPS --*/ 
    Paneljahr = Jahr; 
    ... 
    UPDATE( Paneltag ); 
    /* -- Ablegen des letzten Loggings -- */ 
    LastLoggingTime = tm_ticktime(); 
    } 
    #endif 
    return 0; 
    }
    

    Warscheinlich ist´s total pippieinfach 🙄

    Wäre echt überglücklich, wenn mir jemand helfen kann, ich komm einfach nicht weiter, weil ich auch nicht genau weiß, in welchem Programmiersprachenbuch ich noch weiter suchen kann...



  • Zeile 27

    sprintf( Filename, "d:\\%04d-%02d\\%04d-%02d-%02d.csv", Jahr, Monat, Jahr, Monat, Tag );
    

    erstellt den Dateinamen.

    sprintf( Filename, "d:\\%04d.csv", Jahr );
    

    macht eine Datei z.B. 2011.csv

    Und rück den Code mal richtig ein, damit man den besser lesen kann : [url]http://de.wikipedia.org/wiki/Einrückungsstil [/url]



  • drKnilch schrieb:

    Warscheinlich ist´s total pippieinfach

    Wahrscheinlich, wahrscheinlich aber noch einfacher, wenn du den #if 0 Überfluss entfernst und damit den wesentlichen Teil in den Vordergrund rückst.



  • Wutz schrieb:

    drKnilch schrieb:

    Warscheinlich ist´s total pippieinfach

    Wahrscheinlich, wahrscheinlich aber noch einfacher, wenn du den #if 0 Überfluss entfernst und damit den wesentlichen Teil in den Vordergrund rückst.

    Kann man doch lesen: folgt hinter der Compiler-Anweisung #else
    Insgesamt gefällt mir diese Art für ein Monitoring nicht besonders. Die Automatisierung der Dateien fehlt. Stattdessen werden neue Compileläufe erforderlich.
    Vorschlag: Biete das als Projekt an. Ist nicht sehr aufwendig!



  • Wie meinst du als Projekt?
    Auftragsarbeit?
    Ich denke inzwischen auch daran...



  • drKnilch schrieb:

    Wie meinst du als Projekt?
    Auftragsarbeit?
    Ich denke inzwischen auch daran...

    JA, eine Auftragsarbeit zunächst in C für ein angemessenes Honorar hatte ich gemeint. Siehe Unterforum 'Projekte'. Das ganze sollte ohne die Compiler-Anweisungen #if #else #endif völlig automatisch realisiert werden. Das Programm meiner Vorstellung muss das dauerhaft selbständig leisten und keine weiteren Neucompilierungen erfordern. Schick mir eine mail über mein Profil, ich denke dann darüber nach.


Anmelden zum Antworten