Step 7 Schrittverzögerung mit SCL

SanjaDO

Level-1
Beiträge
177
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Leute


ich habe folgendes Problem:


Bisher habe ich eine Ablaufsteuerung mit zwei IF-Schleifen für einen Schritt und Transition gelöst, also ungefähr so:




IF first THEN
first:=0;
SM[0]:=1;
END_IF;




IF SM[0] THEN
IF IN1 THEN
//ANWEISUNG
SM[0]:=0;
SM[1]:=1;

END_IF;
END_IF;




IF SM[1] THEN
IF IN2 THEN
//ANWEISUNG
SM[1]:=0;
SM[2]:=1;

END_IF;
END_IF;




IF SM[2] THEN
IF IN3 THEN
//ANWEISUNG
SM[2]:=0;
SM[3]:=1;

END_IF;
END_IF;




IF SM[3] THEN
IF IN4 THEN

SM[3]:=0;
SM[4]:=1;
SM[5]:=1;

END_IF;
END_IF;




USW.....


Nun will ich eine Zeitvergögerung in einen oder mehrere Schritte einbauen. Z.B für 10sek. will ich im Schritt 2 hängen.
Mit Step7GRAPHEN geht das ohne Probleme. Will eigentlich das gleiche in SCL hinkriegen.


Danke
 
In dem Du einen Timer im Schritt 2 startest und in die Transition zu Schritt 3 einbeziehst:
Code:
[FONT=courier new]VAR
  Pause: "TON";  // Oder welchen Timertyp auch immer man benötigt
END_VAR

...

IF SM[2] THEN
  IF IN3 THEN
    //ANWEISUNG
    SM[2]:=0;
    SM[3]:=1;
  END_IF;
END_IF;

// Pausentimer
[COLOR=#FF0000]Pause (IN:= SM[3], PT:= Zeitvorgabe);[/COLOR]

IF SM[3] [COLOR=#FF0000]AND Pause.Q[/COLOR] THEN
  IF IN4 THEN
    SM[3]:=0;
    SM[4]:=1;
    SM[5]:=1;
  END_IF;
END_IF;

USW.....[/FONT]
Den Timer möglichst nicht überspringen! Das bringt immer Problem wegen der Flankenerkennung.

Und benutzt bitte den Codebutton [#].
 
Zuletzt bearbeitet:
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?
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:
[FONT=courier new]// Pausentimer[/FONT]
[FONT=courier new]Pause (IN:= SM[3] [/FONT][COLOR=#FF0000][FONT=courier new]OR SM[5][/FONT][/COLOR][FONT=courier new], PT:= Zeitvorgabe);[/FONT]
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.
 
Zuletzt bearbeitet:
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
 
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;
[COLOR=#FF0000]    pause1: TON;
    pause2: TON;
[/COLOR]END_VAR


//______________________________________________________________
M2.0:=first;


IF first THEN
    first:=0;
    SM[0]:=1;
    OUT0:=1;
    OUT4:=0;
END_IF;


[COLOR=#ff0000]Pause1(IN:= SM[0] or SM[2], PT:= T#4s);[/COLOR]

IF SM[0] AND Pause1.Q THEN
        IF IN1 THEN
        OUT0:=0;      
        OUT1:=1;
  
        SM[0]:=0;        
        SM[1]:=1;        
        END_IF;
END_IF;

   
[COLOR=#ff0000]Pause2(IN:= SM[1], PT:= T#4s);[/COLOR]

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
 
Zuletzt bearbeitet:
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;
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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:
[FONT=Courier New]Pause1(IN:= SM[1], PT:= T#4s);
pause1_1(IN:= IN2 [COLOR=#FF0000]AND SM[1][/COLOR], PT:= T#4s);


IF SM[1] AND Pause1.Q THEN
    IF IN2 THEN     
        OUT1:=0;
        SM[1]:=0;
        SM[2]:=1;
        OUT2:=1;
        IF [COLOR=#EE82EE]OUT2 AND[/COLOR] pause1_1.Q THEN
            M2.1:=1;
        END_IF;
    END_IF;
END_IF;[/FONT]
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.
 
Zuletzt bearbeitet:
Ja hast recht OUT2 wäre besser, geht aber leider garnix mehr, das ganze programm läuft nicht mehr....ich starte mal neu!
 
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
 
Zurück
Oben