// SCL :
// jeweils mit
VAR CONSTANT
cdValue1 : DWORD := 16#00000001;
END_VAR
// Bit abfragen : - - - - - - - - - -
obErgebnis := (ioDword AND SHL (IN:=cdValue1, N:=iiBitNr)) <> 0 ; // iiBitNr: 0..31
// Bit setzen : - - - - - - - - - -
ioDword := ioDword OR SHL (IN:=cdValue1, N:=iiBitNr) ; // iiBitNr: 0..31
// Bit löschen : - - - - - - - - - -
ioDword := ioDword AND NOT SHL (IN:=cdValue1, N:=iiBitNr) ; // iiBitNr: 0..31
// Bit invertieren ("toggle") : - - - - - - - - - -
ioDword := ioDword XOR SHL (IN:=cdValue1, N:=iiBitNr) ; // iiBitNr: 0..31
// Bit zuweisen : - - - - - - - - - -
ioDword := SEL (G:= ibBitValueToBeCopied, IN0:= ioDword OR SHL (IN:=cdValue1, N:=iiBitNr), IN1:= ioDword AND NOT SHL (IN:=cdValue1, N:=iiBitNr)) ;
// A C H T U N G ! ! ! Ggfs müssen die Parameter IN0 und IN1 des SEL getauscht werden!
// Leider bin ich aus der Beschreibung der Funktion SEL und aus dem noch dürftigeren Beispiel nicht schlau geworden.
// alternativ mit IF
IF ibBitValueToBeCopied XOR ((ioDword AND SHL (IN:=cdValue1, N:=iiBitNr)) <> 0) THEN
ioDword := ioDword XOR SHL (IN:=cdValue1, N:=iiBitNr) ; // iiBitNr: 0..31
END_IF ;
// alternativ mit IF und temp. Variable tdBitPat
tdBitPat := SHL (IN:=cdValue1, N:=iiBitNr) ; // iiBitNr: 0..31
IF ibBitValueToBeCopied XOR ((ioDword AND tdBitPat) <> 0) THEN
ioDword := ioDword XOR tdBitPat ;
END_IF ;