Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 18, 2022 00:16:49

staxbel
Зарегистрирован: 2021-03-13
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

pymodbus запись в регистр и чтение.

Всем доброго дня. Впервые столкнулся с необходимостью записи в регистр. Но никак не понимаю как это работает. Есть прибор, в документации сказано следующее (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 появятся данные? Может кто-то объяснит как вытянуть данные с прибора?

Офлайн

#2 Фев. 18, 2022 04:23:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

pymodbus запись в регистр и чтение.

После записи номера в регистр 40053 и посылки команды 2002 в регистр 40006 читай регистр 40060, пока в нём не появится значение 2002 или значение 0xFFFF. Если в регистре 40060 появилось значение 2002, то читай регистры с 40051 до 40060, чтобы получить данные.



Офлайн

#3 Фев. 18, 2022 07:27:11

staxbel
Зарегистрирован: 2021-03-13
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

pymodbus запись в регистр и чтение.

Спасибо, хоть какая-то информация, но я не понимаю в чем отличается запись в регистр 40053 от команды 2002 в регистр 40006. Я только учусь. В старых приборах ничего записывать и посылать не нужно было, там все данные хранились открыто в регистрах 400052-400058.

Офлайн

#4 Фев. 18, 2022 08:25:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

pymodbus запись в регистр и чтение.

staxbel
В старых приборах ничего записывать и посылать не нужно было, там все данные хранились открыто в регистрах 400052-400058.
Так ты опиши прибор. А то всё напоминает анекдот:
Летят Чапаев и Петька на дирижабле.
Ч: - Петька! Прибор!
П: - Двадцать!
Ч: - Что двадцать?
П: - А что прибор?

Как ты с него читаешь данные? Как ты на него посылаешь данные?



Офлайн

#5 Фев. 18, 2022 19:14:59

staxbel
Зарегистрирован: 2021-03-13
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

pymodbus запись в регистр и чтение.

Нашел полную документацию на новую версию приборов. Действительно, теперь нужно так как вы написали получать информацию.
Как считывать регистры я знаю, разобрался когда были старые приборы.

 request = client.read_holding_registers(5, 1, unit=0x01)
result = request.registers
written_as = result[0]
print(written_as)
Помогите пожалуйста вытащить данные с новых приборов. Регистр 40053 - это номер продукта, туда нужно записать 1, 40054 - тоже 1 (Consumption)

Прикреплённый файлы:
attachment изображение_2022-02-18_201207.png (126,6 KБ)

Офлайн

#6 Фев. 18, 2022 23:33:09

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

pymodbus запись в регистр и чтение.

Вот пример
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.



Отредактировано py.user.next (Фев. 18, 2022 23:45:29)

Офлайн

#7 Фев. 18, 2022 23:44:07

staxbel
Зарегистрирован: 2021-03-13
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

pymodbus запись в регистр и чтение.

py.user.next
40053 - это регистр для номера формулы, по которой будут сформированы данные и записаны в регистры вывода.
Это при запросе 2002, а при запросе 2020 - это номер продукта. Мне важно именно по продукту данные получить

Офлайн

#8 Фев. 18, 2022 23:49:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

pymodbus запись в регистр и чтение.

staxbel
Это при запросе 2002, а при запросе 2020 - это номер продукта.
2002 - это код команды. Если код такой, то выполнить такую команду. Если код другой, то выполнить другую команду. У устройств как команды, так и ошибки именуются вот такими числами. В данном случае 2002 означает “сформировать данные по формуле”. А формула передаётся во внутреннюю функцию “сформировать данные” устройства как аргумент, хранящийся в регистре номера формулы 40053. Возможно, это аргументный регистр, в котором всегда хранится аргумент для какой-либо внутренней функции устройства, которых у устройства может быть много. Так что не факт, что это регистр только для номеров формул.

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



Отредактировано py.user.next (Фев. 18, 2022 23:55:40)

Офлайн

#9 Фев. 18, 2022 23:54:58

staxbel
Зарегистрирован: 2021-03-13
Сообщения: 48
Репутация: +  0  -
Профиль   Отправить e-mail  

pymodbus запись в регистр и чтение.

Вот что нашел в документации

Отредактировано staxbel (Фев. 18, 2022 23:55:32)

Офлайн

#10 Фев. 18, 2022 23:58:37

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9873
Репутация: +  853  -
Профиль   Отправить e-mail  

pymodbus запись в регистр и чтение.

Процесс я описал здесь. Так что следуй ему и не надо отсебятины.

staxbel
Помогите пожалуйста вытащить данные с новых приборов. Регистр 40053 - это номер продукта, туда нужно записать 1, 40054 - тоже 1 (Consumption)
Consumption там только на чтение. Так что, что ты туда собрался писать, мне неясно. Есть регистры только для чтения, есть регистры только для записи, есть регистры для чтения и записи (не факт, что на твоём устройстве они есть). Поэтому если ты пытаешься записать что-то в регистр только для чтения, то я тебя поздравляю. Будешь долго писать туда и будешь думать, что это команда не такая или что ты читаешь ответ от устройства не так.



Отредактировано py.user.next (Фев. 19, 2022 00:00:31)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version