Manchmal ist es nötig ein Bit in einen Byte oder Word zu prüfen ob gesetzt oder nicht. für diesen Zweck gibt es verschiedene Ansätze die ich nachfolgend aufzeichnen möchte.
eine Variante ist inline den Wert mit Bitoperationen zu prüfen
//Bitnummer 3 testen
int x = 0x9; // Bitmuster 0000 1001
if((x & 0x8) > 0) // TRUE weil 0x8 -> 0000 1000
eine weitere Variante ist das erstellen einer WinCC Funktion. Das Ergebnis einer Schiebe-Operation ist in der Regel ein int. Deshalb auch der Cast in ein BYTE um die Compiler-Warnungen zu unterbinden.
BOOL GetBit(BYTE data, BYTE bit)
{
BYTE pattern = (BYTE)(0x1 << bit);
if((data & pattern) > 0)
return TRUE;
return FALSE;
}
Das gleiche Beispiel wie oben bei Verwendung der Funktion GetBit. So ist das meines Erachtens lesbarer.
//Bitnummer 3 testen
int x = 0x9; // Bitmuster 0000 1001
if(GetBit(x, 3)) // TRUE weil 0x8 -> 0000 1000
Die Funktion GetBit kann auch für ein WORD oder DWORD abgeändert werden. Zu beachten ist dann dass die Bitnummern nur dann verwendet werden können wenn die Variablen auch SPS-seitig so definiert sind. Sind das hingegen SPS-seitig nur einzelne Bits muss die Bytereichenfolge beachtet werden.
noch ein Beispiel:
Variable vom Type WORD -> MW10 (SPS-Seitig Ab M10.0 bis M11.7 16 einzelne Bits)
soll das Bit M10.0 getestet werden muss die Bitnummer 8 verwendet werden.