データ型:ARRAY OF
配列は、同じデータ型のデータ要素のコレクションです。固定長または可変長の1次元および多次元配列がサポートされています。
固定長の一次元配列
配列は、POUの宣言部分またはグローバル変数リストで定義できます。
1次元配列の宣言の構文:
<variable name> : ARRAY[ <dimension> ] OF <data type> := <initialization> ;
| アレイの名前 例: |
| ディメンション(インデックスの下限から上限) 例: 1つのディメンションには、インデックスの下限と上限によって決定される、任意の数のインデックス付き要素を含めることができます。 インデックス制限は整数です。データ型の最大値 |
| 要素のデータ型:
ヒントへの参照とポインタ |
| オプション 配列の初期値 |
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_VAR1次元: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_VAR1次元:1から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> ]
| アレイの名前 例: |
| 3つのレベルのネストされた配列 例: 注記入れ子の深さは無制限です。 |
| 要素のデータ型:
|
| オプション ネストされた配列の初期値 |
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 宣言セクション。
The LOWER_BOUND と UPPER_BOUND 実行時に実際に使用される配列のインデックス制限を決定するための演算子が用意されています。
ヒント
静的に宣言された配列のみ(演算子によって生成された配列ではありません) __NEW)は可変長の配列に渡すことができます。
可変長の1次元配列の宣言の構文
<variable name> : ARRAY[*] OF <data type> := <initialization> ;
| アレイの名前 例: |
| 要素のデータ型:
|
| オプション 配列の配列の初期値 |
可変長の多次元配列の宣言の構文
<variable name> : ARRAY[*, *] OF <data type> := <initialization> ;
| アレイの名前 例: |
| 可変長の2次元配列の宣言 正式には、アスタリスクは可変長の各次元を表します。ディメンションはコンマで区切られます。 注記可変長の次元はいくつでも許可されます。 |
限界指数を計算するための演算子の構文
LOWER_BOUND( <variable name> , <dimension number> ) UPPER_BOUND( <variable name> , <dimension number> )
The SUM 関数は、配列要素の整数値を加算し、結果として計算された合計を返します。合計は、実行時に使用可能なすべての配列要素にわたって計算されます。配列要素の実際の数は実行時にのみわかるため、ローカル変数は可変長の1次元配列として宣言されます。
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;