# 数据类型

有两种变量类型：

- 基本变量
  存储一个值的变量。
- 用户数据类型变量
  一个可以存储多个值的变量（多个变量作为单个变量处理）。

注：

- 有关变量中存储的值（输入值）超出输入范围（最小/最大值）时的操作，请参阅以下内容。
  输入值超出输入范围时的操作

## 基本变量

下面列出了基本变量类型。

数据类型 | 描述
BOOL | 此变量存储 0 或 1。
SINT, USINT, INT, UINT, DINT, UDINT, LINT, ULINT, BYTE | 这些变量存储整数值。与浮点类型变量相比，处理速度更快。
WORD, DWORD, LWORD | 这些变量存储字类型值。
STRING, WSTRING | 这些变量存储文本字符串。
REAL, LREAL | 这些变量存储浮点值。REAL 变量可以存储比整型变量更大的值（如计算和常量）。
TIME, DATE, TIME_OF_DAY, DATE_AND_TIME | 这些变量存储时间和日期值。

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

数据类型 | 有符号 | 数据长度 | 数据范围
SINT | 2 的补码 | 8 位 | -128...127
USINT | - | 8 位 | 0...255
INT | 2 的补码 | 16 位 | -32768...32767
UINT | - | 16 位 | 0...65535
DINT | 2 的补码 | 32 位 | -2147483648...2147483647
UDINT | - | 32 位 | 0...4294967295
LINT | 2 的补码 | 64 位 | -9223372036854775808...9223372036854775807
ULINT | - | 64 位 | 0...18446744073709551615
BYTE | - | 8 位 | 0...255

### WORD, DWORD, LWORD

数据类型 | 数据长度 | 数据范围
WORD | 16 位 | 0...65535
DWORD | 32 位 | 0...4294967295
LWORD | 64 位 | 0...18446744073709551615

### STRING, WSTRING

数据类型 | 描述
STRING | 存储多达 512 字节的文本。 当使用外部变量时，字符串编码由该变量的 [字符串编码] 属性定义。 可用的字符串编码值为: UTF8, UTF16, ShiftJIS, CodePage850, GB2312, BIG5, KSC5601, CodePage1251, CodePage874, 和 CodePage1252。 注： 您也可以在设备属性中配置字符串编码。变量属性设置优先于设备属性。在变量的 [字符串编码] 属性中，选择 [设备设置类型] 以应用设备的字符串编码设置。 只有当驱动程序支持字符串编码时，才会显示 [字符串编码] 属性。
WSTRING | 存储多达 512 字的双字节文本。 只能将 WSTRING 数据类型与外部变量一起使用。 字符串编码固定为 UTF16。您不能改变变量属性中的 [字符串编码] 设置，且设备属性中的编码会被忽略。

注：

- 您可定义字符变量可在[字节数/字数]属性中存储的字节或字数。

- 通过NULL (0x00) 或[字节数]识别文本字符串结尾。

- 对于所选变量或驱动程序，如果所使用文本的字符代码不能由[字符串编码]转换，则字符串的结尾由字符代码识别。

- 字数据的高/低阶关系取决于所选驱动程序中的[字符串模式]。

### REAL, LREAL

数据类型 | 数据长度 | 数据范围
REAL | 32 位 | +/-3.402823E38 ...+/-1.1754944E-38
LREAL | 64 位 | +/-4.19E-307 ...+/-1.67E308

注：

- REAL 变量的精度限制为 7 位。如果需要数据精度（例如比较操作），请使用整形变量。
  示例
  示例1：对于值 1.2345678，当第八个数字被删除 (1.234567 后面) 时，得到的值是近似值。
  示例2：存储在 REAL 变量中的值 0.1 可能会导致 0.1000000014901161。

- 使用外部 REAL 变量时，确保“设备配置”中的“双字顺序”设置和设备中的设置匹配。如果设置不匹配，将不会正确显示外部 REAL 变量的值。

- 用句号 (.) 表示变量值的小数点。小数点不支持使用逗号 (,)。
  即使在屏幕编辑软件或人机界面中使用了逗号 (,) 作为变量值的小数点，也会出现意外的结果，如显示错误，逗号被忽略等。

### 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 注： 当 TIME 变量的 [初始值] 和 [输入范围] 属性设置为负值时，每个时间单位都会显示负号。(例如: -24d -20:-31:-23.-648)
DATE | 存储日期。 | 当使用 SP5000 系列 Open Box (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 系列 Open Box (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

注：

- 使用这些变量时，请将外接设备上的数据类型与存储数据的值匹配。
  如果输入的值不在外接设备地址的范围内，则输入的值将显示在画面上，但不会在外接设备地址中设置。

- 将变量与不同的数据类型关联时，有时源变量的值会被一个公共的结果值覆盖。

  例如，将实数变量转换为整数变量：将 123.4 设置为 REAL 变量，然后将值写入 INT 变量，结果为 123。REAL 变量的值也更新为 123。

- 当从外接设备向 DATE_AND_TIME 变量输入整数值时，存储的值会根据人机界面的时区进行偏移。因此，对于整数值输入，日期/时间显示中显示的日期和时间因时区而异。

SP5000 系列 Open Box (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 9: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 9: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

## 用户数据类型变量

下面是用户数据类型变量的类型。

- 数组变量
  使用单个变量处理同一数据类型的多个变量。
- 结构变量
  使用单个变量处理不同数据类型的多个变量。

注：数组容器和结构容器也被算作变量。

### 数组变量

数组是具有相同数据类型的变量的集合。数组中的每一个变量被称为元素。

要理解数组变量的工作原理，请将变量想象成一个盒子。如下图所示，变量 Number 是一个盒子，其中含有一个值。

将数组想象成是一排盒子，其中每个盒子都对应一个数字。在下图中，数组变量 Number 包含 5 个元素，即 0-4。变量值则分别存储在这 5 个盒子中。

要指定数组中的每个变量，请指定变量名称，后跟用方括号 [ ] 括起来的元素编号。

(示例) 包含 5 个元素的数组

元素编号通常以 0 开头，但也可以以正值或负值开头。

(示例) 数组从元素编号 -1 开始有 5 个元素

多维数组是包含其他数组的数组。例如，包含两个 DINT 数组的数组就是一个二维数组。

#### 每个维度中的元素数量和维度设置

在 [工程浏览器] 窗口的 [变量] → [全部用户数据类型] → [数组]，在 [尺寸] 列设置数组维度和元素数量。

有关设计数组的步骤，请参阅以下内容。

设计步骤（变量、数组、结构）

对于一维数组，只需指定数组中的元素。

(示例) 对于元素数 = 3 的一维数组，输入 "3"。

对于多维数组，在 [尺寸] 字段中，指定每个维度的元素数量，用逗号 (,) 分隔。

(示例) 如果二维数组的第一维有 3 个元素 (起始数 = 0)，第二维有 4 个元素 (起始数 = 0)，请输入 "3,4"。

该数组定义用于创建如下所示的数组变量 Var1。

注： 要将元素的起始编号设置为 0 以外的其他编号，请输入起始元素编号和最后一个元素编号，中间用两个句点 (..) 隔开，而不是输入元素编号，[元素数量] 字段将计算元素总数。

(示例) 要设置一个二维数组，其中第一维从元素 0 开始有 3 个元素，第二维从元素 3 开始有 4 个元素，请输入 "3,3..6”。

输入后，"3..6” 转换为 4 个元素，其数组维度从元素编号 3 开始。

该数组创建了数组变量 Var1，如下所示。

#### 数组的间接寻址

要访问数组中某个连续值范围内的变量值，间接寻址是最快的一种方式，这种方式不但可以最大限度地减少内存占用，还可以在几毫秒内更新值。

对于数组的间接寻址，可通过变量值或对象的属性值指定数组元素编号，从而动态指定数组的元素。

- 通过变量值间接指定:
  在指定数组元素编号的括号 [] 中输入 "(变量名).Value"。
  (示例) Var2[Var1.Value].Value: 此为数组变量 Var2 的值，其数组元素编号是通过变量 Var1 的值间接指定的。
- 通过对象的属性值间接指定:
  输入 "$GraphicalObject"，然后在指定数组元素编号的括号 [] 中输入 "(对象名称).(属性名称)"。
  (示例) Var2[$GraphicalObject.NumericDisplay1.CurrentValue].Value: 此为数组变量 Var2 的值，其数组元素编号值是通过数值显示对象 Numeric Display1 的当前值间接指定的。

注：

通过对象的属性值间接指定数组元素编号时，请在对象名称前输入 "$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] 操作、间接指定的值或表达式转换器操作超过该值时
- 当对于一个配方超过该值时

注：

- 有关值更改操作的详细信息，请参阅值更改。

### 在外接设备上超过该值时

数据类型 | 描述
STRING, WSTRING | 存储可以容纳的字符。
除上述以外 | 超出输入范围的部分的值从输入范围的下限重新计数并存储。 示例）无符号 8 位变量（值范围：0…255） 例1：如果尝试存储 256，则 0 存储在变量中。（当超过上限值 1 时，将存储下限值 0。） 例2：如果尝试存储 257，则1存储在变量中。（当超过上限值 2 时，将存储下限值 1 的第二个值。）

### 通过值更改操作 [Loop] 超过该值时

超出输入范围的部分的值从输入范围的下限重新计数并存储。

（示例）：无符号 8 位变量（值范围：0…255）

例1：如果尝试存储 256，则 0 存储在变量中。（当超过上限值 1 时，将存储下限值 0。）

例2：如果尝试存储 257，则1存储在变量中。（当超过上限值 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 时，将存储下限值 1 的第二个值。）