RS-485
Через порт RS-485 модемы OrionMeter LA-IP-RSP и LA-IP-RSP[A] опрашивают подключённые приборы с интерфейсом Modbus RTU. Устройство само читает регистры приборов по расписанию и передаёт их по LoRaWAN, а по команде с сервера выполняет разовое чтение или запись. Страница нужна тем, кто настраивает порт и опрос по эфиру и разбирает пакеты устройства на своём сервере. Здесь «устройство» — модем OrionMeter, «прибор» — то, что подключено к его порту RS-485. Описание соответствует прошивке METER_V3.1.5.84; что зависит от версии, собрано в разделе «Версии прошивки».
Что даёт интерфейс
- Порт RS-485 один, на нём до четырёх приборов — слоты 0–3. У каждого слота свой адрес прибора, свои группы регистров и своё расписание.
- Протокол обмена с приборами задаёт драйвер. В прошивку при сборке входит ровно один драйвер, и все слоты порта работают через него.
- Текущие сборки прошивки выпускаются для LA-IP-RSP[A] с драйвером Modbus RTU (DRV ID 14, 0x0E). Драйвер виден в имени файла прошивки:
..._DRV(MODBUS_UNI)_public.zip— Modbus RTU. - В таблице драйверов прошивки есть и другие, например драйвер «Пульсар» для счётчиков воды (DRV ID 33, 0x21): по описанию кодека, по нему работают модемы LA-IP-RSP на счётчиках воды. В текущие сборки эти драйверы не входят, поэтому на странице описан только Modbus RTU.
| LA-IP-RSP | LA-IP-RSP[A] | |
|---|---|---|
| Питание модема | Батарея | Сеть переменного тока |
| Класс LoRaWAN | A | A, C |
| Порт RS-485 | 1 порт, 4 слота | 1 порт, 4 слота |
| Питание прибора от порта | 3,3 или 9 В на время опроса | 3,3 или 9 В на время опроса либо без отключения между опросами |
| Допустимый ток при DC 9 В (по спецификации) | 40 мА | 50 мА |
| Мониторинг регистров | Нет | Есть |
| Команда управления питанием 0xAA | Нет | Есть |
| Минимальная пауза между пробуждениями одного слота | 60 секунд | 2 секунды |
Подключение и питание прибора
Порт полудуплексный: направление приёмопередатчика — передача или приём — переключает прошивка.
Прибору без собственного питания интерфейса устройство может подать питание с порта. Источник задают биты 6–7 байта DEVCFG в конфигурации слота:
| Значение | Питание прибора |
|---|---|
| 0 | Выключено |
| 1 | 3,3 В на время опроса |
| 2 | «Без изменений», только LA-IP-RSP[A]: устройство не переключает питание ни перед опросом, ни после. Включают и выключают его командой 0xAA, см. «Управление питанием». На LA-IP-RSP значение 2 работает как 0 |
| 3 | 9 В на время опроса |
При значениях 1 и 3 устройство перед опросом включает питание, ждёт задержку включения и выключает питание, когда опрос закончен. Задержку задают биты 0–3 DEVCFG с шагом 333 мс: от 0 до 15 шагов, то есть до 5 секунд. Допустимый ток нагрузки — по спецификации: до 40 мА у LA-IP-RSP и до 50 мА у LA-IP-RSP[A] при DC 9 В.
На LA-IP-RSP[A] после первого опроса с питанием 2 — по DEVCFG слота или по байту питания разовой команды — или после команды 0xAA устройство до перезагрузки не выключает питание после опросов слотов со значениями 1 и 3. Не смешивайте на одном порту слоты со значением 2 и со значениями 0, 1, 3.
Порядок настройки
Порт и опрос настраивают downlink-пакетом Protocol 78 на fPort 2; настройку устройство принимает и на fPort 1. После заголовка — ID 0x78, SEQ, FLAGS — идут элементы: байт FORMAT, байт LEN с длиной тела элемента, затем тело. В кадре может быть несколько элементов, устройство обрабатывает их по порядку.
| FORMAT | Элемент |
|---|---|
| 0x06 | Конфигурация слота или разовая команда |
| 0x07 | Параметры порта |
| 0x16 | Часть конфигурации слота, когда она не помещается в один кадр |
- Отправьте конфигурацию слота — элемент 0x06. Если драйвер Modbus RTU на порту ещё ни разу не загружался, устройство загружает его и записывает параметры порта по умолчанию: 9600 бит/с, 8N1. Сохранённые ранее параметры при повторной загрузке драйвера не сбрасываются.
- Если прибору нужны другие параметры порта, отправьте элемент 0x07. До первой загрузки драйвера устройство этот элемент отклоняет. Оба элемента можно передать в одном кадре — 0x06 первым.
- Проверьте ответ устройства: на каждый элемент придёт CFG_ID, а бит в CFG_RESULT покажет, применён ли элемент, см. «Подтверждение настройки».
Через ONS кадр отправляют командой downlink_data_req: data — кадр в hex, fport — 2.
Параметры порта (FORMAT 0x07)
Элемент: 07 04, затем 4 байта тела.
| Байты тела | Значение |
|---|---|
| 0–1 | В кодеке — номер порта (PORT, uint16). Прошивка эти байты пропускает и всегда настраивает порт 0. Передавайте 00 00 |
| 2–3 | SERIAL_CFG, uint16, младший байт первым |
| Биты SERIAL_CFG | Параметр | Значения |
|---|---|---|
| 0–3 | Скорость | Номер в списке ниже |
| 4–5 | Чётность | 0 — нет, 1 — чётная (even), 2 — нечётная (odd) |
| 6–7 | Стоп-биты | 0 — 1, 1 — 0,5, 2 — 2, 3 — 1,5 |
| 8–9 | Длина слова | 0 — 7 бит, 1 — 8 бит, 2 — 9 бит |
| 10–15 | Резерв | 0 |
Скорость, бит/с: 0 — 300, 1 — 600, 2 — 1200, 3 — 2400, 4 — 4800, 5 — 9600, 6 — 14 400, 7 — 19 200, 8 — 38 400, 9 — 57 600, 10 — 115 200, 11 — 128 000, 12 — 230 400, 13 — 256 000.
Длина слова включает бит чётности: прошивка передаёт значение в UART как есть, и 9-битное слово — это 8 бит данных и бит чётности. Поэтому при чётности even или odd указывайте длину на 1 больше: для 8E1 — 2 (9 бит).
Пример: 9600 бит/с, 8E1.
78 00 00 07 04 00 00 15 02
| Байты | Значение |
|---|---|
78 00 00 | Заголовок Protocol 78: ID, SEQ, FLAGS |
07 | FORMAT 0x07 — параметры порта |
04 | LEN: 4 байта тела |
00 00 | Номер порта, прошивка пропускает |
15 02 | SERIAL_CFG = 0x0215: скорость 5 (9600), чётность 1 (even), стоп-биты 0 (1), длина слова 2 (9 бит) |
На этот элемент устройство ответит CFG_ID 08 03 07 8F.
Параметры принадлежат порту, поэтому общие для всех четырёх слотов. Значения устройство при приёме не проверяет и сохраняет как есть. Если номер вне списка — скорость 14–15, чётность 3, длина слова 3, — при следующем опросе порт не откроется, и опрос закончится событием ошибки с кодом 7.
Конфигурация опроса Modbus RTU (FORMAT 0x06)
Заголовок элемента
Элемент: 06 <LEN> <DRV_HDR, 2 байта> <LEN_TYPE> <данные>.
| Биты DRV_HDR (uint16, младший байт первым) | Значение |
|---|---|
| 0–11 | DRV ID: 14 (0x00E) — Modbus RTU |
| 12–13 | Слот, 0–3 |
| 14 | Прошивка не читает; в кодеке — TRIGGER/FORCED. Передавайте 0 |
| 15 | ENABLED: 1 — слот включён, 0 — выключить слот |
| Биты LEN_TYPE | Значение |
|---|---|
| 0–5 | Длина данных минус 1 |
| 6–7 | Тип: 0 — EMPTY (без конфигурации), 1 — CONFIG (конфигурация опроса), 3 — COMMAND (разовая команда, см. «Разовые команды»). Тип 2 устройство отклоняет |
Данные конфигурации
| Байты | Значение |
|---|---|
| 0 | Адрес прибора (slave) |
| 1 | DEVCFG: задержка включения, число попыток, питание прибора |
| 2 | Резерв, 0 |
| 3–13 | Группа 1 |
| 14–24 | Группа 2 |
| 25–35 | Группа 3 |
| 36–46 | Группа 4 |
Полная конфигурация — 47 байт. Кодек передаёт только заданные группы: в примере ниже одна группа, 14 байт данных.
| Биты DEVCFG | Значение |
|---|---|
| 0–3 | Задержка после включения питания прибора, шаг 333 мс: 0–15 |
| 4–5 | Число попыток опроса блока по расписанию: 0 и 1 — одна, 2 — две, 3 — три |
| 6–7 | Питание прибора: 0 — выключено, 1 — 3,3 В, 2 — без изменений, 3 — 9 В, см. «Подключение и питание прибора» |
Ответ прибора устройство ждёт до 2 секунд. Между попытками — паузы 300, 600 и 1200 мс.
Группы и блоки регистров
Группа — 11 байт: PARAM CFG (3 байта) и два блока регистров (по 4 байта). Все числа — младшим байтом вперёд.
| Биты PARAM CFG (uint24) | Значение |
|---|---|
| 0–12 | Интервал опроса: (значение + 1) × 10 минут |
| 13–17 | Час начала по UTC, 0–23; 31 — случайный час |
| 18–19 | Резерв |
| 20–21 | Цифровой вход: 0 — без привязки, 1–3 — вход 1–3, см. «Привязка группы к цифровому входу» |
| 22 | Ожидаемое состояние входа: 0 — разомкнут, 1 — замкнут |
| 23 | Группа активна |
| Биты блока (uint32) | Значение |
|---|---|
| 0–1 | Функция: 0 — FC01 (coils), 1 — FC02 (discrete inputs), 2 — FC03 (holding registers), 3 — FC04 (input registers) |
| 2–4 | Делитель мониторинга, 0 — выключен. Только LA-IP-RSP[A], см. «Мониторинг регистров» |
| 5 | Мониторинг: критичное значение — отправить сразу |
| 6 | Мониторинг: отправить с подтверждением LoRaWAN |
| 7 | Резерв |
| 8–15 | Количество регистров или битов; 0 — блок выключен |
| 16–31 | Адрес первого регистра |
Что устройство отклоняет
Драйвер отклоняет конфигурацию целиком, если:
- в активной группе у обоих блоков количество 0;
- оба блока группы включены и совпадают по функции и адресу;
- в блоке FC03 или FC04 больше 125 регистров;
- нет ни одной активной группы.
Отклонённая конфигурация не меняет работу слота: он продолжает опрос по прежней рабочей конфигурации.
Пример: опрос 10 регистров раз в час
Прибор с адресом 1, две попытки, питание 9 В, задержка включения 3 × 333 мс. Одна группа: раз в 60 минут, начиная с 00:00 UTC, читать 10 holding-регистров с адреса 0.
78 00 00 06 11 0E 80 4D 01 E3 00 05 00 80 02 0A 00 00 00 00 00 00
| Байты | Значение |
|---|---|
78 00 00 | Заголовок Protocol 78 |
06 11 | FORMAT 0x06, LEN 17 |
0E 80 | DRV_HDR 0x800E: DRV ID 14, слот 0, ENABLED |
4D | LEN_TYPE: CONFIG, 14 байт данных |
01 | Адрес прибора 1 |
E3 | DEVCFG: задержка 3, попыток 2, питание 3 (9 В) |
00 | Резерв |
05 00 80 | PARAM CFG 0x800005: интервал (5 + 1) × 10 = 60 минут, час начала 0, группа активна |
02 0A 00 00 | Блок 1: FC03, 10 регистров с адреса 0 |
00 00 00 00 | Блок 2 выключен |
Устройство ответит CFG_ID 08 03 06 60 и, если конфигурация применена, CFG_RESULT 08 02 01 00.
Расписание и первый опрос
Каждая активная группа опрашивается раз в (значение + 1) × 10 минут — от 10 до 81 920 минут. Опросы привязаны к часу начала: час начала + k × интервал. Часы устройства идут по UTC, поэтому час начала — тоже по UTC. Например, интервал 6 часов (значение 35) и час начала 3 дают опросы в 03:00, 09:00, 15:00 и 21:00 UTC.
- Час начала 31 — случайный: устройство выбирает его один раз при запуске.
- Час начала 24–30 — группа по расписанию не опрашивается.
Первый опрос после применения конфигурации:
- Слот просыпается через 60 секунд в классе A или через 10 секунд в классе C. Разовая команда в классе A выполняется через 3 секунды.
- Устройство сразу делает полный опрос с соблюдением минимальной паузы между пробуждениями слота: 60 секунд на LA-IP-RSP, 2 секунды на LA-IP-RSP[A].
- Если до ближайшего опроса по расписанию меньше половины интервала, устройство не опрашивает сразу, а ждёт этого опроса.
На LA-IP-RSP опрос откладывается на 90 секунд, пока менеджер питания не разрешает дополнительную нагрузку на батарею.
Привязка группы к цифровому входу
Группу можно привязать к одному из трёх цифровых входов: биты 20–21 PARAM CFG — номер входа, бит 22 — ожидаемое состояние. Опрос группы по расписанию выполняется, только если вход включён в режиме «Цифровой» и находится в ожидаемом состоянии. В остальных случаях этот опрос пропускается.
Если вход выключен или работает в счётном режиме, его состояние не определено, и группа опрашивается без условия.
Мониторинг регистров
Мониторинг работает только на LA-IP-RSP[A]. Блок с ненулевым делителем устройство читает N раз за интервал группы, с шагом интервал / N: один полный опрос и N − 1 чтений мониторинга между полными опросами. Шаг не короче минимальной паузы между пробуждениями слота (2 секунды).
| Делитель (биты 2–4 блока) | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| N — чтений за интервал | 300 | 200 | 100 | 50 | 40 | 30 | 20 |
- Данные мониторинга устройство отправляет, только если они изменились, — с причиной 7 в записи 0x20.
- Биты 5 (критичное значение — отправить сразу) и 6 (с подтверждением LoRaWAN) действуют только на чтения мониторинга.
- События ошибок мониторинга ограничены: не больше одного за 600 секунд на слот. Младшая половина байта subCode в таком событии — число неудач.
На LA-IP-RSP мониторинга в прошивке нет, и делитель не действует.
Разовые команды
Разовая команда — элемент 0x06 с типом COMMAND (биты 6–7 LEN_TYPE = 3). Команда адресуется включённому слоту: команду выключенному слоту или для драйвера, который не загружен на порту, устройство отклоняет. Команду, пришедшую, пока драйвер занят опросом, устройство тоже отклоняет — событием с кодом 19, точка отказа 1.
Чтение и запись
| Поле | Размер | Значение |
|---|---|---|
| Тип | 1 байт | 0x01 — чтение, 0x02 — запись, 0xAA — управление питанием |
| Функция | 1 байт | Код функции Modbus: 01–04 — чтение; 05, 06, 0F, 10 — запись |
| Первый регистр | 2 байта, младший первым | |
| Количество | 1 байт | Регистров или битов. Для FC05 и FC06 не используется |
| Флаги | 2 байта, младший первым | См. таблицу ниже |
| Адрес прибора | 1 байт | Только с битом 3. Без него — адрес из конфигурации слота |
| Питание | 1 байт | Только с битом 4: биты 0–3 — задержка, шаг 333 мс; биты 4–5 — питание прибора: 0 — выключено, 1 — 3,3 В, 2 — без изменений, 3 — 9 В |
| Параметры порта | 2 байта | Только с битом 5: SERIAL_CFG, как в FORMAT 0x07 |
| Задержка после записи | 2 байта, мс | Только запись с битом 7 |
| Число байт данных | 1 байт | Только запись: 1–32. Иначе устройство ответит событием с кодом 7 |
| Данные | 1–32 байта | Только запись. Для FC05 и FC06 значение — первые два байта, старший первым |
| Биты флагов | Значение |
|---|---|
| 0–2 | Приоритет результата: 1 — низкий, 2 — обычный, 3 — высокий, 4 — критичный, uplink уходит сразу. 0 — для записи без бита 6 данных не будет: придёт запись 0x20 с причиной 4; результат чтения придёт с низким приоритетом |
| 3 | Свой адрес прибора |
| 4 | Свой байт питания |
| 5 | Свои параметры порта |
| 6 | Прочитать после записи |
| 7 | Задержка после записи |
| 14–15 | Число попыток минус 1: 0–3 — от 1 до 4 попыток |
Вся команда — от байта типа до последнего байта данных — не длиннее 41 байта; длиннее устройство отклоняет событием с кодом 19, точка отказа 8. Поэтому с необязательными полями данных помещается меньше 32 байт: с задержкой после записи — до 31, со всеми полями — до 27.
Пример: прочитать 4 holding-регистра с адреса 0x0100 у прибора с адресом 17 на слоте 1.
78 00 00 06 0B 0E 90 C7 01 03 00 01 04 0A 00 11
| Байты | Значение |
|---|---|
06 0B | FORMAT 0x06, LEN 11 |
0E 90 | DRV_HDR 0x900E: DRV ID 14, слот 1, ENABLED |
C7 | LEN_TYPE: COMMAND, 8 байт данных |
01 | Чтение |
03 | FC03 |
00 01 | Первый регистр 0x0100 |
04 | 4 регистра |
0A 00 | Флаги 0x000A: приоритет 2, свой адрес прибора, одна попытка |
11 | Адрес прибора 17 |
Пример: записать функцией FC16 (0x10) два регистра с адреса 0x0010, через 500 мс прочитать их обратно.
78 00 00 06 11 0E 80 CD 02 10 10 00 02 C2 00 F4 01 04 00 01 00 02
| Байты | Значение |
|---|---|
06 11 | FORMAT 0x06, LEN 17 |
0E 80 | DRV ID 14, слот 0, ENABLED |
CD | LEN_TYPE: COMMAND, 14 байт данных |
02 | Запись |
10 | FC16 |
10 00 | Первый регистр 0x0010 |
02 | 2 регистра |
C2 00 | Флаги 0x00C2: приоритет 2, прочитать после записи, задержка после записи; адрес прибора — из конфигурации слота |
F4 01 | Задержка 500 мс |
04 | 4 байта данных |
00 01 00 02 | Данные |
Результат команды приходит в записи 0x20 с причиной 1 (чтение), 4, 5 или 6 (запись), см. «Данные от устройства».
Управление питанием
Команда 0xAA: AA <состояние> <отчёт>. Состояние: 0 — выключить, 1 — 3,3 В, 2 — не менять, 3 — 9 В. Отчёт не 0 — устройство пришлёт событие с кодом 0.
Команда работает только на LA-IP-RSP[A] и только если у слота питание прибора «без изменений» (значение 2 в DEVCFG). Иначе устройство ответит событием с кодом 5, а LA-IP-RSP — с кодом 9. Питание остаётся в заданном состоянии, пока его не изменит следующая команда 0xAA или опрос другого слота с питанием 0, 1 или 3: питание у порта общее, и такой опрос его включает или выключает.
Пример: включить 9 В и прислать отчёт.
78 00 00 06 06 0E 80 C2 AA 03 FF
| Байты | Значение |
|---|---|
06 06 | FORMAT 0x06, LEN 6 |
0E 80 | DRV ID 14, слот 0, ENABLED |
C2 | LEN_TYPE: COMMAND, 3 байта данных |
AA | Управление питанием |
03 | 9 В |
FF | Прислать отчёт |
Данные от устройства (запись 0x20)
Прочитанные регистры устройство передаёт в uplink записью 0x20 — FORMAT MODBUS из формата пакета Protocol 78.
| Поле | Размер | Значение |
|---|---|---|
| FORMAT | 1 байт | 0x20 |
| TIMESTAMP | 4 байта, младший первым | Время ответа прибора: секунды с 01.01.2000 UTC. UNIX-время = значение + 946684800 |
| FLAGS | 1 байт | Биты 0–1 — слот; биты 2–6 — сколько блоков идёт после первого; бит 7 — есть EXT_FLAGS |
| EXT_FLAGS | 2 байта, младший первым | Биты 0–2 — причина; бит 5 — блок разбит на части |
| Блок | Функция (1 байт: 0–3 — FC01–FC04), количество (1 байт), начальный адрес (2 байта, младший первым), данные |
Данные блока — байты из ответа прибора после поля с числом байт: для FC03 и FC04 — регистры старшим байтом вперёд, по 2 байта на регистр; для FC01 и FC02 — биты, по 8 в байте, (количество + 7) / 8 байт. Блоки с одинаковыми меткой времени, слотом и флагами устройство объединяет в одну запись.
| Причина | Что прочитано |
|---|---|
| 0 | Опрос по расписанию |
| 1 | Разовая команда чтения |
| 4 | Запись выполнена, данных нет |
| 5 | Записанные данные |
| 6 | Чтение после записи |
| 7 | Мониторинг |
Причины 2 и 3 относятся к опросу по событию, который в текущей прошивке выключен.
Пример: опрос по расписанию, слот 0, регистры 0 и 1.
78 02 00 20 40 42 5A 32 80 00 00 02 02 00 00 00 0A 00 14
| Байты | Значение |
|---|---|
78 02 00 | Заголовок Protocol 78 |
20 | Запись Modbus |
40 42 5A 32 | 0x325A4240 = 844776000; 844776000 + 946684800 = 1791460800 — 08.10.2026 12:00:00 UTC |
80 | FLAGS: слот 0, один блок, есть EXT_FLAGS |
00 00 | EXT_FLAGS: причина 0 — расписание |
02 | FC03 |
02 | 2 регистра |
00 00 | Начальный адрес 0 |
00 0A 00 14 | Регистр 0 = 0x000A, регистр 1 = 0x0014 |
Фрагмент вывода кодека для этого пакета (служебные поля опущены). Слот 0 кодек называет bus1, функцию выводит настоящим кодом Modbus — 3:
"serial": {
"bus1": {
"utctimestamp": "2026-10-08T12:00:00.000Z",
"trigger": { "type": { "value": 0, "description": "Scheduled reading" } },
"modbus1": {
"function": 3,
"count": 2,
"start_address": 0,
"data": { "0": { "value": "000A" }, "1": { "value": "0014" } }
}
}
}
Длинные блоки
Блок FC03 или FC04, который не помещается в кадр uplink, устройство делит на части. В каждой части бит 5 EXT_FLAGS = 1, а между EXT_FLAGS и заголовком блока идут 3 байта:
| Байт | Значение |
|---|---|
| 0 | Биты 0–2 — номер пакета, 0–7; биты 3–7 — номер части |
| 1 | Сколько регистров в блоке всего |
| 2 | Биты 0–6 — сколько регистров в этой части; бит 7 — последняя часть |
Блоки FC01 и FC02 на части не делятся.
Отправка с подтверждением LoRaWAN
Данные слота можно отправлять с подтверждением LoRaWAN — системной командой 0x15 (FORMAT 0x00): 00 03 15 <слот> <группы>, где биты 0–3 последнего байта — группы 1–4. В текущей прошивке бит выбирается по положению блока в прогоне, а не строго по номеру группы, поэтому для подтверждённой доставки включайте все группы:
78 00 00 00 03 15 00 0F
Ошибки обмена (запись 0x08, подтип 0x07)
Ошибки обмена с прибором устройство передаёт служебной записью 0x08 с подтипом 0x07: 08 07 <TIMESTAMP, 4 байта> <2 байта: биты 0–11 — DRV ID, 12–13 — слот, 14 — порт> <код> <subCode>.
| Код | Значение | subCode |
|---|---|---|
| 0 | Нет ошибки — отчёт о выполнении | |
| 1 | Прибор не ответил | Позиция блока |
| 2 | Не сошлась контрольная сумма ответа | Позиция блока |
| 5 | Сбой обмена | |
| 7 | Ошибка конфигурации | |
| 8 | Нарушение протокола | Адрес прибора или код функции из чужого ответа; 0 — неверная длина данных; позиция блока — если число байт в ответе не совпало с запросом (с METER_V3.1.5.62) |
| 9 | Внутренняя ошибка драйвера | 0xF0 — прогон прерван по таймеру порта (60 секунд); 0–4 — внутреннее состояние драйвера; 0 — также ответ LA-IP-RSP на команду 0xAA |
| 10 | Исключение Modbus | Код исключения от прибора |
| 11 | Переполнение приёмника UART | Позиция блока |
| 12 | Ошибка кадра на линии | Позиция блока |
| 13 | Шум на линии | Позиция блока |
| 14 | Аппаратный сбой UART | |
| 15 | Ошибка чётности | |
| 16 | Переполнение, ошибка кадра и шум одновременно | Позиция блока |
| 17 | Очередь uplink переполнена, данные потеряны | Позиция блока |
| 18 | Ответ короче 5 байт | Позиция блока |
| 19 | Конфигурация или команда из downlink не применена | Старшая половина байта — точка отказа 1–12, младшая — слот |
| 255 | Ошибка не распознана | Позиция блока |
Позиция блока: старшая половина байта — номер блока в конфигурации, 0–7 (группа × 2 + блок, с нуля); младшая — сколько блоков прогона оставалось, включая этот. У блоков с мониторингом младшая половина — число неудач.
| Точка отказа (код 19) | Где |
|---|---|
| 1 | Драйвер занят — команда отклонена |
| 2 | Неверный номер слота |
| 3 | Команда выключенному слоту |
| 4 | Выключение слота |
| 5 | Загрузка драйвера, в том числе драйвера нет в сборке |
| 6 | Запуск драйвера |
| 7 | У драйвера нет обработчиков |
| 8 | Драйвер отклонил конфигурацию |
| 9 | Запись конфигурации в память |
| 10 | Нет сохранённой конфигурации для включения слота |
| 11 | Включение слота |
| 12 | Команда для драйвера, который не загружен на порту |
Пример: таймаут на слоте 1.
78 01 00 08 07 40 42 5A 32 0E 10 01 13
0E 10 — DRV ID 14, слот 1; 01 — прибор не ответил; 13 — блок 1 (группа 1, второй блок), оставалось 3 блока. Фрагмент вывода кодека:
"serial": {
"bus2": {
"error": {
"utctimestamp": "2026-10-08T12:00:00.000Z",
"drvId": 14,
"code": 1,
"codeDescription": "Timeout",
"subCode": 19
}
}
}
Когда прогон прерывается
Прогон — опрос всех блоков слота за одно пробуждение. Если блок не прочитан за все попытки, устройство сообщает об ошибке и переходит к следующему блоку. Прогон прерывается целиком, если:
- прибор не ответил на первый блок;
- прибор ответил исключением Modbus;
- пришёл ответ с чужим адресом прибора или с неизвестной функцией;
- не прочитан блок разовой команды.
Прогон дольше 60 секунд прерывает таймер порта (код 9, subCode 0xF0); дальше слот работает по расписанию.
Подтверждение настройки
- На каждый элемент 0x06 и 0x16 устройство отвечает записью CFG_ID
08 03 06 <cfg_id>:cfg_id = (tag6 << 2) | слот, где tag6 — младшие 6 бит CRC-16/MODBUS по байтам элемента после FORMAT и LEN. Сервер считает tag6 по отправленным байтам и сверяет с ответом. - На элемент 0x07 —
08 03 07 <tag8>, где tag8 — младший байт той же CRC. Для примера 9600 8E1 — 0x8F. - Применён ли элемент, показывает CFG_RESULT
08 02 <uint16, младший байт первым>: бит с порядковым номером элемента среди элементов настройки кадра равен 1, если элемент применён. В счёт идут только элементы, на которые устройство отвечает CFG_ID: запросы 0x11 и элементы, которые устройство пропускает (например, 0x05), номера не получают. - CFG_ID подтверждает только, что элемент обработан, — успех показывает бит в CFG_RESULT.
Кодек разбирает 08 03 06 B6 как слот 2, tag6 = 45.
Если конфигурация пришла, пока драйвер занят опросом, устройство ставит её в очередь и применяет, когда драйвер освободится. CFG_ID в этом случае придёт в одном из следующих uplink записью 08 0D <блок> <cfg_id> <номер элемента>; номер элемента — это номер бита в CFG_RESULT того же uplink. На каждый слот в очереди одно место: следующий элемент для того же слота, пока первый ждёт, устройство отклоняет — бит в CFG_RESULT равен 0, события с кодом 19 нет.
Выключить и снова включить слот
- Выключить слот — элемент 0x06 с ENABLED = 0.
- Включить снова с сохранённой конфигурацией — элемент 0x06 типа EMPTY с ENABLED = 1. Сохранённая конфигурация должна быть для того же драйвера, иначе устройство ответит событием с кодом 19, точка отказа 10.
После LEN_TYPE нужен хотя бы один байт данных и для EMPTY: поле длины хранит длину минус 1. Для слота 0:
78 00 00 06 04 0E 00 00 00 — выключить
78 00 00 06 04 0E 80 00 00 — включить с сохранённой конфигурацией
Прочитать настройки из устройства
Текущую конфигурацию слота и параметры порта можно прочитать служебным запросом 0x11 с типом 0x04:
78 00 00 11 03 04 06 00 — конфигурация слота 0 (последний байт — слот)
78 00 00 11 03 04 07 00 — параметры порта
Ответ приходит записью 08 0B, а если не помещается в кадр — частями 08 0C. Кодек строит эти запросы и разбирает ответы.
Большие конфигурации
На скоростях DR0–DR2 в частотных планах EU868 и KZ865 кадр downlink — не больше 51 байта. Заголовок, FORMAT, LEN, DRV_HDR и LEN_TYPE занимают 8 байт, на данные драйвера остаётся 43 байта. Конфигурация из трёх групп (36 байт) помещается, из четырёх (47 байт) — нет: такой кадр занимает 55 байт, и кодек об этом предупреждает. ONS отклоняет downlink_data_req с данными больше предела ошибкой 4. Предел считается для скорости из поля dr, а без него — для скорости последнего uplink, см. max_dl_data_req.
Конфигурацию, которая не помещается в кадр, передают частями — элементами 0x16: 16 <LEN> <DRV_HDR> <FRAG> <часть данных>. Байта LEN_TYPE в элементе нет.
| Биты FRAG | Значение |
|---|---|
| 0–5 | Смещение части в данных конфигурации |
| 6 | Резерв, 0 |
| 7 | LAST — последняя часть |
- Устройство собирает части в памяти и применяет конфигурацию целиком, только после части с LAST.
- Часть со смещением 0 начинает сборку заново. Часть с пропуском или часть другого слота устройство отклоняет.
- В частях должно быть ENABLED = 1. Выключают слот обычным элементом 0x06.
- На каждую часть приходит свой CFG_ID.
Кодек сам делит конфигурацию на кадры. Пример: слот 0, четыре группы — 10 holding-регистров с адреса 0 и 10 с адреса 100 раз в час, 4 input-регистра с адреса 0 раз в час, 16 coils с адреса 0 раз в сутки с 03:00 UTC.
78 00 00 16 2E 0E 80 00 01 E3 00 05 00 80 02 0A 00 00 00 00 00 00 05 00 80 02 0A 64 00 00 00 00 00 05 00 80 03 04 00 00 00 00 00 00 8F 60 80 00 10 00 00
78 01 00 16 07 0E 80 AB 00 00 00 00
Первый кадр — 51 байт: FRAG 0x00 — смещение 0, не последняя часть, 43 байта данных; ожидаемый CFG_ID 08 03 06 44. Второй — 12 байт: FRAG 0xAB — смещение 43, LAST, оставшиеся 4 байта; ожидаемый CFG_ID 08 03 06 38.
Отправляйте кадры строго по порядку и ставьте следующий в очередь только после того, как ушёл предыдущий: из очереди ONS первым уходит последний поставленный кадр, см. downlink_data_req.
Версии прошивки
Номера версий не растут по дате: METER_V3.0.4.7 собрана в августе 2026, METER_V3.0.4.137 — в мае 2026, а METER_V3.1.5.0–3.1.5.12 — в июне 2026, раньше обеих. Поэтому сверяйте возможность по таблице, где для линии 3.1.5 номер указан отдельно.
| Возможность | Первая версия |
|---|---|
| Части конфигурации, FORMAT 0x16 | METER_V3.0.4.7; в линии 3.1.5 — METER_V3.1.5.13. Более старая прошивка элемент 0x16 пропускает |
| CFG_ID на элементы 0x06 | METER_V3.0.4.137 |
| CFG_ID на каждый элемент кадра | METER_V3.0.5.4; в линии 3.1.5 — METER_V3.1.5.13 |
| Продолжение прогона после потерянного блока; паузы 300, 600 и 1200 мс между попытками | METER_V3.1.5.34 |
| Код ошибки 18 | METER_V3.1.5.49 |
| Код ошибки 19 | METER_V3.1.5.55 |
| Отказ на тип 2 в LEN_TYPE | METER_V3.1.5.60 |
Отложенный CFG_ID 08 0D | METER_V3.1.5.73 |
| Биты 6 и 7 флагов команды записи | METER_V3.1.5.77. В более старых прошивках бит 6 не действует (запись выполняется без чтения после неё), а с битом 7 команда разбирается со сдвигом: младший байт задержки принимается за число байт данных. Если он равен 0 или больше 32, команда отклоняется с кодом 7, иначе прибору уходит запись с неверными данными. Не задавайте эти биты в более старых прошивках |
В текущей прошивке, кроме того:
- элемент 0x06 для драйвера, которого нет в сборке, отклоняется без последствий для рабочих слотов; в более ранних прошивках такой элемент мог отключить слоты Modbus;
- конфигурация, которую отклонил драйвер, оставляет слот работать по прежней конфигурации.
Одинаковы в METER_V3.0.4.132 и в текущей прошивке: раскладка параметров порта и список скоростей, правило «сначала драйвер, потом 0x07», раскладка конфигурации Modbus, число попыток и отсутствие мониторинга на LA-IP-RSP.
Что важно знать
- Порт 1 не поддерживается. Кодек умеет строить элементы 0x05 и 0x15 для порта 1, но LA-IP-RSP их пропускает: без бита в CFG_RESULT и без CFG_ID. Используйте 0x06 и 0x16.
- Сначала драйвер, потом порт. Элемент 0x07 до первой конфигурации слота отклоняется. Параметры порта общие для всех слотов.
- Значения 0x07 не проверяются при приёме. Ошибка в номере скорости, чётности или длины слова проявится при следующем опросе событием с кодом 7.
- Час начала — по UTC. Часовой пояс при расчёте расписания не учитывается.
- CFG_ID — не признак успеха. Успех показывает бит в CFG_RESULT.
- Прозрачного канала нет. Передать произвольные байты в RS-485 через LoRaWAN нельзя.
- Опроса по событию нет. Опрос по цифровому входу или магниту (системная команда 0x11, причины 2 и 3 в записи 0x20) в линии 3.1.5 выключен. Привязка группы к цифровому входу — другая возможность, она работает.
См. также
- Спецификация — число портов, питание приборов по RS-485, классы LoRaWAN.
- Цифровой — режим входа, к которому привязывают группу опроса.
- Формат пакета Protocol 78 — заголовок пакета и список FORMAT.
- Playground Protocol 78 — разбор пакетов устройства в браузере.
- Отправка данных на устройство — как поставить кадр в очередь через WebSocket API ONS и проверить его статус.