下面的程序循环错在哪?

分享到:
1880
下一篇 >

菜鸟疑问:

程序用MODBUS通讯读取12个数据,在子程序一分钟用循环转换一次数据从VB1010开始除以10存VD300至VD344,用循环以后读不到数据,监控后发现MODBUS不通讯,把子程序删除后通讯正常了,循环有错误,错在哪请老师们指点一下

主程序:

LD     SM0.0

CALL   ZYDY_4:SBR0, 1, 3

网络2

LD     SM0.0

CALL   WSD:SBR4

读取数据的子程序 ZYDY_4  就是采集12个温湿度数据存放在VW1010-----VW1032

LD     SM0.0

=      L60.0

LD     SM0.0

=      L63.7

LD     L60.0

CALL   MBUS_CTRL:SBR1, L63.7, 9600, 0, +3000, M2.6, VB2000

网络2

LD     SM0.1

R      L8.0, 30

网络3

LD     SM0.0

MOVW   #tingzhidizhi:LW2, LW6

+I     +1, LW6

网络4

LD     SM0.0

LPS

A      T33

EU

MOVW   #kaishidizhi:LW0, LW4

LPP

TOF    T33, +10

网络5

LD     SM0.0

LPS

AW=    LW4, +1

EU

S      L8.0, 1

LRD

AW=    LW4, +2

EU

S      L8.1, 1

LRD

AW=    LW4, +3

EU

S      L8.2, 1

LPP

AW=    LW4, +4

EU

S      L8.3,

网络6

LD     SM0.0

A      L8.0

=      L60.0

LD     SM0.0

A      L8.0

EU

=      L63.7

LD     L60.0

CALL   MBUS_MSG:SBR2, L63.7, 1, 0, 40001, +8, &VB1010, L9.2, VB2001

网络7

LD     L9.2

EU

LPS

+I     +1, LW4

AENO

AW=    LW4, LW6

MOVW   #kaishidizhi:LW0, LW4

LPP

R      L8.0, 1

网络8

LD     SM0.0

A      L8.1

=      L60.0

LD     SM0.0

A      L8.1

EU

=      L63.7

LD     L60.0

CALL   MBUS_MSG:SBR2, L63.7, 2, 0, 30001, +2, &VB1026, L9.3, VB2002

网络9

LD     L9.3

EU

LPS

AB<>   VB2002, 0

MOVD   +0, VD1026

LRD

+I     +1, LW4

AENO

AW=    LW4, LW6

MOVW   #kaishidizhi:LW0, LW4

LPP

R      L8.1, 1

网络10

LD     SM0.0

A      L8.2

=      L60.0

LD     SM0.0

A      L8.2

EU

=      L63.7

LD     L60.0

CALL   MBUS_MSG:SBR2, L63.7, 3, 0, 30001, +2, &VB1030, L9.4, VB2003

网络11

LD     L9.4

EU

LPS

AB<>   VB2003, 0

MOVD   +0, VD1030

LRD

+I     +1, LW4

AENO

AW=    LW4, LW6

MOVW   #kaishidizhi:LW0, LW4

LPP

R      L8.2, 1

数据转换的子程序 WSD  把采集的数据转成小数存放在VD300---VD344

Network 1 

LD     SM0.0

MOVD   &VB1010, AC1

AENO

MOVD   &VB300, AC2

Network 2

LD     SM0.0

A      SM0.4

EU

FOR    VW200, 1, 13

Network 3

LD     SM0.0

MOVW   *AC1, LW2

AENO

ITD    LW2, LD4

AENO

DTR    LD4, LD24

AENO

MOVR   LD24, *AC2

AENO

/R     10.0, *AC2

Network 4

LD     SM0.0

+I     +2, AC1

AENO

+I     +4, AC2

Network 5

NEXT

斑竹:

贴子加工一下吧。写上每一段程序的目的、实现方法等。

菜鸟:

这个程序主要目的采集10个温度和2个湿度,子程序 ZYDY_4没问题,采集的数据存放在VW010----VW1032区间,采集的数据是整数如(12.3度)就是123,数据转换的子程序 WSD是把采集的数据转成小数,存放在VD300----VD344之间.原程序用的地址比较多,没有用循环,现在我想优化一下用循环,问题就在这,子程序 ZYDY_4不运行了

LD     SM0.0

A      L8.0

=      L60.0

LD     SM0.0

A      L8.0

EU

=      L63.7

LD     L60.0

CALL   MBUS_MSG:SBR2, L63.7, 1, 0, 40001, +8, &VB1010, L9.2, VB2001

通讯不上, L9.2不为ON,程序就不向下运行.把子程序WSD删除,程序就正常了.

斑竹:

程序比较多,一下子没看完。

有一个要留意一下的,看你程序存在没有?

MSG的done位没有on之前不可以更改读进来的数据,不知道你更改过没有。程序没有解释又不能转回程序,很难看。

看你那个子程序跟通讯的都没有什么关系,不至于影响通讯程序吧?你只是用间接寻址读了一下。

还有试一下不要用AC。因为AC数据监控不了。我不太喜欢用AC调程序。稳定过后再换回来。

菜鸟:

程序肯定存在,原子程序没用循环,数据和MSG通讯都正常,前几天用循环改了一下,MSG读不到数据了,把循环去掉就正常了,找不到原因,因为不能上传附件,图片也贴不上,前现在能传附件了,我把程序给上传,请你帮看一下,找一下错误原因。

斑竹:

我估计你是在done位没有on的时候读了里面的值,这个时候的值不保证完整的。因为人家已经告诉你没完成的,你硬要把值读出来,后果自负了。(致命的主要位置)

for指令不执行的时候,是不是for下面的指令也会执行一次的呢?你就算不循环,程序也一样在执行,而且每个周期都在执行一次。(致命的附属因素)

建议你不要用循环指令做,因为你的事情一点都不着急的。还每1分钟才执行一次。干嘛要全部挤在一个周期里面完成呢?相当于突然有**加板加了100个小时。然后平常就没事做。你想想?你完全可以用done位触发去算这个事情。慢慢做,平均做。

做一个稳定的子程序做转换,谁done了就谁使用这个转换程序一次。

上面的解释可能不能正中你的问题,但是建议的做法一定可以绕过你的问题,你值得考虑考虑。

菜鸟:

原来程序很稳定,就是在子程序内把VW1010内值转换成双整数,除以10再转成浮点数后放在VD300。前几天心血来潮,用个循环试以下 ,监控调试时发现MSG给探头通讯不正常,把循环删除MSG通讯就正常,MSG读取数据后放在VB1010以后的地址,用循环只读取VW1010地址内的值,没有在done位ON前改变MSG内值,在4楼有我上传的附件,内有程序。谢谢老师的指点。

斑竹:

程序看过了。没有东西试,不知道现状。纸上谈兵很难看出有什么问题。

你现在主要问题是加了循环就影响通讯了。把循环里面用到的全部地址,都改成没有使用过的物理输入点和物理输出点地址,ID4,QD3试试。


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