Skip to main content

データ型:ARRAY OF

配列は、同じデータ型のデータ要素のコレクションです。固定長または可変長の1次元および多次元配列がサポートされています。

固定長の一次元配列

配列は、POUの宣言部分またはグローバル変数リストで定義できます。

1次元配列の宣言の構文:

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

<variable name>

アレイの名前

例: aiCounter

<dimension>

ディメンション(インデックスの下限から上限)

例: 1..100

1つのディメンションには、インデックスの下限と上限によって決定される、任意の数のインデックス付き要素を含めることができます。

インデックス制限は整数です。データ型の最大値 DINT

<data type>

要素のデータ型:

  • 基本データ型

  • ユーザー定義のデータ型

  • ファンクションブロック

ヒント

への参照とポインタ BIT 変数は 無効 宣言、および基本型の配列要素 BIT

<initialization>

オプション

配列の初期値

217. 10個の整数要素の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> ]

<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次元: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


220. ユーザー定義構造の3次元配列
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. 関数ブロックの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> ]

<variable name>

アレイの名前

例: aaaiCounter

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

3つのレベルのネストされた配列

例: 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 宣言セクション。

The LOWER_BOUNDUPPER_BOUND 実行時に実際に使用される配列のインデックス制限を決定するための演算子が用意されています。

ヒント

静的に宣言された配列のみ(演算子によって生成された配列ではありません) __NEW)は可変長の配列に渡すことができます。

可変長の1次元配列の宣言の構文

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

<variable name>

アレイの名前

例: aMyVariableArray

<data type>

要素のデータ型:

  • 基本データ型

  • ユーザー定義のデータ型

  • ファンクションブロック

<initialization>

オプション

配列の配列の初期値

可変長の多次元配列の宣言の構文

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

<variable name>

アレイの名前

例: aMyVariableArray

ARRAY[*, *]

可変長の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;