maximalwert in DB

newman

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo, habe ein porblem,

habe ein ringspeicher programmiert, welcher 5werte behinhaltet
nun möchte ich den maximal wert ermitteln.
mein problem ist eigentlich, dass wenn ich erst einen max wert von 30habe, dieser nun (da es ein ringspeicher ist) überschrieben wird, dass er immernoch denkt 30 wäre mein max wert, obwohl er zur zeit eig nur 15ist...


kann mir jemand bitte schnell helfen, wie ich in einem ringspeicher immer den aktuell größten wert in ein merkerwort ausgebe.


danke
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Also ne einfache Max Funktion würde bei 5 Werten sicher ausreichen.
Im folgenden Beispiel handelt es sich zwar um eine Min-Funktion, aber du müsstest nur die Vergleicher ändern.
http://www.sps-forum.de/showpost.php?p=263943&postcount=6

Wenn es mehr als 5 Werte werden, würde ich das aber auf jedenfall mit einer Schleife erschlagen.

Die Fragen wäre dann allerdings erstmal:
Brauchst du nur den größten Wert als Ausgabe, oder seine Position (Adresse) im DB?
Steht ausser den Werten, die zu vergleichen sind, sonst noch was dazwischen?
Weißt du im Ansatz was eine Schleife ist und würdest mit dieser arbeiten können, wenn man dir ein Beispiel gibt?
 
ich brauche den wert, sonst steht da nichts drin
so bisschen mit ner schleife was anfangen kann ich, aber ich habe da das prob, dass er bei max noch den wert hat der schon überschrieben ist
ich guck jetzt erstmal eure beiden links an

danke schonmal
 
Bei 5 Werten würde ich in jedem OB1-Zyklus den Max-Wert der 5 Werte neu ermitteln.

Ist der Ringpuffer viel größer, dann bei jedem Hinzufügen eines Wertes den neuen Wert sofort mit dem bisherigen Max-Wert vergleichen.
Ist der neue Wert kleiner, dann muß von allen Werten im Ringpuffer der Max-Wert neu ermittelt werden.
Ist der neue Wert größer, dann diesen als Max-Wert übernehmen.
Ist der neue Wert gleich dem Max-Wert, dann ist nichts zu tun.

Wenn die Reihenfolge der Werte im Ringpuffer egal ist, dann könnte man einen sortierten Puffer benutzen und neu hinzukommende Werte
einsortieren. Dann steht der Max-Wert automatisch oben. Dafür könnte man z.B. den Bubble-Sort nehmen.

Bubble-Sort ist ungeeignet, wenn die Reihenfolge der Werte im Ringpuffer nicht verändert werden darf. Was fast immer der Fall ist.

Gruß
Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Versuche es mal damit

Code:
FUNCTION "FC_Max" : VOID
TITLE =
VERSION : 0.1


VAR_INPUT
  I_DB_Nr : INT ;    
  I_Anzahl : INT ;    
END_VAR
VAR_IN_OUT
  max : INT ;    
END_VAR
VAR_TEMP
  DB_Nr : WORD ;    
  Schleife : INT ;    
END_VAR
BEGIN
NETWORK
TITLE =Ermitteln Max Wert 

      L     #I_DB_Nr; // Eingangsdb
      T     #DB_Nr; // umkopieren
      AUF   DB [#DB_Nr]; // DB öffnen

      L     0; // Max Wert löschen
      T     #max; // Setzen auf 0

      L     #I_Anzahl; // Lade Anzahl der Werte
LO:   T     #Schleife; // Schleifenzähler setzen
      L     #Schleife; 
      L     1; // Schleifenwert um 1 verringern damit bis 0 Runter zählt
      -I    ; 
      L     2; // Immer 2 Byte da Integer
      *I    ; 
      SLD   3; // Pointer
      LAR1  ; // Laden in Adressregister
      L     DBW [AR1,P#0.0]; // wert laden
      L     #max; // Laden letzten Max
      <I    ; // Prüfen ob kleiner
      SPB   kl; // wenn ja vorbeispringen
      TAK   ; // Akku tauschen damit wieder der Wert im Speicher steht
      T     #max; // Setzen Max Wert
kl:   L     #Schleife; // Lade Schleifenzähler
      LOOP  LO; // Loop bis Anzahl erreichte
END_FUNCTION
 
Zurück
Oben