Zuviel Werbung? - > Hier kostenlos beim SPS-Forum registrieren

Ergebnis 1 bis 3 von 3

Thema: SCL FIFO mit zwei Ausgabewerten

  1. #1
    Registriert seit
    11.12.2008
    Beiträge
    226
    Danke
    92
    Erhielt 2 Danke für 2 Beiträge

    Frage


    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?
    Zitieren Zitieren SCL FIFO mit zwei Ausgabewerten  

  2. #2
    Registriert seit
    20.11.2006
    Ort
    Hamburg
    Beiträge
    225
    Danke
    35
    Erhielt 35 Danke für 32 Beiträge

    Standard

    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

  3. #3
    Registriert seit
    09.06.2008
    Beiträge
    138
    Danke
    16
    Erhielt 13 Danke für 13 Beiträge

    Standard


    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.
    Geändert von ich988 (18.02.2012 um 22:51 Uhr)

Ähnliche Themen

  1. in SCL zwei bytes zu einem int zusammensetzen
    Von Züttu im Forum Simatic
    Antworten: 9
    Letzter Beitrag: 27.04.2011, 20:07
  2. Fifo mit SCL erstellen ???
    Von Chris30 im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 11.07.2010, 10:09
  3. SCL zwei INT aus einem STRING
    Von Uli_87 im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 24.02.2009, 10:33
  4. Antworten: 9
    Letzter Beitrag: 16.12.2007, 21:20
  5. Scl-fifo
    Von johnij im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 12.11.2007, 08:16

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •