Събиране на показания от измервателни уреди - Меркурий 200-203

Имало едно време възникна задача - да се научите как да четете показанията от броячите на Меркурий 200-203-206.

Първо се оказа, че гишетата са златни, на сайта няма нищо повече, освен паспорти и примитивно описание. Това е разбираемо,NPK-Incotex взе за основа пакета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 все още не е започнал да пише, всичко е в прекъсването:

Ето как се прави заявката:

И така пакетът е „пълнен“:

Ето как пакетът се изпраща до сървъра: