我尝试使用 pymodbus 读取Modbus信号,但得到错误,来源如下:
pymodbus
当服务器响应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) 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