wort ins Bits

Zuviel Werbung?
-> Hier kostenlos registrieren
Danke

das ist ein möglichkeit,aber ich möchte nicht mit merker arbeiten, wenn es geht direkt abfragen oder in temporär datei umladen und dann wandeln
 
Um ein Word in die einzelnen Bits zu zerlegen (oder umgekehrt) benutze ich meist einen Schmiermerkerbereich wie hier.
Code:
L #MyWord
T "TmpUnion_L_W"   // MW222 temporäres Word Bits .0 ... .15

U "TmpUnion_Bit0"  // M223.0 temporäres Word Bit .0
= #MyBit

...

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ohne Merker:
Code:
L  #MyWord
UW W#16#1
U  <>0
=  #MyBit0

...

L  #MyWord
UW W#16#100
U  <>0
=  #MyBit8

...
Man kann auch eine Schleife programmieren, wo ein Word mit nur einem gesetzten Bit für den UW-Vergleich geshiftet wird.

Harald
 
Ich mach mir dazu in den Lokaldaten einen Strukt mit 8 Bits, lade die adresse des strukts, transferiere den wert rein und dann hab ich die bits!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
und wie soll es aussehen für den Bit15.
Code:
L  #MyWord
UW W#16#8000
U  <>0
=  #MyBit15

Die einfachste und zugleich kürzeste Variante (vor allem, wenn man mehrere Bits abfragen will) ist aber das kopieren des Word in einen Speicherbereich und dann direkt auf das Speicherbit zugreifen, so wie Helmut und ich gleich vorgeschlagen haben.
Wenn man keine Merker verwenden will, dann geht das selbstverständlich auch mit DB-Word/DB-Bit oder TEMP-Word/TEMP-Bit. Allerdings kann man da nicht gleichzeitig das Word und die Bits symbolisch deklarieren.
Code:
L #MyWord
T LW 0

U L 1.0
= #MyBit0

...

U L 0.7
= #MyBit15
 
Ich mach mir dazu in den Lokaldaten einen Strukt mit 8 Bits, lade die adresse des strukts, transferiere den wert rein und dann hab ich die bits!
Ahh, das könnte eine Möglichkeit sein, Word UND Bits symbolisch zu adressieren.
Ich bin mir nur grad nicht sicher, ob das geht:
Code:
L P##structname

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich mach mir dazu in den Lokaldaten einen Strukt mit 8 Bits, lade die adresse des strukts, transferiere den wert rein und dann hab ich die bits!
Danke Jochen, ich habe Deinen Tip direkt mal ausprobiert.
Mit Hilfe der Struktur kann man tatsächlich auch in TEMP auf das Word UND die Bits symbolisch zugreifen:
Code:
VAR_TEMP
  test_irgendwas : BYTE ; //Füll-Var für L-Adressoffset > 0
  tempWord : STRUCT
   Bit8  : BOOL ;
   Bit9  : BOOL ;
   Bit10 : BOOL ;
   Bit11 : BOOL ;
   Bit12 : BOOL ;
   Bit13 : BOOL ;
   Bit14 : BOOL ;
   Bit15 : BOOL ;
   Bit0  : BOOL ;
   Bit1  : BOOL ;
   Bit2  : BOOL ;
   Bit3  : BOOL ;
   Bit4  : BOOL ;
   Bit5  : BOOL ;
   Bit6  : BOOL ;
   Bit7  : BOOL ;
  END_STRUCT ;
END_VAR
BEGIN
NETWORK
      LAR1  P##tempWord ;
      L     #MyWord ;
      T     W [AR1,P#0.0] ;

      U     #tempWord.Bit15 ;
      =     #MyBit ;

Harald
 
FC "TestBit_W"

Wenn man aus einem Word nicht alle Einzelbits extrahieren will, sondern nur den Zustand eines einzelnen Bits im Word abfragen will, dann kann man auch diesen FC benutzen:
Code:
FUNCTION "TestBit_W" : BOOL
TITLE =Gibt den Zustand eines Bits aus einem Word zurück
AUTHOR : PN_DP
VERSION : 0.1

VAR_INPUT
  Wordwert : WORD ;     //Wordwert
  Bitnummer : INT ;     //Bitnummer 0...15
END_VAR
BEGIN
NETWORK
      L     #Bitnummer ;
      L     1 ;
      SLW   ;
      L     #Wordwert ;
      UW    ;
      U     <>0 ;
      =     #RET_VAL ;  //Bit-Zustand zurückgeben
      SAVE  ;           //für KOP/FUP auch in BIE/ENO ausgeben

END_FUNCTION

Beispiel-Aufruf in FUP (ENO hat den selben Zustand wie RET_VAL und kann direkt weiterverarbeitet werden!):
Code:
          +-------------------+
          |    "TestBit_W"    |
      ...-|EN                 |
          |                   |
 "MyWord"-|Wordwert    RET_VAL|-M8.0   M8.1
          |                   |       +-----+
        5-|Bitnummer       ENO|-------|  =  |
          +-------------------+       +-----+

Der selbe Aufruf in AWL-Ansicht:
Code:
      CALL  "TestBit_W"
       Wordwert :="MyWord"
       Bitnummer:=5
       RET_VAL  :=M8.0

      U     BIE
      =     M      8.1

Harald
 
Zurück
Oben