Skip to main content

数据类型:ARRAY OF

数组是相同数据类型的数据元素的集合。支持固定或可变长度的单维和多维数组。

固定长度的一维数组

您可以在 POU 的声明部分或全局变量列表中定义数组。

一维数组的声明语法:

<variable name> :  ARRAY[ <dimension> ] OF <data type> := <initialization> ;

<variable name>

数组名称

例子: aiCounter

<dimension>

维度(从低到高的索引限制)

例子: 1..100

一维可以有任意数量的索引元素,由索引上限和下限决定。

索引限制是整数;数据类型的最大值 DINT.

<data type>

元素的数据类型:

  • 基本数据类型

  • 用户定义的数据类型

  • 功能块

提示

指向的引用和指针 BIT 变量是 无效 声明,以及具有基本类型的数组元素 BIT

<initialization>

选修的

数组的初始值

217. 10 个整数元素的一维数组
VAR
    aiCounter : ARRAY[0..9] OF INT;
END_VAR

索引下限:0

指数上限:9

10 个元素的初始化:

aiCounter : ARRAY[0..9] OF INT := [0, 10, 20, 30, 40, 50, 60, 70, 80, 90];

数据访问

iLocalVariable := aiCounter[2];

将值 20 分配给局部变量。



定长多维数组

<variable name> :  ARRAY[ <1st dimension> , <next dimensions> ] OF <data type> := <initialization> ;
<variable name> [ <index of 1st dimension> , <index of next dimensions> ]

<1st dimension>

第一维(从低到高的索引限制)

, <next dimensions>

下一个维度(逗号分隔)

数据访问语法

<index of 1st dimension>

第一维的索引限制

, <next dimensions>

下一个维度的索引限制

218. 二维数组
VAR
    aiCardGame : ARRAY[1..2, 3..4] OF INT;
END_VAR

第 1 维:1 到 2(2 个数组元素)

第 2 维:3 到 4(2 个数组元素)

2 * 2 元素的初始化:

aiCardGame : ARRAY[1..2, 3..4] OF INT := [2(10),2(20)]; // Short notation for [10, 10, 20, 20]

数据访问

iLocal_1 := aiCardGame[1, 3]; // Assignment of 10
iLocal_2 := aiCardGame[2, 4]; // Assignment of 20


219. 三维数组
VAR
    aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT;
END_VAR

第一维:1 到 2

第 2 维:3 到 4

第 3 维:5 到 6

2 * 2 * 2 = 8 个数组元素

初始化

aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT := [10, 20, 30, 40, 50, 60, 70, 80];

数据访问

iLocal_1 := aiCardGame[1, 3, 5]; // Assignment of 10
iLocal_2 := aiCardGame[2, 3, 5]; // Assignment of 20
iLocal_3 := aiCardGame[1, 4, 5]; // Assignment of 30
iLocal_4 := aiCardGame[2, 4, 5]; // Assignment of 40
iLocal_5 := aiCardGame[1, 3, 6]; // Assignment of 50
iLocal_6 := aiCardGame[2, 3, 6]; // Assignment of 60
iLocal_7 := aiCardGame[1, 4, 6]; // Assignment of 70
iLocal_8 := aiCardGame[2, 4, 6]; // Assignment of 80

初始化

aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT := [2(10), 2(20), 2(30), 2(40)]; // Short notation for [10, 10, 20, 20, 30, 30, 40, 40]

数据访问

iLocal_1 := aiCardGame[1, 3, 5]; // Assignment of 10
iLocal_2 := aiCardGame[2, 3, 5]; // Assignment of 10
iLocal_3 := aiCardGame[1, 4, 5]; // Assignment of 20
iLocal_4 := aiCardGame[2, 4, 5]; // Assignment of 20
iLocal_5 := aiCardGame[1, 3, 6]; // Assignment of 30
iLocal_6 := aiCardGame[2, 3, 6]; // Assignment of 30
iLocal_7 := aiCardGame[1, 4, 6]; // Assignment of 40
iLocal_8 := aiCardGame[2, 4, 6]; // Assignment of 40


220. 用户定义结构的三维数组
TYPE DATA_A
STRUCT
    iA_1 : INT;
    iA_2 : INT;
    dwA_3 : DWORD;
END_STRUCT
END_TYPE

PROGRAM PLC_PRG
VAR
    aData_A : ARRAY[1..3, 1..3, 1..10] OF DATA_A;
END_VAR

数组 aData_A 总共由 3 * 3 * 10 = 90 个数据类型的数组元素组成 DATA_A.

部分初始化

aData_A : ARRAY[1..3, 1..3, 1..10] OF DATA_A 
    := [(iA_1 := 1, iA_2 := 10, dwA_3 := 16#00FF),(iA_1 := 2, iA_2 := 20, dwA_3 := 16#FF00),(iA_1 := 3, iA_2 := 30, dwA_3 := 16#FFFF)];

在示例中,只有前 3 个元素被显式初始化。没有显式分配初始化值的元素在内部使用基本数据类型的默认值进行初始化。这将从元素开始在 0 处初始化结构组件 aData_A[2, 1, 1].

数据访问

iLocal_1 := aData_A[1,1,1].iA_1; // Assignment of 1
dwLocal_2 := aData_A[3,1,1].dwA_3; // Assignment of 16#FFFF


221. 功能块数组
FUNCTION BLOCK FBObject_A
VAR
    iCounter : INT;
END_VAR
...
;

PROGRAM PLC_PRG
VAR
    aObject_A : ARRAY[1..4] OF FBObject_A;
END_VAR

数组 aObject_A 由4个元素组成。每个元素实例化一个 FBObject_A 功能块。

函数调用

aObject_A[2]();


222. 功能块的二维数组

实施 FB_Something 用方法 FB_Init

FUNCTION_BLOCK FB_Something
VAR
    _nId : INT;
    _lrIn : LREAL;
END_VAR
...
    METHOD FB_Init : BOOL
    VAR_INPUT
        bInitRetains : BOOL;
        bInCopyCode : BOOL;
        nId : INT;
        lrIn : LREAL;
    END_VAR
    _nId := nId;
    _lrIn := lrIN;

功能块 FB_Something 有方法 FB_Init 这需要2个参数。

初始化数组的实例化

PROGRAM PLC_PRG
VAR
    fb_Something_1 : FB_Something(nId := 11, lrIn := 33.44);
    a_Something : ARRAY[0..1, 0..1] OF FB_Something[(nId := 12, lrIn := 11.22), (nId := 13, lrIn := 22.33), (nId := 14, lrIn := 33.55),(nId := 15, lrIn := 11.22)];
END_VAR


提示

注意使用隐式监控功能的能力 CheckBounds() 在运行时监视索引限制的维护。

数组数组

“数组数组”的声明是多维数组的另一种语法。一组元素是嵌套的,而不是标注元素的尺寸。嵌套深度是无限的。

声明语法

<variable name> :  ARRAY[ <any dimension> ] OF ARRAY[ <any dimension> ] OF <data type> := <initialization> ;

数据访问语法

<variable name> [<index of first array> ] [<index of next array> ]

<variable name>

数组名称

例子: aaaiCounter

ARRAY[ <any dimension> ] OF ARRAY[ <any dimension> ] OF ARRAY[ <any dimension> ] OF

三层嵌套数组

例子: ARRAY[1..2, 1..3] OF ARRAY[1..3] OF ARRAY[1..4] OF ARRAY[1..5]

注意

嵌套深度是无限的。

<data type>

元素的数据类型:

  • 基本数据类型

  • 用户定义的数据类型

  • 功能块

<initialization>

选修的

嵌套数组的初始值

PROGRAM PLC_PRG
VAR
    aiPoints : ARRAY[1..2,1..3] OF INT := [1,2,3,4,5,6];
    ai2Boxes : ARRAY[1..2] OF ARRAY[1..3] OF INT := [ [1, 2, 3], [ 4, 5, 6]];
    ai3Boxes : ARRAY[1..2] OF ARRAY[1..3] OF ARRAY[1..4] OF INT := [ [ [1, 2, 3, 4], [5, 6, 7, 8 ], [9, 10, 11, 12] ], [ [13, 14, 15, 16], [ 17, 18, 19, 20], [21, 22, 23, 24] ] ];
    ai4Boxes : ARRAY[1..2] OF ARRAY[1..3] OF ARRAY[1..4] OF ARRAY[1..5] OF INT;
END_VAR

aiPoints[1, 2] := 1200;
ai2Boxes[1][2] := 1200;

变量 aiPointsai2Boxes 收集相同的数据元素,但声明的语法与数据访问的语法不同。

_cds_aipoints.png
_cds_ai2boxes.png

可变长度数组

在功能块、函数或方法中,您可以在 VAR_IN_OUT 声明部分。

LOWER_BOUNDUPPER_BOUND 提供运算符用于确定运行时实际使用的数组的索引限制。

提示

仅静态声明的数组(不是通过运算符生成的数组 __NEW) 可以传递给可变长度的数组。

一维变长数组的声明语法

<variable name> :  ARRAY[*] OF <data type> := <initialization> ;

<variable name>

数组名称

例子: aMyVariableArray

<data type>

元素的数据类型:

  • 基本数据类型

  • 用户定义的数据类型

  • 功能块

<initialization>

选修的

数组数组的初始值

可变长度多维数组的声明语法

<variable name> :  ARRAY[*, *] OF <data type> := <initialization> ;

<variable name>

数组名称

例子: aMyVariableArray

ARRAY[*, *]

可变长度二维数组的声明

形式上,星号代表可变长度的每个维度。尺寸以逗号分隔。

注意

允许任意数量的可变长度维度。

计算限制指数的运算符语法

LOWER_BOUND( <variable name> , <dimension number> )
UPPER_BOUND( <variable name> , <dimension number> )

SUM 函数将数组元素的整数值相加并返回计算的总和作为结果。总和是在运行时可用的所有数组元素中计算的。由于数组元素的实际数量只有在运行时才能知道,所以局部变量被声明为可变长度的一维数组。

FUNCTION SUM: INT;
VAR_IN_OUT
    aiData : ARRAY[*] OF INT;
END_VAR
VAR
    diCounter : DINT;
    iResult : INT;
END_VAR

iResult := 0;
FOR diCounter := LOWER_BOUND(aiData, 1) TO UPPER_BOUND(aiData, 1) DO // Calculates the length of the current array
    iResult := iResult + aiData[diCounter];
END_FOR;
SUM := iResult;