Pymodbus не находит «сгруппированные» адреса на устройстве

Я работаю над проектом, в котором я использую Pymodbus для подключения к системе промышленных вентиляторов. Я могу прочитать некоторые адреса на этом вентиляторе, но не другие. В буклете с инструкциями к вентилятору, с которым я работаю, адреса распределяются по группам параметров следующим образом:

Grouping Description
Group 00 Basic parameters
Group 01 V/F pattern selections and setup
Group 02 Motor parameters
Group 03 Multi function digital Inputs/Outputs
...
Group 15 PLC monitoring function

Для каждой группы (1-15) выше есть более конкретные адреса, указанные на последующих страницах руководства. Например, для группы 00 выше есть записи адреса, указанные ниже:

Group-address Description Range
00-00 Control Mode Selection 0: V/F Mode, 1: Vector mode
00-02 Main run command. 0: Keypad, 1:Communication, 2: PLC
...
00-20. Jog deceleration time. ~0.1-3600.0

Я могу получить доступ и распечатать вышеуказанные адреса (в случае группировки «00») с помощью следующего скрипта Python:

from pymodbus.client.sync import ModbusSerialClient as ModbusClient    
modbus_conn = ModbusClient(method='rtu', port="/dev/tty.usbserial-AQ00BYCR",baudrate=38400,parity = 'O')
modbus_conn.connect()
print(modbus_conn.read_holding_registers(0,20,unit=1).registers[0])

Проблема, однако, в том, что я не могу получить доступ к более высоким группам ('01' -> '15'). Например, если я попытаюсь получить доступ к любому адресу выше 20 с помощью приведенного выше сценария, я получу ошибку «Нет регистров». Я предполагаю, что это потому, что я заперт в выборке первой группы ('00') с моим скриптом.

Я исследовал идею о том, что группы определяют разные начальные точки адресов, поэтому я проверил, означает ли, например, «01» адрес, начинающийся с позиции «100», как показано ниже:

modbus_conn.read_holding_registers(100,5,unit=1).registers[0]

но это оказалось не сработает (поскольку я снова получил ошибки «регистр не существует»).

Что я делаю не так?

Что мне не хватает?

Кто-нибудь знает, как получить доступ к адресам, сгруппированным вышеописанным образом? Я такое впервые вижу, и я в тупике.

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


person Hayden Eastwood    schedule 20.01.2021    source источник
comment
Не могли бы вы предоставить документацию на устройство?   -  person Tagli    schedule 22.01.2021
comment
Из этого руководства (при условии, что это устройство, к которому вы обращаетесь) это выглядит так: группа 01 начинается с регистра 0100H (в отличие от десятичного числа 100); так что попробуйте modbus_conn.read_holding_registers(0x100,1,unit=1).registers[0].   -  person Brits    schedule 23.01.2021
comment
Спасибо, это потенциально действительно полезно! И да, вы определили правильный мануал! Что на самом деле означает 0x100? А что в инструкции позволяет сделать вывод, что регистр начинается с 0100H - почему H?   -  person Hayden Eastwood    schedule 24.01.2021
comment
Его Hexadecimal - трудно объяснить в комментарии, поэтому проще всего прочитать ссылку в Википедии. В python целочисленный литерал, начинающийся с 0x, является шестнадцатеричным ( поэтому 100H записывается как 0x100 в python — H в документах — это просто еще один способ отметить, что это шестнадцатеричный код).   -  person Brits    schedule 24.01.2021
comment
Ах, хорошо, я не понял, что 0x был кодом для начала шестнадцатеричной записи. Это объяснение выглядит интуитивно правильным — я проверю его завтра и подтвержу, тогда вы сможете сделать его официальным ответом, чтобы я мог присудить вам награду!   -  person Hayden Eastwood    schedule 24.01.2021
comment
Надеюсь, это сработает для вас — обратите внимание, что страницы «App3-13» — «App3-18» в руководстве содержат сопоставление группы/функции с номером регистра Modbus (в шестнадцатеричном формате).   -  person Brits    schedule 24.01.2021
comment
@Британцы - спасибо - ваша инструкция и объяснение вытащили меня из огня! Если вы сделаете ваше объяснение официальным ответом, я присужу вам награду :) Кстати - инструкция по эксплуатации, которая шла с устройством, устарела и не содержала приложения с сопоставлениями, как то, что вы предоставили. Так что спасибо, спасатель!   -  person Hayden Eastwood    schedule 25.01.2021


Ответы (3)


Согласно комментариям, первая проблема заключалась в том, что руководство, которое вы использовали, устарело. В результате поиска "V/F pattern selections and setup" я нашел обновленное руководство. Это обновленное руководство включало таблицу, связывающую «группы» с регистрами (страницы «App3-13» — «App3-18»). Например, функция 01-0 (часть группы 01) «Шаблоны Вольт/Гц» находится в регистре хранения 0100H (100 шестн.).

С обновленным руководством легче определить, как сопоставить группировку/функцию с соответствующим регистром. Одна потенциальная проблема заключается в том, что в руководстве регистры упоминаются в шестнадцатеричном формате (100H), поэтому при выполнении запросов в Python вам нужно использовать что-то вроде modbus_conn.read_holding_registers(0x100,1,unit=1).registers[0] (это, вероятно, объясняет, почему ваша первоначальная попытка не удалась).

Примечание: чем больше подробностей вы можете предоставить, тем лучше, например, при публикации такого рода вопросов. производитель устройства, модель и т. д.).

person Brits    schedule 25.01.2021

В документации к устройству может быть такая схема:

Адрес GGnnH: GG означает группу параметров, nn означает номер параметра, например, адрес Pr 04-01 — 0401H. («H» означает, что число 401 в этом примере является шестнадцатеричным. Таким образом, 0401H — это регистр 1025)

person Bosz    schedule 22.01.2021
comment
Спасибо, я проверю это и вернусь как можно скорее! - person Hayden Eastwood; 22.01.2021

Классифицировать его как группы для меня очень сложно.

Чтобы прочитать регистры хранения, вы должны передать смещение первого и сколько вы хотите прочитать, вот и все.

Возможно, у устройства не более 20 доступных для чтения регистров, поэтому, если вы передаете смещение 10 с количеством 20, вы пытаетесь прочитать до 30-го регистра, которого может не быть.

person Lluis Felisart    schedule 22.01.2021
comment
Спасибо, это действительно то, что произошло. Я понял, что было 2 проблемы - 1. в инструкции не было отображений, 2. адреса были в шестнадцатеричном формате. Теперь, когда меня привели к сопоставлениям, все работает. - person Hayden Eastwood; 25.01.2021