Как сформировать ЗВОНОК в PYMODBUS (Модикон?) - PullRequest
0 голосов
/ 31 января 2020

Я нахожусь в серьезной битве с солнечным инвертором. (INGETEAM 3play) Я подключен по TCP / IP.

Мне нужно понять, как сформировать мой вызов, потому что у меня нет ответа, который я хочу, а также я не знаю, сколько битов я жду ответа. Вот вызов, который мне нужно сделать:

Call and answer

Я уверен, что 01 - это ID 03 означает Регистр хранения, поэтому как мне сформировать отдых (00 00 00 06) ?? Это код:

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

variables = [0,6,12,18,24,30,36,70,72,74,76,78,342,344]

data = client.read_holding_registers(0, 2, unit=1)
decoder = BinaryPayloadDecoder.fromRegisters(data.registers, Endian.Big)
eastron = round(decoder.decode_32bit_float(), 3)
print (eastron) 

Я знаю, что мне нужно играть с client.read_holding_registers, но как? Документация выглядит так: enter image description here

Может быть, я скучаю по факту, который называется Modicon?

Подводя итоги по вопросам:

  1. Как настроить мой вызов так, чтобы он соответствовал вызову 01 03 00 00 00 06?
  2. Почему, когда я выполняю вызов 01 03 00 00 00 06, я получаю все ответы (год к секундам) я не должен просто получить секунды? (думая, что 30006 в pdf обозначает сам вызов 03 00 00 00 06)
  3. Как я могу зарегистрировать отладку, которую я получаю при выполнении вызова? я делаю это в малине, и я не уверен, что смогу увидеть вызов, как я делаю на jupyter

пример

DEBUG:pymodbus.transaction:Current transaction state - TRANSACTION_COMPLETE
DEBUG:pymodbus.transaction:Running transaction 6
DEBUG:pymodbus.transaction:SEND: 0x1 0x3 0x0 0x0 0x0 0x2 0xc4 0xb
DEBUG:pymodbus.framer.rtu_framer:Changing state to IDLE - Last Frame End - 1580425865.276049, Current Time stamp - 1580425955.463177
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: 0x1 0x3 0x4 0x41 0x60 0x0 0x0 0xee 0x11
DEBUG:pymodbus.framer.rtu_framer:Getting Frame - 0x3 0x4 0x41 0x60 0x0 0x0
DEBUG:pymodbus.factory:Factory Response[ReadHoldingRegistersResponse: 3]
DEBUG:pymodbus.framer.rtu_framer:Frame advanced, resetting header!!
DEBUG:pymodbus.transaction:Adding transaction 1
DEBUG:pymodbus.transaction:Getting transaction 1
DEBUG:pymodbus.transaction:Changing transaction state from 'PROCESSING REPLY' to 'TRANSACTION_COMPLETE'
DEBUG:pymodbus.payload:[16736, 0]
DEBUG:pymodbus.payload:[b'A`', b'\x00\x00']

Заранее спасибо!

1 Ответ

1 голос
/ 31 января 2020
  1. Как настроить мой вызов так, чтобы он соответствовал вызову 01 03 00 00 00 06?

Расшифровывая это, мы получаем:

01 - идентификатор объекта; 1 байт; 01
03 - код функции; 1 байт; 0x03 = чтение регистров хранения
00 00 - начальный адрес; 2 байта (big-Endian); Адрес 0
00 06 - Количество регистров; 2 байта (big-Endian); Длина 6

Это означает, что выше приведен запрос к Идентификатору блока 1 на «Чтение регистров хранения» (3), начиная с регистра 0, возвращая шесть регистров.

Для дублирования этого с помощью pymodbus вы должны используйте client.read_holding_registers(0, 6, unit=1).

Почему, когда я звоню 01 03 00 00 00 06, я получаю все ответы (от года к секундам), разве я не должен получать только секунды? (полагая, что 30006 в pdf обозначает сам вызов 03 00 00 00 06)

Как отмечалось выше, запрос относится к шести регистрам (таким образом, это включает полный рабочий день).

Как я могу зарегистрировать отладку, которую я получаю при выполнении вызова? я делаю это в малине, и я не уверен, что смогу увидеть вызов, как я делаю на jupyter

Из вашего примера похоже, что вы уже генерируете отладочную информацию , Поскольку modbus является стандартом , вам обычно не нужно смотреть на байты, отправляемые / получаемые при использовании достойной библиотеки, чтобы обработать это для вас.

...