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

发布时间:2024-08-06  

说明

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


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

CPU 中的存储区

变量地址

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

37f92652-1ec5-11ee-962d-dac502259ad0.png

指针类型

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


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>