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 | 零指针 |
说明 SCL:通过 DB 绝对指针访问数据块 在 SCL 中,如果通过一个 DB 绝对指针(如,P#DB1.dbx0.0)对“系统块”(System blocks) 文件夹中的数据块进行寻址,并仅通过该方式访问此 DB,则极少数情况下,会在下一次编译时删除该数据块。编译器不会将 DB 指针识别为访问,因此会假定该 DB 在程序中未使用。此时,可对该 DB 进行读取访问(如,“MyDB.MyFirstMember”),而非通过指针。这样,可确保访问始终正确执行。 |
前缀 P#
在块调用中输入不带 P# 前缀的实际值,可作为 POINTER 数据类型的形参。然后可自动转换为 POINTER 格式。
如果使用前缀 P#,则只能指向“标准”访问模式的存储区。
在 STL 编程语言中使用前缀 P# 时,需注意以下注意事项:
块类型 | “优化”访问模式 | “标准”访问模式 |
函数 (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 指针。 |