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.