繁体   English   中英

PyModbus 无法通过 TCP 读取 RTU 中的输入寄存器

[英]PyModbus failing to read input registers in RTU Over TCP

我尝试使用pymodbus读取 Modbus 信号但出现错误源如下:
服务器响应TCP时有MAC地址通知功能。 Modbus 通讯怎么可能没有错误? 如何删除 TCP 标头部分?

在此处输入图片说明

手册地址如下:https ://www.eztcp.com/en/download/pds_files/an_ezmanager_en.pdf

from pymodbus.client.sync import ModbusTcpClient
from pymodbus.transaction import ModbusRtuFramer as ModbusFramer
import time

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

def run_read_data(ip, port_num, unit_num):
    while True:
        client = ModbusTcpClient(ip, port=port_num, framer=ModbusFramer)
        con = client.connect()
        while con :
            rr = client.read_input_registers(0,10, unit=unit_num)        
            try:
                print(rr,rr.registers)

            except Exception as e:
                print(f"{type(e).__name__}: {e}")
  
                time.sleep(2)
                client.close()
                time.sleep(2)
                break
            time.sleep(1)
        time.sleep(1)

if __name__ == "__main__":
    ip = "x.x.x.x" 
    port_num = x
    unit_num = 0x1
    run_read_data(ip, port_num,unit_num)

结果是这样的:

DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x18 0x4 0x0 0x0 0x0 0xa 0x72 0x4
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
DEBUG:pymodbus.transaction:RECV: 0x30 0x30 0x33 0x30 0x66 0x39 0x31 0x31 0x34 0x30 0x38 0x35 0xd 0xa 0x18 0x4 0x14 0xe8 0xf9 0x2 0x45 0xf3 0x88 0x1 0x22
DEBUG:pymodbus.framer.rtu_framer:CRC invalid, discarding header!!
DEBUG:pymodbus.framer.rtu_framer:Resetting frame - Current Frame in buffer - 0x30 0x30 0x33 0x30 0x66 0x39 0x31 0x31 0x34 0x30 0x38 0x35 0xd 0xa 0x18 0x4 0x14 0xe8 0xf9 0x2 0x45 0xf3 0x88 0x1 0x22
DEBUG:pymodbus.framer.rtu_framer:Frame check failed, ignoring!!
DEBUG:pymodbus.framer.rtu_framer:Resetting frame - Current Frame in buffer -
DEBUG:pymodbus.transaction:Getting transaction 24
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
AttributeError: 'ModbusIOException' object has no attribute 'registers'
DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x18 0x4 0x0 0x0 0x0 0xa 0x72 0x4
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
DEBUG:pymodbus.transaction:RECV: 0x30 0x30 0x33 0x30 0x66 0x39 0x31 0x31 0x34 0x30 0x38 0x35 0xd 0xa 0x18 0x4 0x14 0xe9 0x9f 0x2 0x45 0xf3 0xd5 0x1 0x22
DEBUG:pymodbus.framer.rtu_framer:CRC invalid, discarding header!!
DEBUG:pymodbus.framer.rtu_framer:Resetting frame - Current Frame in buffer - 0x30 0x30 0x33 0x30 0x66 0x39 0x31 0x31 0x34 0x30 0x38 0x35 0xd 0xa 0x18 0x4 0x14 0xe9 0x9f 0x2 0x45 0xf3 0xd5 0x1 0x22
DEBUG:pymodbus.framer.rtu_framer:Frame check failed, ignoring!!
DEBUG:pymodbus.framer.rtu_framer:Resetting frame - Current Frame in buffer -
DEBUG:pymodbus.transaction:Getting transaction 24
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
AttributeError: 'ModbusIOException' object has no attribute 'registers'

您收到的消息无效,您可以看到 CRC 检查失败 - 问题出在 modbusTCP 服务器上。 由于该response没有属性registers导致异常的原因。 然而,如果你想看看错误是什么样的,你应该打印rr而不做任何其他事情。

检查是否有错误的好方法是使用isError()方法:

if rr.isError():
    # handle error
else:
    # proceed with response

如果您尝试解码消息,则应按如下方式使用BinaryPayloadDecoder

decoder = BinaryPaloadDecoder.fromRegisters(rr.registers)
value = decoder.decode_32bit_float()

完整参考 在这里

不幸的是,我不知道您所说的“如何删除 TCP 标头部分”是什么意思。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM