Bitzugriff auf Variablen

Mit einem Indexzugriff können Sie einzelne Bits in ganzzahligen Variablen adressieren. Mit Hilfe einer Strukturvariablen oder einer Funktionsbaustein-Instanz können Sie einzelne Bits symbolisch adressieren.

Indexzugriff auf Bits in ganzzahligen Variablen

Sie können in ganzzahligen Variablen einzelne Bits adressieren. Dazu hängen Sie an die Variable mit einem Punkt abgetrennt den Index des zu adressierenden Bits an. Der Bitindex kann durch eine beliebige Konstante angegeben werden. Die Indizierung ist 0-basiert.

Syntax:

<integer variable name> . <index>
<integer data typ> = BYTE | WORD | DWORD | LWORD | SINT | USINT | INT | UINT | DINT | UDINT | LINT | ULINT

Wenn der Typ der Variablen nicht zulässig ist, gibt TwinCAT folgende Fehlermeldung aus: Unzulässiger Datentyp <Typ> für direkte Indizierung. Wenn der Index größer als die Bitbreite der Variablen ist, gibt TwinCAT folgenden Fehler aus: Index <n> außerhalb des gültigen Bereichs für Variable <Name>.

Beispiel Indexzugriff:

Im Programm wird das dritte Bit der Variablen nVarA auf den Wert der Variablen nVarB gesetzt.

PROGRAM MAIN 
VAR
    nVarA : WORD := 16#FFFF;
bVarB : BOOL := 0;
END_VAR
// Index access in an integer variable
nVarA.2 := bVarB;

Ergebnis: nVarA = 2#1111_1111_1111_1011 = 16#FFFB

Beispiel Konstante als Index:

Die Konstante cEnable fungiert als Index, um auf das dritte Bit der Variablen nVar zuzugreifen.

// GVL declaration
VAR_GLOBAL CONSTANT
    cEnable : USINT := 2;
END_VAR
PROGRAM MAIN
VAR
    nVar    : INT   := 0;
END_VAR
// Constant as index
nVar.cEnable := TRUE; // Third bit in nVar is set TRUE

Ergebnis: nVar = 4

Bitzugriff auf Variablen 1:

Erreichbarkeit der Variablen, die die Bitnummer definiert

Beachten Sie, dass die Variable, die die Bitnummer definiert (im Beispiel oben nEnable), direkt über den Variablennamen und ohne vorhergehenden Namensraum erreichbar sein muss.
Der Bitzugriff ist also beispielsweise zulässig, wenn die Variable im lokalen Scope (gleiche Ebene wie nVar) oder im globalen Scope auf einer GVL ohne das Attribut 'qualified_only' deklariert wurde.
Wird die Variable auf einer GVL deklariert, die mit dem Attribut 'qualified_only' versehen ist, ist ein Zugriff auf nEnable nur durch Angabe des globalen Variablenlistennamens möglich (GVL.nEnable). Ein solcher Zugriff auf eine globale Variable kann nicht für den Bitzugriff verwendet werden (nicht möglich: nVar.GVL.nEnable := TRUE;).

Symbolischer Bitzugriff in Strukturvariablen

Mit dem Datentyp BIT können Sie einzelne Bits mit einem Namen bezeichnen und zu einer Struktur zusammenfassen. Das Bit wird dann mit dem Komponentennamen adressiert.

Beispiel

Typdeklaration der Struktur:

TYPE ST_ControllerData :
STRUCT
    nStatus_OperationEnabled : BIT;
    nStatus_SwitchOnActive   : BIT;
    nStatus_EnableOperation  : BIT;
    nStatus_Error            : BIT;
    nStatus_VoltageEnabled   : BIT;
    nStatus_QuickStop        : BIT;
    nStatus_SwitchOnLocked   : BIT;
    nStatus_Warning          : BIT;
END_STRUCT
END_TYPE 

Deklaration und Schreibzugriff auf ein Bit:

PROGRAM MAIN
VAR
    stControllerDrive1 : ST_ControllerData;
END_VAR
// Symbolic bit access to nStatus_ EnableOperation 
stControllerDrive1.nStatus_EnableOperation := TRUE;

Symbolischer Bitzugriff in Funktionsbaustein-Instanzen

In Funktionsbausteinen können Sie Variablen für einzelne Bits deklarieren.

Beispiel

Typdeklaration der Struktur:

FUNCTION_BLOCK FB_Controller
VAR_INPUT
    nSwitchOnActive   : BIT;
    nEnableOperation  : BIT;
    nVoltageEnabled   : BIT;
    nQuickStop        : BIT;
    nSwitchOnLocked   : BIT;
END_VAR
VAR_OUTPUT
    nOperationEnabled : BIT;
    nError            : BIT;
    nWarning          : BIT;
END_VAR
VAR
END_VAR
PROGRAM MAIN
VAR
    fbController : FB_Controller;
END_VAR
// Symbolic bit access to nSwitchOnActive
fbController(nSwitchOnActive:= TRUE);

Siehe auch: