easy-forum

Deutsch - Software => easySoft => Thema gestartet von: Joesel am Februar 10, 2021, 23:22:01 Nachmittag

Titel: bitweises Vergleichen
Beitrag von: Joesel am Februar 10, 2021, 23:22:01 Nachmittag
Hallo Zusammen!

Nochmals vielen Dank für die Hilfe zu meiner letzten Frage. Ich komme langsam weiter...

Nun möchte ich zwei Variablen vom Typ Merkerbyte (MB) bitweise vergleichen, z.B. ein bitweises UND anwenden um ein MB zu maskieren, mich interessieren z.B. die drei niedrigsten Bit von MB10. Ich hätte gerne einfach

MB11 := MB10 AND 7;  // "Codesys-like"
CASE MB11 OF
   1: ;
   2: ;
   3: ;
ELSE;
CASE_END ;

geschrieben.
Der Ausdruck  "MB11 := MB10 AND 7;  " liefert aber eine Fehlermeldung, die darauf schließen lässt, dass der Operator AND als Ergebnis ausschließlich einen Wert vom Typ BOOL liefert und ausschließlich Parameter vom Typ BOOL akzeptiert.

Den Umweg über den BV-Baustein habe ich gefunden, aber das muss doch schlanker darstellbar sein?

Beste Grüße
Jösel
Titel: Antw:bitweises Vergleichen
Beitrag von: Frohnius am Februar 11, 2021, 07:11:58 Vormittag
hi,
also du kannst natürlich bei MB10 einfach M73 bis M80 testen  :)


oder ...
erstellst einen UF, da die Merker dann in einem geschützten bereich sind ...
MB1:=IA1;
MB2:=IA2;
Q1:=M1 and M9;
..... bis
Q8:=M8 and M16;



im Hauptprogramm kannst du ja dann über UF01Q1 bis UF01Q8 jedes bit auswerten

also mir fällt keine schlankere lösung als mit UF ein  :-\


^^ ok .. du könntest natürlich die werte nicht in Q1-Q8 schreiben sondern in M17-24 und QA1:=MB3 das byte ausgeben ...
dann funktioniert auch die case anweisung so wie du es dir vorstellst ..


case UF01QA1 of
....

Titel: Antw:bitweises Vergleichen
Beitrag von: weiss_nix am Februar 11, 2021, 08:42:36 Vormittag
Hallo Joesel,

wenn du zusammenhängende Bit's prüfen möchtest kannst du dein Bitmuster mit "SHIFTEN" anpassen.
1 Stelle nach links = Multiplikation mit 2
1 Stelle nach rechts = Division durch 2
Die Zahl hinter dem  ** (Exponent) im Codeschnipsel gibt die Anzahl der zu shiftenden Stellen an.

MB10 := 127;

// Die Operation muss auf 2 Zeilen aufgeteilt werden da dies vom System sonst herausgekürzt wird.
MB11 := MB10*2**5; // 5 Stellen nach links
// Die Division kann entfallen wenn du auf die hohe Wertigkeit 32, 64, 128 prüfst.
MB11 := MB11/2**5; // 5 Stellen nach rechts

CASE MB11 OF
1: ;
2: ;
3: ;
else
;
end_case ;

Gruß
Titel: Antw:bitweises Vergleichen
Beitrag von: Joesel am Februar 11, 2021, 20:48:03 Nachmittag
Vielen Dank Euch beiden,

die Bitshift Variante gefällt mir am besten, das liegt wohl wegen meiner C++ Vergangenheit :-)

Beste Grüße
Jösel