在PLC(西门子)中通过使用间接寻址方法,指令所使用的地址可以改变为指向任意数量的位置。在这种情况下,一个内存位置存储指向另一个内存位置的“指针”。虽然这可能会增加故障排除的难度,但其优点是大大减少控制过程所需的网络和指令的数量。也是使用西门子提供的一些库和系统函数调用必须了解的方法。
POINTER(指针) 和任何数据类型
注意:只需将双字左移 3 位即可将 DINT 转换为 POINTER。
数据块指令
OPN DB 10 //开DB10作为共享数据块
L DBW 36 //将DB10的数据字36加载到ACCU1中
T MW 22 //将ACCU1的内容传送到MW22中
OPN DI 20 //打开DB20作为背景数据块
L DIB 12 //将数据字节12从DB20加载到ACCU1中
T DBB 37 //将ACCU1的内容传输到开放共享数据块DB10的数据字节37
L DBNO //将打开的共享数据块的编号加载到ACCU1
L DBLG //将打开的共享数据块的长度加载到ACCU1
L DINO //将打开的实例数据块的编号加载到ACCU1
L DILG //将打开的实例数据块的长度加载到ACCU1
内存间接寻址
L 5 //用指针值加载ACCU1
T MW 2 //将指针传输到MW2
L T [MW 2] //用T5的当前时间值加载ACCU1
OPN DB [#DB_Temp] //打开数据块号来自接口临时参数的DB,命名为DB_Temp
L P#0.7 //用指针值加载ACCU1
T MD 2 //将指针传输到MD2
A I [MD 2] //检查I0.7的状态
= M [MD 2] //将RLO的值分配给M0.7
OPN DB 5 //打开DB5
L P#2.0 //将指针加载到ACCU1
T #TempPointer //将指针传输到临时位置
L DBW [#TempPointer] //将DB5.DBW2处的值加载到ACCU1
L 0 //将零加载到ACCU1
>D //检查值是否大于零
L P#2.0 //用指针值加载ACCU1
L P#5.0 //用第二个指针值加载ACCU1
+D
T MD 0 //现在MD0包含值P#7.0
地址寄存器
区域内部寄存器间接寻址
L P#0.7 //用指针值加载ACCU1
LAR1 //将指针加载到AR1中
A I [AR1, P#0.0] //检查输入I0.7
= Q [AR1, P#1.1] //如果RLO=1,则打开Q2.0
跨区域寄存器间接寻址
L P#I0.7 //用指针值加载ACCU1
LAR1 //将指针加载到AR1中
L P#Q124.0 //用指针值加载ACCU1
LAR2 //将指针加载到AR2中
A [AR1, P#0.0] //检查输入I0.7
= [AR2, P#1.1] //如果RLO=1,则打开Q125.1
下一个示例展示了使用字和双字格式的区域交叉方法。
L P#M0.0 //用指针值加载ACCU1
LAR1 //将指针加载到AR1中
L W [AR1, P#10.0] //将地址由AR1内容加上10字节(MW10)确定的字加载到ACCU1
OPN DB 5 //打开DB5
L P#DBX 0.0 //将指针值加载到ACCU1
LAR2 //将ACCU1中的指针加载到AR2
L L#0 //将零加载到ACCU1
T D [AR2, P#50.0] //将ACCU1中的值传输到确切位置是AR2地址
//加上50字节的双字中(DB5.DBD50)
2024年01月
1.Smart200&V90伺服系统:已更新15课
2.贝加莱直播课程:已更新30课
3.PKS快速入门:初级&中级-全
原文始发于微信公众号(剑指工控):PLC中指针和间接寻址的深度应用