Skip to main content

变量中的位访问

重要

只有当处理器可以直接在内存上执行位访问时,才能实现两个任务的并发位访问。所有 x86 和 x64 系统都有用于内存中位访问的命令。 ARM 和 PPC 等系统无法直接访问内存中的位。

如果两个任务同时执行位访问,即使处理器不能直接在内存中执行位访问,则进行如下操作。使用信号量 (SysSemEnter) 或类似的技术来防止竞争位访问。但是,最好在任务中执行位访问。

通过索引访问,可以在整数变量中寻址各个位。使用结构变量或功能块实例,可以对各个位进行符号寻址。

对位整数变量的索引访问

您可以寻址整数变量中的各个位。为此,请在变量后面附加一个点和寻址位的索引。位索引可以由任何常数给出。索引是从 0 开始的。

句法

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

在程序中,变量的第三位 wA 设置为变量的值 xB.常数 c_usiENABLE 用作访问变量第三位的索引 iX.

索引访问

PROGRAM PLC_PRG
VAR
        wA : WORD := 16#FFFF;
        xB : BOOL := 0;
END_VAR

// Index access in an integer variable
wA.2 := xB;

结果: wA = 2#1111_1111_1111_1011 = 16#FFFB

常量作为索引

// 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 TRUE

结果: iX = 4



结构变量中的符号位访问

随着 BIT 数据类型,您可以将各个位组合成一个结构,然后单独访问它们。然后使用组件名称对该位进行寻址。

198. 例子

结构的类型声明

TYPE S_CONTROLLER :
STRUCT
        bitOperationEnabled : BIT;
        bitSwitchOnActive : BIT;
        bitEnableOperation : BIT;
        bitError : BIT;
        bitVoltageEnabled : BIT;
        bitQuickStop : BIT;
        bitSwitchOnLocked : BIT;
        bitWarning : BIT;
END_STRUCT
END_TYPE

声明和写访问位

PROGRAM PLC_PRG
VAR
        ControlDriveA : S_CONTROLLER;
END_VAR

// Symbolic bit access to bitEnableOperation
ControlDriveA.bitEnableOperation := TRUE;


功能块实例中的符号位访问

在功能块中,您可以为各个位声明变量。

199. 例子
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);