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 | Как модем запрашивает текущие значения |
|---|---|
| Не 0 | REQ_UD2 на первичный адрес |
| 0 | Сначала выбирает прибор по серийному номеру: SND_UD на адрес 0xFD с CI выбора прибора; в данных — 4 байта серийного номера младшим байтом вперёд и 4 байта 0xFF. Дождавшись подтверждения 0xE5, отправляет REQ_UD2 на адрес 0xFD |
Серийный номер в ответе RSP_UD драйвер не сверяет.
Конфигурация драйвера
Конфигурация занимает 29 байт. Многобайтовые поля передаются младшим байтом вперёд.
| Смещение | Поле | Байт | Содержимое |
|---|---|---|---|
| 0 | dev_addr | 4 | Серийный номер прибора |
| 4 | dev_addr_primary | 1 | Первичный адрес прибора |
| 5 | dev_cfg | 2 | DEVCFG: адресация, синхронизация времени, число попыток |
| 7 | rfu | 2 | Резерв |
| 9 | Группа 1 | 5 | PARAM CFG (3 байта) и PARAM LIST (2 байта) |
| 14 | Группа 2 | 5 | То же |
| 19 | Группа 3 | 5 | То же |
| 24 | Группа 4 | 5 | То же |
Поле 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 | Энергия | 0x00 | 4 (float32) |
| 0x0002 | Объём | 0x06 | 4 |
| 0x0004 | Тепловая мощность | 0x05 | 2 |
| 0x0008 | Объёмный расход | 0x04 | 2 |
| 0x0010 | Температура в подающем трубопроводе | 0x02 | 2 |
| 0x0020 | Температура в обратном трубопроводе | 0x22 | 2 |
| 0x0040 | Двоичные флаги ошибок | 0x0B | 4 |
| 0x0080 | Флаги ошибок | 0x2B | 4 |
| 0x0100 | Импульсный вход 1 | 0x0A | 4 |
| 0x0200 | Импульсный вход 2 | 0x2A | 4 |
| 0x0400 | Импульсный вход 3 | 0x4A | 4 |
| 0x0800 | Импульсный вход 4 | 0x6A | 4 |
| 0x1000 | Время работы, секунды | 0x09 | 4 |
| 0x2000 | Время работы с ошибкой, секунды | 0x29 | 4 |
Ограничения списка:
- В одной группе указывайте не больше 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_HDR | 2 байта, младшим байтом вперёд | Биты 0–11 — номер драйвера 0x17; биты 12–13 — номер устройства 0–3; бит 15 — слот включён |
| LEN_TYPE | 1 байт | Биты 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.
| Поле | Байт | Содержимое |
|---|---|---|
| Тип пакета | 1 | 0x13 |
| Метка времени | 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 разбирает.
| Код | Имя | Что означает |
|---|---|---|
| 1 | TIMEOUT | Прибор не ответил в отведённое время |
| 2 | CRC | Контрольная сумма ответа не сошлась |
| 3 | ACCESS | Счётчик не подтвердил выбор по серийному номеру (нет 0xE5) или не принял установку времени (ответ на 0x28 не начинается с 0x53) |
| 7 | CONFIG | Неверная конфигурация или команда: например, неверная дата в команде или дата за пределами архива |
| 8 | PROTOCOL | Ответ не по протоколу: неверный стартовый байт (не 0x68 или 0x53) или ответ не удалось разобрать; также — модем не смог собрать запрос |
| 11–13, 15, 16 | — | Ошибки линии: переполнение приёмника, ошибка кадрирования, шум, ошибка чётности и их сочетание |
| 14 | HARDWARE | Аппаратный сбой UART или DMA |
| 19 | CFG_FAILED | Конфигурация или команда из downlink не применена; причина — в подкоде, см. ниже |
| 255 | UNKNOWN | Ошибка не распознана |
Подкод у 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 можно подключить к модему.