首页 > 解决方案 > 由于添加 TCP 标头,PyModbus 无法通过 TCP 进行 RTU

问题描述

我正在使用串行以太网设备服务器 (CSE-H55N2) https://www.eztcp.com/en/download/pds_files/an_ezmanager_en.pdf

在此处输入图像描述

使用 CSE-H55N2 的 MAC 地址通知功能时,将 MAC 地址添加到 Modbus 信号中,并通过 TCP 通信进行传输。

使用MAC地址通知功能时,pymodbus出现如下错误。

如果不使用 CSE-H55N2 的 MAC 地址通知功能,则不会出现错误。

使用 MAC 地址通知功能时,如何正确接收数据?

TCP header部分中的数据出现时,似乎发生了CRC错误。我该如何解决?

程序源代码如下

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


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

ip = "x.x.x.x" 
port_num = x
unit_num = 1


client = ModbusTcpClient(ip, port=port_num, framer=ModbusFramer)
client.connect()
rr = client.read_input_registers(0,10, unit=unit_num)  
print(rr,rr.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 0x55 0xb 0x2 0x52 0xac 0x9 0x1 0x28
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 0x55 0xb 0x2 0x52 0xac 0x9 0x1 0x28
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'
Traceback (most recent call last):
  File "d:\devel\python\pymodbus\namjun_mac2.py", line 18, in <module>
    print(rr,rr.registers)
AttributeError: 'ModbusIOException' object has no attribute 'registers'

重要部分

good result
SEND: 0x1 0x4 0x0 0x0 0x0 0xa 0x70 0xd
RECV: 0x1 0x4 0x14 0x9b 0xf7 0x0 0x0 0x0 0x22 0x0 0x0 0x79 0xef 0x43 0xba 0x0 0x0 0x0 0x0 0xa7 0xae 0x43 0xbb 0x39 0x10

error result : added TCP header (MAC address)
SEND: 0x18 0x4 0x0 0x0 0x0 0xa 0x72 0x4
RECV: 0x30 0x30 0x33 0x30 0x66 0x39 0x31 0x31 0x34 0x30 0x38 0x35 0xd 0xa 0x18 0x4 0x14 0x6c 0x4 0x2 0x49 0x8b 0x19 0x1 0x24

标签: pythonmodbuspymodbus

解决方案


推荐阅读