TIA FIFO mit TIA V11

Lina44

Level-1
Beiträge
8
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich soll eine Steuerung mit 24 Tastern und Lampen nach dem FIFO Prinzip programmieren, allerdings komm ich nicht mehr weiter und in der Arbeit kann mir keiner Helfen. Vielleicht kann mir ja hier jemand helfen.

Zur Steuerung: Die Taster und Lampen sind schon soweit programmiert, das sie eingeschaltet werden können und nach der vorgegebenen zeit dauerthaft leuchten. allerdings soll am ende nur eine Lampe leuchten und zwar die die als erstes gerdückt wurde, quasi die lampe bei der das Bauteil am längsten liegt.

Bin über jeden Ratschlag dankbar. Evtl gibt es noch andere möglichkeiten es zu programieren.
 
Zuletzt bearbeitet:
Kannst du die Aufgabenstellung bitte genauer erklären. Ich versteh nicht genau was das mit FIFO zu tun hat...
 
Zuviel Werbung?
-> Hier kostenlos registrieren
ich soll eine Steuerung mit 24 Tastern und Lampen nach dem FIFO Prinzip programmieren, allerdings komm ich nicht mehr weiter und in der Arbeit kann mir keiner Helfen. Vielleicht kann mir ja hier jemand helfen.

Zur Steuerung: Die Taster und Lampen sind schon soweit programmiert, das sie eingeschaltet werden können und nach der vorgegebenen zeit dauerthaft leuchten. allerdings soll am ende nur eine Lampe leuchten und zwar die die als erstes gerdückt wurde.
:confused:
Diese Aussagen wiedersprechen sich etwas.

FIFO steht für First In First Out

Wenn die erst gedrückte Leuchte am Schluß leuchten soll, wäre das ein
FILO = First In Last Out (oft auch LIFO = Last In First Out).

Beide Speicher unterscheiden sich logischerweise in der Handhabung der Verwaltung der Speicherzellen.


Günstig wäre es, Dein bisheriges Programm zu zeigen und Deine konkreten Problem beim weiteren Vorgehen zu schildern, damit man Dir gezielt helfen kann.
Komplettlösungen bringen Lernende in der Regel nicht wirklich weiter und werden daher hier nur ungern gepostet.
;)
 
ich soll eine Steuerung mit 24 Tastern und Lampen nach dem FIFO Prinzip programmieren,
...
Zur Steuerung: Die Taster und Lampen sind schon soweit programmiert, dass sie eingeschaltet werden können und nach der vorgegebenen zeit dauerhaft leuchten.
Allerdings soll am Ende nur eine Lampe leuchten und zwar die, die als erstes gedrückt wurde.
Antwort nach dem ViFo-Prinzip (= Viele Fragen offen ;)):
1. Besteht eine feste Zuordnung zwischen Tastern und Lampen? Z.B. Taster 1 schaltet Lampe 1 (ein), u.s.w. bis Taster 24 schaltet Lampe 24 (ein)?
2. Wodurch bzw. nach welchen Kriterien sollen die Lampen - mit Ausnahme der letzten - wieder ausgeschaltet werden?
3. Wodurch bzw. nach welchen Kriterien soll die letzte Lampe wieder ausgeschaltet werden?
4. Sollen die Taster in einer beliebigen Reihenfolge betätigt werden dürfen? Oder muss geprüft werden, ob eine bestimmte Reihenfolge eingehalten wird? Ggfs welche Reaktion des Programms, wenn Reihenfolge nicht eingehalten?
5. Was bedeutet hier "nach dem FIFO-Prinzip"? Wenn die zuerst eingeschaltete als letzte noch leuchten soll, klingt das eher nach LIFO/FILO als nach FIFO.
6. Wenn die Lampen durch TastenBetätigung sofort eingeschaltet werden, aber erst nach einer vorgegebenen Zeit dauerhaft leuchten sollen, was tun sie dann bis die Zeit abgelaufen ist? Sollen sie blinken?
7. Wann startet die Zeit? Mit dem Betätigen des Tasters?
8. Was soll passieren, wenn der Taster vor Ablauf der Zeit wieder losgelassen wird?

Gruss, Heinileini
 
Hallo heinileini,
1. Ja, jeder taster hat seine zugeordnete Lampe.
2./3. Die taster werden in einer beliebigen Reihenfolge gedrückt dadurch wird eine zeit von 4h gestartet ist diese abgelaufen so wird das Signal an ein merkerbyte weitergegeben. Die Lampe die leuchten soll, soll zwei Kriterien erfüllen zum einen das die 4h abgelaufen sind und zum anderen das es der taster mit der längsten bestätigten zeit ist eben first in first out.
4. Beliebige Reihenfolge
5. Ich glaube ich habe es etwas unglücklich erklärt, es soll die lampe leuchten bei der quasi das bauteil am längsten im regal liegt
6.sie blinken in der zeit. Das ist in dem Programm schon mit programmiert
7.mit starten des tasters
8. Ich hab es mit einer positiven flanke programmiert die dann ein sr Glied betätigt dieses Signal geht dann weiter in eine speichernde zeitfunktion die sich das 1 Signal merkt
Gruß lina
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Ich soll ein regal bauen mit 24 tastern und lampen, die lampen und taster hängen immer zusammen also h1 und s1 usw. Bei drücken des tasters soll eine zeit von 4h ablaufen. Danach soll nur die lampe im regal leuchten bei der das teil mind. 4h im regal lag und als erstes reingelegt wurde also das was am längesten im regal lag. Ist das der fall so leuchtet die Lampe nach tasten druck diesen taster leuchtet die nächste lampe bei der das auch der fall ist usw.
 
Standard
Ich soll ein regal bauen mit 24 tastern und lampen, die lampen und taster hängen immer zusammen also h1 und s1 usw. Bei drücken des tasters soll eine zeit von 4h ablaufen. Danach soll nur die lampe im regal leuchten bei der das teil mind. 4h im regal lag und als erstes reingelegt wurde also das was am längesten im regal lag. Ist das der fall so leuchtet die Lampe nach tasten druck diesen taster leuchtet die nächste lampe bei der das auch der fall ist usw.
 
Jetzt habe ich es verstanden..... mußte mal all deine Antworten lesen

Es leuchtet aber immer nur eine Lampe auch wenn mehrere Teile schon länger als 4 Stunden im Regal liegen.
Dann geht es nach der Reihenfolge wie die Teile ins Regal gelegt worden sind ?

Richtig ?
 
Zuletzt bearbeitet:
Also in der Theorie:
Array erstellen mit struct
Sekunden - int - Anzahl Sekunden vorhanden
Position - int - Wer wurde eingelegt? (Tasternummer z.B.)

Per Schleife alle Arrays, die vorhanden sind (Position ungleich 0) im 1s-Takt hochzählen.
Bei eintreffen der Bedingung =>14400 beim Array-Index 1 die entsprechende Lampe leuchten lassen, worauf die "Position" zeigt, aber nicht mehr zählen lassen.

Die Arrays werden gefüllt indem beim Drücken des Tasters an die nächste Position ungleich 0 der entsprechende Taster in die Position geschrieben wird.

Sollte einer leuchten und der Taster gedrückt werden, so wird das gesamte Array -1 geschoben, wodurch der aktive rausgeschoben würde und der nächste dann der nächste ist der auslösen könnte.

Hoffe das ist irgendwie verständlich formuliert und gibt einen Lösungsansatz. Ansonsten zeig doch einmal im Programm wie weit Du gekommen bist, oder brauchst Du doch eine fertige Lösung?
 
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
 
Zuletzt bearbeitet:
Hallo Lina44,

es ist schwierig mit Deinem Programm weiterzuarbeiten, da für solche Aufgaben eigentlich nicht mehr FUP genutzt wird.
Ich habe also mal eben einen Baustein erstellt, den HeiniLeini in etwa vorgeschlagen hat. Finde seine Idee zum Teil besser als meine. Allerdings ist dieser für TIA v15.1 - sollte aber auch in V11 laufen, habe aktuell nur 15.1 zur Hand.

Code:
    // Die Tastereingänge müssen hier zugewiesen werden:
    // M5.0 sollte dann z.B. E0.0 sein wenn dieser der Taster ist. Es müssen alle Tastereingänge[1] bis [24] zugewiesen werden. Wenn weniger genutzt werden dann eben weniger
    #Tastereingänge[1] := "E0.0";
    #Tastereingänge[1] := "E0.1";
    
    // Für Auswertung erstmal löschen
    #groesste_pos := 0;
    #groesste_zeit := T#0s;
    // eigenen Timer für Sekundentakt zum Blinken erstellen
    #Sek_P(IN:=NOT #Sek_N.Q,
           PT:=t#500ms);
    #Sek_N(IN := #Sek_P.Q,
           PT := t#500ms);
    // Den Speicher durchwühlen
    FOR #Schleife_24 := 1 TO 24 DO
        // aktuelle CPU-Zeit sichern
        #RetVal1 := RD_LOC_T(#"aktuelle CPU-Zeit");
        // Abfrage ob Taster gedrückt wurde und noch nicht belegt wurde (positive Flanke)
        IF #Tastereingänge[#Schleife_24] AND NOT #Speicher[#Schleife_24].Belegt AND NOT #Tasterflankenmerker[#Schleife_24] THEN
            #Speicher[#Schleife_24].Belegt := TRUE;
            #Speicher[#Schleife_24]."Zeit eingelagert" := #"aktuelle CPU-Zeit";
            // Abfrage ob Taster gedrückt wurde und belegt ist um zu löschen (positive Flanke)
        ELSIF #Tastereingänge[#Schleife_24] AND #Speicher[#Schleife_24].Belegt AND NOT #Tasterflankenmerker[#Schleife_24] THEN
            #Speicher[#Schleife_24] := #Speicher[0];
        END_IF;
        // Differenz der Zeit bilden
        #Speicher[#Schleife_24].ZeitDifferenz := #"aktuelle CPU-Zeit" - #Speicher[#Schleife_24]."Zeit eingelagert";
        // groesste Zeit bestimmen und in Position speichern
        IF #groesste_zeit < #Speicher[#Schleife_24].ZeitDifferenz AND #Speicher[#Schleife_24].Belegt THEN
            #groesste_zeit := #Speicher[#Schleife_24].ZeitDifferenz;
            #groesste_pos := #Schleife_24;
        END_IF;
        // Alle LEDs aus
        #LEDs[#Schleife_24] := FALSE;
        // wenn Speicherplatz belegt ist dann LED ein
        IF #Speicher[#Schleife_24].Belegt THEN
            #LEDs[#Schleife_24] := TRUE;
        ELSE
            // wenn nicht belegt, dann LED aus
            #LEDs[#Schleife_24] := FALSE;
        END_IF;
    END_FOR;
    // Die LED mit der groessten Zeit nun blinken lassen wenn die Zeit abgelaufen ist
    IF #groesste_zeit > #Ablaufzeit AND #Speicher[#groesste_pos].Belegt THEN
        #LEDs[#groesste_pos] := #Sek_P.Q;
    END_IF;
    // Für die positiven Flanken hier benötigt
    #Tasterflankenmerker := #Tastereingänge;
    
    // Ausgänge beschreiben
    // M100.0 sollte der Ausgang sein der genutzt werden soll, z.B. A0.0 für die LED
    // Diese müssen hier alle einzeln zugewiesen werden.
    "A0.0" := #LEDs[1];
    "A0.1" := #LEDs[2];

Anhang anzeigen FB_Taster.txt
Datei von .txt sollte aus .scl umbenannt werden.
Dieser Baustein wurde in SCL geschrieben. Das wäre heute die Programmiersprache der Wahl. Falls Du es unbedingt im FUP haben möchtest, so kannst Du bestimmt herauslesen was wo passiert und es entsprechend umsetzen, da SCL ziemlich einfach ist und sich meistens von selbst erklärt.

Um ihn im TIA-Portal zu nutzen solltest Du ihn auf Deiner Festplatte abspeichern, dann in Deinem Projekt bei "Externe Quellen" diese Datei auswählen, also neu hinzufügen.
Daraufhin Rechtsklick -> Baustein aus Quelle generieren und einbinden.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Moin escride1,
habe Deine Variante noch nicht intensiv studiert, aber mir ist aufgefallen, dass Du mit der "aktuellen CPU-Zeit" arbeitest.
Enthält die auch das Datum? Und wenn nicht, lässt sich das Programm dann auch zwischen 20:00 und 04:00 nutzen?
Gruss, Heinileini
 
Moin escride1,
habe Deine Variante noch nicht intensiv studiert, aber mir ist aufgefallen, dass Du mit der "aktuellen CPU-Zeit" arbeitest.
Enthält die auch das Datum? Und wenn nicht, lässt sich das Programm dann auch zwischen 20:00 und 04:00 nutzen?
Gruss, Heinileini

Hallo,

da ich mit DTL arbeite wird das gesamte Datum herangezogen. Die Differenz wird im Datentyp Time gebildet, die kann mit einem Panel leicht abgebildet werden und ist somit am Input änderbar.
Da es die Differenz Time ist, wird der Datumssprung auch genutzt. Somit wird Time immer hochgezählt, eben bis zum Maximum. Das liegt ja irgendwo bei 24 Tagen. Sollten diese überschritten sein, so würde allerdings die Zeit auf 0 gesetzt. Das aber würde man ja dann abfangen. Da hier nur 4h angegeben wurde, würde diese ja nicht erreicht und ich hab auch keine Routine zum Abfangen hineingeschrieben.

Sofern im FB das Array mit dem Speicher auf remanent steht würde die Zeit sogar trotz eines CPU-Neustarts oder aber Spannungsausfalls weiterhin richtig gezählt werden, sofern die CPU-Zeit sich nicht ändert. Es würde also auch die Möglichkeit bestehen das übers Wochenende laufen zu lassen, sprich Anlage wurde nicht leergeräumt, und am Montag würde einfach weitergemacht, und das trotz Hauptschalterabschaltung.
 
Ich persönlich würde die Systemzeit nur 1x vor der Schleife anstatt 24x in der Schleife auslesen, damit alle Einträge im gleichen Zyklus auch den gleichen Zeitstempel bekommen.
 
Ich persönlich würde die Systemzeit nur 1x vor der Schleife anstatt 24x in der Schleife auslesen, damit alle Einträge im gleichen Zyklus auch den gleichen Zeitstempel bekommen.
Ich neige auch dazu, die aktuelle Zeit an nur 1 Stelle vor der Schleife auszulesen und sogar eine zusätzliche TempVariable dafür zu spendieren. Auch macht es Sinn, eine ZeitAngabe zu verwenden, die nicht beim Umschalten zwischen Sommer- und WinterZeit durcheinander gewirbelt wird.
Aber (kleine SpitzFindigkeit ;)): die Begründung, so allen im selben Zyklus erfolgenden Einträgen denselben ZeitStempel zu verpassen, finde ich für den LösungsWeg der Aufgabe dieses Thread fast kontraproduktiv. Hier geht es eigentlich darum, nicht zwei oder mehr Einträge mit demselben ZeitStempel zu erzeugen, sondern eine klare Reihenfolge.
Allerdings: beim allgemeinen LösungsWeg muss man natürlich im Auge behalten, dass mehrere Einträge pro Zyklus theoretisch auftreten könnten und dieser Fall nicht zu einem "groben Fehlverhalten" führen darf.

Gruss, Heinileini
 
Zuletzt bearbeitet:
die Begründung, so allen im selben Zyklus erfolgenden Einträgen denselben ZeitStempel zu verpassen, finde ich für den LösungsWeg der Aufgabe dieses Thread fast kontraproduktiv. Hier geht es eigentlich darum, nicht zwei oder mehr Einträge mit demselben ZeitStempel zu erzeugen, sondern eine klare Reihenfolge.
Finde ich ganz klar rassistisch, die 1 der 24 zu bevorzugen, wenn sie doch zeitgleich betätigt werden.
:p

Und vlt. war die 24 sogar fast 'nen ganzen Zyklus eher und wird trotzdem hinten an gestellt.
:p:p:p
 
Zurück
Oben