西门子博途之POINTER 类型的参数

工业控制

1091人已加入

描述

说明

POINTER 类型的参数是一个可指向特定变量的指针。它在存储器中占用 6 个字节(48 位),可能包含以下变量信息:

数据块编号或 0(若数据块中没有存储数据)

CPU 中的存储区

变量地址

下图显示了 POINTER 参数类型的结构:

cpu

指针类型

根据相关信息,可以使用 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 进行“与”运算。

编辑:黄飞

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分