【博途】分析德国工程师写的STL中的Any指针 L 16#1002

本文详细解析了S7-PLC中的ANY类型数据结构,包括数据格式、字节组成以及实际应用示例,重点讲解了地址寄存器寻址规则和存储区域标识。通过POKE_BLK函数实例,展示了如何在数据块间进行有效迁移和操作。
摘要由CSDN通过智能技术生成

在这里插入图片描述

在这里插入图片描述

any数据类型共10个字节,数据格式如下

Byte 0: 固定10h 表示S7

 Byte 1:表示数据类型

在这里插入图片描述


Byte 2,3  /Word2:表示传送的数据长度,重复因子

Byte 45/Word3:表示DB块号或者为0

Byte 6:表示存储区域

在这里插入图片描述

ANY类型占10字节
比如P#DB1.Dbx0.0 Byte 10
BYTE 0  对于S7PLC 固定是16进制10
BYTE 1  对应 数据类型,2代表是BYTE。
BYTE2到3 是重复系数,相当于P#DB1.DBX0.0 BYTE 10的数字10.
BYTE 45 是DB号,如果 为0,则是非DB区。
BYTE 6932位指针,即相当于P#DB1.DBX0.0 BYTE 10中的指针地址 DBX0.0 即DW#16#84000000



这个程序执行后结果为:
 . 首址为Zeiger_Quelle:
 . 地址Zeiger_Quelle+0单元中:存入了W#16#1002 ,即常数W#16#1002. 地址Zeiger_Quelle+4单元中:存入了SOURCE_DBNR,即数据块号 DB25
 . 地址Zeiger_Quelle+6单元中:存入了由#Ziel_Anfang(DB块内的起始地址)左移3位并或#16#84000000运算结果。该结果即形成的 一DB数据块某位的指针,即例如DBX96.0的指针;
 .  地址Zeiger_Quelle+2单元中:存入了#Laenge,即长度。
 ;
 说明:
 SLD   3          //因为L     #Quelle_Anfang 是字节偏移量,如果不左移,则对齐了指针的后三位是xxx 小数位
 OD    DW#16#8400000
 上述两指令的用途:
 地址寄存器是专门用于寻址的一个特殊指针区域,西门子的地址寄存器共有两个:AR1和AR2,每个32位。
   当使用在区域内寄存器间接寻址中时,我们知道这时的AR中的内容只是指明数值单元,因此,区域内寄存器间接寻址时,寄存器中的内容等同于上帖中提及的存储器间接寻址中的双字指针,也就是:
   其0-2bit,指定bit位,3-18bit指定byte字节。其第31bit固定为0。
   AR:
   0000 0000 0000 0BBB BBBB BBBB BBBB BXXX
   这样规定,就意味着AR的取值只能是:0.0 ——65535.7
   例如:当AR=D4(hex)=0000 0000 0000 0000 0000 0000 1101 0100(b),实际上就是等于26.4。
   而在区域间寄存器间接寻址中,由于要寻址的区域也要在AR中指定,显然这时的AR中内容肯定于寄存器区域内间接寻址时,对AR内容的要求,或者说规定不同。
   AR:
   1000 0YYY 0000 0BBB BBBB BBBB BBBB BXXX
   比较一下两种格式的不同,我们发现,这里的第31bit被固定为1,同时,第242526位有了可以取值的范围。聪明的你,肯定可以联想到,这是用于指定存储区域的。对,bit24-26的取值确定了要寻址的区域,它的取值是这样定义的:
   区域标识符 
   262524位 
   P(外部输入输出) 
   000 
   I(输入映像区) 
   001 
   Q(输出映像区) 
   010 
   M(位存储区) 
   011 
   DB(数据块) 
   100 
   DI(背景数据块) 
   101 
   L(暂存数据区,也叫局域数据) 
   111 
   如果我们把这样的AR内容,用HEX表示的话,那么就有:
   当是对P区域寻址时,AR=800*xx
 当是对I区域寻址时,AR=810*xx
   当是对Q区域寻址时,AR=820*xx
   当是对M区域寻址时,AR=830*xx
   当是对DB区域寻址时,AR=840*xx
   当是对DI区域寻址时,AR=850*xx
   当是对L区域寻址时,AR=870*xx
  经过列举,我们有了初步的结论:如果AR中的内容是8开头,那么就一定是区域间寻址;如果要在DB区中进行寻址,只需在8后面跟上一个4084000000-840FFFFF指明了要寻址的范围是:
   DB区的0.0——65535.7。
   例如:当AR=840000D4(hex)=1000 0100 0000 0000 0000 0000 1101 0100(b),实际上就是等于DBX26.4

在SCL中,有更简单的实现:
在这里插入图片描述

	Input									
	Quelle_DBNR	Int	0	非保持	False	False	False	False		
	Quelle_Anfang	Int	0	非保持	False	False	False	False		
	Ziel_DBNR	Int	0	非保持	False	False	False	False		
	Ziel_Anfang	Int	0	非保持	False	False	False	False		
	Laenge	Int	0	非保持	False	False	False	False		
	



POKE_BLK(area_src := 16#84,
         dbNumber_src := #Quelle_DBNR,
         byteOffset_src := #Quelle_Anfang,
         area_dest := 16#84,
         dbNumber_dest := #Ziel_DBNR,
         byteOffset_dest := #Ziel_Anfang,
         count := #Laenge);
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘诺西亚的火山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值