Skip to main content

ELF-M

Драйвер ELF-M — драйвер в прошивке OrionMeter LA-IP-MBUS для теплосчётчиков ELF-M производства АО «Тепловодомер». Модем сам читает с прибора текущие значения и архивы, синхронизирует часы и отправляет в LoRaWAN готовые параметры — энергию, объём, температуры и другие, — а не сырой ответ прибора, как универсальный драйвер. На этой странице — как настроить драйвер по downlink и как разобрать его данные.

Доступность драйвера​

В стандартной прошивке OrionMeter LA-IP-MBUS драйвера ELF-M нет: в неё включён только универсальный драйвер M-Bus. Для работы с ELF-M нужна отдельная сборка прошивки с этим драйвером. Номер драйвера — 0x17.

Если в модеме прошивка без драйвера, конфигурация ELF-M не применится. Модем ответит служебным событием CFG_FAILED (код 19, 0x13) с подкодом 0x50–0x53: старшая цифра 5 означает «драйвера нет в сборке», младшая — номер устройства (0–3). Уже работающие слоты модем при этом не трогает.

Как модем опрашивает счётчик​

Драйвер обменивается с прибором по двум протоколам на одной линии:

  • текущие значения — по M-Bus: запрос REQ_UD2, ответ RSP_UD (стартовый байт 0x68, модем проверяет контрольную сумму);
  • дата и время, установка времени и архивы — по протоколу ПТ01-2008: команды 0x2D (чтение времени), 0x28 (установка времени) и 0x2F (чтение архива). Запрос начинается байтом 0x4D, ответ — байтом 0x53, контрольная сумма — CRC8.

Шаги одного цикла опроса идут в таком порядке:

ШагЧто делает модем
1Берёт из очереди задание: опрос по расписанию или разовую команду
2Открывает порт
3Читает дату и время счётчика (команда 0x2D)
4Корректирует время — см. «Синхронизация времени»
5Выбирает прибор — только при адресации по серийному номеру
6Читает текущие значения (M-Bus)
7Читает архивы (команда 0x2F)
8Закрывает порт

Время модем читает в каждом цикле, до чтения данных. Если счётчик не ответил на запрос времени после всех попыток, цикл завершается с ошибкой и текущие значения не читаются.

Адресация прибора​

В конфигурации два адреса прибора:

  • первичный (сетевой) адрес — 1 байт, поле dev_addr_primary;
  • серийный номер — 4 байта, поле dev_addr.

Время и архивы по ПТ01-2008 модем всегда запрашивает по первичному адресу, даже если текущие значения читает по серийному номеру. Поэтому первичный адрес задавайте всегда.

Как запрашивать текущие значения, задают биты 3–4 поля DEVCFG:

Биты 3–4 DEVCFGКак модем запрашивает текущие значения
Не 0REQ_UD2 на первичный адрес
0Сначала выбирает прибор по серийному номеру: SND_UD на адрес 0xFD с CI выбора прибора; в данных — 4 байта серийного номера младшим байтом вперёд и 4 байта 0xFF. Дождавшись подтверждения 0xE5, отправляет REQ_UD2 на адрес 0xFD

Серийный номер в ответе RSP_UD драйвер не сверяет.

Конфигурация драйвера​

Конфигурация занимает 29 байт. Многобайтовые поля передаются младшим байтом вперёд.

СмещениеПолеБайтСодержимое
0dev_addr4Серийный номер прибора
4dev_addr_primary1Первичный адрес прибора
5dev_cfg2DEVCFG: адресация, синхронизация времени, число попыток
7rfu2Резерв
9Группа 15PARAM CFG (3 байта) и PARAM LIST (2 байта)
14Группа 25То же
19Группа 35То же
24Группа 45То же

Поле DEVCFG:

БитыНазначение
3–4Адресация текущих значений: 0 — по серийному номеру, другое значение — по первичному адресу
10Модем записывает своё время в счётчик
11Модем берёт время у счётчика
12–13Число попыток обращения к счётчику: 0 и 1 — одна попытка без повтора, 2 — две попытки, 3 — три

Группы опроса​

Каждая из четырёх групп задаёт свой период опроса, час отсчёта, источник данных и список параметров.

PARAM CFG​

Поле занимает 24 бита:

БитыНазначение
0–12Период опроса: (значение + 1) × 10 минут
13–17Час отсчёта по UTC, 0–23: драйвер отсчитывает его от полуночи UTC без учёта часового пояса. Значение 31 (0x1F) — случайный час. Драйвер ELF-M не сохраняет выбранный час между циклами опроса, поэтому для предсказуемого расписания задавайте час явно (0–23). Другое значение больше 23 выключает группу
18–20Источник данных: 0 — текущие значения, 1 — часовой архив, 2 — суточный, 3 — месячный, 4 — годовой
23Группа активна

По расписанию модем читает из архива последнюю запись.

PARAM LIST​

Битовая маска параметров, 2 байта. В таблице также указаны id параметра и длина его значения в пакете 0x13 — см. «Передача данных в LoRaWAN».

Бит маскиПараметрid в пакете 0x13Длина значения, байт
0x0001Энергия0x004 (float32)
0x0002Объём0x064
0x0004Тепловая мощность0x052
0x0008Объёмный расход0x042
0x0010Температура в подающем трубопроводе0x022
0x0020Температура в обратном трубопроводе0x222
0x0040Двоичные флаги ошибок0x0B4
0x0080Флаги ошибок0x2B4
0x0100Импульсный вход 10x0A4
0x0200Импульсный вход 20x2A4
0x0400Импульсный вход 30x4A4
0x0800Импульсный вход 40x6A4
0x1000Время работы, секунды0x094
0x2000Время работы с ошибкой, секунды0x294

Ограничения списка:

  • В одной группе указывайте не больше 13 параметров.
  • Флаги ошибок (0x0080) читаются только из текущих значений. Если включить этот бит в архивной группе, модем завершит цикл опроса: данные этой группы и следующих за ней групп в этом цикле не отправятся.
  • Двоичные флаги ошибок (0x0040) в часовом и суточном архиве модем пропускает без ошибки: в этих архивах нет кодов ошибок.

Синхронизация времени​

Модем читает время счётчика в каждом цикле опроса. Что делать с ним дальше, задают биты DEVCFG:

  • Бит 11 — если часам модема нужна установка, модем берёт время у счётчика.
  • Бит 10 — если часы модема верны, модем записывает своё время в счётчик командой 0x28: минуты, часы, день, месяц, год, век (20), день недели. Запись идёт не чаще раза в сутки; после включения модема первая запись откладывается на сутки. Время пишется по часам модема в UTC, без перевода в местное, а читает драйвер время счётчика как местное. Если в модеме задан часовой пояс, отличный от UTC, бит 10 сдвинет часы счётчика на величину пояса.

Разовые команды​

Разовой командой можно прочитать текущие значения или архивную запись на дату, не дожидаясь расписания. Команда — 1 байт типа и до 16 байт данных; более длинную команду модем отклоняет. Команду, пришедшую во время опроса, модем не откладывает и отвечает событием CFG_FAILED с подкодом 0x1… — см. «Ошибки и служебные события».

ТипЧто читаетДанные после байта типа
0Текущие значенияPARAM LIST, 2 байта
1Часовой архивГод, месяц, день, час — по 1 байту, затем PARAM LIST, 2 байта
2Суточный архивТо же
3Месячный архивТо же
4Годовой архивТо же

Как модем разбирает дату в архивной команде:

  • Год — две последние цифры (число лет от 2000). Год 0 — последняя запись архива.
  • Если год не 0, месяц должен быть 1–12, день 1–31, час 0–23. Иначе модем отправит событие CONFIG (код 7) с подкодом 0.
  • Дату модем переводит в номер записи архива. Глубина архивов: годовой — 9 записей, месячный — 19, суточный — 79, часовой — 744. Если дата в будущем или глубже архива, модем отправит событие CONFIG с подкодом 6 и запись не прочитает.

Результат команды модем ставит в очередь с наивысшим приоритетом (CRITICAL) и по окончании сразу выходит в эфир. Данные по расписанию уходят с приоритетом LOW.

Как передать конфигурацию и команду​

Конфигурацию и команды передают downlink-блоком 0x06 (SERIAL DRIVER CFG PORT 0). Блок 0x05 (порт 1) эта прошивка не обрабатывает, порт всегда 0.

Данные блока начинаются с заголовка:

ПолеРазмерСодержимое
DRV_HDR2 байта, младшим байтом вперёдБиты 0–11 — номер драйвера 0x17; биты 12–13 — номер устройства 0–3; бит 15 — слот включён
LEN_TYPE1 байтБиты 0–5 — длина данных минус 1; биты 6–7 — тип: 1 — CONFIG (конфигурация), 3 — COMMAND (команда)
Данные29 байт для CONFIG, до 17 байт для COMMANDКонфигурация или команда

Например, для конфигурации устройства 0: DRV_HDR = 0x8017 (байты 17 80), LEN_TYPE = 0x5C (тип 1, длина 29 − 1 = 28). Для команды типа 0 LEN_TYPE = 0xC2, для архивной команды — 0xC6.

Конфигурация в 29 байт укладывается в предел 43 байта данных драйвера, поэтому уходит одним блоком, без фрагментации.

Передача данных в LoRaWAN​

Данные драйвер отправляет пакетом 0x13 (данные теплосчётчика), а не расширенным пакетом 0x14.

ПолеБайтСодержимое
Тип пакета10x13
Метка времени4Секунды от 2000-01-01 00:00:00 UTC, младшим байтом вперёд
Флаги1Биты 0–1 — номер устройства; биты 2–6 — число параметров минус 1; бит 7 — архивная запись
Параметры—Для каждого параметра: байт id (биты 0–4 — код величины, биты 5–7 — канал) и значение младшим байтом вперёд. id и длина значения — в таблице PARAM LIST

Метка времени:

  • у текущих значений — время по часам счётчика из ответа на команду 0x2D;
  • у архивной записи — дата самой записи.

Обе метки модем переводит из местного времени в UTC. Из меток часовых и суточных записей он дополнительно вычитает 1 секунду, из меток месячных — 1 час 1 секунду; метки годовых записей идут как есть.

Тип архива в пакете не передаётся: бит 7 флагов говорит только о том, что запись архивная, а часовую, суточную, месячную и годовую запись по пакету не различить.

Если параметры не помещаются в один кадр LoRaWAN, модем делит пакет 0x13 по параметрам, а остаток возвращает в очередь передачи с повышенным приоритетом. Отправка с подтверждением включается не в конфигурации драйвера, а маской групп в настройке слота устройства.

Кодек протокола 78 пакет 0x13 не знает: на неизвестном PID разбор пакета останавливается, поэтому данные после 0x13 кодек тоже не разберёт. Профилей и блоков настройки ELF-M в кодеке нет. Пакет 0x13 нужно разбирать самостоятельно.

Ошибки и служебные события​

Ошибки драйвер отправляет служебным пакетом 0x08 с подтипом 0x07 (SERIAL_DRIVER_EVENT). В нём — метка времени, номер драйвера (в событиях самого драйвера ELF-M — 0x17) с номером устройства, код ошибки и подкод. Этот подтип кодек протокола 78 разбирает.

КодИмяЧто означает
1TIMEOUTПрибор не ответил в отведённое время
2CRCКонтрольная сумма ответа не сошлась
3ACCESSСчётчик не подтвердил выбор по серийному номеру (нет 0xE5) или не принял установку времени (ответ на 0x28 не начинается с 0x53)
7CONFIGНеверная конфигурация или команда: например, неверная дата в команде или дата за пределами архива
8PROTOCOLОтвет не по протоколу: неверный стартовый байт (не 0x68 или 0x53) или ответ не удалось разобрать; также — модем не смог собрать запрос
11–13, 15, 16—Ошибки линии: переполнение приёмника, ошибка кадрирования, шум, ошибка чётности и их сочетание
14HARDWAREАппаратный сбой UART или DMA
19CFG_FAILEDКонфигурация или команда из downlink не применена; причина — в подкоде, см. ниже
255UNKNOWNОшибка не распознана

Подкод у ELF-M — небольшое число, которым драйвер отмечает этап, где произошла ошибка. Подкоды события CONFIG описаны в разделе «Разовые команды».

Подкод CFG_FAILED устроен иначе: старшая цифра — причина, младшая — номер устройства (0–3). Причины, которые касаются ELF-M:

  • 0x1… — модем в этот момент выполнял опрос, а команду он не откладывает;
  • 0x3… — команда адресована выключенному слоту;
  • 0x5… — драйвера ELF-M нет в сборке прошивки;
  • 0x8… — драйвер отклонил данные, например команду длиннее 17 байт;
  • 0xC… — команда драйверу, которого нет на порту, например команда ELF-M на прошивке без этого драйвера.

Событие CFG_FAILED формирует модем, а не драйвер ELF-M: в нём номер драйвера, загруженного на порт сейчас, поэтому номер устройства берите из младшей цифры подкода.

Что важно знать​

  • Драйвер есть только в отдельной сборке прошивки. В стандартной сборке конфигурация ELF-M не применится, модем ответит событием CFG_FAILED.
  • Первичный адрес нужен всегда: по нему модем читает время и архивы. Если счётчик не отвечает на запрос времени, модем не прочитает и текущие значения.
  • Не включайте флаги ошибок (0x0080) в архивные группы и указывайте в группе не больше 13 параметров.
  • Масштабы здесь не приводятся. Драйвер по-разному пересчитывает текущие и архивные значения: температуру из текущих значений умножает на 10, архивную передаёт как есть. Энергию из архивных записей драйвер получает, читая биты целого числа как float32, поэтому её значение использовать нельзя. Прежде чем использовать данные в расчётах, сверьте их с показаниями прибора.
  • Часы модема идут по UTC. Час отсчёта групп драйвер считает от полуночи UTC, а бит 10 пишет в счётчик время UTC, хотя время счётчика драйвер читает как местное. Если в модеме задан часовой пояс, отличный от UTC, бит 10 сдвинет часы счётчика на величину пояса.
  • По пакету 0x13 не определить, из какого архива пришла запись, а кодек протокола 78 этот пакет не разбирает.

См. также​

  • M-BUS — какие драйверы есть у модема и чем они отличаются.
  • Универсальный драйвер — опрос стандартных счётчиков M-Bus без отдельной сборки прошивки.
  • Подключение — схема подключения приборов учёта по M-Bus.
  • Спецификация — сколько приборов M-Bus можно подключить к модему.