NVS
Einleitung
Der NVS-Funktionsblock (Non-Volatile Storage) ermöglicht das persistente Speichern und Laden von Daten auf einem ESP32-Mikrocontroller. Er nutzt den nichtflüchtigen Speicher (NVS) des ESP32, um Werte unter einem definierten Schlüssel (Key) abzulegen und bei Bedarf wieder abzurufen. Dieser Baustein ist besonders für Anwendungen geeignet, bei denen Konfigurationsdaten, Kalibrierwerte oder Zustandsinformationen über einen Neustart des Geräts hinweg erhalten bleiben müssen.
Schnittstellenstruktur
Ereignis-Eingänge
INIT: Initialisiert den Funktionsblock. Löst den Lesevorgang des mit
KEYangegebenen Wertes aus. Wenn kein Wert gespeichert ist, wird derDEFAULT_VALUEzurückgegeben.SET: Speichert den an
VALUEübergebenen Wert unter dem zuvor konfigurierten Schlüssel (KEY) im NVS.GET: Liest den Wert, der unter dem konfigurierten Schlüssel (
KEY) im NVS gespeichert ist.
Ereignis-Ausgänge
INITO: Bestätigt die Ausführung der Initialisierung (INIT) und liefert das Ergebnis.
SETO: Bestätigt die Ausführung des Schreibvorgangs (SET) und liefert den Status.
GETO: Bestätigt die Ausführung des Lesevorgangs (GET) und liefert den gelesenen Wert.
Daten-Eingänge
QI (BOOL): Qualifiziert den INIT-Ereigniseingang. Bei
TRUEwird der Dienst aktiviert, beiFALSEdeaktiviert.KEY (STRING): Der eindeutige Schlüsselname, unter dem der Wert im NVS gespeichert oder von dem er gelesen wird. Dieser Wert muss während der INIT-Phase gesetzt sein.
VALUE (ANY_ELEMENTARY): Der zu speichernde Datensatz. Kann einen beliebigen elementaren Datentyp (z.B. BOOL, INT, REAL, STRING) annehmen.
DEFAULT_VALUE (ANY_ELEMENTARY): Der Standardwert, der bei einem Lesevorgang (INIT oder GET) zurückgegeben wird, wenn unter dem angegebenen Schlüssel noch kein Wert im NVS gespeichert ist.
Daten-Ausgänge
QO (BOOL): Gibt den aktuellen Betriebszustand des Funktionsblocks wider (
TRUE= bereit/erfolgreich,FALSE= nicht bereit/Fehler).STATUS (STRING): Enthält eine Statusmeldung, die den Erfolg oder die Art eines Fehlers bei der letzten Operation beschreibt (z.B. „OK“, „Key not found“, „Storage full“).
VALUEO (ANY_ELEMENTARY): Der tatsächlich gelesene Wert aus dem NVS oder, falls kein Wert vorhanden war, der
DEFAULT_VALUE.
Adapter
Dieser Funktionsblock verwendet keine Adapter.
Funktionsweise
Der NVS-Block arbeitet zustandsbasiert. Bei der Initialisierung (INIT mit QI=TRUE) wird der angegebene KEY festgelegt. Anschließend wird automatisch versucht, den zugehörigen Wert aus dem NVS zu lesen. Das Ergebnis (gespeicherter Wert oder DEFAULT_VALUE) wird zusammen mit dem Status über INITO ausgegeben.
Danach kann der Block zwei Hauptoperationen ausführen:
Schreiben (SET): Der an
VALUEanliegende Wert wird unter dem festgelegten Schlüssel (KEY) im NVS gespeichert. Die Bestätigung erfolgt überSETO.Lesen (GET): Der aktuell unter dem Schlüssel gespeicherte Wert wird aus dem NVS gelesen und über
VALUEOam AusgangGETObereitgestellt.
Die Datentypen der Ein- und Ausgänge VALUE, DEFAULT_VALUE und VALUEO müssen konsistent sein. Der Block ist für den wiederholten Zugriff auf denselben Schlüssel ausgelegt.
Technische Besonderheiten
ESP32-spezifisch: Dieser Block nutzt direkt die NVS-API des ESP32-IDF und ist daher nur auf ESP32-basierten Zieltplattformen lauffähig.
Typflexibilität: Die Verwendung des generischen Datentyps
ANY_ELEMENTARYerlaubt es, verschiedene elementare Datentypen zu speichern. Der konkrete Typ wird bei der ersten Verwendung (INIT) festgelegt und muss bei allen folgenden Operationen beibehalten werden.Persistenz: Daten im NVS überleben einen Neustart des Mikrocontrollers und bleiben auch nach einem Stromausfall erhalten (je nach Konfiguration des NVS-Speichers).
Zustandsübersicht
Nicht initialisiert: Der Block ist nach dem Start inaktiv. Der Schlüssel (
KEY) ist nicht gesetzt.Initialisiert/Bereit: Nach erfolgreichem
INIT-Ereignis ist der Block betriebsbereit. Der Schlüssel ist konfiguriert und ein initialer Wert (aus NVS oder Standard) wurde geladen. Der Block wartet aufSET- oderGET-Ereignisse.Schreibvorgang: Während der Verarbeitung eines
SET-Ereignisses.Lesevorgang: Während der Verarbeitung eines
GET-Ereignisses oder des impliziten Lesevorgangs währendINIT.
Anwendungsszenarien
Gerätekonfiguration: Speichern von Netzwerk-Credentials (SSID, Passwort), IP-Adressen oder anderen Parametern, die nach einem Reset erhalten bleiben sollen.
Betriebsdatenerfassung: Persistente Zählung von Betriebsstunden, Zykluszahlen oder produzierten Einheiten.
Kalibrierdaten: Ablegen von sensor- oder actuatorspezifischen Kalibrierwerten.
Letzter bekannter Zustand: Speichern des Systemzustands vor einem unerwarteten Abschalten, um diesen beim nächsten Start wiederherzustellen.
⚖️ Vergleich mit ähnlichen Bausteinen
E_R_TRIG / F_TRIG: Diese sind reine Ereignis-Trigger und bieten keine persistente Datenspeicherung.
BLINK / DELAY: Zeitbasierte Blöcke ohne Speicherfunktionalität.
E_EEPROM: Ein generischer EEPROM-Baustein. Der NVS-Block ist spezifisch für die ESP32-Plattform und nutzt dessen optimiertes, wear-leveling-fähiges Dateisystem (NVS), während ein generischer E_EEPROM-Block hardwareabhängig und oft auf einfacherem Speicher operieren würde.
🛠️ Zugehörige Übungen
Fazit
Der NVS-Funktionsblock stellt eine einfache und robuste Schnittstelle zum nichtflüchtigen Speicher des ESP32 bereit. Durch die klare Trennung von Lese- und Schreiboperationen sowie die typflexible Datenverarbeitung eignet er sich ideal für eine Vielzahl von Anwendungen, die persistente Daten auf eingebetteten ESP32-Systemen benötigen. Seine Integration in die 4diac-IDE ermöglicht eine plattformspezifische Funktionalität innerhalb des portablen IEC 61499-Modells.