private static void GetAnalogUpdate(string mrid, float value) { measurements.TryGetValue(mrid, out Measurement measurement); AnalogMeasurement analogMeasurement = measurement as AnalogMeasurement; analogMeasurement.Value = value; }
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); } }
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."); } }
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*/ }
public Task AddAnalogMeasurement(AnalogMeasurement analogMeasurement) { return(InvokeWithRetryAsync(client => client.Channel.AddAnalogMeasurement(analogMeasurement))); }