Exemplo n.º 1
0
        public bool StopOutageSimulation(long outageElementId)
        {
            //TODO: END TASK HERE

            if (!outageTokenMap.ContainsKey(outageElementId))
            {
                return(false);
            }

            outageTokenMap[outageElementId].Cancel();
            outageTokenMap.Remove(outageElementId);

            if (!activeOutagesMap.ContainsKey(outageElementId))
            {
                return(false);
            }

            ActiveOutageBindingModel outage = activeOutagesMap[outageElementId];

            ActiveOutages.Remove(outage);
            activeOutagesMap.Remove(outageElementId);

            OnPropertyChanged("IsSelectedOutageGridVisible");
            OnPropertyChanged("OutageElement");
            OnPropertyChanged("OptimumIsolationPoints");
            OnPropertyChanged("DefaultIsolationPoints");

            return(true);
        }
Exemplo n.º 2
0
        private async Task EndOutage()
        {
            var outageElementId = SelectedOutage.OutageElement.GID;

            var outageSimulatorUIClient = OutageSimulatorUIClient.CreateClient();

            if (await outageSimulatorUIClient.EndOutage(outageElementId))
            {
                if (!activeOutagesMap.ContainsKey(outageElementId))
                {
                    return;
                }

                ActiveOutageBindingModel outage = activeOutagesMap[outageElementId];
                ActiveOutages.Remove(outage);
                activeOutagesMap.Remove(outageElementId);

                OnPropertyChanged("ActiveOutages");
                OnPropertyChanged("SelectedOutage");
                OnPropertyChanged("IsSelectedOutageGridVisible");
                OnPropertyChanged("OutageElement");
                OnPropertyChanged("OptimumIsolationPoints");
                OnPropertyChanged("DefaultIsolationPoints");
            }
        }
Exemplo n.º 3
0
        public ScadaNotification(string subscriberName, ActiveOutageBindingModel outage)
        {
            this.subscriberName  = subscriberName;
            this.outageElementId = outage.OutageElement.GID;
            this.proxyFactory    = new ProxyFactory();

            optimumIsolationPointsModbusData  = new Dictionary <long, DiscreteModbusData>(outage.OptimumIsolationPoints.Count);
            defaultIsolationPointsModbusData  = new Dictionary <long, DiscreteModbusData>(outage.DefaultIsolationPoints.Count);
            defaultToOptimumIsolationPointMap = new Dictionary <long, long>(outage.DefaultToOptimumIsolationPointMap.Count);

            GetInegrityUpdateFromScada(outage);
        }
Exemplo n.º 4
0
        public void GenerateOutage(ActiveOutageBindingModel outage)
        {
            CancellationTokenSource tokenSource = new CancellationTokenSource();
            CancellationToken       token       = tokenSource.Token;

            Task task = Task.Run(() =>
            {
                token.ThrowIfCancellationRequested();

                ScadaNotification scadaCallback = new ScadaNotification("OUTAGE_SIMULATOR", outage);
                SubscriberProxy scadaSubscriber = proxyFactory.CreateProxy <SubscriberProxy, ISubscriber>(scadaCallback, EndpointNames.SubscriberEndpoint);

                if (scadaSubscriber == null)
                {
                    string message = "GenerateOutage task => SubscriberProxy is null";
                    Logger.LogError(message);
                    return;
                }

                scadaSubscriber.Subscribe(Topic.SWITCH_STATUS);

                bool toContinue = !token.IsCancellationRequested;
                while (toContinue)
                {
                    //TODO: OUTAGE LOGIC

                    if (token.IsCancellationRequested)
                    {
                        // Clean up here
                        scadaSubscriber.Close();
                        toContinue = false;
                        //token.ThrowIfCancellationRequested();
                    }
                }
            }, token);

            outageTokenMap.Add(outage.OutageElement.GID, tokenSource);

            ActiveOutages.Add(outage);
            activeOutagesMap.Add(outage.OutageElement.GID, outage);

            Dispatcher.BeginInvoke((Action)(() => parent.TabControl.SelectedIndex = 0));
        }
Exemplo n.º 5
0
        public void SetOutages(IEnumerable <SimulatedOutage> simulatedOutages)
        {
            activeOutagesMap.Clear();
            //Dispatcher.Invoke(new Action(() => ActiveOutages.Clear()));
            ActiveOutages.Clear();
            foreach (var simulatedOutage in simulatedOutages)
            {
                var outage = new ActiveOutageBindingModel()
                {
                    OutageElement                     = new GlobalIDBindingModel(simulatedOutage.OutageElementGid),
                    OptimumIsolationPoints            = new ObservableCollection <GlobalIDBindingModel>(simulatedOutage.OptimumIsolationPointGids.Select(gid => new GlobalIDBindingModel(gid))),
                    DefaultIsolationPoints            = new ObservableCollection <GlobalIDBindingModel>(simulatedOutage.DefaultIsolationPointGids.Select(gid => new GlobalIDBindingModel(gid))),
                    DefaultToOptimumIsolationPointMap = new Dictionary <long, long>(simulatedOutage.DefaultToOptimumIsolationPointMap),
                };

                //Dispatcher.Invoke(new Action(() => ActiveOutages.Add(outage)));
                ActiveOutages.Add(outage);
                activeOutagesMap.Add(simulatedOutage.OutageElementGid, outage);
            }
        }
        private void GenerateOutageButton_Click(object sender, RoutedEventArgs e)
        {
            if (!(OutageElement.Count == 1 && OptimumIsolationPoints.Count > 0 && DefaultIsolationPoints.Count > 0))
            {
                string message = $"Rules: OutageElement.Count == 1 && OptimumIsolationPoints.Count > 0 && DefaultIsolationPoints.Count > 0";
                MessageBox.Show(message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
                return;
            }

            ActiveOutageBindingModel outage = new ActiveOutageBindingModel();

            outage.OutageElement = OutageElement.First();
            outage.OptimumIsolationPoints.AddRange(OptimumIsolationPoints);
            outage.DefaultIsolationPoints.AddRange(DefaultIsolationPoints);

            for (int i = 0; i < DefaultIsolationPoints.Count; i++)
            {
                if (!outage.DefaultToOptimumIsolationPointMap.ContainsKey(DefaultIsolationPoints[i].GID) && i < OptimumIsolationPoints.Count)
                {
                    outage.DefaultToOptimumIsolationPointMap.Add(DefaultIsolationPoints[i].GID, OptimumIsolationPoints[i].GID);
                }
            }

            overviewUserControl.GenerateOutage(outage);

            OutageElement.Clear();
            outageElementGids.Clear();
            OptimumIsolationPoints.Clear();
            optimumIsolationPointsGids.Clear();
            DefaultIsolationPoints.Clear();
            defaultIsolationPointsGids.Clear();

            OnPropertyChanged("IsGenerateOutageEnabled");
            OnPropertyChanged("IsSelectOutageElementEnabled");
            OnPropertyChanged("IsDeSelectOutageElementEnabled");
            OnPropertyChanged("IsAddOptimumIsolationPointEnabled");
            OnPropertyChanged("IsRemoveOptimumIsolationPointEnabled");
            OnPropertyChanged("IsAddDefaultIsolationPointEnabled");
            OnPropertyChanged("IsRemoveDefaultIsolationPointEnabled");
        }
Exemplo n.º 7
0
        private void GetInegrityUpdateFromScada(ActiveOutageBindingModel outage)
        {
            using (SCADAIntegrityUpdateProxy proxy = proxyFactory.CreateProxy <SCADAIntegrityUpdateProxy, ISCADAIntegrityUpdateContract>(EndpointNames.SCADAIntegrityUpdateEndpoint))
            {
                if (proxy == null)
                {
                    string message = "GetInegrityUpdateFromScada => SCADAIntegrityUpdateProxy is null";
                    Logger.LogError(message);
                    throw new NullReferenceException(message);
                }

                SCADAPublication data = proxy.GetIntegrityUpdateForSpecificTopic(Topic.SWITCH_STATUS);

                if (data.Message is MultipleDiscreteValueSCADAMessage multipleDiscreteValueSCADAMessage)
                {
                    using (MeasurementMapProxy measurementProxy = proxyFactory.CreateProxy <MeasurementMapProxy, IMeasurementMapContract>(EndpointNames.MeasurementMapEndpoint))
                    {
                        if (measurementProxy == null)
                        {
                            string errorMessage = "Notify => MeasurementMapProxy is null";
                            Logger.LogError(errorMessage);
                            throw new NullReferenceException(errorMessage);
                        }

                        Dictionary <long, List <long> > elemetnToMeasurementMap = measurementProxy.GetElementToMeasurementMap();

                        //UPDATE

                        foreach (long optimumIsolationPointElementId in outage.OptimumIsolationPoints.Select(p => p.GID))
                        {
                            if (!elemetnToMeasurementMap.ContainsKey(optimumIsolationPointElementId))
                            {
                                continue;
                            }

                            List <long> optimumIsolationPointMeasurementIds = elemetnToMeasurementMap[optimumIsolationPointElementId];

                            foreach (long optimumIsolationPointMeasurementId in optimumIsolationPointMeasurementIds)
                            {
                                if (multipleDiscreteValueSCADAMessage.Data.ContainsKey(optimumIsolationPointMeasurementId))
                                {
                                    if (!optimumIsolationPointsModbusData.ContainsKey(optimumIsolationPointMeasurementId))
                                    {
                                        optimumIsolationPointsModbusData.Add(optimumIsolationPointMeasurementId, multipleDiscreteValueSCADAMessage.Data[optimumIsolationPointMeasurementId]);
                                    }
                                }
                            }
                        }

                        foreach (long defaultIsolationPointElementId in outage.DefaultIsolationPoints.Select(p => p.GID))
                        {
                            if (!elemetnToMeasurementMap.ContainsKey(defaultIsolationPointElementId))
                            {
                                continue;
                            }

                            List <long> defaultIsolationPointMeasurementIds = elemetnToMeasurementMap[defaultIsolationPointElementId];

                            foreach (long defaultIsolationPointMeasuremetId in defaultIsolationPointMeasurementIds)
                            {
                                if (multipleDiscreteValueSCADAMessage.Data.ContainsKey(defaultIsolationPointMeasuremetId))
                                {
                                    if (!defaultIsolationPointsModbusData.ContainsKey(defaultIsolationPointMeasuremetId))
                                    {
                                        defaultIsolationPointsModbusData.Add(defaultIsolationPointMeasuremetId, multipleDiscreteValueSCADAMessage.Data[defaultIsolationPointMeasuremetId]);
                                    }
                                }
                            }

                            if (outage.DefaultToOptimumIsolationPointMap.ContainsKey(defaultIsolationPointElementId))
                            {
                                long optimumIsolationPointElementId = outage.DefaultToOptimumIsolationPointMap[defaultIsolationPointElementId];

                                if (elemetnToMeasurementMap.ContainsKey(optimumIsolationPointElementId))
                                {
                                    long optimumIsolationPointMeasurementGid = elemetnToMeasurementMap[outage.DefaultToOptimumIsolationPointMap[defaultIsolationPointElementId]].First(); //TODO: ko voli nek izvoli
                                    long defaultIsolationPointMeasurementGid = defaultIsolationPointMeasurementIds.First();                                                               //TODO: ko voli nek izvoli

                                    if (!defaultToOptimumIsolationPointMap.ContainsKey(defaultIsolationPointMeasurementGid))
                                    {
                                        defaultToOptimumIsolationPointMap.Add(defaultIsolationPointMeasurementGid, optimumIsolationPointMeasurementGid);
                                    }
                                }
                            }
                        }

                        //COMMAND OPEN IF TRUE
                        Dictionary <long, DiscreteModbusData> defaultIsolationPointsToBeOpened = new Dictionary <long, DiscreteModbusData>();

                        foreach (long gid in defaultIsolationPointsModbusData.Keys)
                        {
                            if (defaultToOptimumIsolationPointMap.ContainsKey(gid))
                            {
                                long optimumPointGid = defaultToOptimumIsolationPointMap[gid];

                                if (optimumIsolationPointsModbusData.ContainsKey(optimumPointGid))
                                {
                                    ushort optimumIsolationPointValue = optimumIsolationPointsModbusData[optimumPointGid].Value;

                                    if (optimumIsolationPointValue == (ushort)DiscreteCommandingType.CLOSE)
                                    {
                                        defaultIsolationPointsToBeOpened.Add(gid, defaultIsolationPointsModbusData[gid]);
                                    }
                                }
                            }
                        }

                        OpenIsolationPoints(defaultIsolationPointsToBeOpened);
                    }
                }
                else
                {
                    string message = "SCADA returned wrong value for in SCADAPublication. MultipleDiscreteValueSCADAMessage excepted.";
                    throw new Exception(message);
                }
            }
        }