简体   繁体   English

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

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

I tried to read Modbus signal using pymodbus but got error The source is as follows:我尝试使用pymodbus读取 Modbus 信号但出现错误源如下:
There is a MAC address notification function when the server responds to TCP.服务器响应TCP时有MAC地址通知功能。 How can Modbus communication be possible without error? Modbus 通讯怎么可能没有错误? How do I remove the TCP header part?如何删除 TCP 标头部分?

在此处输入图片说明

The manual is the address below:https://www.eztcp.com/en/download/pds_files/an_ezmanager_en.pdf手册地址如下: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)

and the result is this:结果是这样的:

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'

The message you are getting is invalid, you can see that CRC check failed - the problem is with modbusTCP server.您收到的消息无效,您可以看到 CRC 检查失败 - 问题出在 modbusTCP 服务器上。 Because of that response has no atribute registers what causes an exception.由于该response没有属性registers导致异常的原因。 However, if you want to see what error looks like, you should print rr without anything else.然而,如果你想看看错误是什么样的,你应该打印rr而不做任何其他事情。

Good way to check if there was an error is to use isError() methond:检查是否有错误的好方法是使用isError()方法:

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

If you're trying to decode message you should use BinaryPayloadDecoder as follows:如果您尝试解码消息,则应按如下方式使用BinaryPayloadDecoder

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

Full reference here .完整参考 在这里

Unfortunately, I don't know what you mean by "How do I remove the TCP header part".不幸的是,我不知道您所说的“如何删除 TCP 标头部分”是什么意思。

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

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