Формирование отчетов

Материал из WebHMI Wiki
Перейти к: навигация, поиск
На этой странице были произведены изменения, не отмеченные для перевода.

Другие языки:
English • ‎русский

Формирование суточных, недельных и т.п. отчетов

Для оптимизации производительности устройства данные для отчетов целесообразно регистрировать "в потоке". В WebHMI для этого есть механизм событий, которые после регистрации фактически дают готовые отчеты.

Необходимые переменные, скрипты и события -
  • скрипт, выдающий номер дня, месяца, недели, квартала и т.п. из системного времени во внутренний регистр "день недели", "час", "секунда"
  • скрипт подсчета разницы "текущие показание - предыдущие", и фиксации результата в регистре "счетчик" (скрипт работает также по изменению регистра "минута")
  • регистр-флаг генерации события, однократного, достаточного для записи текущего посчитанного счетчика и метки времени
  • скрипт, снимающий флаг, когда есть событие (т.е. данные уже зафиксированы)'
  • событие для регистрации

Для демонстрации можно использовать пример, в котором на каждой секунде "виртуальный" счетчик увеличивается на 2. Другие скрипты реализуют поминутную запись разницы его показаний в отчет. Для добавления других параметров, необходимо по аналогии добавить их внутрь соответствующих скриптов и событий. Скрипт, генерирующий номера минут:

function main (userId)
  -- получить номер минуты
  local min = os.date("%M",os.time());
  -- записать во внутренний регистр
  WriteReg("minute", min); -- Минуты  
end

Скрипт, работающий на изменение регистра "minute":


function main (userId)
 
  local current = GetReg("FlowMeter"); -- текущие показания
  local prevMin = GetReg("pMinTotal"); -- предыдущее значение 
  local cnt = current - prevMin; -- посчитать разницу
 
  WriteReg("MinuteFlow", cnt); -- записать счетчик во внутр. регистр. он используется в событии
  WriteReg("pMinTotal", current); -- записать текущее в предыдущее для след. периода
  
   -- поднять флаг для отчета 
  WriteReg("EventFlag", 1); -- Установить флаг для события  
  end


Скрипт, снимающий флаг и соответственно событие после записи:


function main (userId)
  -- проверяем выполняется ли событие 
  local event_state = (GetReg("ES1") == 1); -- Событие 1 выполняется  (ES1@Internal register)
  -- и сбрасываем флаг
  if event_state then 
      WriteReg("EventFlag", 0); -- Флаг минутного отчета  
  end 
end

Настройки события для данного отчета:
Rep example2.png
Rep example3.png


Результатом будет являться отчет такого вида:
Rep example.png
При поминутной регистрации данные результаты получаться, если время скана будет меньше чем секунда. Тогда "виртуальный" электросчетчик не пропустит своих секунд.