EcoStruxure Machine Expert 1.1版本不支持M258、LMC058和LMC078控制器。

标准数据类型

 

标准数据类型

概述

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

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

oBOOL

o整数

oREAL / LREAL

oSTRING

oWSTRING

o时间数据类型 (LTIME)

oANY 和 ANY_<type>

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

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 一章)。

REAL / LREAL

数据类型 REAL 和 LREAL 是浮点类型。它们代表有理数。

REAL 和 LREAL 数据类型的特性:

数据类型

下限

上限

存储器空间

REAL

-3.402823e+38

3.402823e+38

32 位

LREAL

-1.7976931348623158e+308

1.7976931348623158e+308

64 位

注意: 对数据类型 LREAL 的支持与否取决于目标设备。请参阅相应文档以了解 64 位类型 LREAL 在编译期间是转换为 REAL(可能丢失信息)还是保持不变。

注意: 如果 REAL 或 LREAL 转换为 SINT, USINT, INT, UINT, DINT, UDINT, LINT 或 ULINT,并且实数的值超出了该整数的值范围,则结果将为未定义且取决于目标系统。在此情况下,可能会出现异常。要获取与目标无关的代码,请通过应用程序来处理超出范围的情况。如果 REAL/LREAL 数字在整数值范围内,则转换在所有系统上都将以相同方式运行。

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

i1 := REAL_TO_INT(r1);

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

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

STRING

STRING 数据类型变量可以包含任何字符串。声明中的 size 条目将确定要为变量保留的存储器空间。这一空间指的是字符串中的字符数量并且可以放在圆括号或方括号中。如果未指定大小,则将使用默认大小,即 80 个字符。

通常,字符串的长度不受限制。但是,字符串函数只能处理长度为 1 到 255 个字符的字符串。如果某个变量在初始化时所使用的字符串对于变量数据类型而言过长,则将从右到左对应地剪切字符串。

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

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

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

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

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

WSTRING

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

库 standard64.lib 提供了 WSTRING 字符串的功能。

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

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

示例:

wstr:WSTRING:="This is a WString";

wstr10 : WSTRING(10) := "1234567890";

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

oSTRING

oSTRING 常量(操作数)

时间数据类型

数据类型 TIME、TIME_OF_DAY(简写为 TOD)、DATE 和 DATE_AND_TIME(简写为 DT)以与 DWORD 相似的方式在内部处理。在 TIME 和 TOD 中,时间以毫秒为单位提供。TOD 中的时间是从午夜 12:00 开始。在 DATE 和 DT 中,时间以秒为单位提供,并且从 1970 年 1 月 1 日午夜 12:00 开始。

LTIME

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

LTIME 的语法:

LTIME#<时间声明>

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

ous:毫秒

ons:纳秒

示例LTIME:

LTIME1 := LTIME#1000d15h23m12s34ms2us44ns

TIME 32 位大小和毫秒精度对比。

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

o数据类型

oTIME 常量

oDATE 常量

oDATE_AND_TIME 常量

oTIME_OF_DAY 常量

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

ANY / ANY_<type>

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

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

一般数据类型的层级

基本数据类型

ANY

ANY_BIT

BOOL, BYTE, WORD, DWORD, LWORD

ANY_DATE

DATE_AND_TIME, DATE, TIME_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 被调用,则可以将数据类型为 BOOL, BYTE, WORD, DWORD 或 LWORD 的变量作为参数传送到此功能。

预定义结构:

编译代码时,在内部用以下结构替换 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 操作符的说明。