说明
POINTER 类型的参数是一个可指向特定变量的指针。它在存储器中占用 6 个字节(48 位),可能包含以下变量信息:
数据块编号或 0(若数据块中没有存储数据)
CPU 中的存储区
变量地址
下图显示了 POINTER 参数类型的结构:
指针类型
根据相关信息,可以使用 POINTER 参数类型声明以下四种类型的指针:
内部区域指针:
内部区域指针存储变量的地址信息。
跨区域指针:
跨区域指针存储变量的存储区域和地址信息。
DB 指针:
使用 DB 指针,可以指向数据块变量。除变量的存储区域和地址信息外,DB 指针中还存储有数据块号。
零指针:
使用零指针,可以指出缺少的值。缺少的值可以表示值不存在,或为未知值。零值表示缺少值,但仍然是值。
下表显示的是声明各种指针类型的格式:
P#ByteRepresentation | 格式 | 输入值示例 | 说明 |
---|---|---|---|
符号 | P#Byte.Bit | "MyTag" | 内部区域指针 |
P#OperandAreaByte.Bit | "MyTag" | 跨区域指针 | |
P#Data_block.Data_operand | "MyDB"."MyTag" | DB 指针 | |
P#零值 | - | 零指针 | |
P#Byte.Bit | P#20.0 | 内部区域指针 | |
P#OperandAreaByte.Bit | P#M20.0 | 跨区域指针 | |
P#Data_block.Data_operand | P#DB10.DBX20.0 | DB 指针 | |
P#零值 | P#0.0, ZERO | 零指针 |
前缀 P#
在块调用中输入不带 P# 前缀的实际值,可作为 POINTER 数据类型的形参。然后可自动转换为 POINTER 格式。
在 STL 编程语言中使用前缀 P# 时,需注意以下注意事项:
块类型 | “优化”访问模式 | “标准”访问模式 |
---|---|---|
函数 (FC) | 在程序代码中,不能使用带前缀 P# 的变量。 | 在程序代码中,可以使用以下带前缀 P# 的变量。 在块接口的 InOut 区域中声明变量的结构变量。 声明基本数据类型的变量不能使用前缀 P#。 |
函数块 (FB) | 在程序代码中,不能使用带前缀 P# 的变量。 | 在程序代码中,可以使用以下带前缀 P# 的变量。 在块接口的 Static、Input 和 Output 区域声明的变量。 在块接口的 InOut 区域中声明的 PLC 数据类型 (UDT) 变量。 |
存储区
下表列出了 POINTER 参数类型的存储区的十六进制代码:
十六进制代码 | 存储区 | 说明 |
---|---|---|
B#16#801) | P | CPU S7-300/400 的外围设备 |
16#1 | P | CPU S7-1500 的外围输入 |
16#2 | P | CPU S7-1500 的外围输出 |
B#16#81 | I | 输入存储区 |
B#16#82 | Q | 输出存储区 |
B#16#83 | M | 位存储的存储区 |
B#16#84 | DBX | 数据块 |
B#16#85 | DIX | 背景数据块 |
B#16#86 | L | 本地数据 |
B#16#87 | V | 先前的本地数据 |
1) 这些数据类型只能用于 CPU S7-300/400 上的 POINTER 指针。 |
输入常量的完整语法 |
概述
短格式 | 长格式 |
---|---|
B# | BYTE# |
W# | WORD# |
DW# | DWORD# |
D# | DATE# |
T# | TIME# |
TOD# | TIME_OF_DAY# |
S5T# | S5TIME# |
DT# | DATE_AND_TIME# |
P# | POINTER# |
使用指针进行间接寻址
说明
对于间接寻址,要求特定的数据格式,应包含地址或者还包含操作数的范围和数据类型。该数据格式称为指针。可以使用以下类型的指针:
引用 (S7-1500)
VARIANT (S7-1200/1500)
POINTER (S7-1500)
ANY(S7-1500,仅适用于可标准访问的块)
有关指针数据类型的更多信息,请参考“另请参见”。
说明 在 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 |
将指针 P#10.0 传递给操作数 MD20。若编程时操作数 MD20 用方括号括起,则在运行时其将被指针中包含的地址替换。
通过指针间接寻址
说明
对于间接寻址,要求特定的数据格式,应包含地址或者还包含操作数的范围和数据类型。该数据格式称为指针。以下提供的是指针类型:
POINTER (S7-300/400)
ANY (S7-300/400)
VARIANT (S7-1200/1500)
有关指针数据类型的详细信息,请参见“另请参见”部分。
说明 在 SCL 中,指针数据类型的使用受到限制。唯一的选择是可以将其转发至被调用块。 |
示例
以下举例说明了使用区域内指针进行间接寻址:
在 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 |
将指针 P#10.0 传递给操作数 MD20。若编程时操作数 MD20 用方括号括起,则在运行时其将被指针中包含的地址替换。
LAR1 :用双字或区域指针加载至 AR1
说明
使用“用双字或区域指针加载至 AR1”指令,将双字或区域内部指针、跨区域指针的内容加载到地址寄存器 1 (AR1) 中。因此双字中的内容必须与区域指针格式相匹配。
在下列某个存储区中,可以寻址指针和双字:
位存储器 (M)
临时本地数据 (L)
数据块 (DB,DI)
无论逻辑运算结果以及状态位如何,CPU 都会执行该指令。该指令既不影响逻辑运算结果也不影响状态位。
该指令不会更改累加器中的内容。
参数
下表列出了“用双字或区域指针加载至 AR1”指令的参数:
参数 | 声明 | 数据类型 | 存储区 | 说明 |
---|---|---|---|---|
Input | DWORD、POINTER | D、M、L | 加载了内容的操作数。 |
示例
以下示例说明了该指令的工作原理:
STL | 说明 |
---|---|
LAR1 P#10.0 | // 将区域内部指针 P#10.0 中的内容加载到地址寄存器 1。 |
L MW [AR1,P#4.0] | // 将 MW14 加载到累加器 1 中。 |
L "Tag_Value" | // 将累加器 1 中的内容移到累加器 2 中。 // 将操作数“Tag_Value”的内容加载到累加器 1 中。 |
>I | // 比较累加器 2 的值是否大于累加器 1 的值。 |
A I [AR1,P#2.1] | // 检查位 I12.1 的信号状态是否为“1”,并与当前的 RLO 进行“与”运算。 |
= "Tag_Output" | // 如果满足条件 (RLO = "1"),则将操作数“Tag_Output”置位为“1”。 |
LAR1 MD20 | // 用 MD20 (MD20 = P#30.0) 中的内容加载至地址寄存器 1 |
A I [AR1,P#2.1] | // 检查位 I32.1 的信号状态是否为“1”,并与当前的 RLO 进行“与”运算。 |