Збір свідчень з лічильників - Меркурій 200-203

Одного разу постало завдання — навчиться зчитувати свідчення з лічильників «Меркурій 200-203-206».

Насамперед виявилося, що лічильники золоті, на сайті крім паспортів та примітивного опису нічого більше немає. Це і зрозуміло,НПК-Інкотекс узяв за основу пакетModbus RTU (прибрав з нього все логічне та корисне - вирішивши використовувати фіксовані поля, без коду помилок і т.д. ,) Розширивши поле ID до 4-х байт, що залишилося було названо «власним протоколом». Що дозволяє продавати (в єдиній особі) конвертери з «власного протоколу» до нормальногоModbus.

Насамперед було завантажено з офсайту конфігуратор:

меркурій
Підключено сам лічильник (USB-485), і підглянуті самі пакети:
лічильників
Виявилося, що конфігуратор здійснював 7 запитів, а саме: - 0x28 (Читання ідентифікаційних даних лічильника) - 0x2F (Читання псевдосерійного номера) - 0x29 (Читання напруги на літієвій батареї) - 0x2C (Читання часу останнього включення напруги) — 0x2B (Читання часу останнього відключення напруги) і невідомі 0x66-65 Далі було роздобуто опис «протоколу» і стало все зрозуміло. У запиті ID це перші чотири байти (0x000D1F або 859973), байт команди і два байти CRC. У відповіді також ID, команда і набір параметрів (довжина представляє магічну цифру, визначається самим параметром, може бути від 0 до 17 байт). З пакетом начебто все зрозуміло, залишилося написати програму)

Зібрав хустку на STM32F107VC (CAN з USB був бажаний), 4 MAX485 на стільки ж USART-UART портів, + висновки DE/RE Написав структури, вибачте за назви:

Далі описав сам лічильник:

для роботи з USART DMA поки не став писати, все у перериванні:

Так готується запит:

А так «набивається» пакет:

У такому вигляді пакет надсилається на сервер: