ArchiveTimeOn

> [HTML Version](archivetimeon.html)

Важно\! Перед началом работы с архивными процедурами, обязательно ознакомьтесь [с примером их использования](work-with-arch-procedures.md).

**Синтаксис**

````
procedure ArchiveTimeOn(AArcVar, AResVar: TM\_Variable; AFrom, ATo: TDateTime; const ALayer: Byte = 0);

````
**Описание**

Вычисляет суммарное время, в котором значение переменной отлично от нуля. Вычисляется из архивных данных переменной AArcVar за период от AFrom до ATo. Результат записывается в переменную AResVar, которая должна иметь тип DateTime. ALayer - необязательный параметр(по-умолчанию равен нулю), который определяет слой архива: 0 - основной; 1 - минутный; 2 - часовой; 3 - суточный.

**Пример 1:**

````
var  
  DateStart, DateEnd: TDateTime;  
begin  
  DateEnd:= Now;                     // текущие дата и время  
  DateStart:= IncDay(DateEnd, -1);   // уменьшить дату на 1 день  
   
  // вычислить время включенного состояния переменной "MyVariable" за период   
  // от "DateStart" до "DateEnd" и записать результат в переменную "MyVariableRes"  
  ArchiveTimeOn(MyVariable, MyVariableRes, DateStart, DateEnd);  
end.

````
Если время наработки не будет превышать 24 часа, то для отображения на мнемосхеме можно использовать компонент "[Календарь](https://simple-scada.com/help/manual/calendar.html)", в ином случае см. пример ниже.

**Пример 2:**

Допустим требуется вывести время наработки оборудования в объект "Текст" в формате "дд.мм.гггг чч:мм". Для вычисления времени наработки воспользуемся процедурой ArchiveTimeOn (пример 1). Затем добавим в проект объект "Текст" и свяжем его с переменной результата - в нашем случае это переменная "MyVariableRes". Далее [создадим новый скрипт](via-script-editor.md) (например с именем "OperateTime") с типом события "[Универсальный скрипт](universal-event.md)" и напишем код приведенный ниже. Для формирования даты/времени в нужном формате используем функцию [ZeroPad](zeropad.md). После этого, [на событие OnDataChange](by-obj-event.md) объекта "Текст" назначим наш скрипт "OperateTime". Данный скрипт универсальный, поэтому его можно применить к любому количеству объектов "Текст" - для этого нужно связать объекты "Текст" с требуемыми переменными результата и для всех объектов на событие OnDataChange назначить наш скрипт "OperateTime". 

````
var  
  aText: TM\_Text;  
  aDate, aTime: string;  
begin  
  // проверяем, что Sender это текст  
  if not (Sender is TM\_Text) then Exit;  
  aText := TM\_Text(Sender);  
  
  if YearOf(aText.AsDateTime) < 2016 then  
  begin  
    // формируем дату в нужном формате  
    aDate := ZeroPad(DaysBetween(aText.AsDateTime, 0), 2) + '.' +  
      ZeroPad(MonthsBetween(aText.AsDateTime, 0), 2) + '.' +  
      ZeroPad(YearsBetween(aText.AsDateTime, 0), 4) + ' ';  
    // формируем время в нужном формате  
    aTime := ZeroPad(HourOf(aText.AsDateTime), 2) + ':' +                        
      ZeroPad(MinuteOf(aText.AsDateTime), 2);  
    // записываем в Текст полученные дату и время  
    aText.Text := aDate + aTime;  
  end else  
    aText.Text := '00.00.0000 00:00';  
end.
````