变量中的位寻址

概述

在整数变量中,可以访问个别位。为此,需将要寻址的位的索引添加到变量中,并以点分隔。您可以向位索引提供任何常量。索引基于 0。

如果您的处理器不支持直接位访问,可以使用信号量 (SysSemEnter) 或类似的方法来防止位访问竞争。但为了避免两个任务同时访问,建议仅在一个任务内执行位访问。

语法

<变量名称>.<位索引>

示例

a : INT;
b : BOOL;
...
a.2 := b;

变量 a 的第三位将被设置为变量的值 b,因此可变 a 将等于 3

如果索引大于变量的位宽度,则会生成以下消息:

'Index '<n>' outside the valid range for variable '<var>'!'

可以对以下数据类型的变量执行位寻址:

  • SINT

  • INT

  • DINT

  • USINT

  • UINT

  • UDINT

  • BYTE

  • WORD

  • DWORD

如果数据类型不允许访问位,则会生成以下消息:

'Invalid data type '<type>' for direct indexing'.

不能向 VAR_IN_OUT 变量分配位访问权。

通过全局常量实现的位访问

如果已声明定义位索引的全局常量,则可使用此常量实现位访问。

通过全局常量实现的位访问和变量中的位访问的示例:

1. 在全局变量列表中声明全局常量

变量 enable 定义所访问的位:

VAR_GLOBAL CONSTANT
    enable:int:=2;
END_VAR

2. 整数变量中的位访问

在 POU 中声明:

VAR
    xxx:int;
END_VAR

位访问:

xxx.enable := true; (* -> the third bit in variable xxx will be set TRUE *)

BIT 数据类型上的位访问

BIT 数据类型是一种特殊数据类型,仅在结构中允许。然后,您可以使用组件名称,单独访问每个位。有关详细信息,请参阅结构中的位访问

示例:BIT 数据类型上的位访问

结构声明

TYPE ControllerData :
STRUCT
    Status_OperationEnabled : BIT;
    Status_SwitchOnActive : BIT;
    Status_EnableOperation : BIT;
    Status_Error : BIT;
    Status_VoltageEnabled : BIT;
    Status_QuickStop : BIT;
    Status_SwitchOnLocked : BIT;
    Status_Warning : BIT;
END_STRUCT
END_TYPE

在 POU 中声明

VAR
    ControllerDrive1:ControllerData;
END_VAR

位访问

ControllerDrive1.Status_OperationEnabled := TRUE;

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

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

示例:

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);