Pymodbus:响应中的字节计数错误

2024-10-01 00:15:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我们从RS485设备请求14个响应,有时我们得到的回复没有设置9个字节。这是因为它有时会在三个论点中作出回应。在

Normal: 
CALL->     01 04 00 00 00 02 71 CB 
RESPONSE-> 01 04 04 43 59 E6 66 F4 59


Error:
CALL->      01 04 00 00 00 02 71 CB 
RESPONSE -> 01 04 04 43
            59 CC CD AA 86 

发生此错误时,从PYI获取消息:

^{pr2}$

我试过让手机进入睡眠状态,这样它就不会让手机失去通话功能,但我无论如何都能收到。我也读过https://wingpath.co.uk/docs/modtest/troubleshoot.html 他们说:

"Wrong byte count in response: XXX when expecting XXX"

The byte count in the response sent by the slave is not what was expected for the count that ModTest sent in the request.

Turn on tracing to get more information.

Check that your slave is functioning correctly.

If you want ModTest to accept the response even though it is incorrect, you could deselect Strict Checking.

但是我不知道如何在PYMODBUS上进行活动跟踪,这个函数是正确的,另一个是我认为没有使用的lib

代码是这样的

from __future__ import division
import pymodbus
import serial
from pymodbus.pdu import ModbusRequest
from pymodbus.client.sync import ModbusSerialClient as ModbusClient #initialize a serial RTU client instance
from pymodbus.transaction import ModbusRtuFramer
from time import sleep
from pymodbus.constants import Endian              # Nodig voor 32-bit float getallen (2 registers / 4 bytes)
from pymodbus.payload import BinaryPayloadDecoder  # Nodig voor 32-bit float getallen (2 registers / 4 bytes)
from pymodbus.payload import BinaryPayloadBuilder  # Nodig om 32-bit floats te schrijven naar register

import logging
logging.basicConfig()
log = logging.getLogger()
log.setLevel(logging.DEBUG)

#
method = "rtu"
port = "COM1"
baudrate = 2400
stopbits = 1
bytesize = 8
parity = "N"
timeout = 10 # I SET THIS TO 10 MAYBE IT WOULD HELP BUT DIDN'T
retries = 5  # SAME THING WITH THIS ONE
#
try:
    client = ModbusClient(method = method, port = port, stopbits = stopbits, bytesize = bytesize, parity = parity, baudrate = baudrate, timeout = timeout, retries = retries)
    connection = client.connect()
    print (connection)
except:
    print ("Modbus connectie error")
#
def 420 (y):
    variables = [0,6,12,18,24,30,36,70,72,74,76,78,342,344]
    labels = ["Voltage","Corriente","Potencia_Activa","Potencia_Aparente","Potencia_Reactiva","Factor_Potencia","Angulo_Fase","Frecuencia","Potencial_Activa_Consumida","Potencia_Activa_Inyectada","Potencia_Reactiva_Consumida","Potencia_Reactiva_Inyectada","Energia_Activa_Total","Energia_Reactiva_Total"]
    unidades = ["V","A","W","VA","VAr","%","Grados","HZ","kWh","kWh","kVArh","kVArh","kWh","kVArh"]
    LISTA = []
    h = 0
    hh = 0
    for xx in variables:
        try:
            data = client.read_input_registers(xx, 2, unit=1)
            decoder = BinaryPayloadDecoder.fromRegisters(data.registers, Endian.Big)
            eastron = round(decoder.decode_32bit_float(), 3)
            weaito = str(labels[h]) + " = " + str(eastron) + " " + str(unidades[hh])
            LISTA.append(weaito)
            h = h + 1
            hh = hh + 1
            sleep(0.5)
        except:
            print ("PICO")
            sleep(1)
    print(LISTA)

我希望有一种方法来解决这个问题,也许只是再咨询一下,直到我得到正确的答案。我不擅长尝试,除非有可能有答案。在


Tags: theinfromimportclientresponselogginghh
1条回答
网友
1楼 · 发布于 2024-10-01 00:15:30

您似乎正在经历一个已知的issue的字符间距。在

不过,有一个简单的解决办法。首先,确保您使用的是pymodbus版本2.2.0(如果路径设置正确,可以在Windows上打开命令行终端并键入pip list,否则您必须移动到存储pip.exe的脚本Python文件夹)。在

然后更改代码以添加声明为Falsestrict参数:

....
client = ModbusClient(method = method, port = port, stopbits = stopbits, bytesize = bytesize, parity = parity, baudrate = baudrate, timeout = timeout, retries = retries)
client.strict = False    #Use Modbus interchar spacing as timeout to prevent missing data for low baudrates
connection = client.connect()
...

这将根据Modbus规范将字符间距定义为所选波特率下比特时间的1.5倍,而不是使用默认的from socket.interCharTimeout

^{pr2}$

如果您能用这个解决方案解决您的问题,那么您应该能够减少设备一次性读取28个寄存器的开销。在

如果你的问题没有解决,我想你可能有硬件问题。我建议您将代码放在一边一段时间,尝试用QModMaster或类似的方法读取寄存器,以确保您的硬件按预期运行。(您可能会遇到噪音或接地问题,从而缩短了您的框架,如果您希望在前面提供一些指针,请编辑您的问题,以包括硬件的更多详细信息,例如:设备的种类和连接方式)。在

相关问题 更多 >