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

Ergebnis 1 bis 6 von 6

Thema: maximalwert in DB

  1. #1
    Registriert seit
    31.05.2010
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard


    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
    Zitieren Zitieren maximalwert in DB  

  2. #2
    Registriert seit
    21.09.2004
    Beiträge
    95
    Danke
    50
    Erhielt 3 Danke für 3 Beiträge

    Standard

    Such einfach mal nach Bubblesort hier im Forum, bzw. vielleicht ist der untenstehende Link was für Dich.

    Jetzt aber ab in die Sonne anstatt vorm PG zu hängen

    http://www.sps-forum.de/showpost.php...27&postcount=8

    LG CNC840D

  3. #3
    Registriert seit
    22.07.2007
    Beiträge
    86
    Danke
    16
    Erhielt 25 Danke für 19 Beiträge

    Standard

    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...43&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?

  4. #4
    newman ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    31.05.2010
    Beiträge
    8
    Danke
    0
    Erhielt 0 Danke für 0 Beiträge

    Standard

    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

  5. #5
    Registriert seit
    22.06.2009
    Ort
    Sassnitz
    Beiträge
    11.197
    Danke
    926
    Erhielt 3.292 Danke für 2.661 Beiträge

    Standard

    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

  6. #6
    Registriert seit
    04.02.2007
    Beiträge
    2.544
    Danke
    167
    Erhielt 731 Danke für 528 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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
    Zitieren Zitieren Versuche es mal damit  

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 09.09.2011, 14:43
  2. DINT Maximalwert
    Von Wolfi_L im Forum Simatic
    Antworten: 12
    Letzter Beitrag: 25.10.2007, 13:18

Lesezeichen

Berechtigungen

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