Доступ к необработанным байтам в транзакциях pyModbus - PullRequest
1 голос
/ 07 октября 2019

У меня есть скрипт на python, который может обрабатывать транзакции Modbus с использованием библиотеки pymodbus. В целях устранения неполадок я хотел бы распечатать необработанные байты, отправленные и полученные на устройство, предпочтительно в шестнадцатеричном формате.

Вот упрощенный код, см. Комментарии внизу для примера того, что я хотел бы получить. Я использовал TCP-клиент, но хотел бы, чтобы он работал и на ModbusSerialClient.

from pymodbus.client.sync import ModbusTcpClient

ipAddress = '10.130.14.174'
registerToRead = 3000

client = ModbusTcpClient(ipAddress, port=502)
connection = client.connect()

response = client.read_holding_registers(registerToRead, 1, unit=1)

print(response.registers)

# Would like to get something like:
# OUT: [00h] [00h] [00h] [00h] [00h] [06h] [01h] [03h] [0Bh] [B8h] [00h] [01h] 
# IN : [00h] [00h] [00h] [00h] [00h] [05h] [01h] [03h] [02h] [00h] [FFh] 

Я пытался response.encode(), но только вернул b'\x02\x00\xff'

1 Ответ

2 голосов
/ 08 октября 2019

Чтобы получить необработанные кадры, вам просто нужно запустить запрос в режиме отладки.

Это будет примерно так:

from pymodbus.client.sync import ModbusTcpClient
import logging
FORMAT = ('%(asctime)-15s %(threadName)-15s '
          '%(levelname)-8s %(module)-15s:%(lineno)-8s %(message)s')
logging.basicConfig(format=FORMAT)
log = logging.getLogger()
log.setLevel(logging.DEBUG)

ipAddress = '10.130.14.174'
registerToRead = 3000

client = ModbusTcpClient(ipAddress, port=502)
connection = client.connect()

response = client.read_holding_registers(registerToRead, 1, unit=1)

Если вы запускаете этот код из PythonКонсоль теперь вы должны увидеть что-то похожее на это:

2019-10-08 13:10:42,872 MainThread      DEBUG    transaction    :111      Current transaction state - TRANSACTION_COMPLETE
2019-10-08 13:10:42,872 MainThread      DEBUG    transaction    :116      Running transaction 3
2019-10-08 13:10:42,872 MainThread      DEBUG    transaction    :215      SEND: 0x0 0x3 0x0 0x0 0x0 0x6 0x1 0x3 0x0 0x1 0x0 0x1
2019-10-08 13:10:42,872 MainThread      DEBUG    sync           :73       New Transaction state 'SENDING'
2019-10-08 13:10:42,872 MainThread      DEBUG    transaction    :224      Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
2019-10-08 13:10:42,873 MainThread      DEBUG    transaction    :300      Changing transaction state from 'WAITING FOR REPLY' to 'PROCESSING REPLY'
2019-10-08 13:10:42,873 MainThread      DEBUG    transaction    :229      RECV: 0x0 0x3 0x0 0x0 0x0 0x5 0x1 0x3 0x2 0x0 0x14
2019-10-08 13:10:42,873 MainThread      DEBUG    socket_framer  :147      Processing: 0x0 0x3 0x0 0x0 0x0 0x5 0x1 0x3 0x2 0x0 0x14
2019-10-08 13:10:42,873 MainThread      DEBUG    factory        :266      Factory Response[ReadHoldingRegistersResponse: 3]
2019-10-08 13:10:42,873 MainThread      DEBUG    transaction    :379      Adding transaction 3
2019-10-08 13:10:42,873 MainThread      DEBUG    transaction    :390      Getting transaction 3
2019-10-08 13:10:42,873 MainThread      DEBUG    transaction    :189      Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
>>> 

Если вы хотите больше деталей или вам нужно обработать больше, чем пару кадров, я бы посоветовал установить Wireshark , что оченьмощный. Если вам нужно сделать то же самое с Modbus через последовательный порт, вы можете попробовать SerialPCAP .

EDIT : это, вероятно, то, что вам сейчас не нужно, но вЕсли у вас нет доступа к любой из сторон последовательного соединения Modbus, вы можете нажать на шину или использовать программный анализатор, как я объяснил здесь , здесь и здесь .

Для Modbus TCP я не знаю какой-либо простой методики мониторинга трафика с помощью Wireshark, если у вас нет доступа ни к одной из сторон канала, ни к сетевому коммутатору .

...