Advertisement
Guest User

Untitled

a guest
May 28th, 2015
279
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. if (Global.Global_Tag_Data[Temp_Node_Name + ".ТС"] != null && Regex.IsMatch(ParametersTM, @"Отработано суток за период"))
  2.                         {
  3.                             // Массив значений ТС за диапазон дат.
  4.                             List<object[]> tsData = new List<object[]>();
  5.                             // Тег ТС.
  6.                             TagObject tempTag = (TagObject)Global.Global_Tag_Data[TempNode.Value + ".ТС"];
  7.                             // Получаем массив значений.
  8.                             tsData = GetData.DR_Get_Tag_History(StartDate, EndDate, (int)tempTag.Tag_ID);
  9.                             // Количество суток отработанных.
  10.                             double jobDay = 0;
  11.                             // Состояния ТС.
  12.                             int checkState;
  13.                             // Точка времени.
  14.                             DateTime checkDateTime = Convert.ToDateTime(StartDate);
  15.                             if (tsData.Count > 0)
  16.                             {
  17.                                 // Состояние ТС равно первому в архивном массиве.
  18.                                 checkState = Convert.ToInt32(tsData[0][0]);                            
  19.                                 // Если дата первого элемента массива раньше StartDate, то счет начинаем 1 элемента массива, если нет, то с 0.
  20.                                 int firstElement = (Convert.ToDateTime(tsData[0][1]) < Convert.ToDateTime(StartDate)) ? 1 : 0;
  21.                                 // Т.к. хранимка возвращает первое значение с меткой времени до StartDate, начинаем перебор с 1.
  22.                                 for (int k = firstElement, kLen = tsData.Count; k < kLen; k++)
  23.                                 {
  24.                                     // Если Вработе затем Останов
  25.                                     if (checkState == 1 && Convert.ToInt32(tsData[k][0]) == 0)
  26.                                     {
  27.                                         DateTime secondDate = Convert.ToDateTime(tsData[k][1]);
  28.                                         TimeSpan delta = secondDate.Subtract(checkDateTime);
  29.                                         double hourState = delta.TotalHours;//(secondDate - checkDateTime).Hours;
  30.                                         jobDay += hourState;
  31.                                     }
  32.                                     // Если Вработе затем Вработе
  33.                                     if (checkState == 1 && Convert.ToInt32(tsData[k][0]) == 1)
  34.                                     {
  35.                                         DateTime secondDate = Convert.ToDateTime(tsData[k][1]);
  36.                                         TimeSpan delta = secondDate.Subtract(checkDateTime);
  37.                                         double hourState = delta.TotalHours;//(secondDate - checkDateTime).Hours;
  38.                                         jobDay += hourState;
  39.                                     }
  40.                                     // Приравнять текущее состояние ТС.
  41.                                     checkState = Convert.ToInt32(tsData[k][0]);
  42.                                     // Приравнять текущую дату.
  43.                                     checkDateTime = Convert.ToDateTime(tsData[k][1]);
  44.                                 }
  45.                                 // Если последнее состояние из массива Вработе, то высчитываем разницу от EndDate - Предыдущей даты.
  46.                                 if (checkState == 1)
  47.                                 {
  48.                                     DateTime secondDate = Convert.ToDateTime(EndDate);
  49.                                     TimeSpan delta = secondDate.Subtract(checkDateTime);
  50.                                     // Интервал в минутах между последним значением в массиве и EndDate
  51.                                     double minuteState = Convert.ToInt32(Math.Round(delta.TotalMinutes, 0));
  52.                                     // Если интервал между последней датой из массива и EndDate меньше чем интервал архивирования тега, то добавич часы работы.
  53.                                     if (tempTag.Arc_TimeDeadband >= minuteState)
  54.                                     {
  55.                                         double hourState = delta.TotalHours;//(secondDate - checkDateTime).Hours;
  56.                                         jobDay += hourState;
  57.                                     }
  58.                                 }
  59.                             }
  60.                             // Т.к. рассчет велся в часах, делим все на 24, для поиска кол. суток.
  61.                             Row_Data[6] = Math.Round(jobDay/24, 0);
  62.                         }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement