Это старая версия документа.
Содержание
motohr
Модуль учета моточасов оборудования. Данный должен работать в одной задаче с базой данных.
Основные возможности
- Учет работы оборудования по любым тегам проекта
- Быстрое и гибкое определение тегов учета при помощи regex-выражений
- Каждой единице или группе оборудования можно задать свой состав счетчиков
- Возможность создавать дикрементируемые счетчики-таймеры
- Возможность подтягивать описание оборудования из строковых тегов
- Ведение для каждой единицы суточной статистики по времени работы и количеству запусков
- Журналирование всех запусков и остановов по каждой единице оборудования
- Минимальное влияние на трафик для jrbustcp-клиентов на больших проектах
- Низкая нагрузка на СУБД на больших проектах
- Удаление старых данных с клиента через специальный строковый тег
Конфигурация
plugin.motohr: module.mh: database: db counters: - name: c1 descr: Счетчик 1 timer: off - name: c2 descr: Счетчик 2 - name: t1 descr: Таймер 1 timer: on machines: - prefix: M expr.tag: .*\.MCHB_(.*)_Plata expr.descr: (.*)(MCHB.*)(_Plata) repl.descr: $1$2.descr counters: - total - c1 - t1 include: ^UVRD.* exclude: .*Beep.* - prefix: M counters: - c2 include: .*1001.*
Параметры
Параметр | Умолчание | Описание |
---|---|---|
database | db | Модуль базы данных (database) |
counters - типы счетчиков | ||
name | | Уникальное имя счетчика |
descr | | Описание счетчика |
timer | off | Счетчик является таймером |
machines - правила формирования списка машин и назначения им счетчиков | ||
prefix | | Префикс имени машины |
expr.tag | .*\.MCHB_(.*)_Plata | regex-выражение для поиска тегов статуса машины, т.е. содержащих значение статуса, где: 0=стоит, 1=работает |
expr.descr | (.*)(MCHB.*)(_Plata) | regex-выражение для преобразования имени тега статуса машины в имя тега описания |
repl.descr | $1$2.descr | Выражение подстановки для формирования имени тега описания машины |
include | | regex-выражение включающего фильтра имен тегов статуса. Если пусто, не используется |
exclude | | regex-выражение исключающего фильтра имен тегов статуса. Если пусто, не используется |
counters | | Список типов счетчиков |
Теги
Имя тега | Тип данных | Доступ | Описание |
---|---|---|---|
connected | BOOL | | Состояние подключения к базе данных |
system.time | LONG | | Локальное текущее время в секундах |
system.util | STRING | RW | Тег для ввода системных команд (см. …) |
Группы тегов по каждому типу счетчиков | |||
cnttype.<счетчик>.descr | STRING | | Описание счетчика |
cnttype.<счетчик>.timer | BOOL | | Счетчик является таймером |
Группы тегов по каждой единице оборудования | |||
<машина>.<cчетчик> | INT | RW | Значение счетчика без учета рабочего времени с момента последнего старта |
<машина>.time | LONG | | Локальное время в секундах с момента последнего старта, либо 0, если машина остановлена |
Примечание: Локальное время в секундах - от 1970-01-01T00:00:00Z без часового пояса.
Пример выборки тегов для машины M1001
из вышеприведенной конфигурации:
Имя тега | Тип данных | Значение тега |
---|---|---|
mh.cnttype.c1.descr | STRING | Счетчик 1 |
mh.cnttype.c1.timer | BOOL | off |
mh.cnttype.c2.descr | STRING | Счетчик 2 |
mh.cnttype.c2.timer | BOOL | off |
mh.cnttype.t1.descr | STRING | Таймер 1 |
mh.cnttype.t1.timer | BOOL | on |
mh.cnttype.total.descr | STRING | Всего |
mh.cnttype.total.timer | BOOL | off |
mh.M1001.c1 | INT | 5328 |
mh.M1001.c2 | INT | 5328 |
mh.M1001.t1 | INT | -5328 |
mh.M1001.time | LONG | 1740347568 |
mh.M1001.total | INT | 5328 |
mh.system.time | LONG | 1740349832 |
mh.system.util | STRING | |
mh.connected | BOOL | on |
UVRD.MCHB_1001_Plata | INT | 1 |
База данных
База данных создается автоматически.
В таблицах, где есть поле DELETED
, удаление записей происходит установкой DELETED=1
, и в дальнейшем на стороне клиента данные записи отфильтровываются.
Записи в таблицах создаются автоматически по yml-конфигурации модуля.
MH_COUNTER_TYPE
Типы счетчиков
TIMER
- направление счетчика: 0 = обычный счетчик (инкремент), 1 = таймер (декремент)
MH_MACH
Машины
DESCR
- описание машины, подтягиваемое из тега описания. Если тег описания отсутствует, то допустима произвольная запись в данное поле
MH_COUNTER
Счетчики
SEC
- значение счетчика в секундах без учета рабочего времени с момента последнего старта
MH_MACH_STATE
Текущее состояния машин
DT
- дата/время последнего старта или стопа машиныRUNNING
- 0 = машина стоит, 1 = машина работаетSTATCNT
- кол-во запусков машины с начала текущих сутокSTATSEC
- значение счетчикаtotal
на начало текущих суток
MH_STAT
Статистика по суткам
PERIOD
- период в форматеyyyymmdd
CNT
- кол-во запусков машины за суткиSEC
- время работы машины за сутки в секундах
MH_INTERVAL
Интервалы работы машин
DTBEG
- время стартаDTEND
- время стопаSEC
- время от старта до стопа в секундах
Принцип работы
Формирование списка типов счетчиков
Создается тип счетчика total
(Всего), после чего из конфигурации загружаются другие типы счетчиков.
Тип счетчика total
- это несбрасываемый счетчик. Данный тип не нужно прописывать, он создается по умолчанию. Однако в правилах машин он должен быть указан в составе счетчиков, если он необходим.
Формирование списка машин
Выполняется поиск тегов статуса по всем модулям приложения по правилам, описанным в конфигурации в разделе machines
. Данные теги должны отдавать статус машины: 0 - стоит, 1 - работает.
Из найденого тега статуса формируются имя тега описания, после чего из него берется значение - текст описания машины.
Допускается попадание одного и того же тега в несколько правил, при этом наборы счетчиков, указанные в правилах, объединяются.
Синхронизация
Полученная конфигурация машин и счетчиков сохраняется/обновляется в базе данных. Из базы данных загружается состояние машин и значения счетчиков.
Мониторинг
Выполняется отслеживание изменения состояния машины.
Если машина запустилась, то:
- в тег машины
time
записывается текущее время в секундах - в таблице
MH_MACH_STATE
обновляются поляRUNNING = 1
,DT = now
,STATCNT = STATCNT + 1
Если машина остановилась, то:
- в тег машины
time
записывается 0 - в таблице
MH_MACH_STATE
обновляются поляRUNNING = 0
,DT = now
- в таблицу
MH_MACH_INTERVAL
добавляется запись с временем старта/стопа и длительностью работы в секундах (SEC) - в таблице
MH_COUNTER
увеличиваются значения всех счетчиков машины на полученное значение SEC (для таймеров уменьшается) - в тегах счетчиков машины также увеличиваются значения на полученное значение SEC (для таймеров уменьшается)
Запись статистики
В 00:00:00 происходит сброс накопленных данных для машин, имеющих счетчик типа total
. По каждой машине:
- в таблице
MH_STAT
создается запись:CNT = MH_MACH_STATE.STATCNT
SEC = T - MH_MACH_STATE.STATSEC
- в таблице
MH_MACH_STATE
обновляются поля:STATCNT = 0
STATSEC = T
где T - значение актуальное счетчика total
(с учетом рабочего времени с момента последнего старта).
Как получить актуальные значения счетчиков
Счетчики (в тегах и в БД) не обновляются каждую секунду. Это сделано для предотвращения частой записи в БД довольно большего объема данных, особенно в крупных проектах. Тоже самое отностится и к тегам, т.к. ежесекундное изменение большого количества тегов увеличит трафик передачи данных между приложениями, например, по jrbustcp протоколу.
По этой причине, чтобы получить актуальное значение счетчика, нужно вычислить и прибавить к накопленному значению счетчика время работы с момента последнего старта. Как это делается, показано далее на примерах.
Пример с использованием тегов:
long machtime = getTagVal("mh.M1001.time"); long systime = getTagVal("mh.system.time"); int cnt = getTagVal("mh.M1001.total") + (machtime == 0? 0: systime - machtime);
Примеры с использованием БД:
SELECT mh_cnt_sec(c.sec, ms.dt, ms.running, ct.timer) FROM mh_mach m LEFT JOIN mh_counter c ON c.mach_id = m.id JOIN mh_counter_type ct ON ct.id = c.counter_type_id JOIN mh_mach_state ms ON ms.mach_id = m.id WHERE m.name = 'M1001' AND ct.name = 'total'
Для удобства можно использовать view MH_COUNTER_CALC
- это сводная таблица по всем машинам и счетчикам с актуальными значениями:
SELECT * FROM mh_counter_calc
Установка счетчика
Пользовательская установка значений возможна только через теги во все счетчики, кроме total
.
В таймеры можно записать значение от 0 включительно и более. В не-таймеры можно записать только 0.
Также при необходимости можно править значения счетчиков в базе данных, предварительно остановив приложение jrobo во избежание перезаписи данных.
Системные команды
Для очистки таблиц от старых записей используется строковый тег system.util
, поддерживающий следующие команды:
sweep-interval <yyyymm>
- удаление изMH_INTERVAL
записей старше заданной даты включительноsweep-stat <yyyymm>
- удаление изMH_STAT
записей старше заданной даты включительноpach-mach
- удаление изMH_MACH
не актуальных машин, которые отсутствуют в текущем сформированном списке машин
Команды sweep-*
использовать с осторожностью, т.к. можно легко остаться с пустыми таблицами.