View difference between Paste ID: fcWNFd81 and gAeLex4J
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
                        }