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

Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: Schrittverzögerung mit SCL

  1. #11
    SanjaDO ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2013
    Ort
    Castrop-Rauxel
    Beiträge
    177
    Danke
    36
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Eine Frage noch. Muss ich dannach den TON nicht irgendwie zurücksetzen und kann man auch den gleichen TON für andere Schritte nutzen? Oder überschneidet sich das irgendwas?

  2. #12
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.739
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Der TON wird durch das Rücksetzen von IN (in Deinem Fall SM[3]) auch zurückgesetzt. Deswegen ist es wichtig, das der Timer nicht innerhalb der IF-Abfrage steht, weil er sonst das Rücksetzen nicht mitbekommt.

    Normalerweise sollte man Timer nicht für mehrere Sachen verwenden. Unter Umständen ist das zwar möglich, aber da muss man schon genau darauf achten, das sich die beiden Funktionen nicht ins Gehege kommen. Wenn, dann nur mehrere Startoptionen benutzen!
    Ansonsten lieber eine neue Instanz des Timers programmieren.


    PS: So z.B.
    Code:
    // Pausentimer
    Pause (IN:= SM[3] OR SM[5], PT:= Zeitvorgabe);
    Dann hat der Timer in Schritt 4 die Zeit sich zurück zu stellen.
    Bei Verwendung in Schritt 3 und 4 dagegen könnte es Probleme mit dem Neustart des Timers oder der Transition geben.
    Geändert von hucki (22.11.2013 um 15:10 Uhr)

  3. #13
    SanjaDO ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2013
    Ort
    Castrop-Rauxel
    Beiträge
    177
    Danke
    36
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Dieses "es könnte Probleme geben"....aber trotzdem danke

  4. #14
    SanjaDO ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2013
    Ort
    Castrop-Rauxel
    Beiträge
    177
    Danke
    36
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Schon so gehts nicht mehr...

    Code:
    FUNCTION_BLOCK FB0
    
    VAR_INPUT
        IN1,IN2,IN3,IN4:BOOL;
    END_VAR
    
    
    VAR_OUTPUT
        OUT0,OUT1,OUT2,OUT3,OUT4:BOOL;
    END_VAR
    
    
    VAR    
        SM: ARRAY[0..6] OF BOOL;
        first:BOOL:=1;
        pause: TON;
        
    END_VAR
    
    
    //______________________________________________________________
    M2.0:=first;
    
    
    IF first THEN
        first:=0;
        SM[0]:=1;
        OUT0:=1;
        OUT4:=0;
    END_IF;
    
    
    Pause(IN:= SM[0], PT:= T#4s);
    
    
    IF SM[0] AND Pause.Q THEN
            IF IN1 THEN
            OUT0:=0;      
            OUT1:=1;
      
            SM[0]:=0;        
            SM[1]:=1;        
            END_IF;
    END_IF;
       
    Pause(IN:= SM[1], PT:= T#4s);
    
    
    IF SM[1] and Pause.Q THEN
        IF IN2 THEN     
            OUT1:=0;
            SM[1]:=0;
            SM[2]:=1;
            OUT2:=1;
        END_IF;
    END_IF;
    
    
    IF SM[2] THEN
        IF IN3 THEN
            OUT2:=0;
            SM[2]:=0;
            SM[3]:=1;
            OUT3:=1;
        END_IF;
    END_IF;
    
    
    
    
    IF SM[3] THEN
        IF IN4 THEN
            OUT3:=0;
            SM[3]:=0;
            first:=1;
            OUT4:=1;
        END_IF;
    END_IF;
    
    
    
    
    
    
    
    
    END_FUNCTION_BLOCK

  5. #15
    SanjaDO ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2013
    Ort
    Castrop-Rauxel
    Beiträge
    177
    Danke
    36
    Erhielt 0 Danke für 0 Beiträge

    Standard

    wenn ich zwei Zähler nehme gehts. Wieviele TONs kann ich denn besetzten? CPU abhängig?

  6. #16
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.739
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Zitat Zitat von SanjaDO Beitrag anzeigen
    Schon so gehts nicht mehr...

    Ja, logisch.

    Stell Dir den Timer als Stoppuhr in Deiner Hand beim Staffellauf vor.
    Du mußt Dich entscheiden, für welche Läufer du die Uhr benutzt. Läufer 1 und 3 wird relativ problemlos gehen. Mit Läufer 1 und 2 wird's vermutlich die Probleme geben.

    Du kannst aber mit einer Stoppuhr auch nur eine Staffel stoppen. Gleichzeitig eine 2. Staffel (= 2. Aufrauf Pause(..); ) funktioniert mit nur einer Uhr nicht. Die Uhr kann ja nicht gleichzeitig "sagen": Hier läuft 'ne Zeit von meinem ersten Läufer, aber mein anderer zweiter Läufer dort wartet noch auf seinen Start.

    Also jeder Aufruf benötigt eine eigene Instanz:
    Code:
    FUNCTION_BLOCK FB0
    
    VAR_INPUT
        IN1,IN2,IN3,IN4:BOOL;
    END_VAR
    
    
    VAR_OUTPUT
        OUT0,OUT1,OUT2,OUT3,OUT4:BOOL;
    END_VAR
    
    
    VAR    
        SM: ARRAY[0..6] OF BOOL;
        first:BOOL:=1;
        pause1: TON;
        pause2: TON;
    END_VAR
    
    
    //______________________________________________________________
    M2.0:=first;
    
    
    IF first THEN
        first:=0;
        SM[0]:=1;
        OUT0:=1;
        OUT4:=0;
    END_IF;
    
    
    Pause1(IN:= SM[0] or SM[2], PT:= T#4s);
    
    IF SM[0] AND Pause1.Q THEN
            IF IN1 THEN
            OUT0:=0;      
            OUT1:=1;
      
            SM[0]:=0;        
            SM[1]:=1;        
            END_IF;
    END_IF;
    
       
    Pause2(IN:= SM[1], PT:= T#4s);
    
    IF SM[1] and Pause2.Q THEN
        IF IN2 THEN     
            OUT1:=0;
            SM[1]:=0;
            SM[2]:=1;
            OUT2:=1;
        END_IF;
    END_IF;
    
    
    IF SM[2] AND Pause1.Q THEN
        IF IN3 THEN
            OUT2:=0;
            SM[2]:=0;
            SM[3]:=1;
            OUT3:=1;
        END_IF;
    END_IF;
    
    IF SM[3] THEN
        IF IN4 THEN
            OUT3:=0;
            SM[3]:=0;
            first:=1;
            OUT4:=1;
        END_IF;
    END_IF;
    
    END_FUNCTION_BLOCK
    Geändert von hucki (22.11.2013 um 15:43 Uhr) Grund: manchmal nervt die Smiley-Ersetzung bei Klammern

  7. Folgender Benutzer sagt Danke zu hucki für den nützlichen Beitrag:

    SanjaDO (22.11.2013)

  8. #17
    SanjaDO ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2013
    Ort
    Castrop-Rauxel
    Beiträge
    177
    Danke
    36
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Vielen Dank! DU hast mir sehr weitergeholfen. Wie mache ich noch eine Verzögerung in meinem logischen Schritt? Also das klappt nicht so ganz:

    Code:
    Pause1(IN:= SM[1], PT:= T#4s);pause1_1(IN:= IN2, PT:= T#4s);
    
    
    IF SM[1] AND Pause1.Q THEN
        IF IN2 THEN     
            OUT1:=0;
            SM[1]:=0;
            SM[2]:=1;
            OUT2:=1;
            IF OUT2 AND pause1_1.Q THEN
                M2.1:=1;
            END_IF;
        END_IF;
    END_IF;

  9. #18
    Registriert seit
    27.06.2009
    Ort
    am Nordharz
    Beiträge
    3.739
    Danke
    444
    Erhielt 924 Danke für 744 Beiträge

    Standard

    Ich denke mal, das liegt an Deinem IN2.
    Kann es sein, das er schon vor SM[1] auf 1 ist und deswegen der Timer schon abgelaufen ist?

    Im Zweifel vlt. so:
    Code:
    Pause1(IN:= SM[1], PT:= T#4s);
    pause1_1(IN:= IN2 AND SM[1], PT:= T#4s);
    
    
    IF SM[1] AND Pause1.Q THEN
        IF IN2 THEN     
            OUT1:=0;
            SM[1]:=0;
            SM[2]:=1;
            OUT2:=1;
            IF OUT2 AND pause1_1.Q THEN
                M2.1:=1;
            END_IF;
        END_IF;
    END_IF;
    Auf das Prüfung von OUT2 kannst Du auch verzichten, denn der wird ja unmittelbar vorher ohne weitere Bedingung gesetzt. Er muss also 1 sein, wenn die Pausenabfrage erfolgt.

    PS: Vlt noch besser OUT2 als IN für den 2. Timer verwenden.
    Geändert von hucki (22.11.2013 um 16:16 Uhr)

  10. #19
    SanjaDO ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    25.10.2013
    Ort
    Castrop-Rauxel
    Beiträge
    177
    Danke
    36
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Ja hast recht OUT2 wäre besser, geht aber leider garnix mehr, das ganze programm läuft nicht mehr....ich starte mal neu!

  11. #20
    Registriert seit
    22.07.2007
    Beiträge
    87
    Danke
    16
    Erhielt 25 Danke für 19 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Wenn du wirklich nur eine Art "Standart-Verzögerung" von einem Schritt zum nächsten brauchst, kommst du im Grunde mit einem Timer aus.
    Setze einfach dann wenn die Verzögerung aktiv werden soll ein "Pause"-Bit. Solange dieses Bit sitzt, darf der nächste Schritt nicht aktiv werden.
    Der Timer läuft solange das Bit sitzt und setzt es am Ende zurück.

    Für einige spezielle Anwendungen z.B. Parametrierbare Schnittstellen oder Ähnliches, wo keine Feste Anzahl an Schrittenoder Bedingen existieren nutze ich Ähnliche Mechanismen.

    Gruß Semo

  12. Folgender Benutzer sagt Danke zu Semo für den nützlichen Beitrag:

    SanjaDO (22.11.2013)

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 13.09.2012, 07:31
  2. Antworten: 1
    Letzter Beitrag: 23.01.2012, 17:06
  3. SCL: FB Aufruf unter SCL mit Variablen DB
    Von ThorstenK im Forum Programmierstrategien
    Antworten: 32
    Letzter Beitrag: 10.02.2011, 19:15
  4. Analogwertverarbeitung mit SCL
    Von PapaDjango im Forum Simatic
    Antworten: 3
    Letzter Beitrag: 15.06.2010, 19:11
  5. Problem mit FB in SCL
    Von broesel im Forum Simatic
    Antworten: 4
    Letzter Beitrag: 29.05.2007, 14:41

Lesezeichen

Berechtigungen

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