TIA Bitweiser Zugriff auf Bytes über eine Konstante

Zuviel Werbung?
-> Hier kostenlos registrieren
Bit abfragen:
Code:
Bitgesetzt := Testvar AND SHL(IN:=16#0001, N:=BitPos) <> 0;

Bit setzen:
Code:
Testvar := Testvar OR SHL(IN:=16#0001, N:=BitPos);

beides nicht getestet weil ich hier gerade kein TIA habe.
 
Code:
 ByteVariable.%X[BitNummer]:=TRUE;

ByteVariable.% => symbolsicher Zugriff über DB
[BitNummer] => kann sich Ändern, je nachdem was das für ein Datentyp ist. Aus einer 0 kann eine 8 werden, aus einer 1 eine 9 usw.
Prinzipiell ist wohl POKE_BOOL dafür (und PEEK_BOOL zum Lesen) gedacht:
TIA-Hilfe F1 schrieb:
POKE_BOOL: Speicherbit schreiben

Beschreibung
Mit der Anweisung "Speicherbit schreiben" schreiben Sie ein Speicherbit ohne Angabe eines Datentyps in einen Standard-Speicherbereich.

Verwendung des Speicherbereichs 16#84: DB
Wenn Sie als Speicherbereich einen Datenbaustein verwenden und dieser bei der Erstellung des Programmcodes noch nicht bekannt ist, dann haben Sie die Möglichkeit, den EN-/ENO-Mechanismus zu verwenden, um mögliche Zugriffsfehler zu erkennen:

SCL Kopiert den nachfolgenden Programmcode in die Zwischenablage.

POKE(AREA := 16#84,

DBNUMBER := 1,

BYTEOFFSET := 2,

BITOFFSET := 4,

VALUE := TRUE,

ENO => ENO);

Parameter
Die folgende Tabelle zeigt die Parameter der Anweisung:

Parameter

Deklaration

Datentyp

Speicherbereich

Beschreibung

AREA

Input

BYTE

E, A, M, D

Folgende Bereiche können ausgewählt werden:
  • 16#81: Input
  • 16#82: Output
  • 16#83: Merker
  • 16#84: DB
  • 16#2: Peripherieausgang (nur S7-1500)
DBNUMBER
Input

DINT, DB_ANY

D

Nummer des Datenbausteins, wenn AREA = DB, ansonsten "0"

BYTEOFFSET

Input

DINT

E, A, M, D

Adresse, die geschrieben wird
Es werden nur die 16 niederstwertigen Bits verwendet.

BITOFFSET

Input

INT

E, A, M, D

Bit, das geschrieben wird

VALUE

Input

BOOL

E, A, M, D

Wert, der geschrieben wird

Hinweis
Wenn Sie das Speicherbit in die Bereiche Input, Output oder Merker schreiben, müssen Sie den Parameter DBNUMBER mit dem Wert "0" versorgen, da die Anweisung sonst fehlerhaft ist.
Aber schön ist IMHO auch anders.

:unsure:
Kann nicht z.B. ein passender UDT auf den EA-Bereich gelegt werden?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Code:
 ByteVariable.%X[BitNummer]:=TRUE;

ByteVariable.% => symbolsicher Zugriff über DB
[BitNummer] => kann sich Ändern, je nachdem was das für ein Datentyp ist. Aus einer 0 kann eine 8 werden, aus einer 1 eine 9 usw.
Das wäre eine indirekte Adressierung von Bits in größeren Variablen. Das geht nicht. Das geht nur mit Arrays.

Wenn du den Bits in einem Byte oder Word symbolische Bezeichnungen geben willst, dann kannst du das über ein STRUCT machen.
 
Das wäre eine indirekte Adressierung von Bits in größeren Variablen. Das geht nicht. Das geht nur mit Arrays.

Wenn du den Bits in einem Byte oder Word symbolische Bezeichnungen geben willst, dann kannst du das über ein STRUCT machen.
Die Member des Arrays können ebenfalls symbolische Bezeichnungen haben, wenn zwischen den Klammern statt Ziffern Konstanten verwendet werden.
 
Zurück
Oben