5.0 KiB
5.0 KiB
Firmware-Handbuch (Slave Node)
Status: Work in Progress (WIP)
Dieses Dokument beschreibt den aktuellen Funktionsumfang der Firmware für den slave_node des Bewässerungssystems.
Inhaltsverzeichnis
1. Übersicht
Die Firmware macht aus einem Standard-Mikrocontroller (wie dem Bluepill STM32F103) einen intelligenten Modbus-Slave, der zur Steuerung eines motorisierten Ventils und zur Überwachung einfacher digitaler Sensoren dient.
2. Implementierte Features
2.1. Modbus RTU Server
- Schnittstelle: Läuft auf der Standard-UART-Schnittstelle des Boards.
- Konfiguration: Baudrate und Slave-ID können über die Shell zur Laufzeit geändert und persistent gespeichert werden.
- Register-Map: Implementiert die in
docs/modbus-registers.de.mddefinierte Register-Map.
2.2. Ventilsteuerung (Simuliert)
- Zustandsmaschine: Eine virtuelle Ventilsteuerung simuliert die Zustände "Geöffnet", "Geschlossen" und die Bewegungen "Öffnet" und "Schließt".
- Zeitbasierte Bewegung: Die Dauer für einen vollständigen Öffnungs- oder Schließvorgang kann über Modbus-Register (
MAX_OEFFNUNGSZEIT_S,MAX_SCHLIESSZEIT_S) konfiguriert werden. - Befehle: Das Ventil kann über das
VENTIL_BEFEHL-Register gestartet, gestoppt und in die jeweilige Richtung bewegt werden.
2.3. Digitale Ein- und Ausgänge
- Ausgänge: Der Zustand von zwei digitalen Ausgängen kann über das
DIGITAL_AUSGAENGE_ZUSTAND-Register gelesen und geschrieben werden. In der aktuellen Implementierung ist dies rein virtuell und wird nur geloggt. - Eingänge: Der Zustand von zwei digitalen Eingängen wird im
DIGITAL_EINGAENGE_ZUSTAND-Register abgebildet. Diese sind für den Anschluss von Tastern oder Sensoren vorgesehen. - Taster-Events: Das
TASTER_EVENTS-Register speichert Bit-Flags für "gedrückt"-Events und wird beim Lesen automatisch zurückgesetzt (Clear-on-Read).
2.4. Systemfunktionen
- Uptime: Die Firmware zählt die Sekunden seit dem letzten Start und stellt sie über zwei 16-Bit-Register zur Verfügung.
- Firmware-Version: Die Version (
vX.Y.Z) ist fest einkompiliert und kann über die entsprechenden Register ausgelesen werden. - Gerätestatus: Ein einfaches Statusregister (
DEVICE_STATUS) zeigt den allgemeinen Zustand des Geräts an (0= OK).
2.5. Fail-Safe Watchdog
- Funktionsweise: Ein Timer wird bei jeder erfolgreichen Modbus-Kommunikation zurückgesetzt.
- Timeout: Läuft der Timer ab (Timeout konfigurierbar über
WATCHDOG_TIMEOUT_S), wird als Sicherheitsmaßnahme automatisch der Befehl zum Schließen des Ventils ausgelöst. - Aktivierung: Das Schreiben eines Wertes
> 0in das Register aktiviert den Watchdog. Das Schreiben einer0deaktiviert ihn.
2.6. Simulierter Firmware-Update-Prozess
- Protokoll: Der in der Modbus-Dokumentation beschriebene, zustandslose Update-Prozess ist vollständig implementiert.
- Datenempfang: Das Gerät kann Firmware-Chunks (max. 256 Bytes) im
FWU_DATA_BUFFERempfangen. - CRC-Verifizierung: Nach dem Empfang eines Chunks berechnet der Slave dessen CRC16 und stellt das Ergebnis im
FWU_LAST_CHUNK_CRC-Register bereit, damit der Client die Übertragung überprüfen kann. - Flash-Schreiben (Simuliert): Der Befehl zum Schreiben eines verifizierten Chunks ins Flash wird aktuell nur geloggt. Es finden keine echten Schreiboperationen statt.
- Finalisierung (Simuliert): Der Befehl zum Abschluss des Updates und Neustart wird ebenfalls nur geloggt.
2.7. Persistente Einstellungen
- Technologie: Das Zephyr Settings Subsystem wird mit NVS (Non-Volatile Storage) auf einer dedizierten Flash-Partition verwendet.
- Gespeicherte Werte:
- Modbus Baudrate
- Modbus Slave ID
- Maximale Öffnungszeit des Ventils
- Maximale Schließzeit des Ventils
3. Kommandozeilen-Interface (Shell)
Die Firmware bietet eine Shell über die RTT-Schnittstelle für Debugging und Konfiguration.
modbus get: Zeigt die aktuelle Modbus-Konfiguration (Baudrate, Slave ID).modbus set baudrate <wert>: Setzt die Baudrate.modbus set slave_id <wert>: Setzt die Slave ID.valve show_config: Zeigt die aktuelle Ventil-Konfiguration.valve set_open_time <sekunden>: Setzt die maximale Öffnungszeit.valve set_close_time <sekunden>: Setzt die maximale Schließzeit.reset: Führt einen Neustart des Geräts durch.