Step 7 Frage zu Case und abfragen Schritte

Kehrer

Level-2
Beiträge
443
Reaktionspunkte
4
Hallo,
Ich habe eine Schrittkette:
Code:
VAR_TEMP
    step: INT;
    // temporäre Variablen

END_VAR
VAR

END_VAR

step := BYTE_TO_INT(a0c_step);

CASE step OF

    201: // Druckluft einschalten
    
        oDruckLuft(bewegung := 1);              //FC52
        
    202:
    
        sf_wait(wait_time := T#500ms);
        
    203:     //Teileauflage auf  
    
        oTeileauflage(bewegung := 0);           //FC38
        oTeileauflage2(bewegung := 0);          //FC58
        
    204:    //Vereinzelung1 vor    

END_CASE;


Warum funktioniert das Blinken nicht (auch nicht im Einzelsatz)?
Code:
//LED Grundstellung ansteuern
IF step >200 AND step <204 THEN                  //Ablauf 201-216
    oMasch_Grundstellung := sm_blink0_5;      //A5.4 Blinken bei Anforderung
ELSE
    oMasch_Grundstellung := false;              //A5.4 aus
END_IF;
  
IF sm_zst_grundstellung_ok =1 AND NOT oMasch_eEinrichtWAende THEN         //Grundstellung erreicht
    oMasch_Grundstellung := true;               //A5.4 leuchtet
    ELSE
    oMasch_Grundstellung := false;              //A5.4 aus
END_IF;
 
Warum funktioniert das Blinken nicht (auch nicht im Einzelsatz)?
Code:
//LED Grundstellung ansteuern
IF step >200 AND step <204 THEN                  //Ablauf 201-216
    oMasch_Grundstellung := sm_blink0_5;      //A5.4 Blinken bei Anforderung
ELSE
    oMasch_Grundstellung := false;              //A5.4 aus
END_IF;
 
IF sm_zst_grundstellung_ok =1 AND NOT oMasch_eEinrichtWAende THEN         //Grundstellung erreicht
    oMasch_Grundstellung := true;               //A5.4 leuchtet
    ELSE
    oMasch_Grundstellung := false;              //A5.4 aus
END_IF;
Wenn Du sowas in FUP oder KOP programmierst anstatt einer IF-Orgie, brauchst Du beim Beobachten einfach nur der grünen Linie folgen und siehst direkt warum der Ausgang nicht blinkt.

Harald
 
Soll das ein Timer sein? Wäre ungünstig wenn der nur an einer Stelle aufgerufen wird.
Step7: einen Timer an nur einer Stelle aufrufen ist sehr gut (y) (und Standard-Vorgehen). Es darf nur keine Stelle sein, die nur manchmal/bedingt bearbeitet wird (n)
Üblicherweise ruft man die Timer an Stellen auf, die unbedingt immer durchlaufen werden. Wenn man anfängt Timer an nur manchmal durchlaufenen Stellen aufzurufen, dann verzettelt man sich in Details, dann fängt man an, den Timer auch noch an anderen Stellen aufzurufen, und noch weiteren Stellen, und noch mehr Stellen... und dann gibt es bestimmt trotzdem irgendwann eine Situation, wo keine der Stellen durchlaufen wird, weil die Logik dann doch nicht vollständig war (wie so oft, wenn Logik mit IF-Orgien programmiert wird). PS: Und sowas bringt Siemens dann auf so abstruse Neuerungs-Ideen, daß Timer nur aktualisiert werden, wenn man den Q des Timers abfragt.

Harald
 
Zuletzt bearbeitet:
Deine beiden IF Konstrukte kann man auch als Einzeiler lösen, ohne ELSE....
Meinst Du, die beiden IF-Konstrukte durch je einen Einzeiler ersetzen, Michaël?
Dann bleibt das Problem aber bestehen und es blinkt weiterhin nichts.

Für die drei angedachten Zustände (Ein, Aus, Blinken) bietet sich eher ein IF-ELSIF-ELSE-Konstrukt an.
Z.B.:
Code:
IF step >200 AND step <204 THEN                 
    oMasch_Grundstellung := sm_blink0_5; // blinkt
ELSIF sm_zst_grundstellung_ok =1 AND NOT oMasch_eEinrichtWAende THEN
    oMasch_Grundstellung := true;        // leuchtet
ELSE
    oMasch_Grundstellung := false;       // aus
END_IF;
Ob dies schon das tut, was es soll, kann meine Glaskugel leider nicht beurteilen.
 
Ich würde den Einzeiler großzügig/übersichtlich als Zweizeiler schreiben:
Code:
oMasch_Grundstellung := ((step > 200 AND step < 204) AND sm_blink0_5 )
                     OR ((sm_zst_grundstellung_ok = 1) AND NOT oMasch_eEinrichtWAende);

Harald
 
Ich würde den Einzeiler großzügig/übersichtlich als Zweizeiler schreiben:
Code:
oMasch_Grundstellung := ((step > 200 AND step < 204) AND sm_blink0_5 )
                     OR ((sm_zst_grundstellung_ok = 1) AND NOT oMasch_eEinrichtWAende);

Harald
Genau das meinte ich, nicht für alles ein IF ... ELSE ... Konstrukt.
Meinst Du, die beiden IF-Konstrukte durch je einen Einzeiler ersetzen, Michaël?
Dann bleibt das Problem aber bestehen und es blinkt weiterhin nichts.
Das wäre aber schon einmal ein Anfang in die richtige Richtung.
 
Zurück
Oben