public void Init()
 {
     var mainConf = System.Configuration.ConfigurationManager.OpenExeConfiguration("");
     ConverterNumber = int.Parse(mainConf.AppSettings.Settings["ConverterNumber"].Value);
     _eventsHandler = new EsmsEventsHandler(this);
     Instance = this;
     Heat = new Heat();
 }
 private static Heat GetProtocol(IEnumerable<BaseEvent> baseEvent, Heat protocol)
 {
     var events = baseEvent as List<BaseEvent>;
     if (events != null)
         foreach (var e in events)
         {
             switch (e.GetType().ToString())
             {
                 case "Esms.ArCOSEvent":
                     protocol.ArCOSHistory.Add((ArCOSEvent)e);
                     break;
                 case "Esms.Burner1Event":
                     protocol.Burner1History.Add((Burner1Event)e);
                     break;
                 case "Esms.Burner2Event":
                     protocol.Burner2History.Add((Burner2Event)e);
                     break;
                 case "Esms.Burner3Event":
                     protocol.Burner3History.Add((Burner3Event)e);
                     break;
                 case "Esms.Burner4Event":
                     protocol.Burner4History.Add((Burner4Event)e);
                     break;
                 case "Esms.CeloxEvent":
                     protocol.CeloxHistory.Add((CeloxEvent) e);
                     break;
                 case "Esms.CoalInjectionEvent":
                     protocol.CoalInjectionHistory.Add((CoalInjectionEvent)e);
                     break;
                 case "Esms.EnergyEvent":
                     protocol.EnergyHistory.Add((EnergyEvent)e);
                     break;
                 case "Esms.FurnaceEvent":
                     protocol.FurnaceHistory.Add((FurnaceEvent)e);
                     break;
                 case "Esms.FurnaceSwitch1Event":
                     protocol.FurnaceSwitch1History.Add((FurnaceSwitch1Event)e);
                     break;
                 case "Esms.FurnaceSwitch2Event":
                     protocol.FurnaceSwitch2History.Add((FurnaceSwitch2Event)e);
                     break;
                 case "Esms.FurnaceSwitchCommonEvent":
                     protocol.FurnaceSwitchCommonHistory.Add((FurnaceSwitchCommonEvent)e);
                     break;
                 case "Esms.GasWasteEvent":
                     protocol.GasWasteHistory.Add((GasWasteEvent)e);
                     break;
                 case "Esms.HeatPassportEvent":
                     protocol.HeatPassportHistory.Add((HeatPassportEvent)e);
                     break;
                 case "Esms.Injector1Event":
                     protocol.Injector1History.Add((Injector1Event)e);
                     break;
                 case "Esms.Injector2Event":
                     protocol.Injector2History.Add((Injector2Event)e);
                     break;
                 case "Esms.Injector3Event":
                     protocol.Injector3History.Add((Injector3Event)e);
                     break;
                 case "Esms.Injector4Event":
                     protocol.Injector4History.Add((Injector4Event)e);
                     break;
                 case "Esms.LanceCrestEvent":
                     protocol.LanceCrestHistory.Add((LanceCrestEvent)e);
                     break;
                 case "Esms.LevelBunkerEvent":
                     protocol.LevelBunkerHistory.Add((LevelBunkerEvent)e);
                     break;
                 case "Esms.MaterialNamesEvent":
                     protocol.MaterialNamesHistory.Add((MaterialNamesEvent)e);
                     break;
                 case "Esms.MaterialsBucketEvent":
                     protocol.MaterialsBucketHistory.Add((MaterialsBucketEvent)e);
                     break;
                 case "Esms.MaterialsFurnaceEvent":
                     protocol.MaterialsFurnaceHistory.Add((MaterialsFurnaceEvent)e);
                     break;
                 case "Esms.ReactorTransformerEvent":
                     protocol.ReactorTransformerHistory.Add((ReactorTransformerEvent)e);
                     break;
                 case "Esms.SchieberEvent":
                     protocol.SchieberHistory.Add((SchieberEvent)e);
                     break;
                 case "Esms.ScrapLoadEvent":
                     protocol.ScrapLoadHistory.Add((ScrapLoadEvent)e);
                     break;
                 case "Esms.SteelOutletEvent":
                     protocol.SteelOutletHistory.Add((SteelOutletEvent)e);
                     break;
                 case "Esms.SubmissionEvent":
                     protocol.SubmissionHistory.Add((SubmissionEvent)e);
                     break;
                 case "Esms.TempHearthEvent":
                     protocol.TempHearthHistory.Add((TempHearthEvent)e);
                     break;
                 case "Esms.VibratingChannel3Event":
                     protocol.VibratingChannel3History.Add((VibratingChannel3Event)e);
                     break;
                 case "Esms.VibratingChannel4Event":
                     protocol.VibratingChannel4History.Add((VibratingChannel4Event)e);
                     break;
                 case "Esms.WaterCoolingFlueEvent":
                     protocol.WaterCoolingFlueHistory.Add((WaterCoolingFlueEvent)e);
                     break;
                 case "Esms.WaterCoolingMineEvent":
                     protocol.WaterCoolingMineHistory.Add((WaterCoolingMineEvent)e);
                     break;
                 case "Esms.WaterCoolingPanelEvent":
                     protocol.WaterCoolingPanelHistory.Add((WaterCoolingPanelEvent)e);
                     break;
                 case "Esms.WeighBunkersEvent":
                     protocol.WeighBunkersHistory.Add((WeighBunkersEvent)e);
                     break;
                 case "Esms.WorkWindowEvent":
                     protocol.WorkWindowHistory.Add((WorkWindowEvent)e);
                     break;
              }
         }
     return protocol;
 }
        public bool DoCommon(Heat protocol, List<HotMetal> hotMetal, List<Additions> additions, List<ScrapLoadEvent> scrapLoadNext, int stepTime)
        {
            var start = protocol.HeatPassportHistory.Min(x => x.Time);
            var end = protocol.HeatPassportHistory.Max(x => x.Time);
            var step = Math.Round((end - start).TotalSeconds/stepTime) + 1;
            var fingerOpen = (int)Math.Round((protocol.FingersHistory.Where(x => x.FingersOpen).Min(x => x.Time) - start).TotalSeconds / stepTime);
            var fingerClose = (int)Math.Round((protocol.FingersHistory.Where(x => x.FingersClose).Min(x => x.Time) - start).TotalSeconds / stepTime);
            var hib = (int)Math.Round((protocol.PouringHotMetalHistory.Where(x => x.IsPouring).Min(x => x.Time) - start).TotalSeconds / stepTime);
            var hie =(int)Math.Round((protocol.PouringHotMetalHistory.Where(x => x.IsPouring).Max(x => x.Time) - start).TotalSeconds / stepTime);
            var gateOpen = (int)Math.Round((protocol.SteelOutletHistory.Where(x => x.GateOpen).Min(x => x.Time) - start).TotalSeconds / stepTime);
            var gateClose =(int)Math.Round((protocol.SteelOutletHistory.Where(x => x.GateClose).Min(x => x.Time) - start).TotalSeconds / stepTime);
            var outerb = (int)Math.Round((protocol.SteelOutletHistory.Where(x => x.Output).Min(x => x.Time) - start).TotalSeconds / stepTime);
            var outere = (int)Math.Round((protocol.SteelOutletHistory.Where(x => x.Output).Max(x => x.Time) - start).TotalSeconds / stepTime);
            var tubeOpen = TubOpen(protocol.FingersHistory, start, stepTime);
            var tubeClose = TubClose(protocol.FingersHistory, start, stepTime);

            ExcelApp.Cells[3, 3] = protocol.HeatPassportHistory.Select(x => x.HeatNumber).FirstOrDefault();
            ExcelApp.Cells[3, 5] = start;

            //Данные по прелдылущей плавке фигугруют в протоколе один раз.
            //Т.к. нет пока возможности получать реальные данные, то по умолчанию используем типовые данные
            //mStH (масса болота), кг - данных нет - торетические
            ExcelApp.Cells[6, 48] = 15000;
            //mSlH (масса шлака болота), кг -данных нет - торетические
            ExcelApp.Cells[6, 49] = 5000;
            //(TH-273,15) (температура болота), ºС - данных нет - торетические
            ExcelApp.Cells[6, 50] = 1620;
            //WCh1SP (теплосодержание лома в шахте), МДж - данных нет - торетические
            ExcelApp.Cells[6, 51] = 17600;

            for (var i = 0; i < step; i++)
            {
                var current = start.AddSeconds(stepTime);
                var row = i + 6;
                //i (шаг вычисления)
                ExcelApp.Cells[row, 2] = i;
                //t(i) (время) - секунды
                ExcelApp.Cells[row, 3] = i * stepTime;

                //mSlTip(i) (скорость слива шлака), кг/с - Нет данных
                ExcelApp.Cells[row, 23] = i < outerb && protocol.HeatPassportHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.HeatElectricityFlow).FirstOrDefault() >= 10000 ? 8 : 0;
                //(Tenv(i)-273,15) (температура окр. воздуха) - нет данных, берём среднесуточную для данного дня
                ExcelApp.Cells[row, 24] = 25;
                //(TFout(i)-273,15) (температура на выходе из пальцев), ºС - нет данных
                ExcelApp.Cells[row, 28] = 29;
                //(TFin(i)-273,15) (температура на входе в пальцы), ºС  - нет данных
                ExcelApp.Cells[row, 29] = 26;
                //mAir(i) (подсос воздуха), кг/с - теоретические данные
                ExcelApp.Cells[row, 38] = 8.8;
                //(TS(i)-273,15) (температура подины), ºС - PLC1.Температура подины.Температура подины1-8. Здесь по-видимому средняя температура в 8 точках
                ExcelApp.Cells[row, 37] = 200;
                /* это вычисление температуры подины включить после ремонта датчиков
                Math.Round((protocol.TempHearthHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempHearth1).FirstOrDefault()  +
                protocol.TempHearthHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempHearth2).FirstOrDefault()  +
                protocol.TempHearthHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempHearth3).FirstOrDefault() +
                protocol.TempHearthHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempHearth4).FirstOrDefault()  +
                protocol.TempHearthHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempHearth5).FirstOrDefault()  +
                protocol.TempHearthHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempHearth6).FirstOrDefault()  +
                protocol.TempHearthHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempHearth7).FirstOrDefault() +
                protocol.TempHearthHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempHearth8).FirstOrDefault()) / 8, 1);
                 */

                //We(i) (активная мощность трансформатора), МВт - PLC1.ArCos.Активная энергия, МВт
                ExcelApp.Cells[row, 4] = Math.Round(protocol.ArCOSHistory.Where(x => x.Time >= start && x.Time < current).Select(x => x.ActiveEnergy).FirstOrDefault(), 1);
                //UCH4B(i) (интенсиность вдувания CH4) - PLC2.Горелка 1.Текущий расход природного газа, м3/ч+Горелка 2.Текущий расход природного газа, м3/ч+Горелка 3.Текущий расход природного газа, м3/ч+Горелка 4.Текущий расход природного газа, м3/ч
                ExcelApp.Cells[row, 5] = Math.Round(protocol.Burner1History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentNaturalGasFlow).FirstOrDefault() +
                     protocol.Burner2History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentNaturalGasFlow).FirstOrDefault() +
                     protocol.Burner3History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentNaturalGasFlow).FirstOrDefault() +
                     protocol.Burner4History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentNaturalGasFlow).FirstOrDefault(), 0);
                //UO2B(i) (интенсивность вдувания O2) - PLC2.Горелка 1.Текущий расход кислорода, м3/ч+Горелка 2.Текущий расход кислорода, м3/ч+Горелка 3.Текущий расход кислорода, м3/ч+Горелка 4.Текущий расход кислорода, м3/ч
                ExcelApp.Cells[row, 6] = Math.Round(protocol.Burner1History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlow).FirstOrDefault() +
                     protocol.Burner2History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlow).FirstOrDefault() +
                     protocol.Burner3History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlow).FirstOrDefault() +
                     protocol.Burner4History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlow).FirstOrDefault(), 0);
                //UCH4RB(i) (интенсиность вдувания CH4 в режиме горелки) - PLC2.Инжектор 1.Текущий расход газа, м3/ч+Инжектор 2.Текущий расход газа, м3/ч+Инжектор 3.Текущий расход газа, м3/ч+Инжектор 4.Текущий расход газа, м3/ч
                ExcelApp.Cells[row, 7] = Math.Round(protocol.Injector1History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentGasFlow).FirstOrDefault() +
                     protocol.Injector2History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentGasFlow).FirstOrDefault() +
                     protocol.Injector3History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentGasFlow).FirstOrDefault() +
                     protocol.Injector4History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentGasFlow).FirstOrDefault(), 0);
                //UO2RB(i) (интенсивность вдувания O2 в режиме горелки) - PLC2.Инжектор 1.Текущий расход кислорода (режим горелки), м3/ч+Инжектор 2.Текущий расход кислорода (режим горелки), м3/ч+Инжектор 3.Текущий расход кислорода (режим горелки), м3/ч+Инжектор 4.Текущий расход кислорода (режим горелки), м3/ч
                ExcelApp.Cells[row, 8] = Math.Round(protocol.Injector1History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlowBurner).FirstOrDefault() +
                     protocol.Injector2History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlowBurner).FirstOrDefault() +
                     protocol.Injector3History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlowBurner).FirstOrDefault() +
                     protocol.Injector4History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlowBurner).FirstOrDefault(), 0);
                //UO2RL(i) (интенсивность вдувания O2 в режиме фурмы) - PLC2.Инжектор 1.Текущий расход кислорода (режим инжектора), м3/ч+Инжектор 2.Текущий расход кислорода (режим инжектора), м3/ч+Инжектор 3.Текущий расход кислорода (режим инжектора), м3/ч+Инжектор 4.Текущий расход кислорода (режим инжектора), м3/ч
                ExcelApp.Cells[row, 9] = Math.Round(protocol.Injector1History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlowInjector).FirstOrDefault() +
                    protocol.Injector2History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlowInjector).FirstOrDefault() +
                    protocol.Injector3History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlowInjector).FirstOrDefault() +
                    protocol.Injector4History.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlowInjector).FirstOrDefault(), 0);
                //UO2L(i) (режим работы сводовой фурмы), м3/ч - PLC1. Сводовая фурма.Текущий расход кислорода, м3/ч
                ExcelApp.Cells[row, 10] = Math.Round(protocol.LanceCrestHistory.Where(x => x.Time >= start && x.Time < current).Select(x => x.CurrentOxygenFlow).FirstOrDefault(),0);
                //mCP(i)*60 (режим работы угольного инжектора), кг/мин - PLC4. Интенсивность вдувания кокса, кг/мин
                ExcelApp.Cells[row, 11] = Math.Round(protocol.CoalInjectionHistory.Where(x => x.Time >= start && x.Time < current).Select(x => x.CokeBlowing).FirstOrDefault() , 1);

                //mCh1/1000 (завалка с пальцев) - Вес завалки на плавку в тоннах - брать с провайдера MS SQL (скрап) -
                //Ch1 (открытие пальцев) - Данные пока непишутся в БД, поэтом тому определяем как приблизительно 40 секунд от включения горелок
                // врямы = времени открытия пальцев, но данных пока нет, поэтому определяем как приблизительно 40 секунд от включения горелок
                if (fingerOpen == i)
                {
                    ExcelApp.Cells[row, 12] = Math.Round(protocol.ScrapLoadHistory.Where(x => x.TaskNumber == 1).Sum(x => x.Weight), 0);
                    ExcelApp.Cells[row, 41] = i;
                }

                //mCh2S/1000 (подвалка в шахту) - Вес подвалки на плавку в тоннах - брать с провайдера MS SQL (скрап)
                //Ch2S (подвалка в шахту) - Данные по времени завалки и подвалки находятся в базе MS SQL -  определяем как приблизительно 30 секунд от открытия пальцев
                // врямы = подвалки  (открытие бадьи, пальцы открыты)
                if (i >= fingerOpen && i < fingerClose && tubeOpen.FirstOrDefault(x => x == i) == i)
                {
                    ExcelApp.Cells[row, 13] = Math.Round(protocol.ScrapLoadHistory.Where(x => x.TaskNumber == 2).Sum(x => x.Weight), 0);
                    ExcelApp.Cells[row, 42] = i;
                }

                //mHI/1000 (жидкий чугун) PLC1. Паспорт плавки. Вес жидкого чугуна, т.
                //mHISl/1000 (шлак чугуновозного ковша) (5% от чугуна)
                //(THI(i)-273,15) (температура жидкого чугуна в ковше), ºС
                //HIB (начало заливки чугуна)
                if (hib == i)
                {
                    var weight = Math.Round(hotMetal.Sum(x => x.Weight), 0);
                    ExcelApp.Cells[row, 14] = weight;
                    ExcelApp.Cells[row, 15] = weight/100*5;
                    ExcelApp.Cells[row, 17] = Math.Round(hotMetal.Select(x => x.Temperature).FirstOrDefault(), 0);
                    ExcelApp.Cells[row, 39] = i;
                }

                //mCh1SN/1000 (завалка на следующую плавку) - Вес завалки на плавку в тоннах - брать с провайдера MS SQL (скрап)
                //Ch1SN (завалка на следующую плавку) - Данные по времени завалки и подвалки находятся в базе MS SQL
                // врямы = времени закрытия пальцев, но данных пока нет, попробуем взять с паспорта плавки там вроде что-то было
                if (i >= fingerClose && tubeOpen.FirstOrDefault(x => x == i) == i)
                {
                    ExcelApp.Cells[row, 16] = Math.Round(scrapLoadNext.Where(x => x.TaskNumber == 1).Sum(x => x.Weight), 0);
                    ExcelApp.Cells[row, 43] = i;
                }

                //mCk (кокс) Вес сыпучих на плавку в кг
                var temp = Math.Round(additions.Where(x => (x.Time >= start && x.Time < current) && x.Index == 1).Select(x => x.Weight).FirstOrDefault(), 0);
                if (temp > 0)
                {
                    ExcelApp.Cells[row, 18] = temp;
                }
                //mLmAdd (известь) Вес сыпучих на плавку в кг
                temp = Math.Round(additions.Where(x => (x.Time >= start && x.Time < current) && x.Index == 2).Select(x => x.Weight).FirstOrDefault(), 0);
                if (temp > 0)
                {
                    ExcelApp.Cells[row, 19] = temp;
                }
                //mDlmtAdd (доломит) Вес сыпучих на плавку в кг
                temp = Math.Round(additions.Where(x => (x.Time >= start && x.Time < current) && x.Index == 3).Select(x => x.Weight).FirstOrDefault(), 0);
                if (temp > 0)
                {
                    ExcelApp.Cells[row, 20] = temp;
                }
                //mStTap(i) (скорость выпуска металла), кг/с  - вычисляется как вес выпуска/время выпуска металла. В данный момент время выпуска не фиксируется
                //mSlTap(i) (скорость слива шлака во время выпуска), кг/с - вычисляется как вес выпуска/время выпуска шлака. В данный момент время выпуска не фиксируется
                if (i >= outerb && i < outere)
                {
                    ExcelApp.Cells[row, 21] = Math.Round(protocol.HeatPassportHistory.Select(x => x.ReleaseWeight).FirstOrDefault()*1000/(outere - outerb), 1);
                    ExcelApp.Cells[row, 22] = Math.Round((double) (1000 / (outere - outerb)), 1);
                }
                else
                {
                    ExcelApp.Cells[row, 21] = 0;
                    ExcelApp.Cells[row, 22] = 0;
                }
                //(TWout(i)-273,15) (температура на выходе из стены), ºС - PLC1.Охлаждающая вода на панели (кожух). Температура охлаждающей воды на выходе кожуха (панелей)
                ExcelApp.Cells[row, 25] = Math.Round(protocol.WaterCoolingPanelHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempWaterOutputCover).FirstOrDefault(), 1);
                //(TWin(i)-273,15) (температура на входе в стену), ºС - PLC1.Охлаждающая вода на панели (кожух). Температура охлаждающей воды на входе
                ExcelApp.Cells[row, 26] = Math.Round(protocol.WaterCoolingPanelHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempWaterInput).FirstOrDefault(), 1);
                //UCWW(i) (расход воды в стене), м3/ч - PLC1.Охлаждающая вода на панели (кожух). Расход охлаждающей воды на выходе кожуха
                ExcelApp.Cells[row, 27] = Math.Round(protocol.WaterCoolingPanelHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.FlowWaterOutputCover).FirstOrDefault(), 0);
                //UCWF(i) (расход воды в пальцах), м3/ч - PLC1.Охлаждающая вода на свод,шахту. Расход охлаждающей воды на выходе пальцев
                ExcelApp.Cells[row, 30] = Math.Round(protocol.WaterCoolingMineHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.FlowWaterOutputFingers).FirstOrDefault(), 0);
                //(TRout(i)-273,15) (температура на выходе из свода), ºС - PLC1.Охлаждающая вода на свод,шахту. Температура охлаждающей воды на выходе свода
                ExcelApp.Cells[row, 31] = Math.Round(protocol.WaterCoolingMineHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempWaterOutputCrest).FirstOrDefault(), 1);
                //(TRin(i)-273,15) (температура на входе в свод), ºС - PLC1.Охлаждающая вода на свод,шахту. Температура охлаждающей воды на входе свода
                ExcelApp.Cells[row, 32] = Math.Round(protocol.WaterCoolingMineHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempWaterInputCrest).FirstOrDefault(), 1);
                //UCWR(i) (расход воды в своде), м3/ч - PLC1.Охлаждающая вода на свод,шахту. Расход охлаждающей воды на выходе шахты и свода
                ExcelApp.Cells[row, 33] = Math.Round(protocol.WaterCoolingMineHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.FlowWaterOutputMineCrest).FirstOrDefault(), 0);
                //(TSout(i)-273,15) (температура на выходе из шахты), ºС - PLC1.Охлаждающая вода на свод,шахту. Температура охлаждающей воды на выходе шахты и колпака
                ExcelApp.Cells[row, 34] = Math.Round(protocol.WaterCoolingMineHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempWaterOutputMineHoodToo).FirstOrDefault(), 1);
                //(TSin(i)-273,15) (температура на входе в шахту), ºС - PLC1.Охлаждающая вода на свод,шахту. Температура охлаждающей воды на входе шахты и колпака
                ExcelApp.Cells[row, 35] = Math.Round(protocol.WaterCoolingMineHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.TempWaterOutputMineHood).FirstOrDefault(), 1);
                //UCWS(i) (расход воды в шахте), м3/ч - PLC1.Охлаждающая вода на свод,шахту. Расход охлаждающей воды на выходе шахты и свода
                ExcelApp.Cells[row, 36] = Math.Round(protocol.WaterCoolingMineHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.FlowWaterOutputMineCrest).FirstOrDefault(), 0);

                //HIE (окончание заливки чугуна) - Необходимо будет добавить на рабочей станции InTouch кнопку "Конец заливка чугуна" - и требовать, чтобы сталевар её нажимал при заливке. Сейчас данных нет
                // на данные момент вычисляем как время начала заливки + время затрациваемое на завивку (~ 5т в минуту)
                if (hie == i)
                {
                    ExcelApp.Cells[row, 40] = i;
                }

                //StTapB (Шибер сталевыпускного отверстия открыт)
                if (gateOpen == i)
                {
                    ExcelApp.Cells[row, 44] = i;
                }
                //StTapE (Шибер сталевыпускного отверстия закрыты)
                if (gateClose == i)
                {
                    ExcelApp.Cells[row, 45] = i;
                }

                //SlAddB (открытие загрузочного бункера)
                if (tubeOpen.FirstOrDefault(x => x==i) == i && i != 0)
                {
                    ExcelApp.Cells[row, 46] = i;
                }
                //SlAddE (закрытие загрузочного бункера)
                if (tubeClose.FirstOrDefault(x => x == i) == i && i != 0)
                {
                    ExcelApp.Cells[row, 47] = i;
                }

                //OCSD(i) (рабочее окно: 1-открыто; 0-закрыто) - PLC1.Рабочее окно. Рабочее окно открыто
                var open = protocol.WorkWindowHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.Open).FirstOrDefault();
                var close = protocol.WorkWindowHistory.Where(x => (x.Time >= start && x.Time < current)).Select(x => x.Close).FirstOrDefault();
                if (open && close) { temp = 0.5; }
                if (open && !close) { temp = 1; }
                if (!open && close) { temp = 0; }
                ExcelApp.Cells[row, 52] = temp;

                start = current;
            }
            return true;
        }
        private void GetDataFromDB()
        {
            try
            {
                Assembly.ReflectionOnlyLoadFrom("Esms.dll");
                _eventTypes = BaseEvent.GetEvents();
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.ToString());
            }
            Invoke((Action) (() =>
            {
                toolStripProgressBar.Maximum = _eventTypes.Count() * _listSelectedHeats.Count;
                toolStripProgressBar.Value = 0;
            }));
            foreach (var heatCommon in _listSelectedHeats)
            {
                if (IsStopeed) break;
                var heatNumber = heatCommon.HeatNumber;
                var fileName = (string.Format("{0}{1}{2}", OutputFolder, heatNumber, Ext));
                if (!File.Exists(fileName))
                {
                    var heat = _db.GetHeatInfo(heatCommon);
                    var start = heat.HeatStart;
                    var end = heat.HeatEnd;
                    var scrapLoadNext = new List<ScrapLoadEvent>();
                    var unitNumber = int.Parse(heatNumber.ToString()[0].ToString());
                    var protocol = new Heat();
                    Invoke((Action)(() => toolStripStatusLabel.Text = string.Format(" Подгружаем данные по плавке: {0}. ", heatNumber)));
                    foreach (var type in _eventTypes)
                    {
                        Invoke((Action)(() => { toolStripProgressBar.Value++; }));
                        var data = type.GetCustomAttributes(false).Where(p => p.GetType().Name == "DBGroup").Cast<DBGroup>().Where(x => x.UnitNumber == unitNumber);
                        if (data.Count(@group => @group.UnitNumber == unitNumber) == 0) continue;
                        try
                        {
                            if (type.FullName == "Esms.ScrapLoadEvent")
                            {
                                protocol.ScrapLoadHistory = _db.GetScrapLoad(heat.HeatNumber);
                                scrapLoadNext = _db.GetScrapLoad(heat.NextHeatNumber);
                            }
                            else
                            {
                                var ev = Trends.GetEventsByType(unitNumber, type, start, end);
                                if (ev != null)
                                {
                                    protocol = GetProtocol(ev, protocol);
                                }
                            }

                        }
                        catch (Exception exception)
                        {
                            MessageBox.Show(exception.ToString());
                        }
                    }
                    var additons = _db.GetAdditions(heat.HeatId);
                    var hotMetal = _db.GetHotMetal(heat.HeatId);
                    var excel = new ExcelExport(TextBoxTemplate.Text);
                    try
                    {
                        Invoke((Action)(() => toolStripStatusLabel.Text = string.Format(" Формируем протокол плавки: {0}. ", heatNumber)));
                        if (excel.DoCommon(protocol, hotMetal, additons, scrapLoadNext, StepTime))
                        {
                            excel.Save(fileName);
                        }
                    }
                    finally
                    {
                        excel.ExcelFileClose();
                    }
                }
                else
                {
                    Invoke((Action)(() => { toolStripProgressBar.Value = toolStripProgressBar.Value + _eventTypes.Count(); }));
                }
                Download++;
                Invoke((Action)(() =>
                {
                    toolStripStatusLabel.Text = string.Format(" Протокол плавки {0} сформирован. ", heatNumber);
                    var it = CheckedListBoxHeatNumber.FindString(heatNumber.ToString());
                    CheckedListBoxHeatNumber.SetItemCheckState(it, CheckState.Unchecked);
                    label7.Text = string.Format(" Выгружено: {0}", Download);
                }));
            }
            Invoke((Action) (() =>
            {
                toolStripStatusLabel.Text = string.Format(" Готово");
                toolStripProgressBar.Value = toolStripProgressBar.Maximum;
                ButtonDownLoad.Enabled = true;
                ButtonStopProcess.Enabled = false;
                TextBoxTemplate.Enabled = true;
                ButtonGetTemplate.Enabled = true;
                IsStopeed = false;
            }) );
        }