Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Не получили письмо с кодом активации?

Официальный форум Simple-Scada.

Автор Тема: Создание отчетов наработки/простоя оборудования  (Прочитано 7500 раз)

jameswhite13

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Добрый день, есть тренд с 3 состояниями: вкл/простой/выкл. переменные 2/1/0, нужно получить отчет, например за сутки по длительности каждого состояния,  переменные записываются по изменению. Не могу правильно настроить выборку с разницей времени, для каждого состояния. Спасибо заранее за помощь 

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3217
    • Просмотр профиля
    • Simple-Scada
Здравствуйте.

Длительность из архива можно получить только при помощи процедур ArchiveTimeOn и ArchiveTimeOff. Первая возвращает суммарное время, в котором значение переменной отлично от нуля. Вторая возвращает суммарное время, в котором значение переменной равно нулю. Поэтому для трёх состояний эти процедуры не подходят. Нужно "разбить" переменную на несколько переменных, чтобы одна отвечала за "простой" и "выкл." (значения 1 / 0), а вторая за "вкл." (значение 2). Тогда можно будет получить время для каждого состояния при помощи ArchiveTimeOn и ArchiveTimeOff. Функции для работы с архивом выполняются асинхронно и все вычисления займут некоторое время, поэтому перед построением отчета нужно будет также дождаться пока архивные функции закончат все вычисления и только после вызывать построение отчета.

jameswhite13

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Все хорошо, но время не корректно отображается в итоге 30.12.1899 5:40;42
Подскажите в чем проблема?

jameswhite13

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Нашел, нужно было в текст перевести. Вопрос по редактору отчетов я выбираю тип данных : "по включению", что мне выбрать в итоге данных, для суммирования времени вкл. сост.?

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3217
    • Просмотр профиля
    • Simple-Scada
Цитировать
"по включению", что мне выбрать в итоге данных, для суммирования времени вкл. сост.?
О чем идёт речь? Где Вы выбираете "тип данных" "по включению" (это явно не тип данных, а что-то другое)? Для суммирования времени по колонке в итоге данных нужно использовать функцию SumTime. Но нужно учитывать, что она подходит для колонок с типом данных TimeSpan. Для колонок типа datetime эта функция не подойдёт.

jameswhite13

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Хорошо, зайдем с другой стороны: как при помощи процедуры ArchiveTimeOn, полученное время вывести в отчет?
Как вывести в поле я нашел, но как забрать это значение в тренд?
« Изменён: 21 Мая 2019, 09:11:03 от jameswhite13 »

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3217
    • Просмотр профиля
    • Simple-Scada
Цитировать
Хорошо, зайдем с другой стороны: как при помощи процедуры ArchiveTimeOn, полученное время вывести в отчет?
Функция ArchiveTimeOn после выполнения записывает результат вычисления в отдельную (указанную пользователем) переменную. Её значение можно вывести в отчет как и значение любой другой переменной. Для этого нужно в редакторе отчетов кликнуть переменную правой кнопкой мыши и выбрать пункт "Добавить переменную". После этого в словаре отчета (в разделе "Переменные") появится импортированная в отчет переменная, которую можно вынести в любое место отчета.
Основную сложность здесь представляет то, что функция ArchiveTimeOn выполняется в отдельном потоке и её выполнение может занять какое-то произвольное время (зависит от производительности ПК). Поэтому если вызвать функцию и сразу построить отчет, то есть вероятность, что отчет построится раньше, чем ArchiveTimeOn закончит вычисления. Поэтому идеальным вариантом является сначала вызов ArchiveTimeOn, ожидание вычислений, а построение отчета только когда переменная-результат изменится (т.е. все вычисления завершены).

jameswhite13

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
30.12.1899 5:40;42 вот значение которое я получаю,мне кажется, что тип данных выбран некорректно. Еще вопрос как получить ArchiveTimeOn за промежуток времени выбранный из календаря? Скрипт ругается на несоответствие типа данных

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3217
    • Просмотр профиля
    • Simple-Scada
30.12.1899 5:40:42? это значение типа DateTime, дата 30.12.1899 это эквивалент нулевой даты, с этого значения начинается отсчет времени. При отображении дату можно просто отбросить, например если выводить значение в компонент Календарь, то можно выбрать свойство "Дата" -> "скрыть". Тогда будет отображаться только время наработки, т.е. 5:40:42. Аналогично если выводить это значение в отчет, то для ячейки можно задавать формат с отображением только времени.

Цитировать
Еще вопрос как получить ArchiveTimeOn за промежуток времени выбранный из календаря? Скрипт ругается на несоответствие типа данных
Код: (delphi)
begin
  { вычислить время включенного состояния переменной "MyVariable" за период
    от "cldBegin.AsDateTime" до "cldEnd.AsDateTime" и записать результат в переменную "MyVariableRes" }
  ArchiveTimeOn(MyVariable, MyVariableRes, cldBegin.AsDateTime, cldEnd.AsDateTime);
end.
, где cldBegin и cldEnd это два календаря (они обязательно должны быть связаны каждый со своей переменной типа DateTime.

jameswhite13

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Если дату отбросить не потеряю ли я время >24 часов

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3217
    • Просмотр профиля
    • Simple-Scada
Да, время больше 24 часов потеряется. Чтобы отобразить время количество часов более 24 - нужно уходить от типа DateTime, например так:
Код: (delphi)
var 
  aSeconds: Int64;
begin
  aSeconds := SecondsBetween(MyVariable.AsDateTime, 0);  // получаем количество секунд из значения переменной MyVariable
  Text1.Text := SecondsToStr(aSeconds);  // выводим в компонент Text1 время
end.
Функция SecondsToStr не ограничивает часы, т.е. время может быть таким: 42:18:30 (т.е. 42 часа, 18 минут, 30 секунд)

jameswhite13

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Он у меня теперь в обратную сторону считает

Simple-Scada

  • Администратор
  • *****
  • Сообщений: 3217
    • Просмотр профиля
    • Simple-Scada
Это стандартный код, который считает всегда одинаково, он просто берёт количество секунд и представляет его как время в часах/минутах/секундах. Если время отображается как-то не так, значит в Вашей переменной какое-то неправильное значение, например с ненулевой датой (> 30.12.1899). Пример:
Код: (delphi)
var
  aDT: TDateTime;
  aSeconds: Int64;
begin
  aDT := EncodeDateTime(1899, 12, 30, 5, 40, 42, 0);  // записываем в aDT время "30.12.1899 5:40:42"
  aSeconds := SecondsBetween(aDT, 0);    // получаем время в секундах
  Text1.Text := SecondsToStr(aSeconds);   // выводим время в компонент Текст
end.
в результате выполнения этого кода в компоненте Text1 всегда будет выведено значение "05:40:42".

jameswhite13

  • Новичок
  • *
  • Сообщений: 16
    • Просмотр профиля
Разобрался, неправильно событие вызывающее скрипт было