POINTER |
说明
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 |
零指针 |
说明
| ||
块类型 |
“优化”访问模式 |
“标准”访问模式 |
函数 (FC) |
在程序代码中,不能使用带前缀 P# 的变量。 |
在程序代码中,可以使用以下带前缀 P# 的变量。
声明基本数据类型的变量不能使用前缀 P#。 |
函数块 (FB) |
在程序代码中,不能使用带前缀 P# 的变量。 |
在程序代码中,可以使用以下带前缀 P# 的变量。
|
存储区
下表列出了 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 指针。 |
ANY |
说明
ANY 类型的参数指向数据区的起始位置,并指定其长度。ANY 指针使用存储器中的 10 个字节,可能包含以下信息:
- 数据类型:
- 数据区元素的数据类型
- 重复系数:
- 系统区的元素数
- DB 编号:
- 包含数据区元素声名的数据块。
- 存储区:
- CPU 中存储数据区元素的存储区。
- 数据的起始地址(格式为“字节.位”):
- 通过 ANY 指针确定的数据区起始位置。
- 零指针:
- 使用零指针,可以指出缺少的值。缺少的值可以表示值不存在,或为未知值。零值表示缺少值,但仍然是值。
说明 指向 STRING 的 ANY 指针 如果在 LAD/FBD/STL 或 SCL 程序段中通过赋值字符串生成一个 ANY 指针,则系统将创建一个 BYTE 数据类型的 ANY 指针和重复系数 maxstringlen。 如果在 SCL 块中通过赋值字符串生成一个 ANY 指针,则系统将创建一个指向 STRING 的 ANY 指针。 例如,通过将指针从 SCL 块传送到 LAD 程序段中,或在指针上叠加一个 AT 结构并手动设置数据类型 STRING,即可创建这种类型的指针。 |
在编程语言 SCL 和 STL 中,如果在块参数中设定了一个 ANY 指针,则任意类型的存储器都可以在块调用时传递。
但是,ANY 指针不能存储有关存储器结构的任何信息。例如,ANY 指针不能保存指向 PLC 数据类型变量的信息。ANY 指针将其作为 BYTE 类型的 ARRAY。
ANY 数据类型的参数可以被传递到系统函数块 (SFB) 或系统函数 (SFC)。
下图给出了 ANY 指针的结构:
ANY 指针不能指向结构,只能分配给局部变量。
下表列出了声名 ANY 指针的格式:
表示法 |
格式 |
输入值示例 |
说明 |
符号 |
P#DataBlock.MemoryArea DataAddress Type Number |
"MyDB".StructTag.InitialComponents |
全局 DB11 中从 DBB20.0 开始带有 10 个字的区域 |
P#MemoryArea DataAddress Type Number |
"MyMarkerTag" |
以 MB 20.0 开始包含 4 个字节的区域 | |
"MyTag" |
输入 I1.0 | ||
P#零值 |
- |
零值 | |
绝对 |
P#DataBlock.MemoryArea DataAddress Type Number |
P#DB11.DBX20.0 INT 10 |
全局 DB11 中从 DBB20.0 开始带有 10 个字的区域 |
P#MemoryArea DataAddress Type Number |
P#M20.0 BYTE 10 |
以 MB 20.0 开始包含 10 个字节的区域 | |
P#I1.0 BOOL 8 |
包含来自输入 I1.0 的 8 个位的范围(指定的范围长度必须可被 8 除尽)。 | ||
P#零值 |
P#P0.0 VOID 0, Null 1) |
零值 | |
1) 在编程语言 LAD 和 FBD 中,只有 NULL 才是零值的值条目。 |
数据类型的编码
下表列出了 ANY 指针的数据类型编码。
十六进制代码 |
数据类型 |
说明 |
B#16#00 |
NIL |
Null 指针 |
B#16#011) |
BOOL |
位 |
B#16#02 |
BYTE |
字节,8 位 |
B#16#03 |
CHAR |
8 位字符 |
B#16#04 |
WORD |
16 位字 |
B#16#05 |
INT |
16 位整数 |
B#16#06 |
DWORD |
32 位字 |
B#16#07 |
DINT |
32 位整数 |
B#16#08 |
REAL |
32 位浮点数 |
B#16#0B |
TIME |
持续时间 |
B#16#0C |
S5TIME |
持续时间 |
B#16#09 |
DATE |
日期 |
B#16#0A |
TOD |
日期和时间 |
B#16#0E |
DT |
日期和时间 |
B#16#13 |
STRING |
字符串 |
B#16#171) |
BLOCK_FB |
函数块 |
B#16#181) |
BLOCK_FC |
函数 |
B#16#191) |
BLOCK_DB |
数据块 |
B#16#1A1) |
BLOCK_SDB |
系统数据块 |
B#16#1C1) |
COUNTER |
计数器 |
B#16#1D1) |
TIMER |
定时器 |
1) 这些数据类型只能用于 CPU S7-300/400 上的 ANY 指针。 |
存储区的编码
下表列出了 ANY 指针的存储区编码。
十六进制代码 |
区域 |
说明 |
B#16#801) |
P |
I/O |
B#16#81 |
I |
输入存储区 |
B#16#82 |
Q |
输出存储区 |
B#16#83 |
M |
位存储的存储区 |
B#16#84 |
DBX |
数据块 |
B#16#851) |
DIX |
背景数据块 |
B#16#86 |
L |
本地数据 |
B#16#87 |
V |
先前的本地数据 |
1) 这些存储区只能用于 S7-300/400 CPU 上的 ANY 指针。 |