Это старая версия документа.


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

База данных

sql, dbscr

База данных создается автоматически.

В таблицах, где есть поле 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-* использовать с осторожностью, т.к. можно легко остаться с пустыми таблицами.

doc/jroboplc/modules/motohr.1740731982.txt.gz · Последние изменения: 2025/02/28 11:39 — denis
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0