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

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 19

Thema: Unklarheit bei SCL...

  1. #1
    Registriert seit
    18.12.2008
    Beiträge
    255
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    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!
    Grüße
    petzi
    Zitieren Zitieren Unklarheit bei SCL...  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    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

  3. #3
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard

    Zitat Zitat von petzi Beitrag anzeigen
    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.
    Zitat Zitat von petzi Beitrag anzeigen
    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.
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  4. #4
    petzi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    18.12.2008
    Beiträge
    255
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    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?
    Grüße
    petzi

  5. #5
    Registriert seit
    23.04.2009
    Ort
    Allgäu
    Beiträge
    3.042
    Danke
    241
    Erhielt 863 Danke für 617 Beiträge

    Standard

    Ja, zu a.
    b hat ja schon eins.
    Zitat Zitat von petzi Beitrag anzeigen
    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.
    Gruß
    Paule
    ----------------------------------------------------------------------------
    > manchmal verliert man und manchmal gewinnen die anderen <

  6. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    @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

  7. #7
    petzi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    18.12.2008
    Beiträge
    255
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    @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!
    Grüße
    petzi

  8. #8
    petzi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    18.12.2008
    Beiträge
    255
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard

    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?
    Geändert von petzi (13.01.2011 um 11:07 Uhr)
    Grüße
    petzi

  9. #9
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.728
    Danke
    398
    Erhielt 2.406 Danke für 2.002 Beiträge

    Standard

    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 ...

    Gruß
    Larry

  10. #10
    petzi ist offline Erfahrener Benutzer
    Themenstarter
    Registriert seit
    18.12.2008
    Beiträge
    255
    Danke
    0
    Erhielt 1 Danke für 1 Beitrag

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    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?
    Grüße
    petzi

Ähnliche Themen

  1. Antworten: 3
    Letzter Beitrag: 17.03.2009, 08:43

Lesezeichen

Berechtigungen

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