数据类型:ARRAY OF
数组是相同数据类型的数据元素的集合。支持固定或可变长度的单维和多维数组。
固定长度的一维数组
您可以在 POU 的声明部分或全局变量列表中定义数组。
一维数组的声明语法:
<variable name> : ARRAY[ <dimension> ] OF <data type> := <initialization> ;
| 数组名称 例子: |
| 维度(从低到高的索引限制) 例子: 一维可以有任意数量的索引元素,由索引上限和下限决定。 索引限制是整数;数据类型的最大值 |
| 元素的数据类型:
提示指向的引用和指针 |
| 选修的 数组的初始值 |
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> ]
| 第一维(从低到高的索引限制) |
| 下一个维度(逗号分隔) |
数据访问语法
| 第一维的索引限制 |
| 下一个维度的索引限制 |
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
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
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
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
提示
注意使用隐式监控功能的能力 CheckBounds()
在运行时监视索引限制的维护。
数组数组
“数组数组”的声明是多维数组的另一种语法。一组元素是嵌套的,而不是标注元素的尺寸。嵌套深度是无限的。
声明语法
<variable name> : ARRAY[ <any dimension> ] OF ARRAY[ <any dimension> ] OF <data type> := <initialization> ;
数据访问语法
<variable name> [<index of first array> ] [<index of next array> ]
| 数组名称 例子: |
| 三层嵌套数组 例子: 注意嵌套深度是无限的。 |
| 元素的数据类型:
|
| 选修的 嵌套数组的初始值 |
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> ;
| 数组名称 例子: |
| 元素的数据类型:
|
| 选修的 数组数组的初始值 |
可变长度多维数组的声明语法
<variable name> : ARRAY[*, *] OF <data type> := <initialization> ;
| 数组名称 例子: |
| 可变长度二维数组的声明 形式上,星号代表可变长度的每个维度。尺寸以逗号分隔。 注意允许任意数量的可变长度维度。 |
计算限制指数的运算符语法
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;