Формирование отчетов
Формирование суточных, недельных и т.п. отчетов
Для оптимизации производительности устройства данные для отчетов целесообразно регистрировать "в потоке". В 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
Настройки события для данного отчета:
Результатом будет являться отчет такого вида:
При поминутной регистрации данные результаты получаться, если время скана будет меньше чем секунда. Тогда "виртуальный" электросчетчик не пропустит своих секунд.