Найти - Пользователи
Полная версия: pymodbus запись в регистр и чтение.
Начало » Python для новичков » pymodbus запись в регистр и чтение.
1
staxbel
Всем доброго дня. Впервые столкнулся с необходимостью записи в регистр. Но никак не понимаю как это работает. Есть прибор, в документации сказано следующее (For the exchange of values by using the following commands, use the Exchange Registers from
40051 to 40060 together with the Command Register.
To perform a read command you need to set the values highlighted in bold.
Example: command 2002
- In the 40053 register set the formula number (No. Formula) for which you want to read the total
set;
- Send the command 2002 to the Command Register (40006);
- Read continuously 40060 register until you find the command echo (in this case 2002) which
indicates “data ready” or 0xFFFF indicates that “error in the command”;
- Read the values present in 40051…40060 registers and use them according to the following
table CMD R -2020
40053 Product No.
40054 1 = Consumption)

Я так понял, что нужно записать команду 2020 в регистр 40006 а затем в регистрах 40051…40060 появятся данные? Может кто-то объяснит как вытянуть данные с прибора?
py.user.next
После записи номера в регистр 40053 и посылки команды 2002 в регистр 40006 читай регистр 40060, пока в нём не появится значение 2002 или значение 0xFFFF. Если в регистре 40060 появилось значение 2002, то читай регистры с 40051 до 40060, чтобы получить данные.
staxbel
Спасибо, хоть какая-то информация, но я не понимаю в чем отличается запись в регистр 40053 от команды 2002 в регистр 40006. Я только учусь. В старых приборах ничего записывать и посылать не нужно было, там все данные хранились открыто в регистрах 400052-400058.
py.user.next
staxbel
В старых приборах ничего записывать и посылать не нужно было, там все данные хранились открыто в регистрах 400052-400058.
Так ты опиши прибор. А то всё напоминает анекдот:
Летят Чапаев и Петька на дирижабле.
Ч: - Петька! Прибор!
П: - Двадцать!
Ч: - Что двадцать?
П: - А что прибор?

Как ты с него читаешь данные? Как ты на него посылаешь данные?
staxbel
Нашел полную документацию на новую версию приборов. Действительно, теперь нужно так как вы написали получать информацию.
Как считывать регистры я знаю, разобрался когда были старые приборы.
 request = client.read_holding_registers(5, 1, unit=0x01)
result = request.registers
written_as = result[0]
print(written_as)
Помогите пожалуйста вытащить данные с новых приборов. Регистр 40053 - это номер продукта, туда нужно записать 1, 40054 - тоже 1 (Consumption)
py.user.next
Вот пример
https://pymodbus.readthedocs.io/en/latest/source/example/synchronous_client.html

Там есть и способ чтения регистра, и способ записи в регистр.
Отрывок оттуда
  
    log.debug("Write to a holding register and read back")
    rq = client.write_register(1, 10, unit=UNIT)
    rr = client.read_holding_registers(1, 1, unit=UNIT)
    assert(not rq.isError())     # test that we are not an error
    assert(not rr.isError())     # test that we are not an error
    assert(rr.registers[0] == 10)       # test the expected value
 
    log.debug("Write to multiple holding registers and read back")
    rq = client.write_registers(1, [10]*8, unit=UNIT)
    rr = client.read_holding_registers(1, 8, unit=UNIT)
    assert(not rq.isError())     # test that we are not an error
    assert(not rr.isError())     # test that we are not an error
    assert(rr.registers == [10]*8)      # test the expected value

staxbel
Регистр 40053 - это номер продукта, туда нужно записать 1, 40054 - тоже 1 (Consumption)
40053 - это регистр для номера формулы, по которой будут сформированы данные и записаны в регистры вывода с 40051 до 40060.

1. Ты пишешь номер формулы в регистр номера формулы 40053.
2. Затем ты посылаешь команду “сформировать данные” 2002 в регистр управления 40006.
3. Дальше устройство у себя внутри читает команду из регистра управления 40006; понимает, что ты хочешь получить данные по формуле; читает номер формулы из регистра номера формулы 40053; проверяет, есть ли такая формула во внутренней таблице устройства; если формула во внутренней таблице устройства есть, устройство у себя внутри пишет в регистры вывода данные, которые у него запросили по заданной формуле; если формулы нет, устройство выставляет ошибку в регистре; после этого устройство сообщает, что данные готовы или что произошла ошибка при подготовке данных в регистре статуса 40060.
4. После этого ты ждёшь эти данные, проверяя регистр статуса 40060 на наличие эха или ошибки.
5. И после этого ты читаешь эти данные из регистров вывода с 40051 до 40060.
staxbel
py.user.next
40053 - это регистр для номера формулы, по которой будут сформированы данные и записаны в регистры вывода.
Это при запросе 2002, а при запросе 2020 - это номер продукта. Мне важно именно по продукту данные получить
py.user.next
staxbel
Это при запросе 2002, а при запросе 2020 - это номер продукта.
2002 - это код команды. Если код такой, то выполнить такую команду. Если код другой, то выполнить другую команду. У устройств как команды, так и ошибки именуются вот такими числами. В данном случае 2002 означает “сформировать данные по формуле”. А формула передаётся во внутреннюю функцию “сформировать данные” устройства как аргумент, хранящийся в регистре номера формулы 40053. Возможно, это аргументный регистр, в котором всегда хранится аргумент для какой-либо внутренней функции устройства, которых у устройства может быть много. Так что не факт, что это регистр только для номеров формул.

Я ничего сложного не вижу пока. Буквально то же самое происходит в ассемблере, когда работаешь с процессором и памятью. Есть регистр для данных, есть регистр для команд, есть регистр для статуса выполнения и так далее. Ты просто закладываешь части в разные регистры, а потом в регистр команды пишешь “выполнить это всё” и электроника видит эту команду и начинает эти части собирать воедино, выполнять, а потом устанавливает результат в регистры данных, в регистры ошибок и так далее. Так ты можешь выполнять команды и потом читать, что получилось.
staxbel
Вот что нашел в документации
py.user.next
Процесс я описал здесь. Так что следуй ему и не надо отсебятины.

staxbel
Помогите пожалуйста вытащить данные с новых приборов. Регистр 40053 - это номер продукта, туда нужно записать 1, 40054 - тоже 1 (Consumption)
Consumption там только на чтение. Так что, что ты туда собрался писать, мне неясно. Есть регистры только для чтения, есть регистры только для записи, есть регистры для чтения и записи (не факт, что на твоём устройстве они есть). Поэтому если ты пытаешься записать что-то в регистр только для чтения, то я тебя поздравляю. Будешь долго писать туда и будешь думать, что это команда не такая или что ты читаешь ответ от устройства не так.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB