CODESYS 支持长度固定或可变的一维和多维数组。
从Automation Builder 2.6.0 起,不再允许在类型定义中进行数组初始化。
定长数组
您可以在 POU 的声明部分或全局变量列表中定义数组。
一维数组的声明语法
<variable name> : ARRAY[ <dimension> ] OF <data type> ( := <initialization> )? ; <dimension> : <lower index bound>..<upper index bound> <data type> : elementary data types | user defined data types | function block types // (...)? : Optional
多维数组的声明语法
<variable name> : ARRAY[ <1st dimension> ( , <next dimension> )+ ] OF <data type> ( := <initialization> )? ; <1st dimension> : <1st lower index bound>..<1st upper index bound> <next dimension> : <next lower index bound>..<next upper index bound> <data type> : elementary data types | user defined data types | function block types // (...)+ : One or more further dimensions // (...)? : Optional
索引限值为整数;数据类型的最大值为DINT
。
数据访问语法
<variable name>[ <index of 1st dimension> ( , <index of next dimension> )* ] // (...)* : 0, one or more further dimensions
请注意,使用隐式监控功能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 将分配给本地变量。
示例
二维数组
VAR aiCardGame : ARRAY[1..2, 3..4] OF INT; END_VAR
第 1 维1 至 2
第二维度3 至 4
初始化
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
示例
三维数组
VAR aiCardGame : ARRAY[1..2, 3..4, 5..6] OF INT; END_VAR
第 1 维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]; // 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
示例
用户定义结构的三维数组
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 个元素被明确初始化。没有明确分配初始化值的元素,将使用基本数据类型的默认值进行内部初始化。这样,从元素aData_A[2, 1, 1]
开始,将结构元件初始化为 0。
数据访问
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
示例
功能块阵列
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_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
数组的数组
数组的数组 "声明是多维数组的另一种语法。对元素集合进行嵌套,而不是对元素进行尺寸标注。嵌套深度不受限制。
声明语法
<variable name> : ARRAY[<first>] ( OF ARRAY[<next>] )+ OF <data type> ( := <initialization> )? ; <first> : <first lower index bound>..<first upper index bound> <next> : <lower index bound>..<upper index bound> // one or more arrays <data type> : elementary data types | user defined data types | function block types // (...)+ : One or more further arrays // (...)? : Optional
数据访问语法
<variable name>[<index of first array>] ( [<index of next array>] )+ ; // (...)* : 0, one or more further arrays
示例
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;
aiPoints
和ai2Boxes
变量收集的数据元素相同,但声明的语法与数据访问的语法不同。


长度可变的数组
在功能块、函数或方法中,可以在VAR_IN_OUT
声明部分声明长度可变的数组。
LOWER_BOUND
和UPPER_BOUND
操作符用于在运行时确定实际使用数组的索引限制。
只有静态声明的数组(而不是通过操作符__NEW
生成的数组)才可以传递给长度可变的数组。
长度可变的一维数组的声明语法
<variable name> : ARRAY[*] OF <data type> ( := <initialization> )? ; <data type> : elementary data types | user defined data types | function block types // (...)? : Optional
长度可变的多维数组的声明语法
<variable name> : ARRAY[* ( , * )+ ] OF <data type> ( := <initialization> )? ; <data type> : elementary data types | user defined data types | function block types // (...)+ : One or more further dimensions // (...)? : Optional
计算极限指数的运算符语法
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;