Bit Access in Variables
Important
Implement concurrent bit access by two tasks only if the processor can execute bit access directly on the memory. All x86 and x64 systems have commands for bit access in memory. Systems such as ARM and PPC cannot access bits directly in the memory.
If two tasks execute bit access simultaneously, even though the processor cannot perform bit access directly in the memory, then proceed as follows. Use a semaphore (SysSemEnter) or a similar technique to prevent competing bit access. However, it is best to execute the bit access within a task.
With index access, individual bits can be addressed in integer variables. Using a structure variable or a function block instance, individual bits can be addressed symbolically.
Index access to bits integer variables
You can address individual bits in integer variables. To do this, append the variable with a dot and the index of the addressed bit. The bit-index can be given by any constant. Indexing is 0-based.
Syntax
<integer variable name> . <index> <integer data typ> = BYTE | WORD | DWORD | LWORD | SINT | USINT | INT | UINT | DINT | UDINT | LINT | ULINT
In the program, the third bit of the variable wA is set to the value of variable xB. The constant c_usiENABLE acts as an index to access the third bit of the variable iX.
Index access
PROGRAM PLC_PRG
VAR
wA : WORD := 16#FFFF;
xB : BOOL := 0;
END_VAR
// Index access in an integer variable
wA.2 := xB;Result: wA = 2#1111_1111_1111_1011 = 16#FFFB
Constant as index
// GVL declaration
VAR_GLOBAL CONSTANT
gc_usiENABLE : USINT := 2;
END_VAR
PROGRAM PLC_PRG
VAR
iX : INT := 0;
END_VAR
// Constant as index
iX.gc_usiENABLE := TRUE; // Third bit in iX is set TRUEResult: iX = 4
Symbolic bit access in structure variables
With the BIT data type, you can combine individual bits into a structure and then access them individually. Then the bit is addressed with the component name.
Type declaration of the structure
TYPE S_CONTROLLER :
STRUCT
bitOperationEnabled : BIT;
bitSwitchOnActive : BIT;
bitEnableOperation : BIT;
bitError : BIT;
bitVoltageEnabled : BIT;
bitQuickStop : BIT;
bitSwitchOnLocked : BIT;
bitWarning : BIT;
END_STRUCT
END_TYPEDeclaration and write access to a bit
PROGRAM PLC_PRG
VAR
ControlDriveA : S_CONTROLLER;
END_VAR
// Symbolic bit access to bitEnableOperation
ControlDriveA.bitEnableOperation := TRUE;Symbolic bit access in function block instances
In function blocks, you can declare variables for individual bits.
FUNCTION_BLOCK FB_Controller
VAR_INPUT
bitSwitchOnActive : BIT;
bitEnableOperation : BIT;
bitVoltageEnabled : BIT;
bitQuickStop : BIT;
bitSwitchOnLocked : BIT;
END_VAR
VAR_OUTPUT
bitOperationEnabled : BIT;
bitError : BIT;
bitWarning : BIT;
END_VAR
VAR
END_VAR
;
PROGRAM PLC_PRG
VAR
fbController : FB_Controller;
END_VAR
// Symbolic bit access to bitSwitchOnActive
fbController(bitSwitchOnActive := TRUE);