我们从RS485设备请求14个响应,有时我们得到的答复没有设置的9个字节。那是因为它有时会用3个参数回答。Normal:CALL-> 01 04 00 00 00 02 71 CBRESPONSE-> 01 04 04 43 59 E6 66 F4 59Error:CALL-> 01 04 00 00 00 02 71 CBRESPONSE -> 01 04 04 43 59 CC CD AA 86当错误发生时,我从pymodbus得到这个味精:DEBUG:pymodbus.transaction: Incomplete message received, Expected 9 bytes Recieved 4 bytes !!!!DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'DEBUG:pymodbus.transaction:RECV: 0x1 0x4 0x4 0x3eDEBUG:pymodbus.framer.rtu_framer:Frame check failed, ignoring!!DEBUG:pymodbus.framer.rtu_framer:Resetting frame - Current Frame in buffer - 0x1 0x4 0x4 0x3eDEBUG:pymodbus.transaction:Getting transaction 1DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'我已经尝试过为它睡个好觉,这样它就不会因为通话而使设备崩溃,但是无论哪种方式我都会得到。我也读过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上进行主动跟踪,该功能是正确的,另一个是针对我不使用的库的,我认为代码看起来像这样from __future__ import divisionimport pymodbusimport serialfrom pymodbus.pdu import ModbusRequestfrom pymodbus.client.sync import ModbusSerialClient as ModbusClient #initialize a serial RTU client instancefrom pymodbus.transaction import ModbusRtuFramerfrom time import sleepfrom 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 registerimport logginglogging.basicConfig()log = logging.getLogger()log.setLevel(logging.DEBUG)#method = "rtu"port = "COM1"baudrate = 2400stopbits = 1bytesize = 8parity = "N"timeout = 10 # I SET THIS TO 10 MAYBE IT WOULD HELP BUT DIDN'Tretries = 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)我会想办法解决问题,也许只是再次咨询,直到获得正确答案为止。我的尝试不好,除了可能没有答案。 最佳答案 您似乎遇到了一个以字符间距为单位的已知issue的情况。不过,有一个简单的解决方法。首先,请确保您使用的是pymodbus 2.2.0版(如果您正确设置了路径,则可以在Windows上打开命令行终端并键入pip list,否则,必须将其移至脚本Python文件夹,其中已存储)。然后更改您的代码以将声明为pip.exe的strict参数添加到:....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 baudratesconnection = client.connect()...这将根据Modbus规范将字符间距定义为所选波特率的位时间的1.5倍,而不是使用False中的默认值:self._t0 = float((1 + 8 + 2)) / self.baudrateself.inter_char_timeout = 1.5 * self._t0如果您可以使用此解决方案解决问题,则应该能够减少一次性读取所需28个寄存器的设备开销。如果您的问题没有解决,我认为您可能遇到了硬件问题。我建议您将代码搁置一段时间,然后尝试使用QModMaster或类似的方法读取寄存器,以确保您的硬件按预期运行。 (您可能会听到噪音或接地问题,从而缩短了框架的长度,如果您想在前端获得一些提示,请编辑问题,以包括有关硬件的更多详细信息,即:设备的种类以及如何连接它们)。关于python - Pymodbus:响应的字节数错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56659531/
10-09 14:25