/// <summary> /// Helper method to read the property from the KWLEC200. /// </summary> /// <param name="data">The KWLEC200 data.</param> /// <param name="modbus">The Modbus device.</param> /// <param name="slave">The slave ID of the Modbus device.</param> /// <param name="property">The property name.</param> /// <returns>The status indicating success or failure.</returns> public DataStatus ReadProperty(KWLEC200Data data, IModbusMaster modbus, byte slave, string property) { DataStatus status = Good; try { object value = data.GetPropertyValue(property); string name = KWLEC200Data.GetName(property); ushort size = KWLEC200Data.GetSize(property); ushort count = KWLEC200Data.GetCount(property); _logger?.LogDebug($"ReadProperty property '{property}' => Type: {value.GetType()}, Name: {name}, Size: {size}, Count: {count}."); if (value is bool) { var result = ReadBoolData(modbus, slave, name, size, count); if (result.Status.IsGood) { data.SetPropertyValue(property, result.Data); _logger?.LogDebug($"ReadProperty boolean property '{property}' => Value: {result.Data}."); } status = result.Status; } else if (value is int) { var result = ReadIntegerData(modbus, slave, name, size, count); if (result.Status.IsGood) { data.SetPropertyValue(property, result.Data); _logger?.LogDebug($"ReadProperty integer property '{property}' => Value: {result.Data}."); } status = result.Status; } else if (value is double) { var result = ReadDoubleData(modbus, slave, name, size, count); if (result.Status.IsGood) { data.SetPropertyValue(property, result.Data); _logger?.LogDebug($"ReadProperty double property '{property}' => Value: {result.Data}."); } status = result.Status; } else if (value is DateTime) { var result = ReadDateData(modbus, slave, name, size, count); if (result.Status.IsGood) { data.SetPropertyValue(property, result.Data); _logger?.LogDebug($"ReadProperty datetime property '{property}' => Value: {result.Data.Date}."); } status = result.Status; } else if (value is TimeSpan) { var result = ReadTimeData(modbus, slave, name, size, count); if (result.Status.IsGood) { data.SetPropertyValue(property, result.Data); _logger?.LogDebug($"ReadProperty timespan property '{property}' => Value: {result.Data}."); } status = result.Status; } else if (((dynamic)value).GetType().IsEnum) { var result = ReadIntegerData(modbus, slave, name, size, count); if (result.Status.IsGood) { data.SetPropertyValue(property, result.Data); _logger?.LogDebug($"ReadProperty enum property '{property}' => Value: '{result.Data}'."); } status = result.Status; } else if (value is string) { var result = ReadStringData(modbus, slave, name, size, count); if (result.Status.IsGood) { data.SetPropertyValue(property, result.Data); _logger?.LogDebug($"ReadProperty string property '{property}' => Value: {result.Data}"); } status = result.Status; } } catch (ArgumentNullException anx) { _logger?.LogError(anx, $"ArgumentNullException in ReadProperty property '{property}'."); status = BadOutOfRange; } catch (ArgumentOutOfRangeException aor) { _logger?.LogError(aor, $"ArgumentOutOfRangeException in ReadProperty property '{property}'."); status = BadOutOfRange; } catch (ArgumentException aex) { _logger?.LogError(aex, $"ArgumentException in ReadAsync property '{property}'."); status = BadOutOfRange; } catch (ObjectDisposedException odx) { _logger?.LogError(odx, $"ObjectDisposedException in ReadProperty property '{property}'."); status = BadInternalError; } catch (FormatException fex) { _logger?.LogError(fex, $"FormatException in ReadProperty property '{property}'."); status = BadEncodingError; } catch (IOException iox) { _logger?.LogError(iox, $"IOException in ReadAsync property '{property}'."); status = BadCommunicationError; } catch (InvalidModbusRequestException imr) { _logger?.LogError(imr, $"InvalidModbusRequestException in ReadProperty property '{property}'."); status = BadCommunicationError; } catch (InvalidOperationException iox) { _logger?.LogError(iox, $"InvalidOperationException in ReadProperty property '{property}'."); status = BadInternalError; } catch (SlaveException slx) { _logger?.LogError(slx, $"SlaveException in ReadProperty property '{property}'."); status = BadDeviceFailure; } catch (Exception ex) { _logger?.LogError(ex, $"Exception in ReadProperty property '{property}'."); status = BadInternalError; } return(status); }