龙空技术网

PLC 编程基础知识——操作数的使用和寻址

Look自动化 4516

前言:

今天姐妹们对“计数器qu cu ld qd”大概比较重视,朋友们都需要剖析一些“计数器qu cu ld qd”的相关文章。那么小编也在网摘上汇集了一些有关“计数器qu cu ld qd””的相关文章,希望大家能喜欢,咱们快快来了解一下吧!

操作数的基本知识

简介

编程指令时,必须指定指令应该处理的数据值。这些值称为操作数。例如,可以使用下列元素作为操作数:

PLC 变量常量背景数据块中的变量全局数据块中的变量

绝对地址和符号名

操作数可以通过绝对地址和符号名加以识别。可以在 PLC 变量表或块的变量声明中定义名称与地址。

可优化访问的数据块 (S7-1200、S7-1500)

可优化访问的数据块中的数据元素只能接收声明中的符号名,无法接收绝对地址。

关键字

SIMATIC 识别一系列关键字,这些关键字有固定的定义且在程序中有特定含义。不应使用这些关键字作为变量或常量的名称。

关键字表,下表列出了所有关键字。

关键字

德语助记符

关键字

英语助记符

说明

&

&

“与”逻辑表达式的逻辑运算

^

^

读取或写入引用值的操作符

A

Q

输出,位

A1

CC1

条件代码位

A0

CC0

条件代码位

AB

QB

输出,字节

AD

QD

输出,双字

AND

AND

“与”逻辑表达式的逻辑运算

ANY

ANY

数据类型,指针

AR1

AR1

地址寄存器 1

AR2

AR2

地址寄存器 2

ARRAY

ARRAY

引入数组规范,其后是“[”和“]”括起来的下标列表

AT

AT

覆盖变量声明

AUTHOR

AUTHOR

作者名、公司名、部门名或其它名称(最多 8 个字符,不含空格)

AW

QW

输出,字

B

B

字节

BEGIN

BEGIN

引入代码块的指令部分或数据块的初始化部分

BIE

BR

二进制结果

BLOCK_FB

BLOCK_FB

指定 FB 的参数类型

BLOCK_FC

BLOCK_FC

指定 FC 的参数类型

BLOCK_SDB

BLOCK_SDB

指定 SDB 的参数类型

BOOL

BOOL

数据类型

BY

BY

FOR 循环的增量

BYTE

BYTE

数据类型

CALL

CALL

调用

CASE

CASE

引入 CASE 语句

CHAR

CHAR

基本数据类型

CODE_VERSION1

CODE_VERSION1

标签,可确定 FB 是否具有多重实例功能。如果要声明多重实例,则 FB 不得具有该特性。

CONST

CONST

开始常量声明

CONTINUE

CONTINUE

在 SCL 中退出循环的指令

COUNTER

COUNTER

指定计数器的参数类型

DATA_BLOCK

DATA_BLOCK

引入数据块

DATE

DATE

数据类型

DATE_AND_TIME

DATE_AND_TIME

数据类型

DB

DB

数据块

DB_ANY

DB_ANY

数据类型

DBB

DBB

数据块,数据字节

DBD

DBD

数据块,数据双字

DBLG

DBLG

数据块长度

DBNO

DBNO

数据块编号

DBW

DBW

数据块,数据字

DBX

DBX

数据块,数据位

DI

DI

背景数据块

DIB

DIB

背景数据块,数据字节

DID

DID

背景数据块,数据双字

DILG

DILG

背景数据块长度

DINO

DINO

背景数据块编号

DINT

DINT

数据类型

DIW

DIW

背景数据块,数据字

DIX

DIX

背景数据块,数据位

DO

DO

在 FOR 和 WHILE 指令中引入指令部分

DT

DT

数据类型

DTL

DTL

数据类型

DWORD

DWORD

数据类型

E

I

输入(通过过程映像),位

EB

IB

输入(通过过程映像),字节

ED

ID

输入(通过过程映像),双字

ELSE

ELSE

IF 和 CASE 语句中的选择分支

ELSIF

ELSIF

IF 指令的选择条件

EN

EN

EN/ENO 机制的系统操作数

ENO

ENO

EN/ENO 机制的系统操作数

END_CASE

END_CASE

结束 CASE 语句

END_DATA_BLOCK

END_DATA_BLOCK

结束数据块

END_FOR

END_FOR

结束 FOR 语句

END_FUNCTION

END_FUNCTION

结束函数

END_FUNCTION_BLOCK

END_FUNCTION_BLOCK

结束函数块

END_IF

END_IF

结束 IF 指令

END_ORGANIZATION_BLOCK

END_ORGANIZATION_BLOCK

结束组织块

END_REGION

END_REGION

块结束

END_REPEAT

END_REPEAT

结束 REPEAT 语句

END_STRUCT

END_STRUCT

结束结构说明

END_SYSTEM_FUNCTION

END_SYSTEM_FUNCTION

结束系统函数

END_SYSTEM_FUNCTION_BLOCK

END_SYSTEM_FUNCTION_BLOCK

结束系统函数块

END_TYPE

END_TYPE

结束 PLC 数据类型

END_VAR

END_VAR

结束声明块

END_WHILE

END_WHILE

结束 WHILE 指令

EW

IW

输入(通过过程映像),字

EXIT

EXIT

在 SCL 中退出循环的指令

FALSE

FALSE

预定义的布尔型常数:逻辑条件为假,值等于 0

FAMILY

FAMILY

块系列名称:如,控制器

FB

FB

函数块

FC

FC

函数

FOR

FOR

引入 FOR 语句

FUNCTION

FUNCTION

引入函数

FUNCTION_BLOCK

FUNCTION_BLOCK

引入函数块

GOTO

GOTO

引入 GOTO 语句

IF

IF

引入 IF 指令

INSTANCE

INSTANCE

数据类型

INT

INT

数据类型

KNOW_HOW_PROTECT

KNOW_HOW_PROTECT

块保护

L

L

局部数据位

LB

LB

局部数据字节

LD

LD

局部数据双字

LDT

LDT

数据类型

LINT

LINT

数据类型

LTIME

LTIME

数据类型

LTOD

LTOD

数据类型

LW

LW

局部数据字

LWORD

LWORD

数据类型

M

M

存储器位

MB

MB

存储器字节

MD

MD

存储器双字

MOD

MOD

求模运算符

MW

MW

存储器字

NAME

NAME

块名称

NETWORK

NETWORK

程序段

NOT

NOT

逻辑取反

NULL

NULL

零指针

OB

OB

组织块

OF

OF

引入数据类型规范/引入 CASE 语句的指令部分

OR

OR

“或”逻辑表达式的逻辑运算

ORGANIZATION_BLOCK

ORGANIZATION_BLOCK

引入组织块

OS

OS

保存溢出

OV

OV

溢出

PA

PQ

输出(直接的外围输出),位

PAB

PQB

输出(直接的外围输出),字节

PAD

PQD

输出(直接的外围输出),双字

PAW

PQW

输出(直接的外围输出),字

PE

PI

输入(直接的外围输入),位

PEB

PIB

输入(直接的外围输入),字节

PED

PID

输入(直接的外围输入),字节

PEW

PIW

输入(直接的外围输入),字

POINTER

POINTER

数据类型

PRAGMA_BEGIN

PRAGMA_BEGIN

引入 Pragma

PRAGMA_END

PRAGMA_END

Pragma 结束

READ_ONLY

READ_ONLY

数据块写保护

REAL

REAL

数据类型

REF

REF

生成引用的指令

REF_TO

REF_TO

声明引用的指令

REGION

REGION

引入块

REPEAT

REPEAT

引入 REPEAT 语句

RET_VAL

RET_VAL

返回值

RETURN

RETURN

SCL 中的 RETURN 语句

S5T

S5T

数据类型 S5TIME 的语法

S5TIME

S5TIME

数据类型

S7_

S7_

系统属性关键字

SDB

SDB

系统数据块

SFB

SFB

系统函数块

SFC

SFC

系统函数

SINT

SINT

数据类型

STRING

STRING

数据类型

STRUCT

STRUCT

引入结构规范,其后是元素列表

STW

STW

状态字

SYSTEM_FUNCTION

SYSTEM_FUNCTION

系统函数

SYSTEM_FUNCTION_BLOCK

SYSTEM_FUNCTION_BLOCK

系统函数块

T

T

时间元件(定时器)

THEN

THEN

引入 IF 指令的指令部分

THIS

THIS

访问 ARRAY 数据块的语法

TIME

TIME

提供时间信息的基本数据类型

TIME_OF_DAY

TIME_OF_DAY

数据类型

TIMER

TIMER

指定定时器的参数类型

TITLE

TITLE

可选块标题或程序段标题

TO

TO

定义 FOR 语句的整个范围值

TOD

TOD

数据类型

TRUE

TRUE

预定义的布尔型常数:逻辑条件为真,值不等于 0

TYPE

TYPE

PLC 数据类型说明

UDT

UDT

全局或 PLC 数据类型

UDINT

UDINT

数据类型

UINT

UINT

数据类型

ULINT

ULINT

数据类型

UNLINKED

UNLINKED

标记“与运行无关”

UNTIL

UNTIL

结束 REPEAT 语句的指令部分

USINT

USINT

数据类型

UO

UO

(Q1=1) AND (Q0=1) 后的查询

VAR

VAR

引入声明块

VAR_IN_OUT

VAR_IN_OUT

引入声明块

VAR_INPUT

VAR_INPUT

引入声明块

VAR_OUTPUT

VAR_OUTPUT

引入声明块

VAR_TEMP

VAR_TEMP

引入声明块

VARIANT

VARIANT

数据类型

VERSION

VERSION

块的版本号

VOID

VOID

函数没有返回值

WCHAR

WCHAR

数据类型

WSTRING

WSTRING

数据类型

WHILE

WHILE

引入 WHILE 指令

WORD

WORD

数据类型

XOR

XOR

逻辑运算

Z

C

计数器

在程序中使用变量

定义

变量是可以在程序中更改的数值的占位符。数值的格式已定义。使用变量使程序变得更灵活。例如,对于每次块调用,可以为在块接口中声明的变量分配不同的值。从而可以重复使用已编程的块,用于实现多种用途。

变量由以下元素组成:

名称数据类型绝对地址标准访问块中的 PLC 变量和 DB 变量都采用绝对地址。可优化访问块中的 DB 变量不使用绝对地址。Value(可选)

声明变量

可以为程序定义具有不同范围的变量:

在 CPU 的所有区域中都适用的 PLC 变量全局数据块中的 DB 变量可用于整个 CPU 范围内的所有块。背景数据块中的 DB 变量,通常在对其进行声明的块中使用。

下表显示的是变量类型之间的区别:

PLC 变量

背景 DB 中的变量

全局 DB 中的变量

应用范围

在整个 CPU 中有效。

CPU 所有块均可使用。

该名称在 CPU 中唯一。

主要用于定义它们的块中。

该名称在背景 DB 中唯一。

CPU 中的所有块均可使用。

该名称在全局 DB 中唯一。

可用的字符

字母、数字、特殊字符

不可使用引号。

不可使用保留关键字。

字母、数字、特殊字符

不可使用保留关键字。

字母、数字、特殊字符

不可使用保留关键字。

使用

I/O 信号(I、IB、IW、ID、Q、QB、QW、QD)

位存储器(M、MB、MW、MD)

块参数(输入、输出和输入/输出参数)

块的静态数据

静态数据

定义位置

PLC 变量表

块接口

全局 DB 声明表

常量

定义

常量是具有固定值的数据,其值在程序运行期间不能更改。常量在程序执行期间可由各种程序元素读取,但不能被覆盖。不同的常量值通常会指定相应的表示方式,具体取决于数据类型和数据格式。类型与非类型表示方式不同。

无类型的常量

在无类型的表示法中,仅输入常量值即可,无需输入数据类型。对于无类型的常量,只有在首次算术运算和逻辑运算中使用后,才会获得数据类型。

以下示例为无类型的表示法:

SCL

#My_Int1 := #My_Int2 + 12345

(*常量“12345”的数据类型

取决于加数 My_Int。2.此时,“12345”的数据类型为 INT。*)

#My_Real1 := #My_Real2 + 12345

(*常量“12345”的数据类型取决于加数 My_Real2。此时,“12345”的数据类型为 REAL。*)

带有数据类型的常量

在有类型的表示法中,除指定常量值外还指定数据类型。

以下示例为有类型的表示法:

SCL

#My_Int1 := INT#12345

(*The data type of the constant is always INT.*)

符号常量

可以选择声明常量符号名,从而使程序中名称下的常量值可用。这使得在更改常量值时,程序更具有可读性并且更易于维护。

符号常量由以下元素组成:

名称数据类型符号常量始终有数据类型;无类型表示法不适用于符号常量。常量值可以选择指定数据类型值范围内的任意值作为常量值。有关值范围的信息,请参见“数据类型”一章。

常量声明

可以定义具有不同适用范围的常量:

全局常量适用于 CPU 的所有区域局部常量仅在块内适用

下表显示常量类型之间的区别:

全局常量

局部常量

适用范围

在整个 CPU 中有效。

该名称在 CPU 中唯一。

仅在声明它们的块中有效。

该名称在块中唯一。

允许的字符

常量名称允许使用的字符包括字母、数字和特殊字符。

常量名称允许使用的字符包括字母、数字和特殊字符。

定义位置

PLC 变量表的“常量”(Constants) 选项卡

块接口

表示法

括在引号中,例如:

"Glob_Const"

带有数字符号前缀,例如:

#Loc_Const

如果声明的局部常量和全局常量具有相同的符号名称,并将此重复指定的名称用作变量的默认值,则会发生名称冲突。此时,系统将自动使用局部常量。

允许的数据类型

对于常量,允许使用所有基本数据类型和所有衍生数据类型:

二进制数,位字符串,整数,浮点数,定时器,日期和时间,字符串

所有显式和隐式类型转换的通用规则均适用。

无类型常量的数据类型

无类型常量不显式指定数据类型。只有在首次算术运算和逻辑运算中使用后,才会获得数据类型。

以下示例说明如何使用无类型常量:

SCL

#My_Int1 := #My_Int2 + 12345

(*常量“12345”的数据类型

取决于加数 My_Int。2.此时,“12345”的数据类型为 INT。*)

#My_Real1 := #My_Real2 + 12345

(*常量“12345”的数据类型取决于加数 My_Real2。此时,“12345”的数据类型为 REAL。*)

寻址操作数

寻址全局变量

要对全局 PLC 变量进行寻址,可以使用绝对地址或符号名称。

说明

LWORD、LINT、ULINT、LREAL、LTIME、LTOD 和 LDT 数据类型只能通过符号名寻址。

按符号名对全局变量寻址

使用符号名称进行寻址时,则需输入 PLC 变量表中的变量名称。全局变量的符号名自动用引号括起来.

可以使用 PLC 变量的符号名称,对基于 PLC 数据类型的结构化变量进行寻址。也可以使用句点分隔各元素的名称。

按绝对地址对全局变量寻址

使用绝对地址寻址时,则需输入 PLC 变量表中的变量地址。对于每个操作数范围,绝对地址使用以零开头的数值地址地址标识符 % 被自动设置为全局变量绝对地址的前缀。

示例

以下示例显示的是符号名与绝对地址寻址的应用:

寻址

说明

%Q1.0

绝对地址:输出 1.0

%I16.4

绝对地址:输入 16.4

%IW4

绝对地址:输入字 4

"Motor"

符号名地址"Motor"

"Value"

符号名地址"Value"

"Structured_Tag"

基于 PLC 数据类型的变量符号地址

"Structured_Tag".Component

结构化变量的元素符号地址。

访问IO设备

CPU 的过程映像是每个周期更新一次。但是,在对时间要求苛刻的应用中,读取或传送数字输入或输出当前状态的频率可能必须高于每个周期一次。为此,可以在操作数中使用 I/O 访问标识符的后缀直接访问 I/O。

如果要从 I/O 直接读取输入,则需使用 I/O 输入存储区 (PI),而非过程映像输入 (I)。外围设备存储区可按位、字节、字或双字读取。

如果要直接写入输出中,则需使用 I/O 输出存储区 (PQ),而非过程映像输出 (Q)。可以位、字节、字或双字形式对外围输出存储区执行写操作。

要直接从外围设备输入读取或写入信号,可以给操作数添加 I/O 访问后缀“:P”。

也可以通过“:P”寻址结构化 PLC 变量中的元素。但无法使用“:P”访问上一级变量。

示例

下列示例显示的是 I/O 访问标识符的应用:

寻址

说明

"Motor"

对过程映像中的 "Motor" 变量进行寻址。

"Motor":P

对 I/O 存储器区(PI 或 PQ)中的 "Motor" 变量进行寻址。

"Structured_Tag".Component

对过程映像中结构化 PLC 变量的元素进行寻址。

"Structured_Tag".Component:P

对 I/O 存储器区(PI 或 PQ)中结构化 PLC 变量的元素进行寻址。

全局数据块中的变量寻址

全局数据块中的变量可以按符号名或绝对地址进行寻址。对于符号寻址,可以使用数据块的名称和变量名,并用圆点分隔。数据块的名称用引号括起来。

对于绝对寻址,可以使用数据块的编号和数据块变量的绝对地址,并用圆点分隔。地址标识符 % 被自动设置为绝对地址的前缀。

S7-1200/1500 提供了一个选项,用于访问编程期间处于未知状态的数据块。为此,请在访问块的块接口中创建一个 DB_ANY 数据类型的块参数。数据块名称或数据块编号将在运行期间传送到此参数。为了访问数据块的内部变量,请使用 DB_ANY 数据类型的块参数名称以及变量的绝对地址,并用圆点分隔。

说明

按绝对地址对 DB 变量寻址

以下变量无法进行绝对寻址:

优化访问块中的变量。LWORD、LINT、ULINT、LREAL、LTIME、LTOD 和 LDT 数据类型的变量。

最佳做法是对这些变量使用更为便捷的符号寻址。

ARRAY 数据块

ARRAY 数据块是一种特殊类型的全局数据块。这些数据块包含一个任意数据类型的 ARRAY。例如,可以是 PLC 数据类型 (UDT) 的 ARRAY。

可通过关键字“THIS”寻址 ARRAY 数据块中的元素。然后再在方括号中指定下标。下标可以是一个常量,也可以是一个变量。变量类型的下标最大可支持长度为 32 位的整数。

寻址 ARRAY 数据块的扩展选项位于“指令”(Instructions) 任务卡的“移动”(Move) 区域中。例如,可以通过这些指令对数据块名称进行间接寻址。

寻址 ARRAY 数据块

ARRAY 数据块是一种特殊形式的 ARRAY。ARRAY 数据块是仅包含一个 ARRAY 的全局数据块。可通过以下语法寻址 ARRAY 数据块中的元素:

"<GlobArrayDBname>".THIS[#i].<元素名称>

SCL:

"<GlobArrayDBname>"."THIS"[#i].<元素名称>

示例

以下示例说明了如何寻址 ARRAY 数据块中的元素:

在 SCL 中寻址

说明

"My_ARRAY_DB"."THIS"[0]

"My_ARRAY_DB" 是一个 ARRAY 数据块,元素的数据类型为 REAL。

在此,将寻址 "My_ARRAY_DB" 中的第一个元素。

"MY_UDT_ARRAY_DB"."THIS"[3].MyREAL

"MY_UDT_ARRAY_DB" 是一个 ARRAY 数据块,元素的数据类型为 PLC 数据类型 (UDT)。在 PLC 数据类型中,各元素的数据类型为 BYTE。

在此,将寻址 "MY_UDT_ARRAY_DB" 中第四个 ARRAY 元素和该元素中的 "MyREAL" 子元素。

寻址 ARRAY 数据块的指令

在“移动 > ARRAY 数据块”(Move > ARRAY DB) 区域的“指令 > 基本指令”(Instructions > Basic instructions) 任务卡中,包含有各种 ARRAY 数据块的寻址方式。例如,使用这些指令间接寻址该数据块的名称。

ReadFromArrayDB:读取数组数据块WriteToArrayDB:写入数组数据块ReadFromArrayDBL:从装载存储器的数组型数据块中读取WriteToArrayDBL:写入装载存储器的 ARRAY 数据块中

间接寻址

间接寻址允许用户寻址在运行之前不计算地址的操作数。采用间接寻址方式时,各程序段可多次执行,而且每次运行时使用的操作数不同。例如,在程序循环中,每次运行都使用不同的下标。

这种方法具有以下优势:

程序更为灵活。间接寻址可在所有 STEP 7 编程语言中使用。程序代码更为清晰易读。可使用数据块和变量的现有名称(符号化寻址),因为显著提高了程序代码的可读性。

S7-1200 和 S7-1500 中的常规间接寻址选项

所有的编程语言都提供以下间接寻址选项:

通过指针间接寻址ARRAY 元素的间接索引通过 DB_ANY 数据类型间接寻址数据块。

语言特定的间接寻址选项

以下指定寻址选项还可以在多种编程语言中提供:

在 STL 中,可以直接通过地址寄存器寻址操作数。在 SCL 中,可以通过以下指令读写变量存储区:POKE - 写入存储器地址POKE_BOOL - 写入存储器位PEEK - 读取存储器地址PEEK_BOOL - 读取存储器位POKE_BLK - 写入存储区域

1.程序示例

在以下示例中,可以使用下标访问来自不同存储区的三个变量。

分别分配给相应下标的三个变量总览:

下标

访问变量

存储区

1

Input_WORD_0

IW 0

2

"Processdata".Temperature

DB 1

3

Output_WORD_4

QW 4

在“默认变量表”(Default tag table) 中声明以下两个变量:

创建全局数据块:

双击“添加新块”(Add new block) 命令。这样会打开“添加新块”(Add new block) 对话框。单击“数据块 (DB)”(Data block (DB)) 按钮。指定名称“DB_Processdata”。选择“Global DB”作为数据块的类型。单击“确定”(OK)。声明数据块元素“Temperature”:

使用指针间接寻址

对于间接寻址,要求特定的数据格式,应包含地址或者还包含操作数的范围和数据类型。该数据格式称为指针。可以使用以下类型的指针:

引用 (S7-1500)VARIANT (S7-1200/1500)POINTER (S7-1500)ANY(S7-1500,仅适用于可标准访问的块)

有关指针数据类型的更多信息,请参考“另请参见”。

说明

SCL 中的 POINTER

在 SCL 中,POINTER 的使用具有一定限制。只能将其转发到被调用块中。

示例

以下举例说明了使用区域内指针进行间接寻址:

在 STL 中寻址

说明

L P#10.0

// 在累加器 1 中(P#10.0)加载指针

T MD20

// 将指针传递给操作数 MD20

L MW [MD20]

// 在累加器 1 中加载 MW10

....

// 任意程序

L MD [MD20]

// 在累加器 1 中加载 MD10

....

// 任意程序

= M [MD20]

// 若 RLO=1,则设置存储器位 M10.0

clipboard

将指针 P#10.0 传递给操作数 MD20。若编程时操作数 MD20 用方括号括起,则在运行时其将被指针中包含的地址替换。

标签: #计数器qu cu ld qd