Programmkonzept Hausautomatisierung

forellengarten

Level-1
Beiträge
217
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Erste Programmversion - Licht schalten

Ich würde gerne eine allgemeine Frage in den Raum schmeißen und bitte um eure Meinung, ob das der "richtige" Lösungsweg ist:

Ich schreibe ein MAIN-programm, welches z.B alle 100ms läuft (=Task) und sämtliche Schalter einließt. Gesetzte Taster werden als globale Variable abgelegt (oder z.b in einem Array). Auf diese Weise verhindere ich, daß das Programm lange in einer Schleife "hängt", nur weil ein Taster lange gedrückt wird.

Jetzt nehme ich einen 2ten Task, der wird z.B alle 300ms ausgeführt. Er überprüft die globalen variablen. ist eine Gesetzt, so schaltet das entsprechende Licht.

Im Falle eines Dimmers besteht aber noch immer das Problem, daß auch der 2te Task evtl. lange blockiert ist. Aber wenigstens werden alle Tasterinputs erkannt, da das MAIN-Programm immer gleichschnell durchläuft, egal was es letztendlich schaltet.

Hoffe die Frage / meine Idee der Struktur ist verständlich. Um euch nicht zu sehr mit meinem Problem aufzuhalten, reicht mir ein kurzes ja, so macht man das oder ein paar Stichwörter wie man es besser löst! DANKE!
 
Wenn das Programm in einer Schleife hängt weil ein Taster gedrückt ist, stimmt was mit dem Programm nicht. Für die "normalen" Funktionen wie Licht, Dimmer, Rolladen, usw reicht ein Task alle 50ms ohne Speicherung von irgendwelchen Tastendrücken. Für Kommunikation (Ethernet) kann wegen blockierenden Funktionen ein zusätzlicher, niedriger priorisierter Task erforderlich sein.
 
Ich würde für jede Aufgabe eine Task nehmen (Taskkonfiguration).

Bei einfachem Lichtschalten geht das direkt in der Task.

Dimmvorgänge würde ich nicht auf die altmodische Langtastendrückmethode sondern über Start-Stop-Dimmen machen.

Als High-end dann nur noch auf Szenen setzen.
 
Start-Stop-Dimmen: Super. Geniale Idee, danke!


@Oberchefe:
"Wenn das Programm in einer Schleife hängt weil ein Taster gedrückt ist, stimmt was mit dem Programm nicht"...
Damit meinte ich: das Programm wartet an der Stelle bis der Taster losgelassen wird (=Dimmer-Stop). Und in der Zeit wären dann keine anderen Schalter abgefragt worden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wie wäre es damit für jeden Schalter einen FB zu machen, der alle 100ms ausgeführt wird? Dann braucht es für jeden Schaltertyp nur einen FB mit einem Automaten, der dann auch nicht blockierend ist.
 
Damit meinte ich: das Programm wartet an der Stelle bis der Taster losgelassen wird

Das ist eine völlig falsche Vorgehensweise bei einer SPS. Eine SPS "arbeitet" das Programm von oben bis unten durch, es werden üblicherweise maximal Teile des Programms je nach Zustand von Eingängen oder Variablen nicht abgearbeitet um Zykluszeit zu sparen. Soll die Länge eines Tastendrucks abgefragt werden oder dergleichen, verwendet man einen Timer, das Programm bleibt aber deshalb nicht an einer Stelle stehen.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
hm, denke hier ist eine andere denkweise als beim mikroprozessor gefragt.

dann läuft es wohl so ab: das main-programm fragt sequenziell alle taster ab. stoßt es auf einen gedrückten taster, so startet es einen FB, der diesen taster weiter behandelt. das main-programm läuft nebenbei ungehindert weiter. der gestartete FB läuft dann wie ein eigenständiger "task" und hält mein main-programm bei seiner ausführung nicht weiter auf.

sorry daß ich mich so anstelle - es scheint hier ein kleines grundsatzproblem zu geben :confused:
 
Zurück
Oben