标准数据类型

概述

EcoStruxure Machine Expert 支持标准 IEC61131-3 所描述的所有数据类型

本章中描述了下列数据类型:

此外,还支持某些标准扩展数据类型,并且您可以自行定义用户定义数据类型

BOOL

BOOL 类型变量可以具有值 TURE (1) 和 FALSE (0)。保留 8 位存储器空间。

有关更多信息,请参阅章节 BOOL 常亮

注: 您可以使用隐式检查来验证变量类型的转换(请参阅用于隐式检查的 POU 一章)。

整数

该表列出了可用的整数数据类型。每个类型涵盖了不同范围的值。存在下列范围限制。

数据类型

下限

上限

存储器空间

BYTE

0

255

8 位

WORD

0

65,535

16 位

DWORD

0

4,294,967,295

32 位

LWORD

0

264-1

64 位

SINT

-128

127

8 位

USINT

0

255

8 位

INT

-32,768

32,767

16 位

UINT

0

65,535

16 位

DINT

-2,147,483,648

2,147,483,647

32 位

UDINT

0

4,294,967,295

32 位

LINT

–263

263-1

64 位

ULINT

0

264-1

64 位

注: 从较大类型转换为较小类型可能会导致丢失信息。

有关更多信息,请参阅此数字常量的描述。

注: 您可以使用隐式检查来验证变量类型的转换(请参阅用于隐式检查的 POU 一章)。

独立于目标的整数数据类型 __UXINT, __XINT, __XWORD

创建适用于不同目标系统的 IEC 代码,使用独立于目标的整数数据类型 __UXINT, __XINT__XWORD。编译器可将这些数据类型转换为目标系统支持的相应标准数据类型。支持具有 32 位和 64 位宽度的地址寄存器的系统。

提供以下类型转换操作符:

独立于目标的数据类型

64 位平台上

32 位平台上

__UXINT

ULINT

UDINT

__XINT

LINT

DINT

__XWORD

LWORD

DWORD

REAL / LREAL

数据类型 REALLREAL 是浮点类型。它们代表有理数。

REALLREAL 数据类型的特性:

数据类型

下限

上限

存储器空间

REAL

-3.402823e+38

3.402823e+38

32 位

LREAL

-1.7976931348623158e+308

1.7976931348623158e+308

64 位

示例:

PROGRAM PLC_PRG
VAR
    rMax: REAL := 3.402823E+38; // Largest number
    rPosMin : REAL := 1.0E-44; // Smallest positive number
    rNegMax: REAL := -1.0E-44; // Largest negative number
    rMin: REAL := -3.402823E+38; // Smallest number
    lrMax: LREAL := 1.7976931348623158E+308; // Largest number
    lrPosMin : LREAL := 4.94065645841247E-324; // Smallest positve number
    lNegMax: LREAL := -4.94065645841247E-324; // Largest negative number
    lrMin: LREAL := -1.7976931348623158E+308; // Smallest number
END_VAR
注: 是否支持数据类型 LREAL 取决于目标设备。请参阅对应文档以了解 64 位类型 LREAL 在编译期间是转换为 REAL(可能丢失信息)还是保持不变。
注: 如果 REALLREAL 转换为 SINT, USINT, INT, UINT, DINT, UDINT, LINTULINT,并且实数的值超出了该整数的值范围,则结果将为未定义且取决于目标系统。在此情况下,可能会出现异常。要获取与目标无关的代码,请通过应用程序来处理超出范围的情况。如果 REAL/LREAL 数字在整数值范围内,则转换在所有系统上都以相同方式运行。

分配 i1 := r1; 时,会检测到错误。因此,在使用转换操作符时,上述注释适用,如下所示:

i1 := REAL_TO_INT(r1);

有关更多信息,请参阅 REAL/LREAL 常量(操作数)

注: 您可以使用隐式检查来验证变量类型的转换(请参阅用于隐式检查的 POU 一章)。

STRING

使用 EcoStruxure Machine Expert V2.2 及更高版本,STRING 数据类型可以编码为 Latin 1UTF-8 格式。对于项目范围解释 UTF-8,在项目设置 > 编译选项对话框中启用参数STRING 的 UTF8 编码。有关更多信息,请参阅 项目范围 UTF-8 编码

注: 在将编码格式设置为 UTF-8,执行静态分析规则 SA0175帮助检测可能导致 UTF-8 编码问题的构造。
注: 如果使用 UTF-8 编码,为变量声明添加 {attribute 'monitoring_encoding' := 'UTF-8'} pragma。进而能够监控 UTF-8 编码中变量的内容。

STRING 数据类型变量可包含任何字符串。声明中的 size 条目将确定要为变量保留的存储器空间。这一空间指的是字符串中的字节数量并且可以放在圆括号或方括号中。如果未指定大小,则将使用默认大小,即 80 个字节。如果某个变量在初始化时所使用的字符串对于变量数据类型而言过长,则将从右到左对应地剪切字符串。

字符串长度:

  • 对于 Latin 1 编码,类型 STRING 的变量所需的存储器空间为每个字符占 1 个字节加 1 个额外字节。这意味着 "STRING[80]" 声明需要 81 个字节。

  • 使用 UTF-8 编码,一个字符的长度最多可达四个字节。字符串长度指示为 STRING 保留的字节数。因此,字符计数和字符串长度(以字节为单位)之间不再存在 1:1 的关系。

含 35 个字节的字符串声明示例:

str:STRING(35):='This is a String';

通常,字符串的长度不受限制。使用 Standard 库的功能执行字符串操作时,允许长度不超过 255 的字符串。使用 StringUtils 库的功能执行字符串操作时,也允许更长的(>255 个字符)字符串。

当通过复位应用程序重新初始化数据类型 STRING 的变量,将不会覆盖在初始值的终止空字符之后存在的旧字符串的内容。这同时适用于使用初始化值进行初始化和使用缺省初始化值 0 进行初始化。

有关更多信息,请参阅 WSTRINGSTRING 常量(操作数)

注: 您可以使用隐式检查来验证变量类型的转换(请参阅用于隐式检查的 POU 一章)。

WSTRING

WSTRING 数据类型与 STRING 类型 (ASCII) 的区别在于:以 Unicode 格式解释,并且每个字符需要 2 个字节以及终止需要 2 字节额外存储器空间(如果是 STRING,则仅需要 1 个字节)。

WSTRING 数据类型编码为 UTF-16 格式的 Unicode

standard64.lib 提供了 WSTRING 字符串的函数。

WSTRING 的字符数取决于所包含的字符。对于 WSTRING,大小为 10 时,表示 WSTRING 的长度最大可达 10 个 WORDS。对于 Unicode 中的某些字符,需要多个 WORDS 来对字符编码,这样字符数就不必与 WSTRING 的长度(在此例中为 10)一致。这种数据类型需要 1 个 WORD 的额外存储空间,因为它以 0 结尾。

如果未定义大小,则分配 80 个 WORDS 外加供终止字符使用的 1 个 0

示例:

wstr:WSTRING:="This is a WString";
wstr10 : WSTRING(10) := "1234567890";

有关更多信息,请参阅以下描述:

日期和时间数据类型

对数据类型 TIMETIME_OF_DAY(缩短 TOD)、DATEDATE_AND_TIME(缩短 DT)进行内部处理,类似于 DWORD。对数据类型 LDATELDATE_AND_TIME (LDT)LTIME_OF_DAY (LTOD) 进行内部处理,类似于 LWORD。在 TIMETOD 中,时间以毫秒为单位提供。TOD 中的时间以零时开始。DATE 中的时间以秒为单位,且 DT 从 1970 年 1 月 1 日零时开始。

LTIME 是高精度计时器的时基。LTIME 的大小为 64 位,精度为纳秒。

LTIME 的语法:

LTIME#<时间声明>

时间声明可以包含与 TIME 常量一起使用的时间单位,并且形式为:

  • us:微秒

  • ns:毫微秒

LTIME 示例:

LTIME1 := LTIME#1000d15h23m12s34ms2us44ns

有关更多信息,请参阅以下描述:

注: 您可以使用隐式检查来验证变量类型的转换(请参阅用于隐式检查的 POU 一章)。

ANY / ANY_<type>

在实现功能并且其中一个功能输入 (VAR_INPUT) 具有一般 IEC 数据类型(ANYANY_<type>))时,不将调用参数的数据类型定义为具有唯一性。可以将不同数据类型的变量传送至此功能。所传送的值及其类型可以在此功能内通过预定义结构请求获得。

允许为功能输入使用基本数据类型的一般 IEC 数据类型:

一般数据类型的层级

基本数据类型

ANY

ANY_BIT

BYTE, WORD, DWORD, LWORD

ANY_DATE

DATE_AND_TIME, DATE, TIME_OF_DAY, LDATE_AND_TIME, LDATE, LTIME_OF_DAY,

ANY_NUM

ANY_REAL

REAL, LREAL

ANY_INT

USINT, UINT, UDINT, ULINT

SINT, INT, DINT, LINT

ANY_STRING

STRING, WSTRING

示例:

FUNCTION ANYBIT_TO_BCD : DWORD
   VAR_INPUT
      value : ANY_BIT;
   END_VAR

如果功能 ANYBIT_TO_BCD 被调用,则可以将数据类型为 BYTE, WORD, DWORDLWORD 的变量作为参数传送到此功能。

预定义结构:

编译代码时,在内部用以下结构替换 ANY 数据类型:

TYPE AnyType :
STRUCT
        // the type of the actual parameter
    typeclass : __SYSTEM.TYPE_CLASS ;
        // the pointer to the actual parameter
    pvalue : POINTER TO BYTE;
        // the size of the data, to which the pointer points
    diSize : DINT;
END_STRUCT
END_TYPE

实际调用参数在运行时分配结构元素。

示例:

此代码示例比较两个传送的变量是否具有相同类型和相同值。

FUNCTION Generic_Compare : BOOL
VAR_INPUT
    any1 : ANY;
    any2 : ANY;
END_VAR
VAR
    icount: DINT;
END_VAR

Generic_Compare := FALSE;
IF any1.typeclass <> any2.typeclass THEN
    RETURN;
END_IF
IF any1.diSize <> any2.diSize THEN
    RETURN;
END_IF
// Byte comparison
FOR icount := 0 TO any1.diSize-1 DO
    IF any1.pvalue[iCount] <> any2.pvalue[iCount] THEN
        RETURN;
    END_IF
END_FOR
Generic_Compare := TRUE;
RETURN;
// END_FUNCTION

另请参阅 __VARINFO 操作符的说明。