菜鸟疑问:
程序用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试试。