求大神看看这程序哪里错了?为什么一直报错,求大神指教

程序是为了循环读取功率仪704地址的数据,程序段如下:

import serial 
import modbus_tk
import modbus_tk.defines as cst
from modbus_tk import modbus_rtu
import time

def sleeptime(hour,min,sec):
    return hour*3600 + min*60 + sec
master = modbus_rtu.RtuMaster(
    serial.Serial('COM8', baudrate=19200, bytesize=8, parity='N', stopbits=1)
)
master.set_timeout(5.0)
while (True):

    data = master.execute(1, cst.READ_HOLDING_REGISTERS, 704, 1)
    print (data)
    second = sleeptime(0,0,3)
    time.sleep(second)

但是每次运行只有第一次能读出来,然后后面就出现以下报错:

Traceback (most recent call last):
  File "C:\Users\zqc\Desktop\新建文本文档 (2).PY", line 15, in <module>
    data = master.execute(1, cst.READ_HOLDING_REGISTERS, 704, 1)
  File "E:\Python\lib\site-packages\modbus_tk\utils.py", line 39, in new
    raise excpt
  File "E:\Python\lib\site-packages\modbus_tk\utils.py", line 37, in new
    ret = fcn(*args, **kwargs)
  File "E:\Python\lib\site-packages\modbus_tk\modbus.py", line 306, in execute
    response_pdu = query.parse_response(response)
  File "E:\Python\lib\site-packages\modbus_tk\modbus_rtu.py", line 46, in parse_response
    raise ModbusInvalidResponseError("Response length is invalid {0}".format(len(response)))
modbus_tk.exceptions.ModbusInvalidResponseError: Response length is invalid 0

看提示呀,响应消息长度不对。 是不是构造的命令不对? 抓包看下通信消息。

我也是这个问题,我的原因是AB接触不良,这问题不好排查,哈哈,总以为是程序的事呢

这个问题解决了吗?我也遇到次现象。

以下是我的觀察與想法:
我想是因為沒有連接到你所設定的slave ID :1裝置
用邏輯去量訊號可以看到,指令:master.execute(1, cst.READ_HOLDING_REGISTERS, 704, 1),
除了發送給slave指令外,他還會再收到slave的回傳資料(?),回報連接正常。

像是:
有連接的slave 13時下指令:
master.execute(13, cst.WRITE_SINGLE_REGISTER, 11, output_valu e= 0)

img

沒有連接的slave 12時下指令:
master.execute(12, cst.WRITE_SINGLE_REGISTER, 11, output_value= 0)

img


並且python報錯:

img

我也遇到这样问题,PC与ardunio 板子(模拟modbus slave器件,使用modbus slave库,查了通讯设定是:9600,8,N,1)通讯,上位机使用python 和 Modbus_tk库,发现通讯成功率非常非常低,往往只有第一次通讯成功,随后开始报“Response length is invalid 0”,发现类似的程序在公司电脑上没什么问题,后来更换了很短的USB连线后,发现通讯成功率大大提高,但是也会出现上述报错。同时连接电脑的还有以USB转TTL形式串行通讯的ardunio板子(模拟串口通讯器件),通讯没有问题。

推测原因:使用modbus_tk库,因为某种原因,以通讯设定:9600,8,N,1的情况下,对通讯连线或PC端USB口稳定性要求高,建议更换短的或质量好的通讯线,并且避免使用不带校验位的串口通讯设定(如果从机能够修改设定的话)。查了网上有人也建议更换通讯线或USB转串口器件。

这个问题没有工具的话有些难差原因,如果监控数据的话,估计会看到乱码。网上查了好几次没得到明确的答案,所以把自己的发现写出来供大家参考,不喜勿喷,谢谢。