SHOW:
|
|
- or go back to the newest paste.
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 | - | double minuteState = delta.TotalMinutes; |
50 | + | // Интервал в минутах между последним значением в массиве и EndDate |
51 | double minuteState = Convert.ToInt32(Math.Round(delta.TotalMinutes, 0)); | |
52 | - | if (tempTag.Arc_TimeDeadband >= Convert.ToInt32(minuteState)) |
52 | + | |
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 | } |