75 lines
2.7 KiB
C++
75 lines
2.7 KiB
C++
/*
|
|
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 <Arduino.h>
|
|
#include <EEPROM.h>
|
|
|
|
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
|
|
static const int MAX_MODBUS_ID_ADDRESS = 254; // 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(22); // Setze Standard ID
|
|
}
|
|
if (EEPROM.read(BAUD_RATE_ADDRESS) == 0xFF) {
|
|
SetBaudRate(9600); // Setze Standard Baudrate
|
|
}
|
|
}
|
|
|
|
void ModBusConfig::SetModbusID(int ID) {
|
|
if (ID >= 0 && ID <= MAX_MODBUS_ID_ADDRESS) { // Ü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
|