Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 7 von 7

Thema: Maximalwert aus Array

  1. #1
    Registriert seit
    24.09.2011
    Ort
    Lustenau / Österreich
    Beiträge
    60
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo zusammen,

    ich habe ein array das ich jede Minute mit einem neuen Wert fülle. Es wird hier Bsp. die aktuelle Aussentemperatur geschrieben, das sind in 24 Stunden also 1440 Werte. Gibt es eine einfache Möglichkeit aus dem Array den maximalen und den minimalen Wert auszulesen, also in dem Maximaltemperatur und Minimaltemperatur der letzten 24 Stunden, oder mus ich mit einer Schleife immer wieder alle Daten im Array abfragen und mit dem momentanen Max bzw. Min vergleichen??

    MfG. Norbert
    Zitieren Zitieren Maximalwert aus Array  

  2. #2
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Verwendest du das Array als Schiebepuffer (kontinuierlich) oder löschst du es nach 24h und fängst wieder bei 0 an?
    Im letzteren Fall machst du den Min/Max Vergleich einfach mit jedem neuen Messwert und gut ist.

    Wenn du die Werte kontinuierlich ein einen Schiebepuffer packst, musst du wohl leider jedesmal alle Elemente prüfen, da deine Min-Max Werte ja irgendwann aus dem Puffer herausgeschoben werden und du dann ein neues Minimum/Maximum aus den verbleibenen Werten im Array ermitteln musst.

  3. #3
    Registriert seit
    24.09.2011
    Ort
    Lustenau / Österreich
    Beiträge
    60
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hallo,

    also ich habe ein Array erzeugt, die Position ändere ich dynamisch (je nach Uhrzeit)

    uiZS_ArrPosition := uiStunde * 60 + uiMinute;

    arrWertespeicher_Monat_Minute[uiZS_ArrPosition] := rIn_Aktuell;

    IF arrWertespeicher_Monat_Minute[uiZS_ArrPosition] > rZR_Max_24 THEN
    rZR_Max_24 := arrWertespeicher_Monat_Minute[uiZS_ArrPosition];
    END_IF

    IF arrWertespeicher_Monat_Minute[uiZS_ArrPosition] < rZR_Min_24 THEN
    rZR_Min_24 := arrWertespeicher_Monat_Minute[uiZS_ArrPosition];
    END_IF


    Wenn der neue Tag beginnt müsste ich also rZR_Min und rZR_Max auf definierte Werte setzen, Bei Tagesbegin steht in uiZS_ArrPosition ja 0, also Bsp mit

    IF uiZS_ArrPosition = 0 THEN
    rZR_Max_24 := rIn_Aktuell;
    rZR_Max_24 := rIn_Aktuell;
    END_IF

    Somit hätte ich die Tageshöchsttemperatur und die Tagestiefsttemperatur, aber ich will zu jedem Zeitpunkt die Tiefst- und Höchsttemperatur der letzten 24 Stunden haben, also um 10:38Uhr will ich dies von Gestern 10:39 bis heute 10:38Uhr.
    Geändert von mailmir (13.08.2013 um 11:56 Uhr)

  4. #4
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Dann brauchst du einen Schiebepuffer.
    Den realisierst du indem du einfach alle Elemente deines Arrays von 1 bis n-1 um eine Position weiter schiebst und auf Position 1 den neuen Wert schreibst. Dann kannst du mit einer FOR Schleife das Min/Max ermitteln.

    Code:
    Array:
    12 13 14 10 9 11 12 12
    
    Schieben =>
    12 12 13 14 10 9 11 12
    
    neuen Wert schreiben (zb. 8):
    8 12 13 14 10 9 11 12
    Der erste Wert ist immer der neueste, der letzte der älteste (Array[1] = jetzt, Array[1440] = vor 24h)

    Einen Schiebepuffer kannst du z.B. sehr leicht mit MEMMOVE realisieren (in TwinCAT):

    Code:
    MEMMOVE(destAddr := ADR(arrWertespeicher_Monat_Minute) + SIZEOF(arrWertespeicher_Monat_Minute[1]),srcAddr:=ADR(arrWertespeicher_Monat_Minute), n:=5756);  
    
    arrWertespeicher_Monat_Minute[1] := rIn_Aktuell;
    rZR_Max_24 := rIn_Aktuell;
    rZR_Min_24 := rIn_Aktuell;
    
    FOR i := 1 to 1440 DO
      IF arrWertespeicher_Monat_Minute[i] > rZR_Max_24 THEN
        rZR_Max_24 := arrWertespeicher_Monat_Minute[i];
      END_IF
    
      IF arrWertespeicher_Monat_Minute[i] < rZR_Min_24 THEN
        rZR_Min_24 := arrWertespeicher_Monat_Minute[i];
      END_IF
    END_FOR
    Erklärung:

    MEMOVE verschiebt Speicherbereiche. destAddr ist die Zieladresse HIER: Die Adresse des Arrays + die größe des ersten Elements => also arrWertespeicher_Monat_Minute[2].
    scrAddr ist die Quell-Adresse HIER die Adresse des Arrays => also arrWertespeicher_Monat_Minute[1].
    n ist die Anzahl von Bytes die Verschoben werden sollen. Ich gehe davon aus, dass du die Temperaturen als REAL speicherst. REAL = 4 Byte. 1440 * 4Byte = 5760. Da wir aber nur die Elemente 1 bis 1439 verschieben wollen (das Letzte fällt ja raus): 5760 - 4 = 5756 Byte.
    Jetzt sind also alle Arrayelemente von 1 bis 1439 um eine Position weiter geschoben worden. Den neuen Wert kannst du jetzt an Position 1 speichern.

    Danach einfach nur mit einer Schleife Min und Max ermitteln.......

    Ohne Gewähr, obs besser geht .... k.a. ich machs immer so.
    Geändert von MasterOhh (13.08.2013 um 12:27 Uhr)

  5. #5
    Registriert seit
    24.09.2011
    Ort
    Lustenau / Österreich
    Beiträge
    60
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    Hoi,

    "blöde Frage"
    ist doch wurscht ob der höchste Wert an Stelle 5 oder Stelle 100 Steht, ich muss mit der Schleifen dann ja eh immer alle Positionen abfragen. Mit meiner Array-Position nach Minute (also stunde * 60 + Minute) überschreibe ich innerhalb der 24 Stunden ja auch alle Werte, ausserdem kann ich so das Arry von meiner Trendaufzeichnung nutzen. Hier habe ich für die Tages, Monats und Jahresauswertung eh jeden Minutenwert in einem 2-dimensionalen Array gespeichert. Ich dachte es gibt eine Funktion "Max of Array . . . . " oder so.
    Wenn ich den Min und Max eh immer mit einer Schleife abfragen muss was bringt mir dann dein Schiebbuffer?

  6. #6
    Registriert seit
    24.02.2009
    Beiträge
    1.242
    Danke
    23
    Erhielt 276 Danke für 235 Beiträge

    Standard

    Kommt halt drauf an wie du das Array auswerten willst. Wenn ich es als Kurve darstellen will, ist einfacher für mich wenn der Aktuelle Wert immer an der gleichen Stelle (Am Anfang) steht. Sonst muss ich mittem im Array anfangen und rückwärts bis zum Anfang und dann rückwärts vom Ende zur Mitte die Werte auslesen.

    Wenn du den Schiebepuffer nicht brauchst, auch gut

    Ein fertige Max Funktion für Arrays gibt es nicht (so weit ich weiss). Aber die würde im Endeffekt auch nur alle Elemente im Array durchrödeln. Du kannst dir ja die Funktion selber basteln.

  7. #7
    Registriert seit
    24.09.2011
    Ort
    Lustenau / Österreich
    Beiträge
    60
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hoi,

    DANKE für die Info. Das hab ich schon gebaut.

    FOR Zaehler:=1 TO 1440 DO

    IF arrIn[Zaehler] > rMax THEN
    rMax := arrIn[Zaehler];
    END_IF

    IF arrIn[Zaehler] < rMin THEN
    rMin := arrIn[Zaehler];
    END_IF

    END_FOR

    Das ganze starte ich dann übern EN-Eingang alle Minute, also immer wenn der Neueste Wert von der Wetterstation kommt. Ich dachte nur es geht auch "eleganter".

    DANKE

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 09.09.2011, 14:43
  2. maximalwert in DB
    Von newman im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 05.06.2010, 14:46
  3. Element aus Array kopieren
    Von guidokk im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 18.06.2008, 16:14
  4. DINT Maximalwert
    Von Wolfi_L im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 25.10.2007, 13:18
  5. Array aus Datenbaustein an FC-Eingang
    Von Joline im Forum Simatic
    Antworten: 2
    Letzter Beitrag: 09.01.2007, 14:34

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •