python - 由于添加 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
解决方案
推荐阅读
- mysql - 与相关表中的条件合并
- datetime - 无法从 stata 中的日期变量获取季度值
- batch-file - Title of run.bat
- laravel - 将 whereIn 与 livewire 一起使用时出现无效的参数编号错误
- python - 尝试使用 Numpy 相等函数比较两个不同的数组,但每次都返回 True
- html - 模式属性:至少需要 1 个非空白字符,并允许字符前后有空白
- ruby-on-rails - Rails 文件上传“TypeError:无法转储文件”
- reactjs - React DND 美丽的去另一个环节后如何保持物品的排列?
- excel - 比较多列列表框中的单元格和选定项时类型不匹配
- csh - 默认 cshell 配置已损坏