Unklarheit bei SCL...

petzi

Level-1
Beiträge
255
Reaktionspunkte
1
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Zusammen,

ich bitte um Hilfe bei folgendem SCL-Auszug:

Code:
           curr_time_R23 := S_ODT (T_NO:=T23, 
                                      S:=S5Timer_flag_R23, 
                                     TV:=T#1S500ms,                                                                                 R:=FALSE, 
                                     BI:=biVal_R23, 
                                      Q:=actFlag_R23); 
                        
        IF  (S5Timer_flag_R23 = false) THEN                                 
             S5Timer_flag_R23 := true; 
        END_IF;    

        IF  (actFlag_R23 = true) THEN                                              
             S5Timer_flag_R23 := false;
          
        IF ("Eingang_1"=true)THEN         
             State_ST_2 :=14 ;     
        END_IF;       
END_IF;   

       IF (E1.0 = true) THEN
       A1.0 := true;  
          
       ELSE
       A1.0 := false;  
       END_IF;
Hierbei handelt es sich ja um eine Einschaltverzögerung von T23.


Die Fragen sind nun Folgende:


1) Hat denn der Timerausgang "actFlag_R23" überhaupt eine Auswirkung auf die nachfolgende IF-Anweisung oder welchen Sinn kann hier der Timer haben?

2) Angenommen "Eingang_1" sei false, dann würde ja bei "State_ST_2 :=14" keine Weiterbearbeitung des Programms erfolgen. Was hätte das aber für die nachfolgende IF-Anweisung zur Folge?

Würde also in diesem Fall die IF-Anweisung,

Code:
       IF (E1.0 = true) THEN
       A1.0 := true;  
          
       ELSE
       A1.0 := false;  
       END_IF;
unabhängig von "Eingang_1", auf jeden Fall durchlaufen werden?


Vielen Dank für eure Erklärungen!
 
Hallo Petzi,
ich kann deine Verwirrung hier gut verstehen ...

Um den ersten Teil sinnvoll bewerten zu können müßte man erstmal wissen, was für eine IF-Kondition noch davor steht denn da steht ja noch ein einsames "END_IF;" (nach links eingerückt).

Den 2. Teil kann man auch so darstellen :
Code:
A1.0 := E1.0 ;
... und er wird nach dem Code-Schnipsel unabhängig bearbeitet ...

Gruß
Larry
 
Zuviel Werbung?
-> Hier kostenlos registrieren
1) Hat denn der Timerausgang "actFlag_R23" überhaupt eine Auswirkung auf die nachfolgende IF-Anweisung oder welchen Sinn kann hier der Timer haben?
Nicht auf die nachfolgende sondern auf die darauf folgende.
2) Angenommen "Eingang_1" sei false, dann würde ja bei "State_ST_2 :=14" keine Weiterbearbeitung des Programms erfolgen. Was hätte das aber für die nachfolgende IF-Anweisung zur Folge?

Würde also in diesem Fall die IF-Anweisung,

Code:
       IF (E1.0 = true) THEN
       A1.0 := true;  
 
       ELSE
       A1.0 := false;  
       END_IF;
unabhängig von "Eingang_1", auf jeden Fall durchlaufen werden?
Ja!

@Larry, das END_IF gehört zu der Zeitabfrage, hat mich aber zuerst auch verwirrt.
 
Danke schon mal für eure Antworten...

Also das nach links eingerückte END_IF gehört sicherlich entweder zu:

a)
Code:
IF  (actFlag_R23 = true) THEN                                              
S5Timer_flag_R23 := false;
Oder zu:

b)
Code:
IF ("Eingang_1"=true)THEN         
State_ST_2 :=14 ;
Vermutlich zu a) , oder?


Was ich aber gar nicht verstehe - warum hat denn der Timerausgang "actFlag_R23" eine Auswirkung auf die darauffolgende IF-Anweisung, also sozusagen auf

Code:
IF (E1.0 = true) THEN
A1.0 := true;  
          
ELSE
A1.0 := false;  
END_IF;
???

Oder habe ich das jetzt falsch verstanden?
 
Ja, zu a.
b hat ja schon eins. ;)
Was ich aber gar nicht verstehe - warum hat denn der Timerausgang "actFlag_R23" eine Auswirkung auf die darauffolgende IF-Anweisung, also sozusagen auf

Code:
IF (E1.0 = true) THEN
A1.0 := true;  
 
ELSE
A1.0 := false;  
END_IF;
???
Hat er doch gar nicht.
Dieser Teil wird immer durchlaufen.
Mit dem Timer Ausgang wird die Zeit frisch gestartet und der Eingang 1 abgefragt.
Wenn dieser in diesem Moment High ist wird die Schrittkette auf Schritt 14 gestellt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@Petzi:
Du hast m.E. Recht mit deiner Vermutung. Die Variante a) wäre dann korrekt.

Aber das programm im Einzelnen :
Code:
        IF  (S5Timer_flag_R23 = false) THEN                                 
             S5Timer_flag_R23 := true; 
        END_IF;
Da "S5Timer_flag_R23" den Timer re-triggert wird es wieder aktiviert, wenn es vorher "0" war. Der Timer möchte ja am Liebsten auf Flanken am Eingang reagieren.

Code:
     IF  (actFlag_R23 = true) THEN                                              
             S5Timer_flag_R23 := false;
          
        IF ("Eingang_1"=true)THEN         
             State_ST_2 :=14 ;     
        END_IF;       
END_IF;
der Kram gehört dann so zusammen.
Ist der Timer abgelaufen so wird sein Trigger-Bit gelöscht um dann im übernächsten Zyklus wieder mit dem obigen Block gesetzt zu werden. Du hast hier also eine Art "Dauer-Impulsgeber".
Ist dann in dieser Zeit zufällig auch "Eingang_1" gerade da dann wird "State_ST_2" der Wert 14 zugewiesen. Ansonsten steht in dem State das drin, was schon drin war ... (Sinn = ???)

Die A1.0-Geschichte wird nach dem Code unabhängig vom "Eingang_1" ausgeführt. Das keißt aber nicht, dass das nicht irgendwo sonst in dem Baustein noch einmal anders stehen könnte ...

Gruß
Larry
 
@Paule: Hm, aber du hattest doch in Thread #3 geschrieben:


Zitat von petzi
1) Hat denn der Timerausgang "actFlag_R23" überhaupt eine Auswirkung auf die nachfolgende IF-Anweisung oder welchen Sinn kann hier der Timer haben?

Nicht auf die nachfolgende sondern auf die darauf folgende.

Und die darauf folgende ist ja diese:


IF (E1.0 = true) THEN
A1.0 := true;

ELSE
A1.0 := false;
END_IF;


Danke!
 
Danke für deine Erklärungen LL!

Was dennoch noch immer nicht ganz klar ist:

1) Es stimmt, dass im Code davor das Trigger-Bit "S5Timer_flag_R23" auf 0 gesetzt wird. Aber es wird doch in jedem Zyklus wieder gesetzt und nicht erst im übernächsten, oder?


2) Der Timerausgang "actFlag_R23" hat doch nach 1s und 500ms den Status "1". Danach wird ja sofort das Trigger-Bit abgeschaltet, so dass auch der Timerausgang sofort wieder den Status "0" annimmt.

In welcher Zeit muss dann zufällig auch "Eingang_1" gerade da sein, damit "State_ST_2" der Wert 14 zugewiesen wird? Der Timer hat doch nur den Bruchteil einer Sekunde den Status "1", oder? Ich sehe hier nicht die Verbindung von "Eingang_1" zu dem Timer...

Code:
     IF  (actFlag_R23 = true) THEN                                              
     S5Timer_flag_R23 := false;
          
     IF ("Eingang_1"=true)THEN         
     State_ST_2 :=14 ;     
     END_IF;  
     
END_IF;
Wie müssen denn die beiden IF-Anweisungen gelesen werden - wo ist da die Verbindung?
 
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo Petzi,

Stichwort "zyklische Bearbeitung".
Ist der Timer abgearbeitet so ist das act_Flag dann = 1.
Das bewirkt dann das Löschen des Trigger_Flags und erlaubt das Abfragen von "Eingang_1".

Beim erneuten Durchlauf vom Zyklus ist dann erstmal das Trigger-Flag noch = 0. Der Timer schaltet also ab und dadurch auch sein act_Flag.
Danach wird das trigger_Flag wieder = 1 auf das dann im nächsten Zyklus reagiert werden wird ...

usw.

Ich würde eine Zeitscheiben-Steuerung so nicht machen (aber scheinbar tut es ja was es soll - oder ???) - und dir scheint es ja auch nicht so gut zu gefallen ... :rolleyes:

Gruß
Larry
 
Danke LL - denke jetzt wird es klarer!

Ja stimmt, obwohl das Programm tut was es soll, ist es für jemanden, der noch nicht viel Erfahrung in SCL hat, etwas schwer durchschaubar...


Wenn ich es jetzt richtig verstanden habe, dann müssen die beiden IF-Anweisungen

Code:
IF  (actFlag_R23 = true) THEN                                              
     S5Timer_flag_R23 := false;
          
     IF ("Eingang_1"=true)THEN         
     State_ST_2 :=14 ;     
     END_IF;  
     
END_IF;
immer als "Verbund" gesehen werden.

D.h. nur wenn der Eingang_1 gerade in dem Zyklus den Status "1" hat, in dem auch der Timerausgang noch den Status "1" hat, kann dem "State_ST_2" der Wert 14 zugewiesen werden.

Stimmt's so?
 
Ja ... stimmt ...
Ich hatte auch zunächst wegen der falschen Einrückung des IF's die falschen Schlüsse gezogen. Man schaut halt erst so "mal eben" drauf und so ist es dann - sorry.

Ganz generell - ein IF wirkt IMMER bis zum nächsten END_IF.
Verschaltelte IF's kannst du dir im Grund wie eine Reihenschaltung von Bedingungen vorstellen (also eine UND-Verschachtelung).

Gruß
Larry
 
D.h. nur wenn der Eingang_1 gerade in dem Zyklus den Status "1" hat, in dem auch der Timerausgang noch den Status "1" hat, kann dem "State_ST_2" der Wert 14 zugewiesen werden.

Stimmt's so?
Ich würde es so formulieren:

Der Timerausgang "actFlag_R23" ist alle 1,5 Sekunden genau 1 Zyklus lang true.
Nur in diesem Zyklus wird geschaut, ob "Eingang_1" auch 1 (true) ist und wenn ja, dann "State_ST_2" der Wert 14 zugewiesen.
"Eingang_1" kann genau in diesem Zyklus 1 geworden sein oder auch schon länger anstehen (was viel wahrscheinlicher ist).

Sowas macht man, um Abläufe zu synchronisieren oder auf feste Zeitraster zu takten.
In der Elektronik nennt man sowas D-Flipflop.

Harald
 
D.h. nur wenn der Eingang_1 gerade in dem Zyklus den Status "1" hat, in dem auch der Timerausgang noch den Status "1" hat, kann dem "State_ST_2" der Wert 14 zugewiesen werden.

Stimmt's so?
Sagte ich das nicht schon? :confused:
Mit dem Timer Ausgang wird die Zeit frisch gestartet und der Eingang 1 abgefragt.
Wenn dieser in diesem Moment High ist wird die Schrittkette auf Schritt 14 gestellt.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Und hier noch zu meiner ersten Antwort:
Code:
[COLOR=red]//1) Hat denn der Timerausgang "actFlag_R23" überhaupt eine Auswirkung[/COLOR] 
[COLOR=red]// auf die [B]nachfolgende[/B] IF-Anweisung[/COLOR] 
 
           curr_time_R23 := S_ODT (T_NO:=T23, 
                                      S:=S5Timer_flag_R23, 
                                     TV:=T#1S500ms,                                                                                 R:=FALSE, 
                                     BI:=biVal_R23, 
                                      Q:=actFlag_R23); 
 
[COLOR=red]// nachfolgende IF-Anweisung:[/COLOR]
 
        IF  (S5Timer_flag_R23 = false) THEN                                 
             S5Timer_flag_R23 := true; 
        END_IF;    
 
[COLOR=red]// Ich schrieb:[/COLOR]
[COLOR=red]// Nicht auf die nachfolgende sondern auf die [B]darauf folgende [/B][/COLOR]
[COLOR=red]// und das ist diese:[/COLOR]
 
        IF  (actFlag_R23 = true) THEN                                              
             S5Timer_flag_R23 := false;
 
        IF ("Eingang_1"=true)THEN         
             State_ST_2 :=14 ;     
        END_IF;       
END_IF;   
 
       IF (E1.0 = true) THEN
       A1.0 := true;  
 
       ELSE
       A1.0 := false;  
       END_IF;
 
Hi ihr - ich nochmal... :p

Also, wie ich schon schrieb, ist mir das Verhalten in dem geposteten SCL-Programm (dank eurer super Erklärung) jetzt klar geworden. Vielen Dank an alle nochmals!

@Paule: Ja, es war nicht dein Fehler, sondern meiner. Ich hatte das zu diesem Zeitpunkt noch falsch verstanden, sorry.

Wünsch' euch ein schönes & sonniges Wochenende!
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi,

Code:
IF  (actFlag_R23 = true) THEN                                              
    S5Timer_flag_R23 := false;
 
    IF ("Eingang_1"=true)THEN         
        State_ST_2 :=14 ;     
    END_IF;       
END_IF;

In diesem, bzw. sofort.

Gruss Daniel
 
Ah, ok - danke Daniel!

Dann erklärt sich die Wartezeit ja im Grunde nur dadurch, dass der Timer bis zum Ablaufen mehrere Zyklen benötigt... hoffe das stimmt so.
 
Zurück
Oben