Ich weiß nicht, ob das Thema in diesem Unterforum schon mal behandelt wurde.
Das nun folgende Problem hat mich Stunden gekostet und lässt mich immer noch kopfschüttelnd zurück.
Bei der Programmierung eines Automaten für unser Garagentor, das sowohl über einen Auf/Ab/Stop-Taster als auch über die Fernbededienung und das EibPC-UI gesteuert werden kann, bin ich auf ein Problem gestoßen, das im folgende Code-Beispiel zum Ausdruck kommt:
(ja, der Code ist zu vereinfachen, er stellt lediglich den Kern des Problems dar)
In letzter wird unter bestimmten Umständen der aktuelle Wert gespeichert (hier vereinfacht, wenn aktuell != letzter). Dieser archivierte Wert beeinflusst unter bestimmten Umständen den aktuellen Wert (hier vereinfacht bei jedem cycle()).
Dieser Code sollte in allen Programmierwelten, die ich kenne, alle 3 Sekunden den Wert von aktuell toggeln. Das tut er aber nicht. Nach jedem cycle() ist aktuell immer noch bzw. wieder 0.
Tatsächlich geschieht das Kuriosum, dass aktuell im then-Zweig zunächst auf 1b01 gesetzt wird, letzter daraufhin auf Grund der if-Bedindung aktuell != letzter davor ebenso auf 1b01, was dann dazu führt, dass nun wegen letzter != 0b01 der else-Zweig durchlaufen wird, der aktuell wieder auf 0b01 setzt.
Das heißt, obwohl cycle() lt. Dokumentation "für einen Verarbeitungszyklus" den Rückgabewert 1b01 setzt, wird innerhalb dieses einen(!) Verarbeitungszyklusses
Das widerspricht meiner Anschauung von "ein Verarbeitungszyklus". Im Ergebnis widerspricht das dem entweder-oder des then...else. Wenn der Code des then-Zweiges ausgeführt wird, dann niemals der Code des else-Zweiges - und umgekehrt, zumindest nicht in einem Zyklus.
Meines Erachtens ist das Verhalten des EibPC an dieser Stelle möglicherweise erklärbar, aber falsch.
Das nun folgende Problem hat mich Stunden gekostet und lässt mich immer noch kopfschüttelnd zurück.
Bei der Programmierung eines Automaten für unser Garagentor, das sowohl über einen Auf/Ab/Stop-Taster als auch über die Fernbededienung und das EibPC-UI gesteuert werden kann, bin ich auf ein Problem gestoßen, das im folgende Code-Beispiel zum Ausdruck kommt:
Code:
letzter = 0b01
aktuell = 0b01
if aktuell != letzter then letzter = aktuell; endif;
if cycle(0u08, 3u08) then {
if letzter == 0b01 then {
aktuell = 1b01;
} else {
aktuell = 0b01;
} endif;
} endif;
In letzter wird unter bestimmten Umständen der aktuelle Wert gespeichert (hier vereinfacht, wenn aktuell != letzter). Dieser archivierte Wert beeinflusst unter bestimmten Umständen den aktuellen Wert (hier vereinfacht bei jedem cycle()).
Dieser Code sollte in allen Programmierwelten, die ich kenne, alle 3 Sekunden den Wert von aktuell toggeln. Das tut er aber nicht. Nach jedem cycle() ist aktuell immer noch bzw. wieder 0.
Tatsächlich geschieht das Kuriosum, dass aktuell im then-Zweig zunächst auf 1b01 gesetzt wird, letzter daraufhin auf Grund der if-Bedindung aktuell != letzter davor ebenso auf 1b01, was dann dazu führt, dass nun wegen letzter != 0b01 der else-Zweig durchlaufen wird, der aktuell wieder auf 0b01 setzt.
Das heißt, obwohl cycle() lt. Dokumentation "für einen Verarbeitungszyklus" den Rückgabewert 1b01 setzt, wird innerhalb dieses einen(!) Verarbeitungszyklusses
- unten letzter == 0b01 geprüft
- aktuell = 1b01 im then-Zweig gesetzt
- oben aktuell != letzter geprüft
- letzter = aktuell im dessen then-Zweig gesetzt
- unten letzter == 0b01 nun negativ geprüft
- aktuell = 0b01 im else-Zweig gesetzt
Das widerspricht meiner Anschauung von "ein Verarbeitungszyklus". Im Ergebnis widerspricht das dem entweder-oder des then...else. Wenn der Code des then-Zweiges ausgeführt wird, dann niemals der Code des else-Zweiges - und umgekehrt, zumindest nicht in einem Zyklus.
Meines Erachtens ist das Verhalten des EibPC an dieser Stelle möglicherweise erklärbar, aber falsch.

