private async Task GenerateOutageLogic() { 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; } var outage = new SimulatedOutage(); outage.OutageElementGid = OutageElement.First().GID; outage.OptimumIsolationPointGids.AddRange(OptimumIsolationPoints.Select(point => point.GID)); outage.DefaultIsolationPointGids.AddRange(DefaultIsolationPoints.Select(point => point.GID)); 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); } } var outageSimulatorUIClient = OutageSimulatorUIClient.CreateClient(); await outageSimulatorUIClient.GenerateOutage(outage); await parentWindow.ChangeTab(TabType.OVERVIEW); OutageElement.Clear(); outageElementGids.Clear(); OptimumIsolationPoints.Clear(); optimumIsolationPointsGids.Clear(); DefaultIsolationPoints.Clear(); defaultIsolationPointsGids.Clear(); SetGenerateOutageIsEnabled(); SetSelectOutageElementIsEnabled(); SetDeselectOutageElementIsEnabled(); SetAddOptimumIsolationPointIsEnabled(); SetRemoveOptimumIsolationPointIsEnabled(); SetAddDefaultIsolationPointIsEnabled(); SetRemoveDefaultIsolationPointIsEnabled(); //OnPropertyChanged("IsGenerateOutageEnabled"); //OnPropertyChanged("IsSelectOutageElementEnabled"); //OnPropertyChanged("IsDeSelectOutageElementEnabled"); //OnPropertyChanged("IsAddOptimumIsolationPointEnabled"); //OnPropertyChanged("IsRemoveOptimumIsolationPointEnabled"); //OnPropertyChanged("IsAddDefaultIsolationPointEnabled"); //OnPropertyChanged("IsRemoveDefaultIsolationPointEnabled"); }
private async Task InitializeMonitoredPoints(SimulatedOutage outage) { var measurementMapClient = MeasurementMapClient.CreateClient(); var measurementToElementGid = await measurementMapClient.GetMeasurementToElementMap(); var scadaClient = ScadaIntegrityUpdateClient.CreateClient(); var publication = await scadaClient.GetIntegrityUpdateForSpecificTopic(Common.Cloud.Topic.SWITCH_STATUS); if (!(publication.Message is MultipleDiscreteValueSCADAMessage multipleDiscreteValueSCADAMessage)) { string errorMessage = $"SCADA returned wrong value for in SCADAPublication. {typeof(MultipleDiscreteValueSCADAMessage)} excepted."; Logger.LogError(errorMessage); throw new Exception(errorMessage); } foreach (var measurementGid in multipleDiscreteValueSCADAMessage.Data.Keys) { if (!measurementToElementGid.ContainsKey(measurementGid)) { continue; } var elementGid = measurementToElementGid[measurementGid]; if (!outage.ElementsOfInteres.Contains(elementGid)) { continue; } var modbusData = multipleDiscreteValueSCADAMessage.Data[measurementGid]; var monitoredPoint = new MonitoredIsolationPoint() { IsolationElementGid = elementGid, DiscreteMeasurementGid = measurementGid, SimulatedOutageElementGid = outage.OutageElementGid, DiscreteModbusData = modbusData, IsolationPointType = outage.OptimumIsolationPointGids.Contains(elementGid) ? IsolationPointType.OPTIMUM : outage.DefaultIsolationPointGids.Contains(elementGid) ? IsolationPointType.DEFAULT : 0, }; await MonitoredIsolationPoints.SetAsync(measurementGid, monitoredPoint); } }
public async Task <bool> GenerateOutage(SimulatedOutage outage) { while (!ReliableDictionariesInitialized) { await Task.Delay(1000); } if (await SimulatedOutages.ContainsKeyAsync(outage.OutageElementGid)) { return(false); } await InitializeMonitoredPoints(outage); await SimulatedOutages.SetAsync(outage.OutageElementGid, outage); return(true); }
public Task <bool> GenerateOutage(SimulatedOutage outage) { return(InvokeWithRetryAsync(client => client.Channel.GenerateOutage(outage))); }