菜鸟:
请大家帮我分析一下,这个程序。要实现的想法是:I0.0不动作时,VD400=1,VD404=1,VD500=1,VD504=1,此时对应的Q点输出点亮;I0.0动作后,通过FOR循环把VD400-VD504数据块全部清零。下面是我写的程序,大家帮我看看,为什么FOR循环没有把数据块清零呢?谢谢!
Network 1
LD SM0.0
MOVD &VB400, VD40
Network 2 //初始值
LD SM0.0
MOVD 1, VD400
AENO
MOVD 1, VD404
AENO
MOVD 1, VD500
AENO
MOVD 1, VD504
Network 3 //比较后,输出
LD SM0.0
LPS
AD= VD400, 1
= Q0.0
LRD
AD= VD404, 1
= Q0.2
LRD
AD= VD500, 1
= Q0.4
LPP
AD= VD504, 1
= Q0.6
Network 4 //FOR循环
LD I0.0
EU
FOR VW10, +1, +108
Network 5
LD SM0.0
MOVB 0, *VD40
INCD VD40
Network 6
NEXT
侠客:
清零就用FILL
至圣:
我认为楼主的这个程序,他写的时候,就没明白PLC是如何执行程序的。
请看手册第4章,PLC的基本概念,仔细阅读。
菜鸟:
跳出FOR循环,一般都有哪些办法,
至圣:
这个程序是不是只有vd400可以清零啊?
除了网络5有争议,上面的好像没错。
Network 5
LD SM0.0
MOVB 0, *VD40>>>>>>你用movb去传一个值到vd400?
INCD VD40>>>>>>你面向双字的间接寻址,用自加1吗?自加4吧?
你改好这两个再自己调试一下再说。
侠客:
NETWORK5也没有大问题,他循环了108次,每次move一个字节。按你的写法,循环27次就可以了。
问题是楼主没看到清零的这个结果,关键不是没有清零,而是他没看到。
I0.0的上升沿确实已经清零了,但是下一个扫描周期,又把对应的地址设置为1了,所以他看不到。如果他把Network3放到程序的*后,可能还能看到输出点断开一下,按现在的位置,一直为1。
楼主, 把前面2个network的SM0.0改为SM0.1看看运行效果
不是FOR循环的问题。
所有指令都没问题,PLC也没有错误执行,所以整个程序没有“问题”,但没有“实现”你想要的结果。
程序不会停留在FOR指令上,也不会执行完FOR后就停止,NETWORK1至NETWORK5是周而复始循环执行的,这一点你先要弄清楚。