PyModbus не может прочитать регистры хранения

Я пытаюсь использовать PyModbus 2.3.0 для чтения значений из некоторых регистров хранения на ПЛК Siemens S7-1200. Я установил некоторую релейную логику, чтобы проверить это на ПЛК, с некоторыми регистрами, содержащими случайные тестовые значения с плавающей запятой. Я пытаюсь сделать все это из стандартной установки Raspbian на Raspberry Pi 3. Подключение осуществляется через Ethernet, и я подтвердил, что PyModbus может подключаться к ПЛК (я пинговал ПЛК, и запрос состояния PyModbus возвращается правда, как вы вскоре увидите). Обличающий фрагмент кода таков:

import pymodbus
import logging
import logging.handlers as Handlers
from pymodbus.client.sync import ModbusTcpClient

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

client = ModbusTcpClient('192.168.15.16', port = '443', timeout = 10, baudrate = 38400)
connection = client.connect()
print('PLC connection status: ', connection)
response = client.read_holding_registers(address = 50, length = 64, unit = 1)
print(response)
client.close()

и результат такой:

PLC connection status:  True
DEBUG:pymodbus.transaction:Current transaction state - IDLE
DEBUG:pymodbus.transaction:Running transaction 1
DEBUG:pymodbus.transaction:SEND: 0x0 0x1 0x0 0x0 0x0 0x6 0x1 0x3 0x0 0x32 0x0 0x1
DEBUG:pymodbus.client.sync:New Transaction state 'SENDING'
DEBUG:pymodbus.transaction:Changing transaction state from 'SENDING' to 'WAITING FOR REPLY'
DEBUG:pymodbus.transaction:Transaction failed. (Modbus Error: [Invalid Message] Incomplete message received, expected at least 8 bytes (0 received)) 
DEBUG:pymodbus.framer.socket_framer:Processing: 
DEBUG:pymodbus.transaction:Getting transaction 1
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
Modbus Error: [Input/Output] Modbus Error: [Invalid Message] Incomplete message received, expected at least 8 bytes (0 received)

Я не могу показать релейную логику, которую я использовал прямо сейчас, однако адрес, предоставленный TIA для регистра с тестовым значением, -% MD50, что, как я считаю, означает, что мне нужно сделать то же, что и выше, и посмотреть на регистр 50. (регистры хранения) с 64 битами данных. Однако кажется, что ПЛК ничего не отправляет в ответ; Я делаю что-то неправильно? Я не совсем понимаю, почему это не работает прямо сейчас.


person fherder    schedule 22.06.2020    source источник
comment
Привет, дальше, если вы можете пропинговать адрес ПЛК с Pi и порта (вы используете порт, отличный от порта по умолчанию, вы также написали этот порт в конфигурации ПЛК?), Это правильно, вы все настроены со стороны Pi. Ваша проблема, скорее всего, связана с ПЛК, знаете ли вы, что вам нужно сделать эти адреса памяти доступными на TIA? Вы следовали руководству или руководству? Взгляните на этот   -  person Marcos G.    schedule 22.06.2020
comment
И еще пара вещей: в вашем коде Python вы должны удалить baudrate=38400, который нужен только для Modbus RTU через последовательный порт, но не для Modbus TCP. Существует видео, с помощью которого вы можете выполнить настройку вашего ПЛК. может стоить проверить. Также неплохо проверить настройку Modbus с того же ПК, который вы используете для TIA, с помощью чего-то вроде Modbus Poll или QModMaster (как на видео).   -  person Marcos G.    schedule 22.06.2020


Ответы (1)


Вы можете использовать Wireshark для мониторинга связи между клиентом и сервером. Это поможет вам лучше диагностировать ошибку. Каждая ячейка регистра временного хранения для Modbus содержит 16 бит данных. Инструкция: client.read_holding_registers (адрес = 50, длина = 64, единица = 1) вернет значения из адресной ячейки 50 до 50 + 64 регистра временного хранения.

person Alok    schedule 31.03.2021