private async Task PublishScadaData(Topic topic, ScadaMessage scadaMessage) { string verboseMessage = $"{baseLogString} entering PublishScadaData method."; Logger.LogVerbose(verboseMessage); try { ScadaPublication scadaPublication = new ScadaPublication(topic, scadaMessage); IPublisherContract publisherClient = PublisherClient.CreateClient(); await publisherClient.Publish(scadaPublication, MicroserviceNames.ScadaModelProviderService); Logger.LogInformation($"{baseLogString} PublishScadaData => SCADA service published data of topic: {scadaPublication.Topic}, publisher name: {MicroserviceNames.ScadaModelProviderService}"); } catch (Exception e) { string errorMessage = $"{baseLogString} PublishScadaData => exception {e.Message}"; Logger.LogError(errorMessage, e); throw e; } StringBuilder sb = new StringBuilder(); sb.AppendLine($"{baseLogString} PublishScadaData => MeasurementCache content: "); var enumerableMeasurementCache = await MeasurementsCache.GetEnumerableDictionaryAsync(); foreach (long gid in enumerableMeasurementCache.Keys) { ModbusData data = enumerableMeasurementCache[gid]; if (data is AnalogModbusData analogModbusData) { sb.AppendLine($"Analog data line: [gid] 0x{gid:X16}, [value] {analogModbusData.Value}, [alarm] {analogModbusData.Alarm}"); } else if (data is DiscreteModbusData discreteModbusData) { sb.AppendLine($"Discrete data line: [gid] 0x{gid:X16}, [value] {discreteModbusData.Value}, [alarm] {discreteModbusData.Alarm}"); } else { sb.AppendLine($"UNKNOWN data type: {data.GetType()}"); } } Logger.LogDebug(sb.ToString()); }
public async Task <ScadaPublication> GetIntegrityUpdateForSpecificTopic(Topic topic) { while (!ReliableDictionariesInitialized) { await Task.Delay(1000); } if (GidToPointItemMap == null) { string message = $"GetIntegrityUpdate => GidToPointItemMap is null."; Logger.LogError(message); throw new InternalSCADAServiceException(message); } if (CommandDescriptionCache == null) { string message = $"GetIntegrityUpdate => CommandDescriptionCache is null."; Logger.LogError(message); throw new InternalSCADAServiceException(message); } Dictionary <long, AnalogModbusData> analogModbusData = new Dictionary <long, AnalogModbusData>(); Dictionary <long, DiscreteModbusData> discreteModbusData = new Dictionary <long, DiscreteModbusData>(); var enumerableGidToPointItemMap = await GidToPointItemMap.GetEnumerableDictionaryAsync(); foreach (long gid in enumerableGidToPointItemMap.Keys) { CommandOriginType commandOrigin = CommandOriginType.UNKNOWN_ORIGIN; if (topic == Topic.MEASUREMENT && enumerableGidToPointItemMap[gid] is IAnalogPointItem analogPointItem) { var result = await CommandDescriptionCache.TryGetValueAsync(gid); if (result.HasValue && result.Value.Value == analogPointItem.CurrentRawValue) { commandOrigin = result.Value.CommandOrigin; } AnalogModbusData analogValue = new AnalogModbusData(analogPointItem.CurrentEguValue, analogPointItem.Alarm, gid, commandOrigin); analogModbusData.Add(gid, analogValue); } else if (topic == Topic.SWITCH_STATUS && enumerableGidToPointItemMap[gid] is IDiscretePointItem discretePointItem) { var result = await CommandDescriptionCache.TryGetValueAsync(gid); if (result.HasValue && result.Value.Value == discretePointItem.CurrentValue) { commandOrigin = result.Value.CommandOrigin; } DiscreteModbusData discreteValue = new DiscreteModbusData(discretePointItem.CurrentValue, discretePointItem.Alarm, gid, commandOrigin); discreteModbusData.Add(gid, discreteValue); } } ScadaPublication scadaPublication; if (topic == Topic.MEASUREMENT) { MultipleAnalogValueSCADAMessage analogValuesMessage = new MultipleAnalogValueSCADAMessage(analogModbusData); scadaPublication = new ScadaPublication(Topic.MEASUREMENT, analogValuesMessage); } else if (topic == Topic.SWITCH_STATUS) { MultipleDiscreteValueSCADAMessage discreteValuesMessage = new MultipleDiscreteValueSCADAMessage(discreteModbusData); scadaPublication = new ScadaPublication(Topic.SWITCH_STATUS, discreteValuesMessage); } else { string message = $"GetIntegrityUpdate => argument topic is neither Topic.MEASUREMENT nor Topic.SWITCH_STATUS."; Logger.LogError(message); throw new ArgumentException(message); } return(scadaPublication); }