aus 6 Real Zahlen die höchste und die niedrigste ermitteln

Zuviel Werbung?
-> Hier kostenlos registrieren
@volker: cosmo scheint in die diskussion gestolpert zu sein, jedenfalls hat er den thread nicht gestartet ;)

aber deine befürchtungen teil ich, warum alle pumpen gleichzeitig kaputt gehen lassen? damit der servicetechniker nur einmal kommen muß?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
mmh, das ist natürlich auch ein interessanter punkt, dem im falle des falle wären ja alle pumpen kaputt...

Das sehe ich nicht so. IMHO ist es sinnvoll bei Pumpen einen Betriebsstundenausgleich anzustreben. Vor allem weiss man dann das alle laufen.

Und das alle Pumpen auch nur annähernd bei der gleichen Betriebsstundenanzahl kaputt gehen ist doch sehr unwahrscheinlich.
Je nach Betriebsart sollte man einfach eine sinnvolle umschaltung einstellen, also z.B. alle 1000 Betriebsstunden die Pumpe wechseln.

Und wenn die Pumpen eh nach Anforderungen auch zu mehreren laufen müssen isses eh sinnvoll immer die Pumpe mit der niedrigsten Betriebszeit zuzuschalten.
 
Hier noch mal ein kurzes Programmbeispiel für die Sortierung von 7 REAL-Zahlen mit Bubblesort:

Code:
// FC100 : Bubblesort
 
// Datensatz kopieren
 
      CALL  SFC   20
       SRCBLK :=[COLOR=red]P#DB100.DBX0.0 BYTE 42[/COLOR]
       RET_VAL:=#BLKMOV_RET_VAR
       DSTBLK :=[COLOR=red]P#DB100.DBX42.0 BYTE 42[/COLOR]
 
// Bubblesort
 
      AUF   DB   100                    // Datenbaustein öffnen
 
      [COLOR=red]L     6[/COLOR]
M01:  T     #ZAEHLER_01
 
      [COLOR=red]L     P#42.0[/COLOR]                      // Zeiger Wert 1
      LAR1 
 
      L     #ZAEHLER_01
M02:  T     #ZAEHLER_02
 
      L     DBD [AR1,P#6.0]             // Wert 2
      L     DBD [AR1,P#0.0]             // Wert 1
      >R   
      SPBN  M03
      L     DBD [AR1,P#0.0]             // Wert 1
      L     DBD [AR1,P#6.0]             // Wert 2 
      T     DBD [AR1,P#0.0]             // Wert 2 => Wert 1
      TAK  
      T     DBD [AR1,P#6.0]             // Wert 1 => Wert 2
 
      L     DBW [AR1,P#4.0]             // Kennung 1
      L     DBW [AR1,P#10.0]            // Kennung 2
      T     DBW [AR1,P#4.0]             // Kennung 2 => Kennung 1
      TAK  
      T     DBW [AR1,P#10.0]            // Kennung 1 => Kennung 2
 
M03:  L     P#6.0                       // Zeiger Wert 1 + 1
      +AR1 
 
      L     #ZAEHLER_02
      LOOP  M02
 
      L     #ZAEHLER_01
      LOOP  M01

Gruß Kai
Hier mal ein kurzes Programmbeispiel mit Bubblesort:

Code:
// FC100 : Bubblesort
 
// Datenbaustein öffnen
 
      AUF   DB   100
 
 
// Datensatz kopieren
 
      CALL  SFC   20
       SRCBLK :=P#DB100.DBX0.0 BYTE 36
       RET_VAL:=#BLKMOV_RET_VAR
       DSTBLK :=P#DB100.DBX36.0 BYTE 36
 
 
// Bubblesort
 
      L     P#36.0                      // Zeiger Wert 1
      LAR1 
 
      L     5
M01:  T     #ZAEHLER_01
 
      L     #ZAEHLER_01
M02:  T     #ZAEHLER_02
 
      L     DBD [AR1,P#6.0]             // Wert 2
      L     DBD [AR1,P#0.0]             // Wert 1
      >R   
      SPB   M03
      SPA   M04
M03:  L     DBD [AR1,P#0.0]             // Wert 1
      T     DBD   72                    // Wert 7
 
      L     DBW [AR1,P#4.0]             // Kennung 1
      T     DBW   76                    // Kennung 7
 
      L     DBD [AR1,P#6.0]             // Wert 2
      T     DBD [AR1,P#0.0]             // Wert 1
 
      L     DBW [AR1,P#10.0]            // Kennung 2
      T     DBW [AR1,P#4.0]             // Kennung 1
 
      L     DBD   72                    // Wert 7
      T     DBD [AR1,P#6.0]             // Wert 2
 
      L     DBW   76                    // Kennung 7
      T     DBW [AR1,P#10.0]            // Kennung 2
 
M04:  L     P#6.0                       // Zeiger Wert 1 + 1
      +AR1 
 
      L     #ZAEHLER_02
      LOOP  M02
 
      L     P#36.0                      // Zeiger Wert 1
      LAR1 
 
      L     #ZAEHLER_01
      LOOP  M01

Gruß Kai
Hallo, kann ich den Code verwenden?. Ich soll Laufzeit (DINT) von 5 Pumpe ermitteln und dann sortieren von kleinste Laufzeit bis größten Laufzeit . und auch Standzeit (DINT) von 5 Pumpe ermitteln und dann sortieren von größten Standzeit bis kleinste Standzeit.
 
Hab da ein kleines Problem, ich möchte 6 Real Zahlen vergleichen und die höchste / niedrigste Zahl ermitteln.

Wenn's unbedingt in AWL sein muss und lediglich der kleinste und der grösste Wert aus 6 Variablen gefunden werden sollen:
Code:
      L    Real1   
      L    Real2   
      >=R
      SPB  MIN1
      TAK
MIN1: L    Real3   
      >=R
      SPB  MIN2
      TAK
MIN2: L    Real4   
      >=R
      SPB  MIN3
      TAK
MIN3: L    Real5   
      >=R
      SPB  MIN4
      TAK
MIN4: L    Real6   
      >=R
      SPB  MIN5
      TAK
MIN5: T    MINI     // MIN(Real1, Real2, Real3, Real4, Real5, Real6)     

      L    Real1   
      L    Real2   
      <=R
      SPB  MAX1
      TAK
MAX1: L    Real3   
      <=R
      SPB  MAX2
      TAK
MAX2: L    Real4   
      <=R
      SPB  MAX3
      TAK
MAX3: L    Real5   
      <=R
      SPB  MAX4
      TAK
MAX4: L    Real6   
      <=R
      SPB  MAX5
      TAK
MAX5: T    MAXI     // MAX(Real1, Real2, Real3, Real4, Real5, Real6)
Aber in Wirklichkeit ...
Am Ende soll das für eine Windenüberwachung dienen. Also Positionen (umdrehung der einzelnen Winde wird gezählt 6 Winden ingesamt). Die Winden sollen sich annähernd gleich schnell bewegen (Tolereanz 10 Impulse). Das heisst das die schnellste Winde abgestoppt werden soll, bis die langsamste Winde wieder aufgeholt hat.
... ist die Information gesucht, in welchen der 6 Variablen das Minimum bzw. das Maximum gefunden wird.

Als "Ersatz" für die "Kennung" werden zwölf BOOL-Variablen definiert, damit die Information gebildet werden kann, ohne den Akku-Inhalt zu beeinflussen.
Um die Variable mit dem kleinsten Wert zu identifizieren, wird eine der BOOL-Variablen Bool_11 (für Real1) bis Bool_16 (für Real6) gesetzt.
Um die Variable mit dem grössten Wert zu identifizieren, wird eine der BOOL-Variablen Bool_21 (für Real1) bis Bool_26 (für Real6) gesetzt.
Es kann natürlich vorkommen, dass zwei oder mehr der 6 Variablen den kleinsten oder grössten Wert enthalten, dennoch wird immer nur 1 der BOOL-Variablen Bool_11..Bool_16 (für den MinimalWert) und 1 der BOOL-Variablen Bool_21..Bool_26 (für den MaximalWert) gesetzt.
Code:
      L    Real1   
      L    Real2   
      >=R
      =    Bool_12  // Real2 enthält den kleinsten Wert aus Real1 .. Real6
      SPB  MIN1
      =    Bool_11  // Real1 enthält den kleinsten Wert aus Real1 .. Real6
      TAK
MIN1: L    Real3   
      >=R
      R    Bool_11
      R    Bool_12
      =    Bool_13  // Real3 enthält den kleinsten Wert aus Real1 .. Real6
      SPB  MIN2
      TAK
MIN2: L    Real4   
      >=R
      R    Bool_11
      R    Bool_12
      R    Bool_13
      =    Bool_14  // Real4 enthält den kleinsten Wert aus Real1 .. Real6
      SPB  MIN3
      TAK
MIN3: L    Real5   
      >=R
      R    Bool_11
      R    Bool_12
      R    Bool_13
      R    Bool_14
      =    Bool_15  // Real5 enthält den kleinsten Wert aus Real1 .. Real6
      SPB  MIN4
      TAK
MIN4: L    Real6   
      >=R
      R    Bool_11
      R    Bool_12
      R    Bool_13
      R    Bool_14
      R    Bool_15
      =    Bool_16  // Real6 enthält den kleinsten Wert aus Real1 .. Real6
      SPB  MIN5
      TAK
MIN5: T    MINI     // MIN(Real1, Real2, Real3, Real4, Real5, Real6)     

      L    Real1   
      L    Real2   
      <=R
      =    Bool_22  // Real2 enthält den groessten Wert aus Real1 .. Real6
      SPB  MAX1
      =    Bool_21  // Real1 enthält den groessten Wert aus Real1 .. Real6
      TAK
MAX1: L    Real3   
      <=R
      R    Bool_21
      R    Bool_22
      =    Bool_23  // Real3 enthält den groessten Wert aus Real1 .. Real6
      SPB  MAX2
      TAK
MAX2: L    Real14   
      <=R
      R    Bool_21
      R    Bool_22
      R    Bool_23
      =    Bool_24  // Real4 enthält den groessten Wert aus Real1 .. Real6
      SPB  MAX3
      TAK
MAX3: L    Real5   
      <=R
      R    Bool_21
      R    Bool_22
      R    Bool_23
      R    Bool_24
      =    Bool_25  // Real5 enthält den groessten Wert aus Real1 .. Real6
      SPB  MAX4
      TAK
MAX4: L    Real6   
      <=R
      R    Bool_21
      R    Bool_22
      R    Bool_23
      R    Bool_24
      R    Bool_25
      =    Bool_26  // Real6 enthält den groessten Wert aus Real1 .. Real6
      SPB  MAX5
      TAK
MAX5: T    MAXI     // MAX(Real1, Real2, Real3, Real4, Real5, Real6)

Anmerkung zu der ProblemLösung per Sortierung:
Will man durch die SortierAktion wirklich die kompletten 6 (bzw. 7 für den ThreadHijacker) Zeilen der Tabelle sortieren?
Vermutlich nein. Z.B., weil Pumpe1 in der Visualisierung auch weiterhin als Pumpe1 in Zeile 1 erscheinen soll u.s.w..
Man kann aber trotzdem sortieren, indem man der Tabelle 1 Spalte mit Indizes hinzufügt und nur diese neue Spalte sortiert.
Vor dem (ersten) Sortieren dieser neuen Spalten müssen in diese Spalte die ZeilenNrn (1..6 bzw. 1..7) eingetragen werden.
Dann sortiert man die Spalte - nicht nach der Grösse der Inizes, die drin stehen - sondern man liest indirekt in der Spalte, nach der sortiert werden soll, indem man über den Index aus der neuen Spalte auf den Wert aus der Spalte zugreift, nach der sortiert werden soll.
Passt die Reihenfolge nicht zur gewünschten Sortierung, so tauscht man nicht die Werte selbst, sondern ausschliesslich die beiden betroffenen Indizes in der neuen Spalte.
Hat man nach aufsteigenden Werten sortiert, so zeigt der Index der ersten Zeile in der neuen Spalte auf die Zeile der Tabelle, in der der kleinste Wert steht. Ausserdem zeigt der Index der letzten Zeile in der neuen Spalte auf die Zeile der Tabelle, in der der grösste Wert steht.

Falls die Spalte "Kennung" nicht für andere Zwecke beibehalten werden muss, als sie bisher verwendet wird (ausschliesslich zur Identifizierung der Artikel mit dem kleinsten bzw. grössten Wert), dann kann sie entfallen. Ihre Aufgabe wird durch die neue Spalte übernommen.
 
Zuletzt bearbeitet:
Zurück
Oben