/* Insgesamt ermöglicht die ModBusConfig-Klasse das Speichern und Abrufen von Modbus-Konfigurationsdaten (ID und Baudrate) in einem EEPROM. Dies ist besonders nützlich für Anwendungen, bei denen Konfigurationsdaten zwischen den Stromzyklen erhalten bleiben sollen. Die Klasse abstrahiert die EEPROM-Operationen und bietet eine benutzerfreundliche Schnittstelle zur Verwaltung von Modbus-Konfigurationen. */ #ifndef ModbusSlaveConfigToEEPROM_H #define ModbusSlaveConfigToEEPROM_H #include #include class ModBusConfig { public: ModBusConfig(); // Konstruktor ohne Parameter void SetModbusID(int ID); void SetBaudRate(int BAUDRATE); int GetModbusID(); int GetBaudRate(); private: /* In diesem Beispiel wird Adresse 0 für die Modbus-ID und Adresse 1 für die Baudrate verwendet. Diese Adressen sind willkürlich gewählt und sollten nicht mit anderen Daten im EEPROM überlappen. */ static const int MODBUS_ID_ADDRESS = 0; // Speicheradresse für Modbus-ID static const int BAUD_RATE_ADDRESS = 1; // Speicheradresse für Baudrate static const int MAX_BAUD_RATE = 115200; // Maximal unterstützte Baudrate }; /* Konstruktor: Der Konstruktor initialisiert die Modbus-ID und die Baudrate auf Standardwerte (1 und 9600), falls die EEPROM-Werte nicht gesetzt sind (d.h. wenn sie 0xFF sind). */ ModBusConfig::ModBusConfig() { // Optional: Initialisieren Sie die EEPROM-Werte, falls erforderlich if (EEPROM.read(MODBUS_ID_ADDRESS) == 0xFF) { SetModbusID(1); // Setze Standard ID } if (EEPROM.read(BAUD_RATE_ADDRESS) == 0xFF) { SetBaudRate(9600); // Setze Standard Baudrate } } void ModBusConfig::SetModbusID(int ID) { if (ID >= 0 && ID <= 255) { // Überprüfung, dass ID im gültigen Bereich liegt EEPROM.write(MODBUS_ID_ADDRESS, ID); } else { Serial.println("Ungültige Modbus-ID. ID muss zwischen 0 und 255 liegen."); } } void ModBusConfig::SetBaudRate(int BAUDRATE) { int dividedBaudrate = BAUDRATE / 100; // Überprüfung, dass Baudrate im gültigen Bereich liegt if (BAUDRATE > 0 && BAUDRATE <= MAX_BAUD_RATE) { if (dividedBaudrate != EEPROM.read(BAUD_RATE_ADDRESS)) { EEPROM.write(BAUD_RATE_ADDRESS, dividedBaudrate); } } else { Serial.println("Ungültige Baudrate. Baudrate muss zwischen 0 und 115200 liegen."); } } int ModBusConfig::GetModbusID() { return EEPROM.read(MODBUS_ID_ADDRESS); } int ModBusConfig::GetBaudRate() { int Baudrate = EEPROM.read(BAUD_RATE_ADDRESS) * 100; return Baudrate; } #endif