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

Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 48

Thema: Nie mehr als zwei Ausgänge setzen können.

  1. #11
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.620
    Danke
    377
    Erhielt 799 Danke für 642 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Ich wurde auch nach SCL tendieren.

    Man kann schnell ein pseude-code schreiben, und wenn das richtig aussieht hat man fast schon den SCL code.


    Code:
    FUNCTION_BLOCK Stabel_Puffer_2_von_5
    
    VAR_INPUT
       Schalter_1 : BOOL ;
       Schalter_2 : BOOL ;
       Schalter_3 : BOOL ;
       Schalter_4 : BOOL ;
       Schalter_5 : BOOL ;
    END_VAR
    
    VAR_OUTPUT
      Lampe_1 : BOOL ;
      Lampe_2 : BOOL ;
      Lampe_3 : BOOL ;
      Lampe_4 : BOOL ;
      Lampe_5 : BOOL ;
    END_VAR 
    
    VAR_TEMP
      i , j : INT ;
      Plaziert , Entfernt : BOOL ;
    END_VAR
    
    
    VAR
       Stabel : ARRAY[1..5] of INT ; // Stabelpuffer mit 5 Ebenen. 
       Schalter_Zustand : ARRAY[1..5] of BOOL ;
       Schalter_Flanke : ARRAY[1..5] of BOOL ;
       Schalter_Flanke_Speicher : ARRAY[1..5] of BOOL ;
       Lampe_Zustand : ARRAY[1..5] of BOOL ;
    END_VAR
    
    //Wenn eine Schalter aktiviert wird, 
    Schalter_Zustand[1] := Schalter_1 ;
    Schalter_Zustand[2] := Schalter_2 ;
    Schalter_Zustand[3] := Schalter_3 ;
    Schalter_Zustand[4] := Schalter_4 ;
    Schalter_Zustand[5] := Schalter_5 ;
    
    FOR i:=1 TO 5 BY 1 DO
      Schalter_Flanke[i] := Schalter_Zustand[i] AND NOT Schalter_Flanke_Speicher[i] ;
      Schalter_Flanke_Speicher[i] := Schalter_Zustand[i] ;
      IF Schalter_Flanke[i] THEN
    // wird das dazugehörige Nummer zu den ersten freien Ebene hingefügt.
        Plaziert := FALSE ;
        FOR j:=1 TO 5 BY 1 DO
          IF Stabel[j]=0 AND NOT Plaziert THEN 
            Stabel[j] :=i  ;
            Plaziert := TRUE ;
          END_IF ;
        END_FOR ;
      END_IF ;
    END_FOR ;
    
    
    // Wenn eine Schalter deaktiviert wird, wird es von den Puffer entfernt, und die Werte in die obere Ebenen fallen einen Ebene runter.
    FOR i:=1 TO 5 BY 1 DO
    (*
    Nun habe ich kein Zeit mehr.
    Aber ich denke du kapierst den Idee.
    *)
    
    // Nur Ebenen 1 und 2 aktiviert eine Lampe.
    Lampe_Zustand[1] := FALSE ;
    Lampe_Zustand[2] := FALSE ;
    Lampe_Zustand[3] := FALSE ;
    Lampe_Zustand[4] := FALSE ;
    Lampe_Zustand[5] := FALSE ;
    Lampe_Zustand[Stabel[1]] := TRUE ; // Hier fehlt es ein abfangen von wenn eine ebene Leer ist (Stabel[1] = 0)
    Lampe_Zustand[Stabel[2]] := TRUE ;
    
    Lampe_1 := Lampe_Zustand[1] ;
    Lampe_2 := Lampe_Zustand[2] ;
    Lampe_3 := Lampe_Zustand[3] ;
    Lampe_4 := Lampe_Zustand[4] ;
    Lampe_5 := Lampe_Zustand[5] ;
    
    END_FUNCTION_BLOCK
    Geändert von JesperMP (08.01.2014 um 10:48 Uhr)
    Jesper M. Pedersen

  2. Folgender Benutzer sagt Danke zu JesperMP für den nützlichen Beitrag:

    bkizilkaya (08.01.2014)

  3. #12
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    die Array die du hast : Schalter_Flanke_Speicher, Schalter_Flanke.
    Die brauchst man doch nicht oder was haben diese für den Zweck. Sind die etwa für die erkennung ob sie frisch aktiviert worden sind.

  4. #13
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.620
    Danke
    377
    Erhielt 799 Danke für 642 Beiträge

    Standard

    Du hast in dein Bescreibung erklärt das die Schalter die Ausgänge aktiveren soll, abhängig von welchen Reihenfolge sie aktiviert werden.
    Deswegen muss man den Flanke erkennen wenn eine Schalter aktiviert werden. ("Wenn ein Schalter aktiviert wird").
    Ohne diese Bedingung in deine Beschreibung wäre das ganze viel viel einfacher. Aber deswegen auch interessanter.
    Jesper M. Pedersen

  5. #14
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    ok verstehe
    du hast im ersten schritt einen positiven flanken gewertet

    und jetzt beim deaktivieren muss ich halt die negative flanke auswerten.

    muss ich für die negative flanke nur die Not ein bisschen tauschen oder wie geht das? habe noch nie eine negativeflanke auswertung gemacht im SCL

  6. #15
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.620
    Danke
    377
    Erhielt 799 Danke für 642 Beiträge

    Standard

    Zitat Zitat von bkizilkaya Beitrag anzeigen
    und jetzt beim deaktivieren muss ich halt die negative flanke auswerten.
    Nein brauchst du nicht.
    Es ist egal wenn ein Schalter deaktiviert ist. Wenn deaktiviert, muss es von den Stabelpuffer entfernt werden wenn es in Puffer vorhanden ist.
    Jesper M. Pedersen

  7. #16
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    ich habe es einmal so gemacht:

    Code:
    // Puffer eintrag löschen
    FOR #x:=1 TO 5 BY 1 DO  
      IF #Schalter_zustand[#x] = 0 THEN
    // wird die Schalter_ID in der entsprechenden Zelle gelöscht und die eins höhere Zelle wird dann verschoben in die tiefste Zelle
        #Entfernt := false ;
        FOR #y:=1 TO 5 BY 1 DO
          IF #Puffer[#y] < 0 AND NOT #Entfernt THEN 
            #Puffer[#y] := #Puffer[#y + 1]  ;
            #Entfernt := TRUE ;
          END_IF ;
        END_FOR ;
      END_IF ;
    END_FOR ;
    aber irgendwie geht es nicht wenn ich die beiden programmteile separat teste dann funktioniert es

  8. #17
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.620
    Danke
    377
    Erhielt 799 Danke für 642 Beiträge

    Standard

    Du musst weiter arbeiten.
    Du kriegst es bald.
    In dein Code, wenn eine #Schalter_zustand[#x] = false, egal welche, ziehst du nur den Pufferzelle 2 nach unten nach Zelle 1, die andere nicht.


    Hinweis:
    IF #Schalter_zustand[#x] = 0 THEN
    muss man nach diesen Nummer (x) in den Stabelpuffer suchen, und wenn es gefunden wird, dann die Obere Zellen nach unten ziehen (wobei gleichzeitig den Zelle mit x gelöscht wird).

    Und eine Schönheitssache:
    IF #Schalter_zustand[#x] = 0 THEN // ok
    IF #Schalter_zustand[#x] = FALSE THEN // besser
    IF NOT #Schalter_zustand[#x] THEN // best
    Geändert von JesperMP (08.01.2014 um 15:40 Uhr)
    Jesper M. Pedersen

  9. #18
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    ok danke

    mein Problem ist es einmal wenn ich den schalter deaktiviere dann halt immer noch der eintrag geschrieben ist nicht gelöscht.

  10. #19
    Registriert seit
    03.09.2013
    Beiträge
    93
    Danke
    1
    Erhielt 1 Danke für 1 Beitrag

    Standard

    ich komme nicht weiter bei mir sind die einträge im array immer noch geschrieben obwohl der schalter deaktiviert ist.

    könnt ihr mir vielleicht helfen


    gruss

  11. #20
    Registriert seit
    06.10.2004
    Ort
    Kopenhagen.
    Beiträge
    4.620
    Danke
    377
    Erhielt 799 Danke für 642 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Postier dein Code hier.
    Jesper M. Pedersen

Ähnliche Themen

  1. Step 5 Ausgänge setzen/rücksetzen
    Von hoffi im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 07.01.2014, 12:22
  2. Antworten: 5
    Letzter Beitrag: 08.10.2013, 09:47
  3. Ausgänge im EG können nicht angesteuert werden
    Von antares24 im Forum Simatic
    Antworten: 14
    Letzter Beitrag: 07.05.2012, 20:27
  4. Antworten: 5
    Letzter Beitrag: 09.03.2010, 08:20
  5. Antworten: 10
    Letzter Beitrag: 28.04.2008, 22:17

Lesezeichen

Berechtigungen

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