发布于 2015-07-19 16:38:58
14楼
Network 1
// 网络注释
LD M0.0
EU
MOVD &VB0, VD100 //把VD0的首地址读取到VD100
MOVR VD0, VD200
Network 2 // 循环9次
LD M0.0
FOR VW104, 1, 9
Network 3 // 因为是下面是浮点数指令,而一个浮点数又占4个字节,所以这里是加4。又因为VD100最初是VD0的首地址,这个指令执行一次后VD100里就是VD4的首地址,执行两次后就是VD8的首地址,以此类推,循环结束后VD100里就是VD36的首地址。
LD M0.0
+D 4, VD100
Network 4 // 用VD100里的数据为地址的存储器的内容和VD200相加,结果放在VD200。
LD M0.0
+R *VD100, VD200
Network 5
NEXT
上面是一个用指针做得从VD0到VD36连续10个浮点数相加的程序(没有实际测试)。你可以用你熟悉的方法(假设你现在不会用间接寻址)写出来和用间接寻址写出来的比较一下,数据的个数越多效果越明显。其实指针还是很好理解,关键是你要跳出来。vb0,vw0,vd0我们很熟悉,但是PLC执行这些地址时有可能用的是另一种表示方法,我们假设是一种PLC更容易理解的表示地址的方法,它就是一个32位的数,你又何必硬生生的要把它拆分成两个16位的数呢。movd &vb0,vd100就是把vb0的PLC更容易理解的表示地址的方法存放到vd100里。vw0,vd0都是以vb0为首地址的(我们不用去管西门子的数据存储方式,什么低地址高字节,这些都是plc自己的事情),既然vd100里是vb0的地址,movw *vd100,vw200就是把vw0传送给vw200;movd *vd100,vd202就是把vd0传送给vd202。就是我们用首地址以字节指令就是读取字节的内容,以字指令就是读取字的内容,以双字指令就是读取双字的内容。你也不要去纠结&vb0,&vw0,&vd0有什么不同,你可以在编程软件里分别输入一下看看,当输入&vw0或者&vd0时系统自动会变成&vb0。
说得有点多,我都觉得有点啰嗦,有点绕。没办法,语文太烂了,理解万岁。
学无止境