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 async Task <DiscreteMeasurement> GetPopulatedDiscreteMeasurement(ResourceDescription rs)
        {
            string verboseMessage = $"{baseLogString} entering GetPopulatedDiscreteMeasurement method.";

            Logger.LogVerbose(verboseMessage);

            DiscreteMeasurement measurement = new DiscreteMeasurement();

            try
            {
                measurement.Id              = rs.Id;
                measurement.Address         = rs.GetProperty(ModelCode.MEASUREMENT_ADDRESS).AsString();
                measurement.IsInput         = rs.GetProperty(ModelCode.MEASUREMENT_ISINPUT).AsBool();
                measurement.CurrentOpen     = rs.GetProperty(ModelCode.DISCRETE_CURRENTOPEN).AsBool();
                measurement.MaxValue        = rs.GetProperty(ModelCode.DISCRETE_MAXVALUE).AsInt();
                measurement.MinValue        = rs.GetProperty(ModelCode.DISCRETE_MINVALUE).AsInt();
                measurement.NormalValue     = rs.GetProperty(ModelCode.DISCRETE_NORMALVALUE).AsInt();
                measurement.MeasurementType = (DiscreteMeasurementType)rs.GetProperty(ModelCode.DISCRETE_MEASUREMENTTYPE).AsEnum();

                var connection = await GetAllReferencedElements(rs);

                if (connection.Count < 0)
                {
                    Logger.LogError($"{baseLogString} GetPopulatedDiscreteMeasurement => Discrete measurement with GID {rs.Id:X16} is not connected to any element.");
                }
                else if (connection.Count > 1)
                {
                    Logger.LogWarning($"{baseLogString} GetPopulatedDiscreteMeasurement => Discrete 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($"[NMSManager] Failed to populate discrete measurement with GID: {rs.Id:X16}." +
                                $"{Environment.NewLine} Exception message: {e.Message}" +
                                $"{Environment.NewLine} Stack trace: {e.StackTrace}");
            }
            return(measurement);
        }