Найти - Пользователи
Полная версия: Опрос теплосчетчика по RS485
Начало » Центр помощи » Опрос теплосчетчика по RS485
1
Akhepython
Доброго времени суток
Просьба помочь разобраться с ребусом по опросу теплосчетчика 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
нашел очень близкий пример по реализации, но не понимаю части логики кода….
xam1816
 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'
py.user.next
Akhepython
Единственное пока, что понял из найденных примеров что нужно передавать данные в НЕХ.
Сначала формировать данные в hex. Потом передавать сформированные данные как байты простые. Потом получать ответ от устройства в виде простых байтов. Потом разбирать эти простые байты на поля и получать данные из этих полей.

Для этого всего хватит pyserial, bytearray(), crcmod и struct.
Demion
Здравствуйте, увидел Ваше сообщения о созданию пакета данных с 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? Просьба помочь!

Rodegast
> Но как это сделать на Python? Просьба помочь!

Что тебе нужно сделать? CRC16 вычислить? Но в твоём протоколе есть же готовый пример его вычисления…
Demion
Мне нужна помощь в написании кода на питоне для разбора ответа от прибора, например: ответ: “085616180112a3e8103c0000000001005fab”. Но ответ может быть и другой.
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