Skip to main content

运算符

CODESYS V3 支持所有 IEC 61131-3 运算符。这些运算符在整个项目中都得到隐式识别。除了这些 IEC 运算符之外, CODESYS 还支持一些非IEC 61131-3操作员。

运算符用于块中,例如函数。

提示

有关 ST 运算符的处理顺序(结合强度)的信息,请参阅“ST 表达式”一章。

小心

对于浮点数据类型的运算,计算结果取决于所应用的目标系统硬件。

小心

对于数据类型溢出或下溢的运算,计算结果取决于所应用的目标系统硬件。

数据类型的上溢/下溢

CODESYS 编译器为目标设备生成代码,并始终使用目标设备定义的本机大小计算临时结果。例如,在 x86 和 ARM 系统上至少使用 32 位临时值执行计算,在 x64 系统上始终使用 64 位临时值执行计算。这在计算速度方面提供了相当大的优势,并且通常还会产生所需的结果。但这也意味着在某些情况下数据类型的溢出或下溢不会被截断。

104. 例子

示例 1

此加法的结果不会被截断,并且结果为 dwVar65536

VAR
wVar : WORD;
dwVar: DWORD;
END_VAR

wVar := 65535;
dwVar := wVar + 1;

示例 2

数据类型的上溢和下溢不会被截断,结果(bVar1, bVar2)两个比较的结果都是 FALSE 在 32 位和 64 位硬件上。

VAR
wVar1 : WORD;
wVar2 : WORD;
bVar1 : BOOL;
bVar2 : BOOL;
END_VAR

wVar1 := 65535;
wVar2 := 0;
bVar1 := (wVar1 + 1) = wVar2;
bVar2 := (wVar2 - 1) = wVar1;

示例 3

通过分配给 wVar3,该值将被截断为目标数据类型 WORD 结果 bvar1TRUE

VAR
wVar1 : WORD;
wVar2 : WORD;
wVar3 : WORD;
bVar1 : BOOL;
END_VAR

wVar1 := 65535;
wVar2 := 0;
wVar3 := (wVar1 + 1);
bVar1 := wVar3 = wVar2;

示例 4

为了强制编译器截断临时结果,可以插入转换。

类型转换确保两个比较都是 16 位的,并且结果(bVar1, bVar2)两个比较的 TRUE

VAR
wVar1 : WORD;
wVar2 : WORD;
bVar1 : BOOL;
bVar2 : BOOL;
END_VAR

wVar1 := 65535;
wVar2 := 0;
bVar1 := TO_WORD(wVar1 + 1) = wVar2;
bVar2 := TO_WORD(wVar2 - 1) = wVar1;


算术运算符

ADD

SUB

MUL

DIV

MOD

MOVE

INDEXOF

SIZEOF

XSIZEOF

位串运算符

AND

OR

XOR

NOT

AND_THEN

OR_ELSE

移位运算符

SHL

SHR

ROL

ROR

选择运算符

SEL

MAX

MIN

LIMIT

MUX

比较运算符

比较运算符是比较两个输入(第一个和第二个操作数)的布尔值。

GT

LT

LE

GE

EQ

NE

地址运算符

ADR

内容运营商

BITADR

呼叫操作员

CAL

类型转换运算符

您可以显式调用类型转换运算符。下面描述的类型转换运算符可用于从一种基本类型到另一种基本类型的类型转换,以及重载。从“较大”类型到“较小”类型的转换也是隐式可能的(例如,从 INTBYTE 或来自 DINTWORD)。

类型转换: <elementary data type> _TO_ another elementary data type>

重载转换: TO_ <elementary data type>

基本数据类型

<elementary  data type> =
__UXINT | __XINT | __XWORD | BIT | BOOL | BYTE | DATE | DATE_AND_TIME | DINT | DT | DWORD | INT | LDATE | LDATE_AND_TIME | LDT | LINT | LREAL | LTIME | LTOD | LWORD | REAL | SINT | TIME | TOD | UDINT | UINT | ULINT | USINT | WORD

关键词 TTIME_OF_DAYDATE_AND_TIME 是数据类型的替代形式 TIMETOD, 和 DTTTIME_OF_DAYDATE_AND_TIME 不表示为类型转换命令。

重要

如果类型转换运算符的操作数值超出目标数据类型的值范围,则结果输出取决于处理器类型,因此未定义。例如,当负操作数值从 LREAL 目标数据类型 UINT

从较大的数据类型转换为较小的数据类型时,信息可能会丢失。

转换为时的字符串操作 STRING 或者 WSTRING

将类型转换为 STRING 或者 WSTRING,输入的值作为字符串左对齐,如果太长会被截断。因此,声明类型转换运算符的返回变量 <>_TO_STRING<>_TO_WSTRING 足够长,使得字符串有足够的空间而无需进行任何操作。

REAL, LREAL

TIME, LTIME

DATE, DT, TOD, LDATE, LDT, LTOD

STRING, WSTRING

TRUNC

TRUNC_INT

数字运算符

ABS

SQRT

LN

LOG

EXP

EXPT

SIN

ASIN

COS

ACOS

TAN

ATAN

命名空间运算符

命名空间运算符是从 IEC 61131-3 运算符扩展而来。它们使您能够提供对变量和模块的唯一访问,即使您在项目中多次对变量或模块使用相同的名称。

全局命名空间

全局变量列表的命名空间

枚举命名空间

库命名空间

__POOL

多核运算符

处理不同的任务需要同步这些任务。在多核平台上工作时尤其如此。 CODESYS 提供了一些特殊的操作符来支持这种同步。

这些运算符是 IEC-61131-3 的扩展。运算符 TEST_AND_SET__COMPARE_AND_SWAP 用于类似的任务。

TEST_AND_SET

__COMPARE_AND_SWAP

__XADD

其他运营商

__DELETE

__ISVALIDREF

__NEW

__QUERYINTERFACE

__QUERYPOINTER

INI

__TRY, __CATCH, __FINALLY, __ENDTRY

__POSITION

__POUNAME