TIA Vergleich von Binärer Zahl

Beiträge
53
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,
gibt es eine Möglichkeit zwei Zahlen auf binärer Ebene zu vergleichen?

Zahl1: 0000_0000_0001_1000
Zahl2: 0000_0000_0000_1000

Ich würde gerne eine Möglichkeit schaffen, dass bei diesen beiden zahlen als Ergebnis herauskommt, dass das 4.Bit von rehcts gleich ist.

Hat da jemand eine Möglichkeit/Idee wie man dies umsetzen kann?

Vielen Dank
 
Hallo Hamburgerstudent,

Zerlege die Aufgabe in die notwendigen Teilaufgaben:

1) Wie bekommst du jeweils das 4. Bit aus den Worten?

a) Maskierung:
Zahl_1 UND Maske_Bit4 = Zahl_1_vergleichbar
Zahl_2 UND Maske_Bit4 = Zahl_2_vergleichbar

b) Zugriff jeweils auf das 4. Bit
Zahl_1.4 ...

2) Wie kannst du die Bits vergleichen?

a) Aus der Maskierung hast du 2 Worte, die verglichen werden können.

b) Die Bits können direkt auf Gleichheit geprüft werden.


Gruß
Chräshe
 
Zuletzt bearbeitet:
Kann man einen Slice-Zugriff indirekt Adressieren (z.B. Zahl1.%X(i)) , sodass man das über eine For-Schleife automatisieren kann?
 
Zuletzt bearbeitet:
Was willst du tun?
Für was soll die indirekte Adressierung zum Einsatz kommen?
Was soll die For-Schleife machen?
 
In Classic S7 kann das so aussehen, sollte auch in TIA laufen:

Code:
FUNCTION DetectBit : INT

VAR_INPUT
    
       wTestA: WORD;
       wTestB: WORD;
    
END_VAR


VAR_TEMP
    // temporäre Variablen
    Temp1: INT;
    TempA: WORD;
    TempB: WORD;

END_VAR

    // Anweisungsteil
  
    
    DetectBit := -1;
    FOR Temp1 := 0 TO 15 DO
        TempA := SHR (IN:=wTestA, N:=Temp1);
        TempB := SHR (IN:=wTestB, N:=Temp1);
        IF (TempA AND 16#1) <> (TempB AND 16#1) THEN
            DetectBit := Temp1;
            EXIT;
        END_IF;
    END_FOR;

END_FUNCTION
 
... Ich würde gerne eine Möglichkeit schaffen, dass bei diesen beiden zahlen als Ergebnis herauskommt, dass das 4.Bit von rehcts gleich ist...
Althergebracht ver-&-et man die beiden Operanden wortweise und vergleicht das Ergebnis mit dem gesuchten Bitmuster. Das sollte auf so ziemlich jeder SPS und mit jedem Werkzeug machbar sein.

Code:
#RESULT := (2#0000_0000_0001_1000 AND 2#0000_0000_0000_1000) = 2#0000_0000_0000_1000;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
...
Zahl1: 0000_0000_0001_1000
Zahl2: 0000_0000_0000_1000

Ich würde gerne eine Möglichkeit schaffen, dass bei diesen beiden zahlen als Ergebnis herauskommt, dass das 4.Bit von rehcts gleich ist.
...
Du solltest erst mal erklären, was Du wirklich meinst. In Deinem Beispiel sind nämlich alle Bits außer dem fünften Bit von rechts gleich.
Andere Frage: Was soll rauskommen, wenn mehrere Bits in beiden Zahlen auf der gleichen Bitposition gesetzt sind.

Gruß
Erich
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Du solltest erst mal erklären, was Du wirklich meinst.
Meine ich auch. Bevor hier noch mehr falsche Lösungen zu der offensichtlich unklaren Fragestellung präsentiert werden.

Die einzige Lösung, die nach Aufgabenstellung von #1 ein richtiges Ergebnis liefert:
Per Slice-Zugriff die gewünschten Bits vergleichen, in deinem Fall "Bit4gleich := Zahl1.%X3 = Zahl2.%X3"
sollte man sich allerdings auf der Zunge zergehen lassen... Daß unbedarfte Programmierer BOOLs mit TRUE und FALSE vergleichen, das sieht man ja öfter. Daß aber BOOL mit BOOL verglichen wird, das sieht man selten...
(Der TIA-SCL-Compiler übersetzt den Bool-Vergleich sogar, und anscheinend nicht so viel schlechter gegenüber einer eigentlich effizienteren XOR-Verknüpfung wie der SCL-Compiler von Step7 classic.)

Harald
 
Beitrag 4 liest sich so, dass er alle 16 Bits der Worte einzeln auf Gleichheit prüfen will/muss/soll...
Was in mir auch die Frage auslöst, wozu das gut ist und obs für die eigentliche Aufgabe auch ne schönere Lösung gibt als die Schleife...

Also was beinhalten die 2 Worte und was ist die eigentliche Aufgabe dafür?

Und nein, boolsche Variablen würd ich auch nicht auf Gleichheit prüfen 😂 auch nicht mit einer boolschen Konstanten 😂
 
... Ich würde gerne eine Möglichkeit schaffen, dass bei diesen beiden zahlen als Ergebnis herauskommt, dass das 4.Bit von rehcts gleich ist...
Althergebracht ver-&-et man die beiden Operanden wortweise und vergleicht das Ergebnis mit dem gesuchten Bitmuster. Das sollte auf so ziemlich jeder SPS und mit jedem Werkzeug machbar sein.

Code:
#RESULT := (2#0000_0000_0001_1000 AND 2#0000_0000_0000_1000) = 2#0000_0000_0000_1000;
Das liefert leider nur TRUE, wenn das 4. Bit von rechts in beiden Zahlen 1 ist. Es sollte aber TRUE liefern, wenn die beiden Bits GLEICH sind. Für Test auf gleich lautet die Wordverknüpfung:
#RESULT := (NOT(2#0000_0000_0001_1000 XOR 2#0000_0000_0000_1000) AND 2#0000_0000_0000_1000) <> 0;
allgemein: #xResult := (NOT(#wWert1 XOR #wWert2) AND #wMaske) <> 0;

oder etwas kürzer aber mit eventuellem Gehirnknoten:
#RESULT := ((2#0000_0000_0001_1000 XOR 2#0000_0000_0000_1000) AND 2#0000_0000_0000_1000) = 0;
allgemein: #xResult := ((#wWert1 XOR #wWert2) AND #wMaske) = 0;

In der allgemeinen Form kann die Bitmaske variabel gehalten werden, eignet sich also auch für "indirekte" Adressierung des zu testenden Bits.


In Classic S7 kann das so aussehen, sollte auch in TIA laufen:
Code:
FUNCTION DetectBit : INT

VAR_INPUT
  
       wTestA: WORD;
       wTestB: WORD;
  
END_VAR


VAR_TEMP
    // temporäre Variablen
    Temp1: INT;
    TempA: WORD;
    TempB: WORD;

END_VAR

    // Anweisungsteil
 
  
    DetectBit := -1;
    FOR Temp1 := 0 TO 15 DO
        TempA := SHR (IN:=wTestA, N:=Temp1);
        TempB := SHR (IN:=wTestB, N:=Temp1);
        IF (TempA AND 16#1) <> (TempB AND 16#1) THEN
            DetectBit := Temp1;
            EXIT;
        END_IF;
    END_FOR;

END_FUNCTION
Das ermittelt leider auch nicht, ob das 4. Bit gleich ist, sondern liefert die Nummer des niedrigsten Bits was ungleich ist.

Harald
 
Zurück
Oben