public async Task <bool> IsOutageElement(long outageElementId)
        {
            while (!ReliableDictionariesInitialized)
            {
                await Task.Delay(1000);
            }

            return(await SimulatedOutages.ContainsKeyAsync(outageElementId));
        }
Exemple #2
0
        public async Task <IEnumerable <SimulatedOutage> > GetAllSimulatedOutages()
        {
            while (!ReliableDictionariesInitialized)
            {
                await Task.Delay(1000);
            }

            var outagesMap = await SimulatedOutages.GetDataCopyAsync();

            return(outagesMap.Values);
        }
Exemple #3
0
        public async Task <bool> EndOutage(long outageElementGid)
        {
            while (!ReliableDictionariesInitialized)
            {
                await Task.Delay(1000);
            }

            if (!await SimulatedOutages.ContainsKeyAsync(outageElementGid))
            {
                return(false);
            }

            await RemoveNoLongerNeededMonitoredPoints(outageElementGid);

            await SimulatedOutages.TryRemoveAsync(outageElementGid);

            return(true);
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        private async Task RemoveNoLongerNeededMonitoredPoints(long outageElementGid)
        {
            var enumerableSimulatedOutages = await SimulatedOutages.GetEnumerableDictionaryAsync();

            if (!enumerableSimulatedOutages.ContainsKey(outageElementGid))
            {
                return;
            }

            var removeOutage = enumerableSimulatedOutages[outageElementGid];

            var measurementMapClient     = MeasurementMapClient.CreateClient();
            var elementToMeasurementsMap = await measurementMapClient.GetElementToMeasurementMap();

            foreach (var monitoredElementGid in removeOutage.ElementsOfInteres)
            {
                bool stillNeeded = false;

                foreach (var outage in enumerableSimulatedOutages.Values)
                {
                    if (outage.OutageElementGid != removeOutage.OutageElementGid && outage.ElementsOfInteres.Contains(monitoredElementGid))
                    {
                        stillNeeded = true;
                        break;
                    }
                }

                if (!stillNeeded && elementToMeasurementsMap.ContainsKey(monitoredElementGid))
                {
                    var measurementGids = elementToMeasurementsMap[monitoredElementGid];
                    var measurementGid  = measurementGids.FirstOrDefault();

                    await MonitoredIsolationPoints.TryRemoveAsync(measurementGid);
                }
            }
        }
Exemple #6
0
        public async Task Start()
        {
            while (!ReliableDictionariesInitialized)
            {
                await Task.Delay(1000);
            }

            var enumerableOutages = await SimulatedOutages.GetEnumerableDictionaryAsync();

            var enumerableMonitoredPoints = await MonitoredIsolationPoints.GetEnumerableDictionaryAsync();

            if (enumerableOutages.Count == 0 || enumerableMonitoredPoints.Count == 0)
            {
                Logger.LogVerbose($"{baseLogString} Start => No simulated outages. End of cycle.");
                return;
            }

            var defaultIsolationPointsToBeOpened = new Dictionary <long, DiscreteModbusData>();
            var measurementMapClient             = MeasurementMapClient.CreateClient();
            var elementToMeasurementMap          = await measurementMapClient.GetElementToMeasurementMap();

            foreach (var outage in enumerableOutages.Values)
            {
                foreach (long defaultPointElementGid in outage.DefaultIsolationPointGids)
                {
                    if (!elementToMeasurementMap.ContainsKey(defaultPointElementGid))
                    {
                        continue;
                    }

                    var defaultPointMeasurementGid = elementToMeasurementMap[defaultPointElementGid].FirstOrDefault();

                    if (!outage.DefaultToOptimumIsolationPointMap.ContainsKey(defaultPointElementGid))
                    {
                        continue;
                    }

                    long optimumPointElementGid = outage.DefaultToOptimumIsolationPointMap[defaultPointElementGid];

                    if (!elementToMeasurementMap.ContainsKey(optimumPointElementGid))
                    {
                        continue;
                    }

                    long optimumPointMeasurementGid = elementToMeasurementMap[optimumPointElementGid].FirstOrDefault();

                    if (!enumerableMonitoredPoints.ContainsKey(optimumPointMeasurementGid) || !enumerableMonitoredPoints.ContainsKey(defaultPointMeasurementGid))
                    {
                        continue;
                    }

                    var    defaultIsolationPoint      = enumerableMonitoredPoints[defaultPointMeasurementGid].DiscreteModbusData;
                    ushort optimumIsolationPointValue = enumerableMonitoredPoints[optimumPointMeasurementGid].DiscreteModbusData.Value;

                    if (optimumIsolationPointValue == (ushort)DiscreteCommandingType.CLOSE && defaultIsolationPoint.Value == (ushort)DiscreteCommandingType.CLOSE)
                    {
                        defaultIsolationPointsToBeOpened.Add(defaultPointMeasurementGid, defaultIsolationPoint);
                        Logger.LogInformation($"{baseLogString} Start => preparing command to OPEN 0x{defaultPointElementGid:X16} because element 0x{optimumPointElementGid:X16} is CLOSED.");
                    }
                }
            }

            await OpenIsolationPoints(defaultIsolationPointsToBeOpened);
        }