Ah ja, jetzt dämmert's. Was mir eigentlich immer noch zu knapp/beiläufig beschrieben ist: wann die Lampe wieder ausgeschaltet wird.
Aber das kann ich mir jetzt anhand der Beschreibung zusammenreimen. Also:
24 RegalFächer, jedem ist ein Taster und ein Leuchtmelder sowie eine ZeitZählung zugeordnet.
Legt man ein Teil in ein Fach, so drückt man den zugehörigen Taster und der Melder blinkt. Frühestens 4 h später geht der Melder auf Dauerlicht.
Hat ein Leuchtmelder Dauerlicht oder blinkt er und man betätigt den zugehörigen Taster, so geht der Melder aus und man muss das Teil aus dem Fach entnehmen. Umgekehrt formuliert: entnimmt man ein Teil aus einem Fach, so muss man den entsprechenden Taster betätigen, damit dieses Fach für das Programm erkennbar wieder freigegeben wird.
Dauerlicht kann höchstens einer der Melder haben, nämlich derjenige, dem die längste Zeit > 4 h zugeordnet ist. Die Melder der übrigen belegten Fächer blinken - egal, welche Zeit aufgelaufen ist.
Kleine Anmerkung - tut aber nichts zur Sache
: ich würde die Bedeutungen von Blinken und Dauerlicht vertauschen, weil m.E. die eine blinkende Leuchte in einem Meer von bis zu 23 Leuchten mit Dauerlicht eher "ins Auge fällt", als die eine Leuchte mit Dauerlicht in einem Meer von bis zu 23 blinkenden.
Sooo, zum Ansatz (ohne "Schiebung", ohne FIFO):
Ich stelle mir ein Array mit 24 Elementen vor. Jedes Element ist einem RegalFach + Taster + LeuchtMelder fest zugeordnet.
Jedes Element enthält eine Variable für Datum mit Uhrzeit einerseits und eine BOOL-Variable andererseits für "Fach ist belegt".
Ein TastenDruck auf Taster n schaltet das BelegtBit des ArrayElements n um. Nur, wenn das BelegtBit von False auf True wechselt, so wird zusätzlich die aktuelle Uhrzeit mit Datum in das ArrayElement n geschrieben.
In einer ProgrammSchleife werden alle ArrayElemente abgefragt:
- BelegtBit von Element n wird als "enable-Bit" für Leuchtmelder n ausgegeben (d.h. Bit n im DWORD 'PatternOn' dazuodern).
- Wenn BelegtBit von Element n = TRUE ist, wird die Differenz DatumUhrzeitAktuell - DatumUhrzeitElement n gebildet.
- Wenn die aktuelle Differenz grösser ist, als die bisher grösste gefundene in Variable 'DiffMax', so wird die Variable 'DiffMax' mit der aktuellen Differenz überschrieben und 'IndexDiffMax' mit dem aktuellen Index n.
Nach den SchleifenDurchläufen: wenn 'DiffMax' > 4 h, dann in DWORD 'PatternFlash' das Bit n laut 'IndexDiffMax' setzen.
Vor Beginn der SchleifenDurchläufe müssen natürlich die Variablen 'IndexDiffMax', 'DiffMax', 'PatternOn' und 'PatternFlash' gelöscht werden.
Zum Abschluss noch
Code:
If BlinkTakt THEN
Lamps := PatternOn;
ELSE
Lamps := PatternOn AND (PatternFlash XOR #16#FFFF); // Alternativ: Lamps := PatternOn XOR PatternFlash;
ENDIF;
Wie nun die LampenBits aus dem DWORD 'Lamps' auf die einzelnen Leuchtmelder verteilt werden, hängt nicht zuletzt davon ab, welche Ausgänge für welchen Leuchtmelder zuständig sind ...
Entsprechendes gilt natürlich auch für den umgekehrten Weg, die Ermittlung des Index n passend zum Taster.
Vermutlich "zu Fuss" per IF - ELSIF - ... - ENDIF bzw. CASE-Selektion.
Gruss, Heinileini