Autor Thema: bitweises Vergleichen  (Gelesen 2518 mal)

Offline Joesel

  • Newbie
  • *
  • Beiträge: 10
bitweises Vergleichen
« 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

Offline Frohnius

  • Jr. Member
  • **
  • Beiträge: 40
Antw:bitweises Vergleichen
« Antwort #1 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
....

« Letzte Änderung: Februar 11, 2021, 08:36:16 Vormittag von Frohnius »

Offline weiss_nix

  • Sr. Member
  • ****
  • Beiträge: 608
  • it has to be easy, it's a easy!
Antw:bitweises Vergleichen
« Antwort #2 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ß
« Letzte Änderung: Februar 11, 2021, 09:12:32 Vormittag von weiss_nix »
Sollte ich (gefährliches) Halbwissen verbreiten, beuge ich demütig mein Haupt mit der Gewissheit versagt zu haben!
WICHTIG: Sämtliche Programme dienen lediglich der Veranschaulichung von Funktionen und sind nicht für den Produktiveinsatz geeignet!

Offline Joesel

  • Newbie
  • *
  • Beiträge: 10
Antw:bitweises Vergleichen
« Antwort #3 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