SCL FIFO mit zwei Ausgabewerten

zloyduh

Level-1
Beiträge
226
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
möchte den ältesten (Nr.1) und den zweitältesten (Nr.2) Eintrag ständig auf dem HMI-Panel anzeigen.
Wird der Älteste-Auftrag abgearbeitet, wird dieser aus der Liste gelöscht. Der zweitälteste wird (1), der drittälteste wird (2) und so weiter….

Die Einträge werden vorher als INT-Zahl in einem DB (Array) gespeichert.

/\ Eintrag Nr.: 1 (wird angezeigt)
I Eintrag Nr:: 2 (wird angezeigt)
I Eintrag Nr:: 3 (wird nach obengeschoben) unsichtbar
I Eintrag Nr.: 4 (wird nach obengeschoben) unsichtbar

Das ganze wollte ich in SCL lösen.
Kann mir jemand Helfen?
Oder hat jemand bereits so eine Anwendung gehabt?
 
Das ist nicht genau was du suchst, aber sollte dir zeigen, wie es gehen kann.

Code:
(*ç________________________________________________________________________________________________________________________________________________________
.  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
.  FB_FIFO
.  CD 18/02/12
.  ________________________________________________________________________________________________________________________________________________________
.  ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
*)
FUNCTION_BLOCK FB_FIFO 
VAR_INPUT
    B_NeuerAuftrag          : BOOL;         // Neuer Auftrag muss in FIFO eingetragen werden
    I_NeuerAuftrag          : INT;          // Auftragsnummer des neuen Auftrags
    B_AuftragFertig         : BOOL;         // Auftrag wurde abgearbeitet und kann aus der Auftragsliste entfernt werden
END_VAR
VAR_OUTPUT
    I_HMIAuftrag1           : INT;          // Auftrag 1 für HMI
    I_HMIAuftrag2           : INT;          // Auftrag 2 für HMI
END_VAR
VAR_TEMP
    I                       : INT;          // Index
END_VAR
VAR
    Speicher                : ARRAY[1..256] OF INT;
    I_MaxSpeicher           : INT;          // aktuell letzter Speicherplatz
    B_ImgNeuerAuftrag       : BOOL;         // Image Neuer Auftrag
    B_ImgAuftragFertig      : BOOL;         // Image Auftrag Fertig
END_VAR
// -------------------------------------------------------------
// FIFO
// ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
//  
// -------------------------------------------------------------
    // Neuer Auftrag ???
    IF B_NeuerAuftrag AND NOT B_ImgNeuerAuftrag AND (I_MaxSpeicher < 256) THEN
        I_MaxSpeicher := I_MaxSpeicher + 1;
        // neuen Inhalt an letzte Stelle schreiben
        Speicher[I_MaxSpeicher] := I_NeuerAuftrag;
    END_IF;
    
    // Auftrag fertig ???
    IF B_AuftragFertig AND NOT B_ImgAuftragFertig AND (I_MaxSpeicher > 0) THEN
        I_MaxSpeicher := I_MaxSpeicher - 1;
        // Inhalte aufrücken
        FOR I := 1 TO I_MaxSpeicher DO
            Speicher[I] := Speicher[I+1];
        END_FOR;
        // freigewordene Speicherstelle auf 0 setzen
        Speicher[I_MaxSpeicher+1] := 0;
    END_IF;
    
    // Image schreiben
    B_ImgNeuerAuftrag := B_NeuerAuftrag;
    B_ImgAuftragFertig := B_AuftragFertig;
    
    // Ausgabe an HMI
    I_HMIAuftrag1 := Speicher[1];
    I_HMIAuftrag2 := Speicher[2];
    
END_FUNCTION_BLOCK
DATA_BLOCK FIFO FB_FIFO
BEGIN 
END_DATA_BLOCK

Viele Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Entweder mit einer For-Schleife oder aber noch simpler.
Man nehme ein Array und zeiht es als Ring-Array auf. So dass alles immer im Kreis läuft.
Dann merkt man sich die Stelle der anzuzeigenden Variablen. Jedesmal wenn ein Auftrag abgeabreitet wird, wird der Zeiger auf die anzuzeigenden Variablen um eines erhöht und hinter diesen Variablen die neue Nummer eingetragen.
 
Zuletzt bearbeitet:
Zurück
Oben