在PLC(西门子)中通过使用间接寻址方法,指令所使用的地址可以改变为指向任意数量的位置。在这种情况下,一个内存位置存储指向另一个内存位置的“指针”。虽然这可能会增加故障排除的难度,但其优点是大大减少控制过程所需的网络和指令的数量。也是使用西门子提供的一些库和系统函数调用必须了解的方法。POINTER(指针)和任何数据类型
POINTER数据类型用于格式化要接受为地址而不是值的数字。指针前面始终带有指向DB25的第一个字节,长度为14个字节。
注意:只需将双字左移3位即可将DINT转换为POINTER。数据块指令
使用间接寻址时,有时需要首先打开一个DB,然后开始处理地址,而不直接引用任何一个DB。这是使用OPN指令完成的。OPN指令可以打开共享数据块(DB)或背景数据块(DI)。
OPNDB10//开DB10作为共享数据块
LDBW36//将DB10的数据字36加载到ACCU1中
TMW22//将ACCU1的内容传送到MW22中
OPNDI20//打开DB20作为背景数据块
LDIB12//将数据字节12从DB20加载到ACCU1中
TDBB37//将ACCU1的内容传输到开放共享数据块DB10的数据字节37
在STL中监视时,共享DB编号显示在DB1列中,背景DB编号显示在DB2列中。此外,还有指令确认打开了正确的DB编号,并且它足够大以进行下一步操作。
LDBNO//将打开的共享数据块的编号加载到ACCU1
LDBLG//将打开的共享数据块的长度加载到ACCU1
LDINO//将打开的实例数据块的编号加载到ACCU1
LDILG//将打开的实例数据块的长度加载到ACCU1
内存间接寻址
第一种间接寻址方法称为内存间接寻址,因为它允许一个内存位置(M、DB或L)确定或指向另一个位置。存储区标识符T、C、DB、DI、FB和FC使用整数格式的字(16位)指针位置。两个例子如下:
L5//用指针值加载ACCU1
TMW2//将指针传输到MW2
LT[MW2]//用T5的当前时间值加载ACCU1
OPNDB[0.7//用指针值加载ACCU1
TMD2//将指针传输到MD2
AI[MD2]//检查的状态
=M[MD2]//将RLO的值分配给
OPNDB5//打开DB5
LPTempPointer//将指针传输到临时位置
LDBW[2.0+)。
//用第二个指针值加载ACCU1
+D
TMD0//现在MD0包含值+,而不是//用指针值加载ACCU1
LAR1//将指针加载到AR1中
AI[AR1,]//如果RLO=1,则打开
跨区域寄存器间接寻址
跨区域寄存器间接寻址与区域内部方法类似,只是加载到地址寄存器中的指针引用内存区域(例如)。这意味着如果引用位,则不需要在左括号之前使用地址标识符,否则它将是B代表字节、W代表字或D代表双精度。下面的示例显示了使用位位置的区域交叉方法。
//用指针值加载ACCU1
LAR2//将指针加载到AR2中
A[AR1,]//如果RLO=1,则打开
下一个示例展示了使用字和双字格式的区域交叉方法。
]//将地址由AR1内容加上10字节(MW10)确定的字加载到ACCU1
OPNDB5//打开DB5
LP0//将零加载到ACCU1
TD[AR2,P#50.0]//将ACCU1中的值传输到确切位置是AR2地址
//加上50字节的双字中()