Ankündigung

Einklappen
Keine Ankündigung bisher.

Remanter Langzeitspeicher & Charts

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    [Codebeispiel] Remanter Langzeitspeicher & Charts

    Hier mal ein erster Teil für das Abspeichern von Daten im Flash mit Ringpuffer.

    Ich werde das Ganze in ein Makro packen, so dass die Anwendung einfach wird. Dies hier dient nur der Veranschaulichung!

    Der Code speichert abhängig von Store_Timer (s.u.) z.B. alle 1/4 Stunde, täglich etc. Minimum, Maximum und Mittelwert und Zeitstempel. Er benötigt dazu 2 Speicherplätze im Flash. Diese Werte werden effizient in ein Stringarray gespeichert, so dass 116 Werte mitgeloggt werden.

    Dabei wird eine Ringpufferstruktur angelegt, d.h. neue Werte überschrieben werden. Das Speichern auf das Flash wird mit der Variablen Store_Now gesteuert (hier um Mitternacht). Bis zu diesem Zeitpunkt wären die Variablen nur im RAM und nicht im Flash.

    Der Puffer kann Datentypen zwischen 1 und 32 Bit aufnehmen.

    Mit den Variablen Store_InitDay,Store_InitMon,Store_InitYear kann festgelegt werden, ob bei einem neuen Einspielen des Progamms aus dem Flash gelesen werden soll (das Datum muss bereits vorüber sein), oder ob die Daten neu geschrieben werden.

    Da man (wenn mal ein Makro da ist) beliebige Puffer mit unterschiedlichen Zeitintervallen (Kurz-, Mittel-, Langzeit) ist die Sache an sich recht brauchbar - vielleicht erübrigt sich die RRD Datenbank .

    [highlight=epc]
    //Value kann zwischen 1 und 32 Bit breiter Datentyp sein
    Value='2/1/3'u08+1
    // Ein paar Daten generieren zu Testzwecken
    if stime(2) or stime(17) or stime(32) or stime(48) or stime(9) or stime(19) or stime(39) or stime(49) then write('2/1/3'u08,'2/1/3'u08+2) endif
    //
    // -----------------------------------------------------------------------
    //
    // Speichern auf das Flash:
    // Platz1: Min,Max,Mittelwert (im Abstand von 4 Bytes)
    // Platz2: std,min,sek,Tag,Monat, Jahr (im Abstand von 4 Bytes)
    // -----------------------------------------------------------------------
    //initga('2/1/3'f32)
    Store_InitDay=2
    Store_InitMon=12
    Store_InitYear=10
    Store_Start=AUS
    // Zeitpunkt: 1/4 Stunden Werte
    //Store_Timer=mtime(0,0) or mtime(15,0) or mtime(30,0) or mtime(45,0)
    Store_Timer=stime(0) or stime(15) or stime(30) or stime(45)
    // Speichern in temporäre Arrays
    Store_Array=$$
    Store_TimeStamp=$$
    Store_ArrayPos=0u16
    Store_TimeStampPos=1u16
    Store_CarryFlag=OFF
    Store_Now=htime(0,0,convert(random(59u32),0))
    // Indexspeicher
    Store_Init=2u16
    Store_Pos=Store_Init
    // Min,Max,Mittelwert
    Store_Max=convert(0,Value)
    Store_Min=convert(0,Value)
    Store_Avg=0f32
    Store_AvgIcr=1f32
    //
    Store_Error=AUS
    // Datum als Zahlen abspeicher
    Store_dd=convert(split(convert(setdate(),$$),0u16, 1u16),0)
    Store_mm=convert(split(convert(setdate(),$$),3u16, 4u16),0)
    Store_yy=convert(split(convert(setdate(),$$),6u16, 10u16),0u16)

    // Aufzeichnung nur aus dem Flash lesen, wenn Aufzeichnung bereits begonnen hatte
    if date(Store_InitDay,Store_InitMon,Store_InitYear) then {
    readflash(Store_Array, Store_ArrayPos);
    readflash(Store_TimeStamp, Store_ArrayPos+1u16)
    } else {
    writeflash(Store_Pos, Store_ArrayPos);
    writeflash(Store_CarryFlag, Store_ArrayPos+1u16)
    } endif
    // Sollte ein Wert aus dem Flash gelesen werden, so muss dieser
    // eine gültige Position haben
    if after(systemstart(),500u64) and date(Store_InitDay,Store_InitMon,Store_InitYear) then {
    Store_Pos=stringcast(Store_Array,Store_Pos,0u16);
    if mod(Store_Pos-Store_Init,12u16)>0u16 then Store_Pos=Store_Init endif
    } endif
    if after(systemstart(),1000u64) then {
    Store_Max=Value;
    Store_Min=Value;
    Store_Avg=convert(Value,0f32);
    Store_AvgIcr=1f32;
    Store_Start=EIN
    } endif

    // Min,Max, Mittelwert
    if (Store_Max<Value) and Store_Start then Store_Max=Value endif
    if (Store_Min>Value) and Store_Start then Store_Min=Value endif
    if change(Value) and Store_Start then {
    Store_AvgIcr=Store_AvgIcr+1f32;
    Store_Avg=((Store_Avg*(Store_AvgIcr-1f32))+convert(Value,0f32))/Store_AvgIcr
    } endif

    // Messen im nächsten Zeitintervall
    if after(Store_Timer,1u64) and Store_Start then {
    Store_Max=Value;
    Store_Min=Value;
    Store_Avg=convert(Value,0f32);
    Store_AvgIcr=1f32;
    Store_Pos=Store_Pos+12u16
    } endif

    // In das StringArray Speichern
    // 12 Byte (3x4 Byte): Value kann zwischen 1 und 32 Bit breiter Datentyp sein
    // Die Zeitwerte werden im TimestampArray gespeichert
    if Store_Start and Store_Timer then {
    if (Store_Pos>END-12u16) then Store_Pos=Store_Init; Store_CarryFlag=ON endif;
    stringset(Store_Array,Store_Pos,0u16);
    stringset(Store_Array,Store_Min,Store_Pos);
    stringset(Store_Array,Store_Max,Store_Pos+4u16);
    stringset(Store_Array,Store_AvgIcr,Store_Pos+8u16) ;
    stringset(Store_TimeStamp,Store_CarryFlag,0u16);
    stringset(Store_TimeStamp,hour(),Store_Pos);
    stringset(Store_TimeStamp,minute(),Store_Pos+1u16) ;
    stringset(Store_TimeStamp,second(),Store_Pos+2u16) ;
    stringset(Store_TimeStamp,Store_dd,Store_Pos+3u16) ;
    stringset(Store_TimeStamp,Store_mm,Store_Pos+4u16) ;
    stringset(Store_TimeStamp,Store_yy,Store_Pos+5u16)
    } endif

    // Speichern der Werte
    if (change(Store_Array) and Store_Now) or (Store_Pos>END-12u16) then {
    Store_Error=writeflash(Store_Array,Store_ArrayPos) or writeflash(Store_TimeStamp,Store_ArrayPos+1u16)
    } endif
    [/highlight]
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    #2
    Anbei die komplette Anwendung einer Remanent-Langzeitaufzeichnung im Flash des EibPC direkt "mit den Bordmitteln" des EibPCs.

    Es werden Ringpuffer mit Hilfe von String-Arrays (c1400) angelegt und im Flash abgespeichert.

    Man benötigt EibStudio 1.909 (aktuelle Beta).

    Das Ganze ist zwar noch Betastatus - geht aber bei mir hier perfekt. Wenn's mal ordentlich getestet wurde bzw. die Makros neu released werden, mach ich noch ein Demo im Codeschnipsel.

    Im FlashCycleGA-Makro gibt man die GA/Variable an, das 3. Argument stellt die Zeit dar.

    Man kann hier auch eine Variable schreiben, etwa
    MyTIme=htime(6,00,00) or htime(18,00,00)
    um täglich 2 mal den Wert abzuspeichern. Dabei wird jeweils von einem zum nächsten Speicherpunkt der Mitterlwert, Maximum und Minimum berechnet.

    Um den Mittelwert korrekt zu berechnen, sollte die GA sich zyklisch (regelmäßig) schreiben.

    Mit dem Slider (unten) kann man dann sich die Daten aus dem Speicher wieder anzeigen lassen. Der Info-Button zeigt dann den Start bzw. Ende (bei Klick auf die Schaltfläche)

    [highlight=epc]
    [Macros]
    // Speicher im Flash zyklisch laden
    FlashCycleGA(Essen2Temp,0,'2/3/4'f16,cycle(3,0),26,12,10)
    FlashCycleGA(EssenTemp,4,'2/3/4'f16,cycle(6,0), 26,12,10)
    // Darstellen der aktuellen Daten und bei Neustart des Programms von bereits vergangenen Daten
    VisuFlash(Essen2Temp,1,Logger2VisuID,LoggerPageID)
    VisuFlash(EssenTemp,1,LoggerVisuID,LoggerPageID)
    // Slider abfragen VisuFlashHistory Makro
    VisuHistoryButtonSlider(EssenTemp,SliderID,InfoID, LoggerPageID)
    VisuHistoryButtonSlider(Essen2Temp,Slider2ID,Info2 ID,LoggerPageID)
    // Aus dem Speicher holen und darstellen (Slider als %-Angabe), benötigt VisuHistoryButtonSlider
    VisuFlashHistory(EssenTemp,1,LoggerHistoryID,Logge rPageID)
    VisuFlashHistory(Essen2Temp,1,Logger2HistoryID,Log gerPageID)

    [MacroLibs]
    //Makro-Bibliotheken
    flash.lib
    [WebServer]
    page (LoggerPageID) [$Allgemein$,$Logger$]
    // Charts mit aktuellen Werten
    line $Aktuelle Werte$
    mpchart(LoggerVisuID) [DOUBLE,SXY] ($Min$,LINE,$MAX$,LINE,$MITTELWERT$,LINEDOTS) \\
    mpchart(Logger2VisuID) [DOUBLE,SXY] ($Min$,LINE,$MAX$,LINE,$MITTELWERT$,LINEDOTS)
    // Werte aus dem Flash mit Slider einstellbar
    line $Historie$
    pslider(SliderID)[DATE]$Ringpuffer - Position%$ pslider(Slider2ID)[DATE]$Ringpuffer - Position$
    pshifter(InfoID)[INFO]$Beobachtungszeitraum$ pshifter(Info2ID)[INFO]$Beobachtungszeitraum$
    mpchart(LoggerHistoryID) [Single,SXY] ($Min$,LINE,$MAX$,LINE,$MITTELWERT$,LINEDOTS) \\
    mpchart(Logger2HistoryID) [Single,SXY] ($Min$,LINE,$MAX$,LINE,$MITTELWERT$,LINEDOTS)

    [EibPC]
    // Zugriff auf Visu
    LoggerPageID=1
    Logger2VisuID=0
    LoggerVisuID=1
    SliderID=2
    Slider2ID=7
    InfoID=4
    Info2ID=8
    LoggerHistoryID=5
    Logger2HistoryID=6
    //
    // Ein paar Daten generieren
    //
    u='1/3/4'c14
    changet=AUS
    if cycle(0,2) and Store_EssenTemp_Start then {
    changet=!changet;
    write('2/3/4'f16,convert(sin((convert(minute(),0f32)/60f32+convert(second(),0f32)/260f32+convert(hour(),0f32))/60f32*3.14f32)+convert(random(1000u32),0f32)/10000f32,0.0))
    } endif

    [/highlight]
    Angehängte Dateien
    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
    Enertex Produkte kaufen

    Kommentar


      #3
      Wo gibt es die aktuelle Beta EibStudio 1.909 ?

      Gruß
      Markus

      Kommentar


        #4
        Zitat von Marha Beitrag anzeigen
        Wo gibt es die aktuelle Beta EibStudio 1.909 ?
        Auch wenn diese Ankündigung
        https://knx-user-forum.de/134756-post209.html
        "alt" ist, gibt es unter diesen Links immer die aktuellsten Betas.

        EDIT: Bitte beachten, ich habe eben flash,zip aktualisiert
        offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
        Enertex Produkte kaufen

        Kommentar


          #5
          Zitat von enertegus Beitrag anzeigen
          EDIT: Bitte beachten, ich habe eben flash,zip aktualisiert
          Und gleich nochmal - nun stimmt das auch mit den History-Daten und dem Slider
          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
          Enertex Produkte kaufen

          Kommentar


            #6
            Zitat von enertegus Beitrag anzeigen
            Und gleich nochmal - nun stimmt das auch mit den History-Daten und dem Slider
            Vielen Dank, sieht ja ganz brauchbar aus, nur leider scheint das flash-2.zip defekt zu sein ....

            Gruß
            dl2ocb

            Kommentar


              #7
              Nö, das zip ist in Ordnung und lässt sich ohne Fehler entpacken.
              Was geht bei dir nicht?

              Kommentar


                #8
                Zitat von enertegus Beitrag anzeigen
                Und gleich nochmal - nun stimmt das auch mit den History-Daten und dem Slider
                Da ist noch ein Bug drinne bei der Darstellung der alten Werte bzw. der Berechnung der Daten des Ringpuffers mit dem Slider - wir testen das aber erst mal ausführlich .
                offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                Enertex Produkte kaufen

                Kommentar


                  #9
                  Kannst du noch schnell sagen, was 'Detail' machen soll? Bei mir kommen bei Detail <> 1 schöne Grafiken raus
                  BR
                  Marc

                  Kommentar


                    #10
                    Zitat von saft6luck Beitrag anzeigen
                    Kannst du noch schnell sagen, was 'Detail' machen soll? Bei mir kommen bei Detail <> 1 schöne Grafiken raus
                    Die Skalierung der X-Achse, die sollte passend sein zu den Häufigkeiten der Speicherung: Bei Speichern alle Minuten ist eine Anzeige mit einer Montatsachse recht wenig brauchbar...
                    Wie gesagt, ich werde da noch etwas nacharbeiten.
                    offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                    Enertex Produkte kaufen

                    Kommentar


                      #11
                      Ich kann das zip auch nicht entpacken.

                      Kommentar


                        #12
                        Zitat von Marha Beitrag anzeigen
                        Ich kann das zip auch nicht entpacken.
                        Hm, Michael, gibt es noch ein Version, die sich entpacken läßt oder sollten wir lieber auf die final Release warten?

                        Gruß,
                        Bernd

                        Kommentar


                          #13
                          Zitat von bmx Beitrag anzeigen
                          Hm, Michael, gibt es noch ein Version, die sich entpacken läßt oder sollten wir lieber auf die final Release warten?
                          Warten.
                          offizielles Supportforum für den Enertex® EibPC: https://knx-user-forum.de/eibpc/
                          Enertex Produkte kaufen

                          Kommentar

                          Lädt...
                          X