Форум сайта python.su
Доброго времени суток
Просьба помочь разобраться с ребусом по опросу теплосчетчика SANEXT Mono RM по RS485
Есть описание формата данных
https://imgur.com/J6SwXrK
https://imgur.com/nOzvkYr
Есть Raspberry pi 3 b и rs485 to usb
И огромное желание разобраться как собрать данные )
Планировал использовать готовую библиотеку minimalmodbus для питона с режимом RTU.
Но не осилил синтаксис. Точнее не осилил в целом логику синтаксиса передачи и получения данных по RS485 даже просто в режиме СОМ порта.
Единственное пока, что понял из найденных примеров что нужно передавать данные в НЕХ. Еще как то нужно CRC16 посчитать и куда то деть. В общем непонятно ни чего от слова совсем.
Примеров под мой случай толковых не нашел. Буду очень признателен за помощь в решении этого ребуса. Мне по сути нужно вытащить один показатель только.
https://github.com/n0l/Mercury_remote/blob/master/get_data_python3.py
нашел очень близкий пример по реализации, но не понимаю части логики кода….
Отредактировано Akhepython (Дек. 21, 2021 18:13:19)
Офлайн
import crcmod # def crc16_calc(chunk): # считает crc16 crc16 = crcmod.mkCrcFun(0x18005, initCrc=0xFFFF, rev=True, xorOut=0x0000) crc_int = crc16(chunk) high_byte = crc_int >> 8 low_byte = crc_int & 0xff out_hex = '{:02X}{:02X}'.format(low_byte, high_byte) return bytes.fromhex(out_hex) # def create_package(addr, f, l, mask_ch, id) -> bytes: # собирает пакет hex_chunk = '{:08d}{:02X}{:02X}{:<08}{:02X}'.format(addr, f, l, '{:02X}'.format(mask_ch), id) chunk = bytes.fromhex(hex_chunk) data = chunk + crc16_calc(chunk) return data # addr = 12345678 # - сетевой адрес устройства (4байта) в формате BCD, старшим байтом вперёд f = 1 # - код функции запроса (1 байт) чтение текущих показаний l = 14 # - общая длина пакета (1 байт) mask_ch = 2 # – битовая маска запрашиваемых каналов (4 байта) (чтение второго канала) id = 24228 # - идентификатор запроса (любые 2 байта) # data = create_package(addr, f, l, mask_ch, id) # отправить теплосчетчику, # print(data) #b'\x124Vx\x01\x0e\x02\x00\x00\x00^\xa4Ac'
Офлайн
AkhepythonСначала формировать данные в hex. Потом передавать сформированные данные как байты простые. Потом получать ответ от устройства в виде простых байтов. Потом разбирать эти простые байты на поля и получать данные из этих полей.
Единственное пока, что понял из найденных примеров что нужно передавать данные в НЕХ.
Отредактировано py.user.next (Дек. 22, 2021 00:07:41)
Офлайн
Здравствуйте, увидел Ваше сообщения о созданию пакета данных с CRC. Не могли бы Вы помочь в разборе пакета приходящего от счетчика?
Счетчик Пульсар с rs485. Запрос “08 56 16 18 01 0E 03 00 00 00 01 00 FE 71”.
Получаю ответ: “085616180112a3e8103c0000000001005fab”.
Вручную (согласно протокола от Пульсар) разбираю: “08561618” - ADDR (номер счетчика), “01” - код функции запроса, “12” - общая длина пакета, “a3e8103c00000000” - данные, “01 00” - ID (идентификатор запроса (любые 2 байта))
“5fab” - CRC16.
Но как это сделать на Python? Просьба помочь!
Отредактировано Demion (Окт. 24, 2024 16:26:42)
Прикреплённый файлы:
_Для_форума_1.pdf (811,6 KБ)
Офлайн
> Но как это сделать на Python? Просьба помочь!
Что тебе нужно сделать? CRC16 вычислить? Но в твоём протоколе есть же готовый пример его вычисления…
Офлайн
Мне нужна помощь в написании кода на питоне для разбора ответа от прибора, например: ответ: “085616180112a3e8103c0000000001005fab”. Но ответ может быть и другой.
Офлайн