Simple-Scada forum

Simple-Scada 2 => Ваши вопросы => Тема начата: jameswhite13 от 07 Мая 2019, 16:39:04

Название: Создание отчетов наработки/простоя оборудования
Отправлено: jameswhite13 от 07 Мая 2019, 16:39:04
Добрый день, есть тренд с 3 состояниями: вкл/простой/выкл. переменные 2/1/0, нужно получить отчет, например за сутки по длительности каждого состояния,  переменные записываются по изменению. Не могу правильно настроить выборку с разницей времени, для каждого состояния. Спасибо заранее за помощь 
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: Simple-Scada от 08 Мая 2019, 11:28:22
Здравствуйте.

Длительность из архива можно получить только при помощи процедур ArchiveTimeOn (https://simple-scada.com/help/script/archivetimeon.html) и ArchiveTimeOff (https://simple-scada.com/help/script/archivetimeoff.html). Первая возвращает суммарное время, в котором значение переменной отлично от нуля. Вторая возвращает суммарное время, в котором значение переменной равно нулю. Поэтому для трёх состояний эти процедуры не подходят. Нужно "разбить" переменную на несколько переменных, чтобы одна отвечала за "простой" и "выкл." (значения 1 / 0), а вторая за "вкл." (значение 2). Тогда можно будет получить время для каждого состояния при помощи ArchiveTimeOn и ArchiveTimeOff. Функции для работы с архивом выполняются асинхронно и все вычисления займут некоторое время, поэтому перед построением отчета нужно будет также дождаться пока архивные функции закончат все вычисления и только после вызывать построение отчета.
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: jameswhite13 от 08 Мая 2019, 17:06:54
Все хорошо, но время не корректно отображается в итоге 30.12.1899 5:40;42
Подскажите в чем проблема?
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: jameswhite13 от 10 Мая 2019, 14:23:13
Нашел, нужно было в текст перевести. Вопрос по редактору отчетов я выбираю тип данных : "по включению", что мне выбрать в итоге данных, для суммирования времени вкл. сост.?
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: Simple-Scada от 14 Мая 2019, 10:58:56
Цитировать
"по включению", что мне выбрать в итоге данных, для суммирования времени вкл. сост.?
О чем идёт речь? Где Вы выбираете "тип данных" "по включению" (это явно не тип данных, а что-то другое)? Для суммирования времени по колонке в итоге данных нужно использовать функцию SumTime. Но нужно учитывать, что она подходит для колонок с типом данных TimeSpan. Для колонок типа datetime эта функция не подойдёт.
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: jameswhite13 от 20 Мая 2019, 11:27:08
Хорошо, зайдем с другой стороны: как при помощи процедуры ArchiveTimeOn, полученное время вывести в отчет?
Как вывести в поле я нашел, но как забрать это значение в тренд?
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: Simple-Scada от 21 Мая 2019, 10:35:21
Цитировать
Хорошо, зайдем с другой стороны: как при помощи процедуры ArchiveTimeOn, полученное время вывести в отчет?
Функция ArchiveTimeOn (https://simple-scada.com/help/script/archivetimeon.html) после выполнения записывает результат вычисления в отдельную (указанную пользователем) переменную. Её значение можно вывести в отчет как и значение любой другой переменной. Для этого нужно в редакторе отчетов кликнуть переменную правой кнопкой мыши и выбрать пункт "Добавить переменную". После этого в словаре отчета (в разделе "Переменные") появится импортированная в отчет переменная, которую можно вынести в любое место отчета.
Основную сложность здесь представляет то, что функция ArchiveTimeOn выполняется в отдельном потоке и её выполнение может занять какое-то произвольное время (зависит от производительности ПК). Поэтому если вызвать функцию и сразу построить отчет, то есть вероятность, что отчет построится раньше, чем ArchiveTimeOn закончит вычисления. Поэтому идеальным вариантом является сначала вызов ArchiveTimeOn, ожидание вычислений, а построение отчета только когда переменная-результат изменится (т.е. все вычисления завершены).
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: jameswhite13 от 22 Мая 2019, 08:35:44
30.12.1899 5:40;42 вот значение которое я получаю,мне кажется, что тип данных выбран некорректно. Еще вопрос как получить ArchiveTimeOn за промежуток времени выбранный из календаря? Скрипт ругается на несоответствие типа данных
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: Simple-Scada от 22 Мая 2019, 16:18:47
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.
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: jameswhite13 от 22 Мая 2019, 17:06:50
Если дату отбросить не потеряю ли я время >24 часов
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: Simple-Scada от 23 Мая 2019, 23:04:44
Да, время больше 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 секунд)
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: jameswhite13 от 24 Мая 2019, 09:39:27
Он у меня теперь в обратную сторону считает
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: Simple-Scada от 24 Мая 2019, 10:11:45
Это стандартный код, который считает всегда одинаково, он просто берёт количество секунд и представляет его как время в часах/минутах/секундах. Если время отображается как-то не так, значит в Вашей переменной какое-то неправильное значение, например с ненулевой датой (> 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".
Название: Re: Создание отчетов наработки/простоя оборудования
Отправлено: jameswhite13 от 24 Мая 2019, 13:43:29
Разобрался, неправильно событие вызывающее скрипт было