.

数据类型‘ARRAY’

.
.

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

.
固定长度数组

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

.一维数组声明的语法


<变量的名称> :  ARRAY[ <维数> ] OF <数据类型> ( := <初始化的值> )? ;

<维数> :  <索引下限>..<索引上限>
<数据类型> : 基本数据类型 | 用户自定义数据类型 | 功能块类型 
// (...)? : 可选的
 

.多维数组声明的语法


<变量的名称> :  ARRAY[ <第一维> ( , <第二维> )+ ] OF <数据类型> ( := <初始化值> )? ;

<第一维> :  <第一维下限索引>..<第一维上限索引>
<第二维> : <第二维下限索引>..<第二维上限索引>
<数据类型> : 基本数据类型 | 用户自定义数据类型 | 功能块类型 
// (...)+ : 一个或多个其他维度
// (...)? : 可选的
 

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

.数据访问语法


<变量的名称>[ <一维指数> ( , <二维索引> )* ]
// (...)*: 0, 一个或多个维度
 

 

注意,在runtime中,可以使用隐式监视功能CheckBounds()检查索引的限制。

.

.例如

. 10个整数元素的一维数组


VAR
    aiCounter : ARRAY[0..9] OF INT;
END_VAR
 

索引下限: 0

索引上限: 9

.初始化


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

.数据存取


iLocalVariable := aiCounter[2];
 

这个值20被分配给局部变量。

.

.例如

. 2维数组


VAR
    aiCardGame : ARRAY[1..2, 3..4] OF INT;
END_VAR
 

第一维数: 1到2

第二维数: 3到4

.初始化


aiCardGame : ARRAY[1..2, 3..4] OF INT := [2(10),2(20)]; // [10, 10, 20, 20]的简写
 

.数据存取


iLocal_1 := aiCardGame[1, 3]; // 值为10
iLocal_2 := aiCardGame[2, 4]; // 值为20
 
.

.例如

.3维数组


VAR
    aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT;
END_VAR
 

第一维数: 1到2

第二维数: 3到4

第三维数: 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]; // 值为10
iLocal_2 := aiCardGame[2, 3, 5]; // 值为20
iLocal_3 := aiCardGame[1, 4, 5]; // 值为30
iLocal_4 := aiCardGame[2, 4, 5]; // 值为40
iLocal_5 := aiCardGame[1, 3, 6]; // 值为50
iLocal_6 := aiCardGame[2, 3, 6]; // 值为60
iLocal_7 := aiCardGame[1, 4, 6]; // 值为70
iLocal_8 := aiCardGame[2, 4, 6]; // 值为80
 

.初始化


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

.数据存取


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

.例如

.用户定义结构的三维数组


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

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

.数据存取


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

.例如

.一个功能块的数组


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](); 
 
.

.例如

.用这个方法FB_Init实现FB_Something


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,它需要两个参数。

.数组的实例化和初始化


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
 
.
数组的数组

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

.声明的语法


<变量的名称> :  ARRAY[<第一个>] ( OF ARRAY[<第二个>] )+ OF <数据类型> ( := <初始化值> )? ;

<第一个> :  <第一个索引下限>..<第一个索引上限>
<第二个> : <索引下限>..<索引上限>// 一维或多维数组
<数据类型> : 基本数据类型 | 用户自定义数据类型 | 功能块类型 
// (...+: 一个或多个数组
// (...)? : 可选的
 

.数据访问语法


<变量的名称>[<第一个数组的索引>] ( [<第二个数组的索引>] )+ ;
// (...)*: 0, 一个或多个数组
 
.

.例如


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收集相同的数据元素,但是声明的语法与数据访问的语法不同。

.
可变长数组

在功能块,函数或方法中,可以在VAR_IN_OUT声明部分中声明长度可变的数组。提供LOWER_BOUNDUPPER_BOUND运算符用于确定运行时实际使用的数组的索引限制。

.一维变长数组声明的语法


<变量的名称> :  ARRAY[*] OF <数据类型> ( := <初始化值> )? ;

<数据类型> : 基本数据类型 | 用户自定义数据类型 | 功能块类型 
// (...)? : 可选的
 

.多维变长数组声明的语法


<变量名称> :  ARRAY[* ( , * )+ ] OF <数据类型> ( := <初始化值> )? ;

<数据类型> : 基本数据类型 | 用户自定义数据类型 | 功能块类型 
// (...)+ : 一个或多个其他维度
// (...)? : 可选的
 

.计算极限指数的运算符语法


LOWER_BOUND( <变量的名称> , <维数> )
UPPER_BOUND( <变量的名称> , <维数> )
 
.

.例如

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


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

diResult := 0;
FOR diCounter := LOWER_BOUND(aiData, 1) TO UPPER_BOUND(aiData, 1) DO // 计算当前数组的长度
 diResult := diResult + A[i];
END_FOR;
SUM := diResult;