====== Описание работы модулей для счетчиков газа Elster, Metrix, Samgaz ====== [[https://jooby.eu/rdc-en/|{{:ru:rdc:elster.png?nolink&200}}]] [[https://jooby.eu/rdc-en/|{{:ru:rdc:metrix.png?nolink&200}}]] [[https://jooby.eu/rdc-en/|{{:ru:rdc:samgas.png?nolink&200}}]] Модули выполнены в разных корпусах. Алгоритм функционирования полностью идентичен. ===== LoRaWan sensor commands ===== {{ :ru:rdc:lorawan_sensor_commands._version_4.6_rev.2.22_.pdf |LoRaWan sensor commands. Version 4.6 (Rev.2.22)}} ===== Начало работы ===== Для корректной инсталляции модуля в NS, необходимо знать заводские параметры модуля (Уточнить в спецификации): * Способ активации модуля в сети LoraWAN - ABP (Activation by personalisation) или OTAA (Over the Air Activation) * Ключи (APPSKEY[16], NETSKEY[16] - ABP) или (APPKEY[16] - OTAA). ===== Индикация ===== Индикация с помощью светодиода: * Короткая вспышка светодиода (20 мс) индицирует нажатие,отпускание кнопки. * Увеличение счетчика импульсов также сопровождается короткой (20 мс) вспышкой светодиода. * Активация модуля в сети LoraWAN подтверждается серией из 7 вспышек светодиода. ===== Время, дата ===== FIXME Время модуля и сервера необходимо синхронизировать. В процессе работы необходимо корректировать время модуля при его расхождении с сервером. Допустимое отклонение не более 30 секунд Время модуля передается в виде 4-х байтного счетчика. Это время в секундах, начиная с 2000 года. Время модуля необходимо синхронизировать с временем сервера. Установка времени может происходить при помощи 2 команд: **SET_TIME** и **CORRECT_TIME**. Команда **SET_TIME** предназначена для начальной установки времени и в случае корректировки более +/-128 секунд. При выполнении этой команды могут быть потеряны почасовые данные, если коррекция производиться назад. В дальнейшем сервер должен корректировать время модуля при его расхождении с временем сервера. Рекомендуемое допустимое отклонение времени не более 30 секунд, при его превышении проводится корректировка времени командой **CORRECT_TIME**. ===== Режим Активации ===== Активация происходит после того, как кнопка находится в "зажатом" состоянии 20 секунд. Это происходит при установке модуля в счетчик газа. Опрос датчика происходит постоянно. Режим **АКТИВАЦИИ** подтверждается светодиодной индикацией - 7 вспышек светодиода с периодом 50 мс. Под АКТИВАЦИЕЙ подразумевается то что модуль начнет пересылать кадры данных по радиотракту. До активации радиотракт выключен. В режиме АКТИВАЦИИ происходят [[#события]] **INSERT** и **ACTIVATE**, передаются кадры **NEW_EVENT** с событиями - **INSERT** и **ACTIVATE**, в данных этих событий передается время события. Также [[#команды|командой]] **GET_CURRENT** передаются текущие данные счетчика импульсов. Если модуль снять со счетчика газа (кнопка отжата), то через 30 секунд модуль будет деактивирован. На сервер будет отправлен кадр NEW_EVENT с событиями - **REMOVE** и **DEACTIVATE** (в данных этих событий передается время события) и командой **GET_CURRENT** передаются текущие данные счетчика импульсов. ===== Данные потребления ===== После активации модуль будет регулярно пересылать данные потребления. По умолчанию модуль передает данные почасового потребления с интервалом около 4 часов + псевдослучайная составляющая в пределах от 0 до 17 минут. Периодичность отправки данных может быть изменена, но период не может быть меньше 10 минут и больше 36 часов. Можно задать тип передаваемых данных. Возможно передача текущих данных, почасовых, посуточных. Также возможна передача по часовых и суточных одновременно (в одном кадре). Для выбора типа передаваемых данных следует воспользоваться параметром 5 (Тип выдаваемых данных). Почасовые данные сохраняются в архиве, максимальная глубина архива 6 месяцев. Данные суточного потребления также сохраняются в архиве, максимальная глубина 2 года. Глубина архивов конфигурационно не меняется. ===== Элемент питания (Аккумуляторная батарея) ===== Один раз в сутки модуль измеряет параметры элемента питания. Измеряется напряжение батареи без нагрузки и напряжение батареи под нагрузкой резистора (150 Ом для модулей на WLE). Эти данные и вычисленное значение внутреннего сопротивления будет передаваться один раз за сутки. По результатам проверки батарейки возможен запуск процесса депассивации батарейки. В этом случае в журнал будет записано событие **DEPASS_DONE**. ===== Датчики магнитного поля ===== В модуле установлены два датчика магнитного поля. Первый датчик фиксирует потребление газа. В счетчике газа в одно из колец механизма установлен магнит. Таким образом модуль фиксирует количество оборотов этого кольца. Счетчик импульсов в модуле только наращивается, нет механизма для сброса счетчика импульсов. Наращивание счетчика импульсов сигнализируется короткой вспышкой светодиода (20 мс). Счетчик импульсов это беззнаковое 4-х байтовое число. При переполнении счетчика он начинает отсчет с “0”. При этом будет сформировано событие **COUNTER_OVER** и отправлен кадр **NEW_EVENT** с этим событием. Второй датчик используется для фиксации вредоносного воздействия магнитом на счетчик газа. Если это воздействие было продолжительностью более 20 сек, то на сервер будет отправлен кадр **NEW_EVENT** с уведомлением о магнитном воздействии **MAGNIT_ON**. После снятия воздействия магнита на сервер будет отправлен кадр **NEW_EVENT** о прекращении воздействия магнитного поля **MAGNIT_OFF**. При кратком воздействии магнитного поля (2-20 сек), на сервер будут отправлены текущие данные счетчика импульсов **GET_CURRENT** для **HARD_TYPE 1,2** и **GET_CURRENT_MUL** для **HARD_TYPE 12**. ===== Организация хранения данных в модуле ===== ==== CURRENT DATA ==== CURRENT DATA - Текущие данные счетчика импульсов. Данные хранятся в нескольких местах. При рестарте микроконтроллера производится попытка восстановления данных счетчика импульсов. Проверяется сохраненное значение в BACKUP-регистрах микроконтроллера. Если данные корректны, то они принимаются как данные счетчика импульсов. В противном случае происходит поиск последних сохраненных данных в памяти микроконтроллера. Запись текущих данных в BACKUP-регистр происходит при каждом приращении счетчика импульсов, т.е. в BACKUP-регистре всегда находится актуальное значение счетчика импульсов. Рестарт микроконтроллера не приводит к потере данных в BACKUP-регистрах. Значения счетчика импульсов записывается в память не чаще 90 секунд. Под хранение CURRENT_DATA выделено 2 страницы флеш-памяти - 2048*2=4096 байт. ^ Формат хранения CURRENT_DATA ^^^^^^^^^^^^^^^^ | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | | CNT[4] |||| RES]* || CRC16[2] || CNT[4] |||| RES* || CRC16[2] || ==== HOURS_DATA ==== HOURS_DATA - почасовые данные счетчика импульсов. Данные записываются во флэш память микроконтроллера при смене часа по времени микроконтроллера. Под хранение архива почасовых данных отведено 24 страницы флэш памяти 2048*24 = 49152 байт. Почасовые данные за сутки занимают 256 байт. Общая глубина архива не более 6 месяцев. ^ Формат хранения HOURS_DATA ||||||||||||||||||| | | 0 | 1 | 2 | | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | | B | C | D | E | F | | 0 | Y | M | D | Hour_0 | CNT[4] |||| LRC | Y | M | D | Hour_1 | CNT[4] |||| LRC | | 10 | Y | M | D | Hour_2 | CNT[4] |||| LRC | Y | M | D | Hour_3 | CNT[4] |||| LRC | | 20 | Y | M | D | Hour_4 | CNT[4] |||| LRC | Y | M | D | Hour_5 | CNT[4] |||| LRC | | 30 | Y | M | D | Hour_6 | CNT[4] |||| LRC | Y | M | D | Hour_7 | CNT[4] |||| LRC | | .. | .. | | | .. | .. |||| .. | .. | | | .. | .. |||| .. | | A0 | Y | M | D | Hour_20 | CNT[4] |||| LRC | Y | M | D | Hour_21 | CNT[4] |||| LRC | | B0 | Y | M | D | Hour_22 | CNT[4] |||| LRC | Y | M | D | Hour_23 | CNT[4] |||| LRC | ==== DAYS_DATA ==== DAYS_DATA - Данные суточного потребления. Данные записываются во флэш-память в "учетный час" суток. Учетный час можно задать произвольно в пределах 24 часов суток. По умолчанию "учетный час" равен 0 часов. Для хранения архивов суточных данных во флэш-памяти отведено 3 страницы - 2048*3=6144 байта. ^ Формат хранения DAYS_DATA ^^^^^^^^^^^^^^^^^ | | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | | 0 | Y | M | D_1 | CNT[4] |||| LRC | Y | M | D_2 | CNT[4] |||| LRC | | 10 | Y | M | D_3 | CNT[4] |||| LRC | Y | M | D_4 | CNT[4] |||| LRC | | 20 | Y | M | D_5 | CNT[4] |||| LRC | Y | M | D_6 | CNT[4] |||| LRC | | 30 | Y | M | D_7 | CNT[4] |||| LRC | Y | M | D_8 | CNT[4] |||| LRC | | | | | | | | | | | | | | | | | | | | E0 | Y | M | D_29 | CNT[4] |||| LRC | Y | M | D_30 | CNT[4] |||| LRC | | F0 | Y | M | D_31 | CNT[4] |||| LRC | | | | |||| | ===== Абсолютные данные. Команды, настройки ===== Устройство поддерживает режим работы с абсолютными данными. Этот режим устанавливается для того, чтобы из переданных устройством данных можно было легко получить текущие показания прибора учета. В этом режиме устройство использует другой набор команд для передачи данных о потреблении. Для установки начальных показаний прибора учета, необходимо использовать импульсный коэффициент - IPK, который является параметром прибора учета и обозначает объем ресурса на один импульс. Для установки режима передачи абсолютных данных в модуль, необходимо передать импульсный коэффициент IPK и начальные показания прибора учета, выраженные с учетом импульсного коэффициента INITIAL_METER_DATA= INITIAL_CONSUMPTION/IPK. А также текущее значение счетчика импульсов. Значение счетчиков импульса можно получить в момент активации или инициировать передачу текущих данных с помощью слайдера, магнита, нажатии кнопки, установки разъема (замыкание тампера). При необходимости эти операции можно повторить. Например, для газового модуля: * IPK (импульсный коэффициент) = 100 литров на 1 импульс; * Начальные показания INITIAL_CONSUMPTION = 12.5 м3; * Текущее значение счетчика импульсов START_COUNTER = 0x5033. При таких исходных данных необходимо установить INITIAL_METER_DATA в значение 12.5/0.1 = 125. ==== Установка параметров ==== Для установки [[#параметры|параметров]] режима абсолютных данных используется команда **SET_PARAMETERS = 0x03** c **TYPE_PARAMETERS = 23**. | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | 0 | 0 | 0 | CMD SET_PARAMETERS = 0x03 ||||| | CMD_LENGTH = 10 |||||||| | TYPE_PARAMETERS = 23 |||||||| | INITIAL_METER_DATA[4] |||||||| | IPK[1] |||||||| | START_COUNTER[4] |||||||| Пример: hex dump: 030A170000007D6400005033 030A - SET_PARAMETERS = 0x03, len = 10 dec 17 - TYPE_PARAMETERS = 23 0000007D - INITIAL_METER_DATA = 0x0000007D = 125 dec 64 - IPK = 0x64 = 100 dec 00005033 - START_COUNTER = 0x5033 = 20531 dec ==== Режим передачи ==== Для включения режима передачи абсолютных данных используется команда **SET_PARAMETERS = 0x03** c **TYPE_PARAMETERS = 24**. | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | | 0 | 0 | 0 | CMD SET_PARAMETERS = 0x03 | | | | | | CMD_LENGTH = 2 | | | | | | | | | TYPE_PARAMETERS = 24 | | | | | | | | | ABS_DATA_EN=1 | | | | | | | | Пример: hex dump: 03021801 Параметры TYPE_PARAMETERS = 23 и TYPE_PARAMETERS = 24 можно установить одним сообщением. Пример: hex dump: 030A170000007D640000503303021801+LRC Выполнение команды подтверждается ответом ''hex dump: 0302170103021801'', что подтверждает успешную установку параметров. Так же после этого устройство начнет выдавать абсолютные данные прибора учета. Это означает, что вместо команд **DATA_DAY** и **DATA_HOUR_DIFF**, передаваемых периодически без запроса, будут передаваться команды **ABS_DATA_DAY** и **ABS_HOUR_DIFF** для модулей **HARD_TYPE=1,2** и вместо команд **DATA_DAY_MUL** и **DATA_HOUR_MUL** будут выдаваться команды **EX_ABS_DAY_MUL** и **EX_ABS_HOUR_MUL** для модулей **HARD_TYPE=12**. В сообщениях мы будем получать показания прибора учета с учетом импульсного коэффициента. Например: если мы получим значение поля METER_DATA = 0x80 = 128 dec, то это соответствует показаниям прибора учета - METER_CONSUMPTION = METER_DATA*IPK = 128*100=12,8m3 ==== Реализация в устройстве ==== * **INITIAL_CONSUMPTION** - начальные показания прибора учета, на момент активации. * **IPK** - импульсный коэффициент устройства, определяющий соответствие потребленного ресурса на 1 импульс. * **INITIAL_METER_DATA** = INITIAL_CONSUMPTION/IPK * **START_COUNTER** - показания счетчика импульсов в момент активации, из сообщения об активации * **CURRENT_COUNTER** - текущие показания счетчиков импульсов в устройстве * **METER_CONSUMPTION** - текущие показания прибора учета METER_CONSUMPTION = METER_DATA*IPK Устройство передает в сообщения данные **METER_DATA** = INITIAL_METER_DATA + (CURRENT_COUNTER-START_COUNTER). Например: Cтартовые показания прибора учета INITIAL_CONSUMPTION = 41.1 м3(41100 дм3, IPK=100 (100 дм3 на один импульс), текущие показания счетчика импульсов CURRENT_COUNTER = 4580, стартовые показания счетчика импульсов START_COUNTER=5. В результате: METER_DATA = 41100/100 + (4580-5)=4986. В результате получаем текущие показания прибора учета: METER_CONSUMPTION = 4986*100 = 498600 дм3 = 498.6 м3. ===== События ===== Все события в модуле записываются в архив событий. Емкость архива - не менее 256 событий и не более 512 событий. При этом в журнал событий записывается время события, код события и номер последовательности LAST_EVENT. Номер события инкрементируется с каждой записью. Этот номер передается на сервер командой LAST_EVENTS , которая добавляется к каждому UPLINK кадру, передаваемому без запроса. Приоритета сообщений в архиве нет. События записываются по циклу. Архивы можно запросить, как самые последние, так и самые старые и начиная с определенного времени. ^ Событие ^ Код ^ Описание ^ |**MAGNIT_ON**|0x01|Фиксация воздействия магнитного поля на время более 20 секунд| |**MAGNIT_OFF**|0x02|Снятие воздействия магнитного поля| |**ACTIVATE**|0x03|Произошла активация модуля| |**DEACTIVATE**|0x04|Деактивация модуля. Прекращение передачи кадров в эфир| |**INSERT**|0x07|Фиксация установки модуля в счетчик газа| |**REMOVE**|0x08|Фиксация снятия модуля со счетчика газа| |**COUNTER_OVER**|0x09|Произошло переполнение счетчика импульсов. Количество импульсов превысило 4294967295| |**SET_TIME**|0x0A|Фиксация события установки времени модуля| |**DEPASS_DONE**|0x0E|Фиксация депассивации батарейки модуля| ===== Команды ===== {{tablelayout?rowsHeaderSource=Auto&colwidth="270px,407px,268px"}} ^ HARD_TYPE=1,2 |^ HARD_TYPE=12 || | **UPLINK без запроса** |||| | DATA_DAY = 0x20 | Данные счетчика импульсов датчика на учетный час. | DATA_DAY_MUL=0x16 | Данные счетчиков импульсов многоканального датчика на учетный час. | | DATA_HOUR_DIF = 0x40 | Почасовые данные счетчика импульсов датчика с выдачей опорного счетчика и накопления счетчика в последовательных часах. | DATA_HOUR_DIF_MUL=0x17 | Данные счетчиков импульсов многоканального датчика на учетный час. | | LAST_EVENTS = 0x60 | Последнее непрочитанное событие. | LAST_EVENTS = 0x60 | Последнее непрочитанное событие. | | GET_CURRENT=0x07 | Команда выдачи текущих показаний счетчика импульсов датчика. | GET_CURRENT_MUL=0x18 | Команда выдачи текущих показаний счетчика импульсов ногоканального датчика. | | ABS_HOUR_DIFF = 0xA0 | Почасовые данные прибора учета с выдачей импульсного коэффициента и опорного значения потребленного ресурса и накопления счетчика в последовательных часах. | EX_ABS_HOUR_MUL=0x1F-0x0A | Команда получения абсолютных данных в формате многоканального счетчика импульсов. | | ABS_DATA_DAY = 0xC0 | Абсолютные данные прибора учета на учетный час. | EX_ABS_DAY_MUL=0x1F-0x0B | Команда получения абсолютных данных суточного потребления в формате многоканального счетчика импульсов. | | TIME2000 = 0x09 | Текущее время датчика | TIME2000 = 0x09 | Текущее время датчика | | NEW_STATUS=0x14 | Состояние датчика. | NEW_STATUS=0x14 | Состояние датчика. | | NEW_EVENT=0x15 | Произошло событие. | NEW_EVENT=0x15 | Произошло событие. | | **Команды, поступающие с сервера NS в DOWNLINK кадрах.** |||| | SET_TIME_2000 = 0x02 | Корректировка времени в датчике. Четыре байта в параметрах команды знаковое число определяющее величину коррекции времени Time2000. | SET_TIME_2000 = 0x02 | Корректировка времени в датчике. Четыре байта в параметрах команды знаковое число определяющее величину коррекции времени Time2000. | | CORRECT_TIME2000=0x0C | Аналогична команде SET_TIME_2000. В данных команды номер последовательности корректировки и один знаковый байт величины коррекции. Команда применяется только если номер последовательности отличается от текущего в датчике. | CORRECT_TIME2000=0x0C | Аналогична команде SET_TIME_2000. В данных команды номер последовательности корректировки и один знаковый байт величины коррекции. Команда применяется только если номер последовательности отличается от текущего в датчике. | | GET_CURRENT = 0x07 | Запрос на чтение текущего значения счетчика импульсов. | GET_CURRENT_MUL = 0x18 | Запрос на чтение текущих значений многоканального счетчика импульсов. | | SET_PARAMETERS = 0x03 | Установка параметров в датчик. | SET_PARAMETERS = 0x03 | Установка параметров в датчик. | | GET_PARAMETERS = 0x04 | Запрос установленных параметров в датчике. | GET_PARAMETERS = 0x04 | Запрос установленных параметров в датчике. | | GET_ARCHIVE_HOURS = 0x05 | Запрос на чтение архива часовых выборок счетчика импульсов. | GET_ARCHIVE_HOURS_MUL=0x1A | Запрос на чтение архива часовых выборок многоканального счетчика импульсов. | | GET_ARCHIVE_DAYS = 0x06 | Запрос на чтение архива суточных (на 0 часов) выборок счетчика импульсов. | GET_ARCHIVE_DAYS_MUL = 0x1B | Запрос на чтение архива суточных (на учетный час) выборок многоканального счетчика импульсов. | | GET_ARCHIVE_EVENTS=0x0B | Запрос на чтение архива событий | GET_ARCHIVE_EVENTS=0x0B | Запрос на чтение архива событий | | SOFT RESET = 0x19 | Команда программного сброса. | SOFT RESET = 0x19 | Команда программного сброса. | | GET_LMIC_VERSION=0x1F-0x02 | Команда запроса версии LMIC . | GET_LMIC_VERSION=0x1F-0x02 | Команда запроса версии LMIC . | | GET_ABS_ARCHIVE_HOURS=0x1F-0x03 | Команда запроса архива данных почасового потребления прибора учета. | EX_ABS_ARCH_HOUR_MUL=0x1F-0x0C | Команда получения архива абсолютных данных почасового потребления в формате многоканального счетчика импульсов. | | GET_ABS_ARCHIVE_DAYS=0x1F-0x04 | Команда запроса архива данных суточного потребления прибора учета. | EX_ABS_ARCH_DAY_MUL=0x1F-0x0D | Команда получения архива абсолютных данных суточного потребления в формате многоканального счетчика импульсов. | ===== Параметры ===== | **№ ** | **Тип/Значение** | | **1** |Задание временных параметров работы. | | **4** |Задание расчетного часа. | | **5** |Тип выдаваемых данных. | | **8** |Способ доставки приоритетных данных. | | **9** |Способ активации устройства в сети LoraWAN. | | **10** |Параметры депассивации батарейки модуля. | | **11** |BATTERY_ACTIVE_TIME Минимально необходимое время нагрузки батарейки в сутки предохраняющее пассивации. | | **18** |RX2_CFG. Для всех типов модулей. Позволяет настроить параметры работы второго окна приема. | | **22** |DELTA_TIME_EN. | | **23** |METER_BASE_DATA. | | **24** |ABSOLUTE_DATA_EN. | | **25** |SERIAL_NUMBER. | | **26** |GEOLOCATION. | | **28** |TimeExtraFrame. |