# データの種類

変数には次の 2 種類があります。

- 基本変数
  1 つの変数に、1 つの値が格納されます。
- ユーザーデータタイプ変数
  1 つの変数に、複数の値を格納できます (複数の変数を、1 つの変数として扱います)。

MEMO:

- 変数に格納する値 (入力値) が範囲 (最大値/最小値) を超えた場合の動作については、以下を参照してください。
  入力値が入力範囲を超えた場合の動作

## 基本変数

基本変数には次の種類があります。

データの種類 | 説明
BOOL | 変数に 0 または 1 の値が格納されます。
SINT、USINT、INT、UINT、DINT、UDINT、LINT、ULINT、BYTE | 変数に整数型の値が格納されます。実数型の変数よりも高速に処理ができます。
WORD、DWORD、LWORD | 変数にワード型の値が格納されます。
STRING、WSTRING | 変数に文字列型の値が格納されます。
REAL、LREAL | 変数に実数型の値が格納されます。実数型変数は、整数型の変数よりも大きな値 (演算、定数等) を格納することができます。
TIME、DATE、TIME_OF_DAY、DATE_AND_TIME | 変数に時刻、日付の値が格納されます。

### SINT、USINT、INT、UINT、DINT、UDINT、LINT、ULINT、BYTE

データの種類 | 符号付き | データ長 | データ範囲
SINT | 2 の補数 | 8 bit | -128...127
USINT | - | 8 bit | 0...255
INT | 2 の補数 | 16 bit | -32768...32767
UINT | - | 16 bit | 0...65535
DINT | 2 の補数 | 32 bit | -2147483648...2147483647
UDINT | - | 32 bit | 0...4,294,967,295
LINT | 2 の補数 | 64 bit | -9,223,372,036,854,775,808...9,223,372,036,854,775,807
ULINT | - | 64 bit | 0...18,446,744,073,709,551,615
BYTE | - | 8 bit | 0...255

### WORD、DWORD、LWORD

データの種類 | データ長 | データ範囲
WORD | 16 bit | 0...65,535
DWORD | 32 bit | 0...4,294,967,295
LWORD | 64 bit | 0...18,446,744,073,709,551,615

### STRING、WSTRING

データの種類 | 説明
STRING | 最大 512 バイト分の文字列が格納されます。 外部変数を使用する場合、文字列のエンコードは変数の [文字列エンコード] プロパティで定義されます。 使用できる文字列エンコードは、UTF8、UTF16、シフト JIS、コードページ 850、GB2312、BIG5、KSC5601、コードページ 1251、コードページ 874、コードページ 1252 です。 MEMO: 文字列エンコードは、機器プロパティでも設定できます。変数プロパティの設定は、機器プロパティの設定よりも優先されます。機器プロパティの設定を適用する場合は、変数の [文字列エンコード] プロパティで [機器設定タイプ] を選択します。 [文字列エンコード] プロパティは、ドライバーが文字列エンコードに対応している場合にのみ表示されます。
WSTRING | 最大 512 ワード分のダブルバイト文字列が格納されます。 データタイプ WSTRING は、外部変数でのみ使用できます。 文字列エンコードは、UTF16 に固定されています。変数プロパティの [文字列エンコード] で設定を変更することはできません。また、機器プロパティのエンコードは無視されます。

MEMO:

- 変数に格納するバイト数またはワード数は、[バイト数 / ワード数] で設定します。

- テキスト文字列の終端は、NULL (0x00) または [バイト数] で認識されます。

- 特定の変数またはドライバーについては、文字コードが [文字列エンコード] で変換できないテキストを使用すると、文字列の末尾が文字コードで認識されます。

- ワードデータの上位 / 下位の関係は、選択したドライバーの [文字列モード] に依存します。

### REAL、LREAL

データの種類 | データ長 | データ範囲
REAL | 32 bit | +/-3.402823E38 ...+/-1.1754944E-38
LREAL | 64 bit | +/-4.19E-307 ...+/-1.67E308

MEMO:

- 実数型変数の精度は 7 桁までです。データの精度が必要な場合 (比較演算など) では、整数型変数を使用してください。
  例
  例 1: 1.2345678 の場合、8 桁目 (1.234567 以降) の値は近似値です。
  例 2: 実数型変数に 0.1 として格納された値は、実際には 0.1000000014901161 のような値である可能性があります。

- 外部実数型変数として実数型変数を使用する場合は、デバイス設定内のダブルワード順位設定が機器内の設定と一致していることを確認してください。設定が一致しない場合は、外部実数型変数値が正常に表示されません。

- 変数値の小数点にはピリオド (.) を使用してください。小数点を表すコンマ (,) には対応していません。
  画面編集ソフトウェアや表示器で変数値の小数点にコンマ (,) を使用すると、エラーが表示されたり、コンマが無視されたりするなどの予期せぬ結果になります。

### TIME、DATE、TIME_OF_DAY、DATE_AND_TIME

データの種類 | 説明 | データ範囲
TIME | 経過した期間 (日数、時間) が格納されます。 | - 24 d 20 h 31 m 23 s 648 ms ... 24 d 20 h 31 m 23 s 647 ms MEMO: TIME 変数の [初期値] および [入力範囲] に負の値を設定した場合、各時間単位に負の符号が表示されます。(例 : -24d -20:-31:-23.-648)
DATE | 日付データが格納されます。 | SP5000 シリーズオープンボックス (Windows 10 IoT Enterprise モデル)、IPC シリーズ、または PC/AT を使用する場合 1970/01/01 ... 2106/02/07 上記以外の機種 1970/01/01 ...2038/01/19
TIME_OF_DAY | 時刻データが格納されます。 | 00:00:00 ... 23:59:59
DATE_AND_TIME | DATE と TIME_OF_DAY の組み合わせです。 | SP5000 シリーズオープンボックス (Windows 10 IoT Enterprise モデル)、IPC シリーズ、または PC/AT を使用する場合 1970/01/01 00:00:00 UTC ...2106/02/07 06:28:15 UTC 上記以外の機種 1970/01/01 00:00:00 UTC ...2038/01/19 03:14:07 UTC

MEMO:

- これらの変数を使用する場合は、接続機器側のデータタイプと、格納する値のデータタイプを合わせてください。
  接続機器アドレスの範囲外の値を入力した場合は、入力した値が画面に表示されますが、接続機器アドレスには設定されません。

- 変数を異なるデータタイプに関連付けると、ソース変数の値が共通の結果値で上書きされる場合があります。

  例えば、実数型変数を整数型変数に変換する場合: 123.4 を実数型変数に設定し、その値を整数型変数に書き込むと結果は 123 になります。実数型変数の値も 123 に更新されます。

- DATE_AND_TIME 変数に接続機器から整数値を入力した場合、格納される値は表示器のタイムゾーンによってオフセットされます。そのため、入力した整数値に対して日付/時間表示器で表示される日付/時間がタイムゾーンによって異なります。

SP5000 シリーズオープンボックス (Windows 10 IoT Enterprise モデル)、IPC シリーズ、または PC/AT

接続機器から入力する整数値 | UTC+0 (範囲: 1970/01/01 00:00:00 ... 2106/02/07 06:28:15) | UTC+9 (範囲: 1970/01/01 09:00:00 ...2106/02/07 15:28:15)
0 | 1970/01/01 00:00:00 | 2106/02/07 06:28:16
1 | 1970/01/01 00:00:01 | 2106/02/07 06:28:17
: | : | :
32399 | 1970/01/01 08:59:59 | 2106/02/07 15:28:15
32400 | 1970/01/01 09:00:00 | 1970/01/01 09:00:00
: | : | :
4294967295 | 2106/02/07 06:28:15 | 2106/02/07 06:28:15

上記以外の機種

接続機器から入力する整数値 | UTC+0 (範囲: 1970/01/01 00:00:00 ... 2038/01/19 03:14:07) | UTC+9 (範囲: 1970/01/01 09:00:00 ...2038/01/19 12:14:07)
0 | 1970/01/01 00:00:00 | 2038/01/19 03:14:08
1 | 1970/01/01 00:00:01 | 2038/01/19 03:14:09
: | : | :
32399 | 1970/01/01 08:59:59 | 2038/01/19 12:14:07
32400 | 1970/01/01 09:00:00 | 1970/01/01 09:00:00
: | : | :
2147483647 | 2038/01/19 03:14:07 | 2038/01/19 03:14:07

## ユーザーデータタイプ変数

ユーザーデータタイプ変数には次の種類があります。

- 配列変数
  同じデータタイプの複数の変数を、1 つの変数として扱います。
- 構造体変数
  異なるデータタイプの複数の変数を、1 つの変数として扱います。

MEMO: 配列と構造体も変数としてカウントされます。

### 配列変数

配列は、同じデータタイプの変数の集まりです。配列内の各変数は要素と呼ばれます。

配列変数を理解するために、変数をボックスとしてイメージしてください。次の図に示すように、変数 Number は 1 つの値を含む 1 つのボックスです。

配列を各ボックスに番号が付けられている 1 列のボックスとしてイメージしてください。次の図では、配列変数 Number には 0～4 までの 5 つの要素が含まれています。変数の値は 5 つのボックスそれぞれに保存されています。

配列内の各変数を指定するときは、変数名の後に要素番号を [ ] で囲んで指定します。

(例) 要素数が 5 の配列

要素番号は通常 0 を起点としますが、正の値または負の値を起点とすることもできます。

(例) 開始番号が -1、要素数が 5 の配列

多次元配列とは、別の配列を含む配列です。(例えば、2 つの DINT 配列を含む配列は 2 次元配列です。)

#### 各次元の要素数、および次元の設定

[プロジェクトエクスプローラー] ウィンドウの [変数] → [すべてのユーザーデータタイプ] → [配列] の、[次元] 列にて、配列の次元と要素数をまとめて設定します。

配列の設計手順については、以下を参照してください。

設計手順 (変数、配列、構造体)

1 次元の場合、要素数のみを入力します。

(例) 要素数 = 3 の 1 次元配列の場合、「3」と入力します。

多次元の場合、各次元の要素数を [次元] フィールドに、カンマ (,) で区切って入力します。

(例) 1 次元が (開始番号 = 0 で) 要素数 = 3、また 2 次元が (開始番号 = 0 で) 要素数 = 4 の 2 次元配列の場合、「3,4」と入力します。

この配列を使って配列変数 Var1 を作成すると、以下のようになります。

MEMO: 要素の開始番号を 0 以外に設定する場合、要素数の代わりに、開始番号と最終番号を 2 つのピリオド (..) で区切って入力すると [要素数] フィールドで要素数が算出されます。

(例) 1 次元が開始番号 = 0 で要素数 = 3、また 2 次元が開始番号 = 3 で最終番号 = 6 の場合、「3,3..6」と入力します。

入力後、「3..6」は要素数「4」に変換され、この次元の配列は要素番号 3 から開始します。

この配列で配列変数 Var1 を作成すると、以下のようになります。

#### 配列の間接アドレス設定

間接アドレス設定により、配列内の連続する値の範囲内の変数値へのアクセス、メモリー消費の最小化、ミリ秒未満の値の更新を最速に行えます。

配列の間接アドレス設定は、変数の値またはオブジェクトのプロパティ値に応じて要素番号を動的に指定します。

- 変数の値により間接指定をする場合:
  配列要素番号を指定する [ ] の中に、「(変数名).Value」を入力します。
  (例) Var2[Var1.Value].Value: ：配列要素番号を変数 Var1 の値で間接指定した場合の、配列変数 Var2 の値です。
- オブジェクトのプロパティ値により間接指定をする場合:
  配列要素番号を指定する [ ] の中に、「$GraphicalObject」の後、「(オブジェクト名).(プロパティ名)」を入れます。
  (例) Var2[$GraphicalObject.NumericDisplay1.CurrentValue].Value: 配列要素番号を数値表示器オブジェクト Numeric Display1 の現在値で間接指定した場合の、配列変数 Var2 の値です。

MEMO:

オブジェクトのプロパティ値により配列要素番号を間接指定する場合、オブジェクト名のまえに、「$GraphicalObject」を入れます。
現在値の入力欄または変数セレクタのソースプロパティ欄にて、「$」を入力することでポップアップ表示される文字列から「$GraphicalObject」を選択することで入力することができます (入力補助機能によります)。

配列の間接アドレス設定は、以下に対応しています。

- [式] コンバーターで使用できます。
  (例: Array11[DINT1.value+2]、Array21[Int2[Int3[Int1+1]]]、Array31[Int1*4-(Int2+Int4/4)])

- すべての変数データタイプで最大 5 レベルの入れ子に対応しています。
  (例: Array11[Array22[DINT1.value],DINT02.value])

### 構造体変数

構造体とは、他の変数をまとめて保持する変数のことです。構造体内の各変数は要素と呼ばれます。要素はどのデータタイプでもかまいません。

別の構造体または配列を要素として追加することで、入れ子の構造体を作成することができます。

構造体を各ボックスに要素が関連付けられている １ つのグループのボックスとしてイメージしてください。

次の図では、構造体変数 DATA に 3 つの要素が含まれています。変数の値は 3 つのボックスそれぞれに保存されています。

## 入力値が入力範囲を超えた場合の動作

変数に格納する値が範囲 (最大値/最小値) を超えた場合、値は次のように扱われます。

- 接続機器側で値が超えた場合
- 値の変更オペレーション [Loop] で値が超えた場合
- 値の変更オペレーション [Stop] で値が超えた場合
- 値の変更オペレーション [Set]、値の間接指定、式コンバーターで値が超えた場合
- レシピで値が超えた場合

MEMO:

- 値の変更オペレーションについては、値の変更を参照してください。

### 接続機器側で値が超えた場合

データの種類 | 説明
STRING、WSTRING | 可能な文字数分の値が格納されます。
上記以外 | 入力範囲から超えた分の値を入力範囲の下限値から数え直して、値が格納されます。 例) 符号なし 8 ビットの変数 (値の範囲: 0...255) 例 1: 256 を格納しようとすると、変数には「0」が格納されます。(上限値を 1 つ越えたので、下限値の「0」が格納されます。) 例 2: 257 を格納しようとすると、変数には「1」が格納されます。(上限値を 2 つ越えたので、下限値から数えて 2 番目の値である「1」が格納されます。)

### 値の変更オペレーション [Loop] で値が超えた場合

入力範囲から超えた分の値を入力範囲の下限値から数え直して、値が格納されます。

(例): 符号なし 8 ビットの変数 (値の範囲: 0...255)

例 1: 256 を格納しようとすると、変数には「0」が格納されます。(上限値を 1 つ越えたので、下限値の「0」が格納されます。)

例 2: 257 を格納しようとすると、変数には「1」が格納されます。(上限値を 2 つ越えたので、下限値から数えて 2 番目の値である「1」が格納されます。)

### 値の変更オペレーション [Stop] で値が超えた場合

データの種類 | 説明
STRING、WSTRING | 可能な文字数分の値が格納されます。
上記以外 | 次の上限値 / 下限値に値が丸められます。 BOOL 1/0 SINT 127/-128 USINT、BYTE 255/0 INT 32767/-32768 UINT、WORD 65535/0 DINT 2147483647/-2147483648 UDINT、DWORD 4294967295/0 LINT 9223372036854775807/-9223372036854775808 ULINT、LWORD 18446744073709551615/0 REAL、LREAL プロパティの設定により異なります。 TIME 2147483647/-2147483648 DATE/TIME_OF_DAY、DATE_AND_TIME 4294967295/0

### 値の変更オペレーション [Set]、値の間接指定、式コンバーターで値が超えた場合

値は何も格納されません。

### レシピで値が超えた場合

データの種類 | 説明
BOOL、REAL、LREAL | 値は何も格納されません。
LINT、ULINT、LWORD | 次の上限値 / 下限値に値が丸められます。 LINT 9223372036854775807/-9223372036854775808 ULINT、LWORD 18446744073709551615/0
STRING、WSTRING | 可能な文字数分の値が格納されます。
上記以外 | 入力範囲から超えた分の値を入力範囲の下限値から数え直して、値が格納されます。 (例): 符号なし 8 ビットの変数 (値の範囲: 0...255) 例 1: 256 を格納しようとすると、変数には「0」が格納されます。(上限値を 1 つ越えたので、下限値の「0」が格納されます。) 例 2: 257 を格納しようとすると、変数には「1」が格納されます。(上限値を 2 つ越えたので、下限値から数えて 2 番目の値である「1」が格納されます。)