public HeatData GetHeatData(HeatData hd, int intervalSec) { if (hd == null) throw new ArgumentNullException("hd"); hd.CarbonMonoxideVolumePercent = CarbonMonoxideVolumePercent.Average(intervalSec); hd.CarbonMonoxideVolumePercentPrevious = CarbonMonoxideVolumePercentPrevious.Average(intervalSec); hd.CarbonOxideVolumePercent = CarbonOxideVolumePercent.Average(intervalSec); hd.CarbonOxideVolumePercentPrevious = CarbonOxideVolumePercentPrevious.Average(intervalSec); hd.OffgasVolumeRate = OffgasVolumeRate.Average(intervalSec); hd.HeightLanceCentimeters = (int) Math.Round(HeightLanceCentimeters.Average(intervalSec), 0); hd.OxygenVolumeRate = OxygenVolumeRate.Average(intervalSec); hd.OxygenVolumeCurrent = OxygenVolumeCurrent.Average(intervalSec); return hd; }
public static void Iterate(HeatData heatData) { using (var l = new Logger("Iterate")) { var calculatedCarboneEvent = new CalculatedCarboneEvent(); if (!TotalCarbonMassCalculated) { if ( (heatData.IronMass > 0) && (heatData.IronCarbonPercent > 0) && (heatData.ScrapMass > 0) && (heatData.ScrapCarbonPercent > 0) && (heatData.SteelCarbonPercent > 0) ) { TotalCarbonMass = Decarbonater.HeatCarbonMass( heatData.IronMass, heatData.IronCarbonPercent, heatData.ScrapMass, heatData.ScrapCarbonPercent, heatData.SteelCarbonPercent ); RemainCarbonMass = TotalCarbonMass; RemainCarbonPercent = GetCarbonPercent(RemainCarbonMass, heatData.IronMass, heatData.IronCarbonPercent, heatData.ScrapMass, heatData.ScrapCarbonPercent); if (TotalCarbonMass > 0 && heatData.OxygenVolumeRate > 0) { TotalCarbonMassCalculated = true; l.msg("##### [TotalCarbonMassCalculated: {0}][RemainCarbonPercent]", TotalCarbonMass, RemainCarbonPercent); } else l.msg("HeatCarbonMass returned bad result: {0}", TotalCarbonMass); } else { l.err( "bad data for HeatCarbonMass [IronMass: {0}][IronCarbonPercent: {1}][ScrapMass: {2}][ScrapCarbonPercent: {3}][SteelCarbonPercent: {4}]", heatData.IronMass, heatData.IronCarbonPercent, heatData.ScrapMass, heatData.ScrapCarbonPercent, heatData.SteelCarbonPercent ); } } else if (!GasCarbonMassFinished) { heatData.DeltaT = m_sw.ElapsedMilliseconds*0.001; m_sw.Restart(); if ( (heatData.CarbonMonoxideVolumePercent > 0) && (heatData.OffgasVolumeRate > 0) && (heatData.DeltaT > 0) && (heatData.Kgasan > 0) ) { double GCMResult = Decarbonater.GasanCarbonMass( heatData.CarbonMonoxideVolumePercent, heatData.OffgasVolumeRate, heatData.DeltaT, heatData.Kgasan ); if (GCMResult >= 0) { if (heatData.OxygenVolumeRate > 0) RemainCarbonMass -= GCMResult; ////////////////////////////// } else l.err("GasanCarbonMass return bad result: {0}", GCMResult); if ( (RemainCarbonMass > 0) && (heatData.IronMass > 0) && (heatData.IronCarbonPercent > 0) && (heatData.ScrapMass > 0) && (heatData.ScrapCarbonPercent > 0) ) { RemainCarbonPercent = GetCarbonPercent( RemainCarbonMass, heatData.IronMass, heatData.IronCarbonPercent, heatData.ScrapMass, heatData.ScrapCarbonPercent ); } else { l.err( "bad data for GetCarbonPercent [RemainCarbonMass: {0}][IronMass: {1}][IronCarbonPercent: {2}][ScrapMass: {3}][ScrapCarbonPercent: {4}]", RemainCarbonMass, heatData.IronMass, heatData.IronCarbonPercent, heatData.ScrapMass, heatData.ScrapCarbonPercent ); } GasCarbonMassFinished = VerifyGasCarbonFinished( heatData.OxygenVolumeTotal, heatData.OxygenVolumeCurrent, TotalCarbonMass, RemainCarbonMass, heatData.CarbonMonoxideVolumePercent, heatData.CarbonMonoxideVolumePercentPrevious, heatData.CarbonOxideVolumePercent, heatData.CarbonOxideVolumePercentPrevious ); } else { l.err( "bad data for GasanCarbonMass [CarbonMonoxideVolumePercent: {0}][OffgasVolumeRate: {1}][DeltaT: {2}][Kgasan: {3}]", heatData.CarbonMonoxideVolumePercent, heatData.OffgasVolumeRate, heatData.DeltaT, heatData.Kgasan ); } } else { var currentStateData = new MFCMData { CarbonMonoxideVolumePercent = heatData.CarbonMonoxideVolumePercent, CarbonOxideVolumePercent = heatData.CarbonOxideVolumePercent, HeightLanceCentimeters = heatData.HeightLanceCentimeters, OxygenVolumeRate = heatData.OxygenVolumeRate }; //MFMChooser //var CMCarbon = Decarbonater.MultiFactorCarbonMass(heatData.MatrixStateData, currentStateData); m_currentMatrix = MFMChooser(heatData); var matrixStateData = Program.MFCMDataGenerate(Program.MatrixStateDataFull[m_currentMatrix].MatrixList); var CMCarbon = Decarbonater.MultiFactorCarbonMass(matrixStateData, currentStateData); //if (CMCarbon < RemainCarbonPercent) RemainCarbonPercent = CMCarbon; RemainCarbonPercent = CMCarbon; if (MomentFixDataForMFactorModel(heatData.CarbonMonoxideVolumePercent, heatData.CarbonOxideVolumePercent)) // фиксируем для обучения { if (m_noFixData) { CurrentHeatResult.OxygenVolumeRate = heatData.OxygenVolumeRate; CurrentHeatResult.SteelCarbonCalculationPercent = RemainCarbonPercent; CurrentHeatResult.CarbonMonoxideVolumePercent = heatData.CarbonMonoxideVolumePercent; CurrentHeatResult.CarbonOxideVolumePercent = heatData.CarbonOxideVolumePercent; CurrentHeatResult.HeightLanceCentimeters = heatData.HeightLanceCentimeters; CurrentHeatResult.MFMEquationId = m_currentMatrix; // фиксируем матрицу по которой учим EnqueueWaitC(CurrentHeatResult); // ставим в очередь ожидания углерода Program.PushGate.PushEvent(new FixDataMfactorModelEvent()); // временная мера для перехода на старый углерод var fex = new ConnectionProvider.FlexHelper("CPlusProcessor.DataFix"); fex.Fire(Program.PushGate); Console.WriteLine(fex.evt + "\n"); ////////////////////////////////////////////////////////////////////// m_noFixData = false; } } } DataArchSec.SD.Add(new SecondData()); // заполняем для статистики во время плавки DataArchSec.SD[DataArchSec.SD.Count - 1].CarboneCalc = RemainCarbonPercent; DataArchSec.SD[DataArchSec.SD.Count - 1].Time = DateTime.Now.ToString(); DataArchSec.SD[DataArchSec.SD.Count - 1].CarboneMonoxide = heatData.CarbonMonoxideVolumePercent; DataArchSec.SD[DataArchSec.SD.Count - 1].CarboneOxide = heatData.CarbonOxideVolumePercent; DataArchSec.SD[DataArchSec.SD.Count - 1].HeightLance = heatData.HeightLanceCentimeters; DataArchSec.SD[DataArchSec.SD.Count - 1].OxygenVolumeCurrent = heatData.OxygenVolumeCurrent; // if (!GasCarbonMassFinished) { DataArchSec.SD[DataArchSec.SD.Count - 1].Model = "Gas Analise Mono factor Model"; l.msg("Gas Analise Mono factor Model"); } else { DataArchSec.SD[DataArchSec.SD.Count - 1].Model = "Multi Factor Model"; l.msg("Multi Factor Model № {0}", m_currentMatrix); } calculatedCarboneEvent.CarbonePercent = RemainCarbonPercent; calculatedCarboneEvent.CarboneMass = RemainCarbonMass; calculatedCarboneEvent.model = DataArchSec.SD[DataArchSec.SD.Count - 1].Model; Program.PushGate.PushEvent(calculatedCarboneEvent); //Program.PushGate.PushEvent(new CalculatedCarboneEvent()); // временная мера для перехода на старый углерод var fex2 = new ConnectionProvider.FlexHelper("CPlusProcessor.Result"); fex2.AddArg("C", RemainCarbonPercent); fex2.Fire(Program.PushGate); ////////////////////////////////////////////////////////////////////// } }
private static int MFMChooser(HeatData hd) { //return (hd.CarbonMonoxideVolumePercent < hd.CarbonMonoxideVolumePercentPrevious) ? 0 : 1; return (hd.CarbonOxideVolumePercent > hd.CarbonOxideVolumePercentPrevious) ? 0 : 1; }
public static void Init() { m_sw = new Stopwatch(); CurrentHeatResult = new MFCMDataFull(); DataCurrentHeat = new HeatData(); //CIterator.DataCurrentHeat.MatrixStateData = Program.MFCMDataGenerate(Program.MatrixStateDataFull); //!! DataArchSec = new SecondDataArch(); DataSmoothCurrent = new HeatDataSmoother(100); m_smoothSecondLancePosition = new RollingAverage(); TotalCarbonMass = 0.0; RemainCarbonMass = 0.0; RemainCarbonPercent = 0.0; m_maxDownLancePosition = 10000; m_lanceSpeed = 0.0; TotalCarbonMassCalculated = false; GasCarbonMassFinished = false; m_noFixData = true; }