Форум сайта python.su
Всем доброго дня. Впервые столкнулся с необходимостью записи в регистр. Но никак не понимаю как это работает. Есть прибор, в документации сказано следующее (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 появятся данные? Может кто-то объяснит как вытянуть данные с прибора?
Офлайн
После записи номера в регистр 40053 и посылки команды 2002 в регистр 40006 читай регистр 40060, пока в нём не появится значение 2002 или значение 0xFFFF. Если в регистре 40060 появилось значение 2002, то читай регистры с 40051 до 40060, чтобы получить данные.
Офлайн
Спасибо, хоть какая-то информация, но я не понимаю в чем отличается запись в регистр 40053 от команды 2002 в регистр 40006. Я только учусь. В старых приборах ничего записывать и посылать не нужно было, там все данные хранились открыто в регистрах 400052-400058.
Офлайн
staxbelТак ты опиши прибор. А то всё напоминает анекдот:
В старых приборах ничего записывать и посылать не нужно было, там все данные хранились открыто в регистрах 400052-400058.
Офлайн
Нашел полную документацию на новую версию приборов. Действительно, теперь нужно так как вы написали получать информацию.
Как считывать регистры я знаю, разобрался когда были старые приборы.
request = client.read_holding_registers(5, 1, unit=0x01) result = request.registers written_as = result[0] print(written_as)
Прикреплённый файлы:
изображение_2022-02-18_201207.png (126,6 KБ)
Офлайн
Вот пример
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
staxbel40053 - это регистр для номера формулы, по которой будут сформированы данные и записаны в регистры вывода с 40051 до 40060.
Регистр 40053 - это номер продукта, туда нужно записать 1, 40054 - тоже 1 (Consumption)
Отредактировано py.user.next (Фев. 18, 2022 23:45:29)
Офлайн
py.user.nextЭто при запросе 2002, а при запросе 2020 - это номер продукта. Мне важно именно по продукту данные получить
40053 - это регистр для номера формулы, по которой будут сформированы данные и записаны в регистры вывода.
Офлайн
staxbel2002 - это код команды. Если код такой, то выполнить такую команду. Если код другой, то выполнить другую команду. У устройств как команды, так и ошибки именуются вот такими числами. В данном случае 2002 означает “сформировать данные по формуле”. А формула передаётся во внутреннюю функцию “сформировать данные” устройства как аргумент, хранящийся в регистре номера формулы 40053. Возможно, это аргументный регистр, в котором всегда хранится аргумент для какой-либо внутренней функции устройства, которых у устройства может быть много. Так что не факт, что это регистр только для номеров формул.
Это при запросе 2002, а при запросе 2020 - это номер продукта.
Отредактировано py.user.next (Фев. 18, 2022 23:55:40)
Офлайн
Вот что нашел в документации
Отредактировано staxbel (Фев. 18, 2022 23:55:32)
Офлайн
Процесс я описал здесь. Так что следуй ему и не надо отсебятины.
staxbelConsumption там только на чтение. Так что, что ты туда собрался писать, мне неясно. Есть регистры только для чтения, есть регистры только для записи, есть регистры для чтения и записи (не факт, что на твоём устройстве они есть). Поэтому если ты пытаешься записать что-то в регистр только для чтения, то я тебя поздравляю. Будешь долго писать туда и будешь думать, что это команда не такая или что ты читаешь ответ от устройства не так.
Помогите пожалуйста вытащить данные с новых приборов. Регистр 40053 - это номер продукта, туда нужно записать 1, 40054 - тоже 1 (Consumption)
Отредактировано py.user.next (Фев. 19, 2022 00:00:31)
Офлайн