private static void GetAnalogUpdate(string mrid, float value)
        {
            measurements.TryGetValue(mrid, out Measurement measurement);

            AnalogMeasurement analogMeasurement = measurement as AnalogMeasurement;

            analogMeasurement.Value = value;
        }
Exemplo n.º 2
0
        private async Task <List <AnalogMeasurement> > GetMeasurements(Dictionary <long, string> measurements)
        {
            string verboseMessage = $"{baseLogString} GetMeasurements method called.";

            Logger.LogVerbose(verboseMessage);

            List <AnalogMeasurement> analogMeasurements = new List <AnalogMeasurement>();

            foreach (var measurement in measurements)
            {
                DMSType type = (DMSType)ModelCodeHelper.ExtractTypeFromGlobalId(measurement.Key);

                if (type == DMSType.ANALOG)
                {
                    Logger.LogDebug($"{baseLogString} GetMeasurements => Calling GetAnalogMeasurement for GID {measurement.Key:X16} from measurement provider.");
                    var measurementProviderClient       = MeasurementProviderClient.CreateClient();
                    AnalogMeasurement analogMeasurement = await measurementProviderClient.GetAnalogMeasurement(measurement.Key);

                    Logger.LogDebug($"{baseLogString} GetMeasurements => GetAnalogMeasurement method from measurement provider has been called successfully.");

                    if (analogMeasurement == null)
                    {
                        string message = $"{baseLogString} GetMeasurements => GetAnalogMeasurement from measurement provider returned null for measurement GID {measurement.Key:X16}";
                        Logger.LogWarning(message);
                        continue;
                    }

                    if (measurement.Value.Equals(AnalogMeasurementType.POWER.ToString()))
                    {
                        analogMeasurements.Add(analogMeasurement);
                    }
                    else if (measurement.Value.Equals(AnalogMeasurementType.VOLTAGE.ToString()))
                    {
                        analogMeasurements.Add(analogMeasurement);
                    }
                    else if (measurement.Value.Equals(AnalogMeasurementType.CURRENT.ToString()))
                    {
                        analogMeasurements.Add(analogMeasurement);
                    }
                    else if (measurement.Value.Equals(AnalogMeasurementType.FEEDER_CURRENT.ToString()))
                    {
                        analogMeasurements.Add(analogMeasurement);
                    }
                    else
                    {
                        Logger.LogWarning($"{baseLogString} GetMeasurements => Unknown type [{measurement.Value}] of measurement with GID {measurement.Key:X16}.");
                    }
                }
            }

            return(analogMeasurements);
        }
        private async Task <AnalogMeasurement> GetPopulatedAnalogMeasurement(ResourceDescription rs)
        {
            string verboseMessage = $"{baseLogString} entering GetPopulatedAnalogMeasurement method.";

            Logger.LogVerbose(verboseMessage);

            AnalogMeasurement measurement = new AnalogMeasurement();

            try
            {
                measurement.Id            = rs.Id;
                measurement.Address       = rs.GetProperty(ModelCode.MEASUREMENT_ADDRESS).AsString();
                measurement.IsInput       = rs.GetProperty(ModelCode.MEASUREMENT_ISINPUT).AsBool();
                measurement.CurrentValue  = rs.GetProperty(ModelCode.ANALOG_CURRENTVALUE).AsFloat();
                measurement.MaxValue      = rs.GetProperty(ModelCode.ANALOG_MAXVALUE).AsFloat();
                measurement.MinValue      = rs.GetProperty(ModelCode.ANALOG_MINVALUE).AsFloat();
                measurement.NormalValue   = rs.GetProperty(ModelCode.ANALOG_NORMALVALUE).AsFloat();
                measurement.Deviation     = rs.GetProperty(ModelCode.ANALOG_DEVIATION).AsFloat();
                measurement.ScalingFactor = rs.GetProperty(ModelCode.ANALOG_SCALINGFACTOR).AsFloat();
                measurement.SignalType    = (AnalogMeasurementType)rs.GetProperty(ModelCode.ANALOG_SIGNALTYPE).AsEnum();

                var connection = await GetAllReferencedElements(rs);

                if (connection.Count < 0)
                {
                    Logger.LogError($"{baseLogString} GetPopulatedAnalogMeasurement => Analog measurement with GID: {rs.Id:X16} is not connected to any element.");
                }
                else if (connection.Count > 1)
                {
                    Logger.LogWarning($"{baseLogString} GetPopulatedAnalogMeasurement => Analog measurement with GID: {rs.Id:X16} is connected to more then one element.");

                    if (!await MeasurementToConnectedTerminalMap.ContainsKeyAsync(rs.Id))
                    {
                        await MeasurementToConnectedTerminalMap.SetAsync(rs.Id, connection.First());
                    }
                }
                else
                {
                    if (!await MeasurementToConnectedTerminalMap.ContainsKeyAsync(rs.Id))
                    {
                        await MeasurementToConnectedTerminalMap.SetAsync(rs.Id, connection.First());
                    }
                }
            }
            catch (Exception e)
            {
                Logger.LogError($"{baseLogString} GetPopulatedAnalogMeasurement => Failed to populate analog measurement with GID {rs.Id:X16}." +
                                $"{Environment.NewLine} Exception message: {e.Message}" +
                                $"{Environment.NewLine} Stack trace: {e.StackTrace}");
            }
            return(measurement);
        }
        private AnalogMeasurement GetPopulatedAnalogMeasurement(ResourceDescription rs)
        {
            AnalogMeasurement measurement = new AnalogMeasurement();

            try
            {
                measurement.Id            = rs.Id;
                measurement.Address       = rs.GetProperty(ModelCode.MEASUREMENT_ADDRESS).AsString();
                measurement.IsInput       = rs.GetProperty(ModelCode.MEASUREMENT_ISINPUT).AsBool();
                measurement.CurrentValue  = rs.GetProperty(ModelCode.ANALOG_CURRENTVALUE).AsFloat();
                measurement.MaxValue      = rs.GetProperty(ModelCode.ANALOG_MAXVALUE).AsFloat();
                measurement.MinValue      = rs.GetProperty(ModelCode.ANALOG_MINVALUE).AsFloat();
                measurement.NormalValue   = rs.GetProperty(ModelCode.ANALOG_NORMALVALUE).AsFloat();
                measurement.Deviation     = rs.GetProperty(ModelCode.ANALOG_DEVIATION).AsFloat();
                measurement.ScalingFactor = rs.GetProperty(ModelCode.ANALOG_SCALINGFACTOR).AsFloat();
                measurement.SignalType    = (AnalogMeasurementType)rs.GetProperty(ModelCode.ANALOG_SIGNALTYPE).AsEnum();

                var connection = GetAllReferencedElements(rs);
                if (connection.Count < 0)
                {
                    logger.LogWarn($"Analog measurement with GID: 0x{rs.Id:X16} is not connected to any element.");
                }
                else if (connection.Count > 1)
                {
                    logger.LogWarn($"Analog measurement with GID: 0x{rs.Id:X16} is connected to more then one element.");
                    MeasurementToConnectedTerminalMap.Add(rs.Id, connection.First());
                }
                else
                {
                    MeasurementToConnectedTerminalMap.Add(rs.Id, connection.First());
                }
            }
            catch (Exception)
            {
                logger.LogDebug($"Failed to populate analog measurement with GID: 0x{rs.Id:X16}.");
            }
            return(measurement);
        }
        public async Task <UIModel> ConvertTopologyToUIModel(TopologyModel topology)
        {
            string verboseMessage = $"{baseLogString} ConvertTopologyToUIModel method called.";

            Logger.LogVerbose(verboseMessage);

            if (topology == null)
            {
                string message = $"{baseLogString} ConvertTopologyToUIModel => Provider topology is null.";
                Logger.LogError(message);
                throw new Exception(message);
            }

            UIModel      uIModel = new UIModel();
            Stack <long> stack   = new Stack <long>();

            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => Calling GetReclosers method from model provider client.");
            var modelProviderClient = CeModelProviderClient.CreateClient();
            var reclosers           = await modelProviderClient.GetReclosers();

            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => GetReclosers method from model provider client has been called successfully.");

            uIModel.FirstNode = topology.FirstNode;
            stack.Push(topology.FirstNode);
            long nextElementGid;

            while (stack.Count > 0)
            {
                nextElementGid = stack.Pop();
                if (topology.GetElementByGid(nextElementGid, out ITopologyElement element))
                {
                    if (!reclosers.Contains(nextElementGid))
                    {
                        foreach (var child in element.SecondEnd)
                        {
                            long nextElement = child.Id;
                            if (ModelCodeHelper.ExtractTypeFromGlobalId(child.Id) == 0)
                            {
                                if (child is Field field && field.Members.Count > 0)
                                {
                                    nextElement = field.Members.First().Id;
                                }
                                else
                                {
                                    string message = $"{baseLogString} ConvertTopologyToUIModel => Error while getting field in Topology to UIModel convert. Element is not field or field is empty.";
                                    Logger.LogError(message);
                                    throw new Exception(message);
                                }
                            }

                            uIModel.AddRelation(element.Id, nextElement);
                            stack.Push(nextElement);
                        }
                    }

                    List <UIMeasurement> measurements = new List <UIMeasurement>();
                    foreach (var measurementGid in element.Measurements.Keys)
                    {
                        DMSType type = (DMSType)ModelCodeHelper.ExtractTypeFromGlobalId(measurementGid);

                        if (type == DMSType.ANALOG)
                        {
                            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => Calling GetAnalogMeasurement method from measurement provider client for measurement GID {measurementGid:X16}.");
                            var measurementProviderClient       = MeasurementProviderClient.CreateClient();
                            AnalogMeasurement analogMeasurement = await measurementProviderClient.GetAnalogMeasurement(measurementGid);

                            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => GetAnalogMeasurement method from measurement provider client has been called successfully.");

                            measurements.Add(new UIMeasurement()
                            {
                                Gid   = analogMeasurement.Id,
                                Type  = analogMeasurement.GetMeasurementType(),
                                Value = analogMeasurement.GetCurrentValue()
                            });
                        }
                        else if (type == DMSType.DISCRETE)
                        {
                            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => Calling GetDiscreteMeasurement method from measurement provider client for measurement GID {measurementGid:X16}.");
                            var measurementProviderClient           = MeasurementProviderClient.CreateClient();
                            DiscreteMeasurement discreteMeasurement = await measurementProviderClient.GetDiscreteMeasurement(measurementGid);

                            Logger.LogDebug($"{baseLogString} ConvertTopologyToUIModel => GetDiscreteMeasurement method from measurement provider client has been called successfully.");

                            measurements.Add(new UIMeasurement()
                            {
                                Gid   = discreteMeasurement.Id,
                                Type  = discreteMeasurement.GetMeasurementType(),
                                Value = discreteMeasurement.GetCurrentValue()
                            });
                        }
                    }


                    if (!uIModel.Nodes.ContainsKey(element.Id))
                    {
                        UINode newUINode = new UINode()
                        {
                            Id             = element.Id,
                            Name           = element.Name,
                            Mrid           = element.Mrid,
                            Description    = element.Description,
                            DMSType        = element.DmsType,
                            NominalVoltage = element.NominalVoltage,
                            Measurements   = measurements,
                            IsActive       = element.IsActive,
                            IsRemote       = element.IsRemote,
                            NoReclosing    = element.NoReclosing
                        };
                        uIModel.AddNode(newUINode);
                    }
                }
Exemplo n.º 6
0
        private async Task SyncMachine(ITopologyElement element, Dictionary <long, float> loadOfFeeders)
        {
            string verboseMessage = $"{baseLogString} SyncMachine method called. Element with GID {element?.Id:X16}";

            Logger.LogVerbose(verboseMessage);

            if (element == null)
            {
                string message = $"{baseLogString} UpdateLoadFlow => Element is null.";
                Logger.LogError(message);
                throw new Exception(message);
            }

            if (!(element is SynchronousMachine))
            {
                string message = $"{baseLogString} UpdateLoadFlow => Element is not SynchronousMachine.";
                Logger.LogError(message);
                throw new Exception(message);
            }

            AnalogMeasurement powerMeasurement   = null;
            AnalogMeasurement voltageMeasurement = null;

            if (element.Feeder != null)
            {
                if (loadOfFeeders.TryGetValue(element.Feeder.Id, out float feederLoad))
                {
                    float machineCurrentChange;
                    if (feederLoad > 36)
                    {
                        float improvementFactor = feederLoad - 36;

                        machineCurrentChange = (((SynchronousMachine)element).Capacity >= improvementFactor)
                                                    ? improvementFactor
                                                    : ((SynchronousMachine)element).Capacity;
                    }
                    else
                    {
                        machineCurrentChange = 0;
                    }

                    foreach (var meas in element.Measurements)
                    {
                        if (meas.Value.Equals(AnalogMeasurementType.POWER.ToString()))
                        {
                            Logger.LogDebug($"{baseLogString} UpdateLoadFlow => Calling GetAnalogMeasurement method from measurement provider. Measurement GID {meas.Key:X16}.");
                            var measurementProviderClient = MeasurementProviderClient.CreateClient();
                            powerMeasurement = await measurementProviderClient.GetAnalogMeasurement(meas.Key);

                            Logger.LogDebug($"{baseLogString} UpdateLoadFlow => GetAnalogMeasurement method called successfully.");

                            if (powerMeasurement == null)
                            {
                                Logger.LogError($"{baseLogString} UpdateLoadFlow => Synchronous machine with GID {element.Id:X16} does not have POWER measurement.");
                            }
                        }

                        if (meas.Value.Equals(AnalogMeasurementType.VOLTAGE.ToString()))
                        {
                            Logger.LogDebug($"{baseLogString} UpdateLoadFlow => Calling GetAnalogMeasurement method from measurement provider. Measurement GID {meas.Key:X16}.");
                            var measurementProviderClient = MeasurementProviderClient.CreateClient();
                            voltageMeasurement = await measurementProviderClient.GetAnalogMeasurement(meas.Key);

                            Logger.LogDebug($"{baseLogString} UpdateLoadFlow => GetAnalogMeasurement method called successfully.");

                            if (voltageMeasurement == null)
                            {
                                Logger.LogError($"{baseLogString} UpdateLoadFlow => Synchronous machine with GID {element.Id:X16} does not have VOLTAGE measurement.");
                            }
                        }
                    }

                    if (powerMeasurement != null && voltageMeasurement != null)
                    {
                        float newNeededPower = machineCurrentChange * voltageMeasurement.GetCurrentValue();
                        float newSMPower     = (((SynchronousMachine)element).Capacity >= newNeededPower)
                                                    ? newNeededPower
                                                    : ((SynchronousMachine)element).Capacity;

                        Logger.LogDebug($"{baseLogString} UpdateLoadFlow => Calling SendAnalogCommand method from measurement provider. Measurement GID {powerMeasurement.Id:X16}, Value {newSMPower}.");
                        var measurementProviderClient = MeasurementProviderClient.CreateClient();
                        await measurementProviderClient.SendSingleAnalogCommand(powerMeasurement.Id, newSMPower, CommandOriginType.CE_COMMAND);

                        Logger.LogDebug($"{baseLogString} UpdateLoadFlow => SendAnalogCommand method called successfully.");

                        Dictionary <long, AnalogModbusData> data = new Dictionary <long, AnalogModbusData>(1)
                        {
                            { powerMeasurement.Id, new AnalogModbusData(newSMPower, AlarmType.NO_ALARM, powerMeasurement.Id, CommandOriginType.CE_COMMAND) }
                        };

                        Logger.LogDebug($"{baseLogString} UpdateLoadFlow => Calling UpdateAnalogMeasurement method from measurement provider.");
                        measurementProviderClient = MeasurementProviderClient.CreateClient();
                        await measurementProviderClient.UpdateAnalogMeasurement(data);

                        Logger.LogDebug($"{baseLogString} UpdateLoadFlow => UpdateAnalogMeasurement method called successfully.");

                        loadOfFeeders[element.Feeder.Id] -= newSMPower / voltageMeasurement.GetCurrentValue();
                    }
                    else
                    {
                        Logger.LogError($"{baseLogString} UpdateLoadFlow => Synchronous machine with GID {element.Id:X16} does not have measurements for calculating CURRENT.");
                    }
                }
            }
            else
            {
                Logger.LogError($"{baseLogString} UpdateLoadFlow => Synchronous machine with GID {element.Id:X16} does not belond to any feeder.");
            }
        }
Exemplo n.º 7
0
        private void SyncMachine(ITopologyElement element, Dictionary <long, float> loadOfFeeders)
        {
            AnalogMeasurement powerMeasurement   = null;
            AnalogMeasurement voltageMeasurement = null;

            if (element.Feeder != null)
            {
                if (loadOfFeeders.TryGetValue(element.Feeder.Id, out float feederLoad))
                {
                    float machineCurrentChange;
                    if (feederLoad > 36)
                    {
                        float improvementFactor = feederLoad - 36;

                        machineCurrentChange = (((SynchronousMachine)element).Capacity >= improvementFactor)
                                                    ? improvementFactor
                                                    : ((SynchronousMachine)element).Capacity;
                    }
                    else
                    {
                        machineCurrentChange = 0;
                    }

                    foreach (var meas in element.Measurements)
                    {
                        if (meas.Value.Equals(AnalogMeasurementType.POWER.ToString()))
                        {
                            if (!Provider.Instance.MeasurementProvider.TryGetAnalogMeasurement(meas.Key, out powerMeasurement))
                            {
                                logger.LogError($"[Load flow] Synchronous machine with GID 0x{element.Id:X16} does not have POWER measurement.");
                            }
                        }

                        if (meas.Value.Equals(AnalogMeasurementType.VOLTAGE.ToString()))
                        {
                            if (!Provider.Instance.MeasurementProvider.TryGetAnalogMeasurement(meas.Key, out voltageMeasurement))
                            {
                                logger.LogError($"[Load flow] Synchronous machine with GID 0x{element.Id:X16} does not have VOLTAGE measurement.");
                            }
                        }
                    }

                    if (powerMeasurement != null && voltageMeasurement != null)
                    {
                        float newNeededPower = machineCurrentChange * voltageMeasurement.GetCurrentValue();
                        float newSMPower     = (((SynchronousMachine)element).Capacity >= newNeededPower)
                                                    ? newNeededPower
                                                    : ((SynchronousMachine)element).Capacity;

                        scadaCommanding.SendAnalogCommand(powerMeasurement.Id, newSMPower, CommandOriginType.CE_COMMAND);

                        Dictionary <long, AnalogModbusData> data = new Dictionary <long, AnalogModbusData>(1)
                        {
                            { powerMeasurement.Id, new AnalogModbusData(newSMPower, AlarmType.NO_ALARM, powerMeasurement.Id, CommandOriginType.CE_COMMAND) }
                        };

                        Provider.Instance.MeasurementProvider.UpdateAnalogMeasurement(data);

                        loadOfFeeders[element.Feeder.Id] -= newSMPower / voltageMeasurement.GetCurrentValue();
                    }
                    else
                    {
                        logger.LogError($"[Load flow] Synchronous machine with GID 0x{element.Id:X16} does not have CURRENT measurement.");
                    }
                }
            }
            else
            {
                logger.LogWarn($"[Load flow] Synchronous machine with GID 0x{element.Id:X16} does not belond to any feeder.");
            }
        }
        private static void ExecuteOpenPropertiesCommand(object parameter)
        {
            ResourceDescription rd = cnClient.GetStaticDataForElement((long)parameter);

            PropertiesControl propertiesControl = new PropertiesControl();

            List <DigitalMeasurement> digitalMeasurements = new List <DigitalMeasurement>();
            List <AnalogMeasurement>  analogMeasurements  = new List <AnalogMeasurement>();

            PropertiesModelView propertiesModelView = new PropertiesModelView();

            if (rd != null)
            {
                StaticProperties staticProperties = new StaticProperties();
                staticProperties.ReadFromResourceDescription(rd);

                GeneralStaticPropertiesControl generalStaticPropertiesControl = new GeneralStaticPropertiesControl()
                {
                    DataContext = staticProperties
                };

                propertiesControl.StaticProperties.Content = generalStaticPropertiesControl;

                if (rd.ContainsProperty(ModelCode.PSR_MEASUREMENTS))
                {
                    List <long> measurementGids = rd.GetProperty(ModelCode.PSR_MEASUREMENTS).AsLongs();

                    foreach (long meas in measurementGids)
                    {
                        rd = cnClient.GetStaticDataForElement(meas);

                        short type = ModelCodeHelper.ExtractTypeFromGlobalId(meas);

                        PropertiesModelView.Measurements.Clear();

                        if (type == (short)DMSType.DISCRETE)
                        {
                            DigitalMeasurement digitalMeasurement = new DigitalMeasurement();
                            digitalMeasurement.ReadFromResourceDescription(rd);

                            csClient.GetDiscreteMeasurement(rd.GetProperty(ModelCode.IDOBJ_MRID).AsString(), out OMSSCADACommon.States state);

                            digitalMeasurement.State = state;

                            digitalMeasurements.Add(digitalMeasurement);

                            PropertiesModelView.Measurements.Add(digitalMeasurement.MRID, digitalMeasurement);
                        }
                        else if (type == (short)DMSType.ANALOG)
                        {
                            AnalogMeasurement analogMeasurement = new AnalogMeasurement();
                            analogMeasurement.ReadFromResourceDescription(rd);

                            csClient.GetAnalogMeasurement(rd.GetProperty(ModelCode.IDOBJ_MRID).AsString(), out float value);

                            analogMeasurement.Value = value;

                            analogMeasurements.Add(analogMeasurement);

                            PropertiesModelView.Measurements.Add(analogMeasurement.MRID, analogMeasurement);
                        }
                    }
                }
            }

            if (digitalMeasurements.Count == 0 && analogMeasurements.Count == 0)
            {
                propertiesModelView.MeasurementVisibility = Visibility.Collapsed;
            }
            else
            {
                propertiesModelView.MeasurementVisibility = Visibility.Visible;

                propertiesControl.Measurements.Content = new MeasurementsControl()
                {
                    DataContext = propertiesModelView
                };

                if (digitalMeasurements.Count > 0)
                {
                    foreach (DigitalMeasurement measurement in digitalMeasurements)
                    {
                        DiscreteMeasurementControl discreteMeasurementControl = new DiscreteMeasurementControl()
                        {
                            DataContext = measurement
                        };

                        propertiesModelView.DigitalControls.Add(discreteMeasurementControl);
                    }

                    propertiesModelView.DigitalMeasurementVisibility = Visibility.Visible;
                }
                else
                {
                    propertiesModelView.DigitalMeasurementVisibility = Visibility.Collapsed;
                }

                if (analogMeasurements.Count > 0)
                {
                    foreach (AnalogMeasurement measurement in analogMeasurements)
                    {
                        AnalogMeasurementControl analogMeasurementControl = new AnalogMeasurementControl()
                        {
                            DataContext = measurement
                        };

                        propertiesModelView.AnalogControls.Add(analogMeasurementControl);
                    }


                    propertiesModelView.AnalogMeasurementVisibility = Visibility.Visible;
                }
                else
                {
                    propertiesModelView.AnalogMeasurementVisibility = Visibility.Collapsed;
                }
            }

            ShellFillerShell sfs = new ShellFillerShell() /*DataContext = this*/ }
Exemplo n.º 9
0
 public Task AddAnalogMeasurement(AnalogMeasurement analogMeasurement)
 {
     return(InvokeWithRetryAsync(client => client.Channel.AddAnalogMeasurement(analogMeasurement)));
 }