Maximalwert aus Array

mailmir

Level-1
Beiträge
75
Reaktionspunkte
3
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
 
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.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
Zuletzt bearbeitet:
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.
 
Zuletzt bearbeitet:
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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.
 
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
 
Zurück
Oben