예제 #1
0
        private void SendCommand(CeForecast forecastResult)
        {
            commands = new List <List <ScadaCommandingEvent> >();
            var proxy      = new SF.Common.Proxies.ScadaExportProxy(ConfigurationManager.AppSettings["Scada"]);
            var commanding = new CommandingProxy(ConfigurationManager.AppSettings["Command"]);
            var points     = proxy.GetData().GetAwaiter().GetResult();

            if (points == null)
            {
                return;
            }
            foreach (var item in forecastResult.Results.Take(24))
            {
                var cmds = new List <ScadaCommandingEvent>();
                for (int i = 0; i < item.Pumps.Count(); i++)
                {
                    var onOff = item.Pumps[i];
                    var time  = item.Times[i];
                    var flow  = item.Flows[i];
                    if (points.ContainsKey($"Breaker_2{i + 1}Status"))
                    {
                        var breaker2 = points[$"Breaker_2{i + 1}Status"];
                        if (onOff != 0)
                        {
                            var command1 = new ScadaCommandingEvent()
                            {
                                Index        = (uint)breaker2.Index,
                                RegisterType = breaker2.RegisterType,
                                Milliseconds = 0,
                                Value        = (uint)onOff
                            };
                            cmds.Add(command1);
                        }
                    }

                    if (points.ContainsKey($"Discrete_Tap{i + 1}") && onOff == 1)
                    {
                        var tap = points[$"Discrete_Tap{i + 1}"];

                        var command2 = new ScadaCommandingEvent()
                        {
                            Index        = (uint)tap.Index,
                            RegisterType = tap.RegisterType,
                            Milliseconds = 0,
                            Value        = (uint)(flow / 100)
                        };
                        cmds.Add(command2);
                    }
                }
                commands.Add(cmds);
            }
        }
예제 #2
0
        private void Calculations()
        {
            if (points > 0 && points < 4)
            {
                if (pointUpdateOccures)
                {
                    ChangeStrategy();
                }

                forecastResult = new CeForecast();
                var area            = GetSurfaceArea();
                var weatherForecast = weatherAPI.GetForecast();
                var weather         = new List <double>();
                weatherForecast.ForEach(x => weather.Add(x * area));
                float current = GetCurrentFluidLevel();

                for (int i = 0; i < weatherForecast.Count; i++)
                {
                    ChangeStrategy();
                    for (int j = 0; j < 4; j++)
                    {
                        var income = ((float)weather[i]) / 4;
                        current += income;

                        if (skip && i == 0)
                        {
                            current -= income;
                            skip     = false;
                            break;
                        }

                        result = algorithm.Start(current);
                        var processedResult = ProcessResult(current, result);
                        forecastResult.Results.AddRange(processedResult);
                        current -= GetTotalFromResults(result.Genes);
                    }
                }

                SendCommand(forecastResult);
                Update(forecastResult, weather);
            }
        }
예제 #3
0
        private void Update(CeForecast forecastResult, List <double> weather)
        {
            CeUpdateEvent update = new CeUpdateEvent();

            update.Income = new List <double>();
            for (int i = 0; i < weather.Count; i++)
            {
                double integralIncome = 0;
                for (int j = 0; j < 4; j++)
                {
                    integralIncome += weather[i] / 4;
                    update.Income.Add(integralIncome);
                }
            }
            update.Times      = GetTimes();
            update.FluidLevel = new List <float>();
            foreach (var item in forecastResult.Results)
            {
                update.FluidLevel.Add(item.StartFluidLevel);
                update.FluidLevel.Add(item.EndFluidLevel);
            }
            update.Hours = new List <PumpsHours>();
            update.Flows = new List <PumpsFlows>();

            graph             = new CeGraphicalEvent();
            graph.PumpsValues = new Core.Common.ServiceBus.Events.CeGraph();
            List <List <long> > list = new List <List <long> >();

            for (int i = 0; i < points; i++)
            {
                var  macList = new List <long>();
                long cumm    = 0;
                var  hours   = new PumpsHours();
                var  flows   = new PumpsFlows();
                foreach (var item in forecastResult.Results)
                {
                    if (item.Pumps[i] == 1)
                    {
                        hours.Hours.Add(item.Times[i]);
                        flows.Flows.Add(item.Flows[i]);
                        cumm += (long)(item.Times[i]);
                    }
                    else
                    {
                        hours.Hours.Add(0);
                        flows.Flows.Add(0);
                    }
                    macList.Add(cumm);
                }
                update.Hours.Add(hours);
                update.Flows.Add(flows);
                list.Add(macList);
            }
            pubsub.SendMessage(new Core.Common.PubSub.PubSubMessage()
            {
                ContentType = Core.Common.PubSub.ContentType.CE_UPDATE,
                Content     = JsonTool.Serialize <CeUpdateEvent>(update),
                Sender      = Core.Common.PubSub.Sender.CE
            }).GetAwaiter().GetResult();

            if (points == 1)
            {
                graph.PumpsValues.Pump1.XAxes = update.Times.ConvertAll(x => DateTime.Parse(x));
                graph.PumpsValues.Pump1.YAxes = list[0];
            }
            if (points == 2)
            {
                graph.PumpsValues.Pump1.XAxes = update.Times.ConvertAll(x => DateTime.Parse(x));
                graph.PumpsValues.Pump1.YAxes = list[0];
                graph.PumpsValues.Pump2.XAxes = update.Times.ConvertAll(x => DateTime.Parse(x));
                graph.PumpsValues.Pump2.YAxes = list[1];
            }
            if (points == 3)
            {
                graph.PumpsValues.Pump1.XAxes = update.Times.ConvertAll(x => DateTime.Parse(x));
                graph.PumpsValues.Pump1.YAxes = list[0];
                graph.PumpsValues.Pump2.XAxes = update.Times.ConvertAll(x => DateTime.Parse(x));
                graph.PumpsValues.Pump2.YAxes = list[1];
                graph.PumpsValues.Pump3.XAxes = update.Times.ConvertAll(x => DateTime.Parse(x));
                graph.PumpsValues.Pump3.YAxes = list[2];
            }
        }