@Heinilein: Kannst du deinen Code kurz erklären?
Wenn ich den oberen Teil richtig verstanden habe lädst du den UDINT1 in den Akku 1 und schiebst ihn 1 Bit nach rechts.
Dann lädst du den UDINT2 und machst das gleiche.
Danach vergleichst du die beiden und springst zu GT oder LT.
Aber wo sind GT und LT?
Und was hat es mit dem Linksschieben und wieder rechtsschieben auf sich im unteren Teil?
Gerne, Jan.
Vorab, LT, EQ und GT sind die Sprungziele (irgendwo nach Deinem Belieben) , wo Du Deine Auswertung[en] programmieren kannst.
Das 2. Beispiel ist vielleicht besser zu gebrauchen, weil man da nur 1 Stelle hat, wo man den eigentlich gewünschten Vergleich ==D, <>D, <D, <=D, >D oder >=D direkt hinschreiben kann, so, als gäbe es den kleinen Umweg der Aufbereitung für den Vergleich gar nicht.
So, die Aufbereitung für die Vergleiche ist in beiden Beispielen gleich. Ich beschreibe hier mal nur das 2. Beispiel.
Es werden zunächst udint1/2 und udint2/2 verglichen, also die ursprünglichen Bit1..Bit31.
Sind diese ungleich, so weiss man schon jetzt, welche Zahl die kleinere bzw. grössere ist - unabhängig davon, dass wir beim Vergleich der halben Werte die ursprünglichen Bit0 geschlabbert haben.
Nur wenn beide halbe Werte gleich sind, müssen (und dürfen) wir noch prüfen, wie der jetzt entscheidende Vergleich der ursprünglichen Bit0 beider Zahlen ausfällt.
Wir wissen, dass die Befehle ==D, <>D, <D, <=D, >D und >=D die Inhalte der Akkus 1 und 2 als Zahlen im ZweierKomplement interpretieren.
D.h. Zahlen, bei denen das Bit31 den Wert 1 hat, werden als negative Zahlen und damit "in unserem UDINT-Sinne" falsch verstanden.
Sorgen wir also dafür, dass bei den Vergleichen das Bit31 in Akku1 und Akku2 den Wert 0 hat.
1. Indem wir im ersten Vergleich nur die halben Werte vergleichen, die wir durch SRD 1 berechnen (SRD füllt beim Schieben von links mit 0 auf).
2. Indem wir für den zweiten Vergleich - den wir nur dann ausführen, wenn der 1. Vergleich gesagt hat, beide halbe Zahlen sind gleich - das ursprüngliche Bit31 in beiden Zahlen "platt machen".
Denn wir wissen durch den ersten Vergleich, das die ursprünglichen Bit31 beider Zahlen gleich sind, egal, ob beide den Wert 0 oder beide 1 haben.
Sind beide Bit31 vor dem Löschen schon 0, so ändern wir durch das Löschen rein gar nichts.
Sind beide Bit31 vor dem Löschen 1, so ändern wir durch das Löschen zwar beide in 0, ABER das ändert rein gar nichts daran, dass beide Zahlen in den Bit1..Bit31 weiterhin unverändert gleich bleiben.
Auf das Ergebnis des folgenden Vergleichs haben deshalb nur die (ursprünglichen) Bit0 der beiden Zahlen einen Einfluss.
Um die Bit31 der beiden Zahlen zu löschen, habe ich die BefehlsFolge SLD 1 und SRD 1 gewählt - könnte man auch durch verUNDen mit 7FFFFFFF tun - oder durch verUNDen mit 1, so dass Bit1..Bit31 gelöscht und tatsächlich nur noch Bit0 übrigbleibt.
Gruss, Heinileini