请问如下图中的间接寻址指令是否正确,为什么用间接寻址后,最终得到的确是地址的值!
问题补充:
大宝朱林森,你也做测试了,那请问为什么它最终不是把vw832数值所指向的地址的值送给vw960,而是只把vw832的值送给vw960呢,即实现不了间接寻址!请大家分析分析,LAD语法似乎也没有错啊!
另外,在我的LAD图中,你们可能已意识到&vb832,&vb836,&vb840等,请问在MOV_DW的in中的&vb832等也是双字的吗?可以用&vb832,&vb834这样的单字吗?
如上,谢谢。
图片说明:
最佳答案
程序用法没有问题,附图是从在线帮助中截的图,中关于MOV_DWMOV_W的IN和OUT管脚的可用的参数形式
以及在线测试你的程序截图
最终实现的功能是
用间接寻址法,将 VW832的数值传送到VW960
VW836的数值传送到VW962
VW840的数值传送到VW964
补充回复:
1、 每一个V区以字节为单位都有一个地址编号,它是由CPU操作系统分配的,就好比你洒店盖好了,每个房间都有一个门牌号,这个门牌号就用“&VBx”来表示,在PLC中叫地址指针,它里面的客人用“*门牌号”来表示。
2、 V区每一个字节都有一个唯一的地址编号,这个编号是一个32位的二进制数,比如 &VB832 就是 VB832这个存储单元的门牌号,我们通过这个门牌号去找住在里面的客人,这就是间接寻址
3、 假如如规定每个房间都要住8个人,就像每个存储单元都有8个位,我们要访问1个房间的所有人还是两个房间的所有个、还是4个房间的所有人,还是某个房间的某个人,这在现实生活中没有规定,但在西门子200及200 SMART中有明确规定,规定就是不能访问某个房某个人,这理解为间接寻址不能进行位寻址;你只可以访问某个房间的所有8个人(字节寻址)或者相邻两个房间的所有16个人(字寻址),最多只能访问4个房间的32个人(双字寻址,浮点数寻址)
4、 比如程序中
MOVDW &VB832,AC1 将VB832这个存储单元的地址传给32位的寄存器AC1,这条语句就是建立间接寻址指针的过程;
监视程序,可以看到VB832的地址编号是16#8000340(16进制),转换成十进制就是 134218560;
MOVW *AC1,VW960 ,将连续两个单元的内容传送到VW960,AC1指向了哪个单元,上面一条语名MOVDW &VB832,AC1,使它指向了VB832这个存储单元,MOVW决定了访问2个单元,*AC1指明了从AC1指向的的存储单元开始,二个连续单元的数据传送到什地方?后面的操作数指明了是VW960;
两个语句配合起来就实现了通过间接寻址方式将 VW832这个字传到VW960。
如果用MOVB *AC1,VB960 MOVB 决定访问一个字节
如果用MOVDW *AC1,VD960 MOVDW决定访问一个双字或者
如果用MOVR *AC1,VD960 MOVR 决定访问一个双字
5、请问在MOVDW的in中的&vb832等也是双字的吗?
是双字,V区的地址编号是32位的二进制无符号数。
6、可以用&vb832,&vb834这样的单字吗?
&vb832,&vb834都是地址指针,全部的双字,而不是你理解的单字。
图片说明:
提问者对于答案的评价:
讲的很好,若有提高!谢谢!
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc368610.html