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); }
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"); } }
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); }
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)); }
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"); }
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); } } }