网上有人给出了一条S7-300“看不懂”的指令“L P#P 515.0”。
这条指令与区域之间的寄存器间接寻址有关。S7-300/400有两个地址寄存器AR1和AR2,操作数的地址等于地址寄存器中的地址值加上地址偏移量。下面是寄存器间接寻址的32位指针格式:
x000 0rrr 0000 0bbb bbbb bbbb bbbb bxxx
其中第0~2位(xxx,最低位为第0位)为被寻址地址中位的编号(0~7),第3~18位(16个b)为被寻址地址的字节的编号。第24~26位(rrr)为被寻址地址的区域标识号。
指针的最高位x 为0时,为区域内的间接寻址,最高位x 为1时,为区域间(交叉区域)间接寻址。
将下面的程序下载到仿真PLC,运行时监控累加器1(STANDARD)的值(见下图)。
L P#P 1.0 //16#8000 0008送累加器1
LAR1 //累加器1的内容送AR1
L MW [AR1,P#2.0] //MW3的值送累加器1
MW [AR1, P#2.0]的地址为AR1中的P#1.0加偏移量P#2.0,MW [AR1, P#2.0]即MW3。
由第1条指令的执行结果16#8000 0008可知(见下图),P#P1.0的最高位为1,表示这是区域间(交叉区域)间接寻址。第24~26位(rrr)为2#000,由西门子的资料《S7-300和S7-400寻址》可知,区域标识号2#000表示地址指针不包含地址区。仿真时用PLCSIM设置MW3的值为16#1234,第3条指令的监控结果验证了上述分析的正确性。
http://blog.gkong.com/uploadfile4/2011378389525.jpg
将上述程序的第1条指令改为“L P#1.0”,程序运行结果相同。指针值P#1.0的最高位为0。