关于用for循环指令给数据块赋值的问题

分享到:
291
下一篇 >

菜鸟:

请大家帮我分析一下,这个程序。要实现的想法是: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是周而复始循环执行的,这一点你先要弄清楚。



你可能感兴趣: 工控菜鸟园 自动化系统 SIMATIC S7-200 PLC
无觅相关文章插件,快速提升流量