Step 7 Ablauf SCL mit Rücksprung

Kehrer

Level-2
Beiträge
380
Reaktionspunkte
3
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo;
Ich habe eine Schrittkette die soweit ja funktioniert
Code:
FUNCTION_BLOCK FB32
TITLE='Ablauf Einschub'

VAR
    bTeilEinschubGesehen:BOOL;
END_VAR

// Überwachung Teileeinschub

IF  NOT oLinearschiene_eFrei THEN                //UN E7.5 Linearschiene Übergang Rundschalttisch frei        
  bTeilEinschubGesehen := true;               //Bedingung Einschub gesehen
END_IF;

// Schrittkette



CASE BYTE_TO_INT(a1c_step) OF

    1:  // Warten auf Start
    
        IF (a1c_sync = 0) THEN
            sm_wsb := false;
        END_IF;
        //oVereinzelung2(bewegung := 1);  //Teilezuführung neues Teil auf

                                                                        
        
    9:  //FC32 Einschubachse vor
    
        oEinschubachse(bewegung := 1);                                                                         
        
    10: // Klaus "Warten bis Endlage wirklich erreicht"
    
        sf_wait(wait_time := T#1000ms);
        
    11: // Gegenprüfung Sensor Spalt Linearschiene Rundschalttisch
    
         IF  bTeilEinschubGesehen = false THEN
            IF a2m_sync <> 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
                ;
            ELSE
                sf_fehler(Fehlernummer := 1323, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(a1c_step));
            END_IF;
            sc_nextstep := a1c_step;
        END_IF;
        
    12:     
    
        xa0_run.aoTeile[(xa0_run.iAktuelleStellung - 1 + 6) MOD 6].bVorhanden := true;
        xa0_run.aoTeile[(xa0_run.iAktuelleStellung - 1 + 6) MOD 6].bGebohrt := false; 
        xa0_run.aoTeile[(xa0_run.iAktuelleStellung - 1 + 6) MOD 6].bAbgeblasen := false;         
        xa0_run.aoTeile[(xa0_run.iAktuelleStellung - 1 + 6) MOD 6].bGemessen := false;         
        xa0_run.aoTeile[(xa0_run.iAktuelleStellung - 1 + 6) MOD 6].bBewertungGO := false;  
    
    13: // TWE@20160128 - Versuch von Nils Teilmitnehmer während Bewegung Einschubachse nach oben zu fahren.
    
        // oEinschub_aGS := true;
        // oEinschub_aAS := false;

        // sf_wait(wait_time := DINT_TO_TIME(XXD_ALLG_DATEN.iVerzoegerungTeilemitneh)); 
        
        // TWE@20160330 - Neuer Versuch von Nils mit Ventil "Mittelstellung entlüftet" für Einschubachse       
        
        oEinschub_aGS := false;                                                                                     //A11.4 Einschubachse NICHT Grundstellung
        oEinschub_aAS := false;                                                                                     //A11.5 Einschubachse NICHT Arbeitsstellung
        
        sf_wait(wait_time := T#1000ms);
        
    14: //Teilemessung beim Einschub
    
    IF NOT oTeileeinschub_eGO THEN  
        
    IF a2m_sync = 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
            sf_fehler(Fehlernummer := 1328, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(a1c_step));    //Messung Teil im Teileeinschub außerhalb der Toleranz
            END_IF;            
            sc_nextstep := a1c_step;
        END_IF;
        
        //Vereinzelung 1 schließen 
        oVereinzelung1(bewegung := 0);
                                                                            
        
    15:  //FC39 Teilemitnehmer auf
    
        oTeilemitnehmer(bewegung := 0); 
        sf_wait(wait_time := T#1000ms);
        
        //Vereinzelung 2 öffnen für neues Teil Einschub
        oVereinzelung2(bewegung := 1);                                                                      
    
    16:  //FC32 Einschubachse zurück
        
        oEinschubachse(bewegung := 0);                                                                             
        

 
END_CASE;

END_FUNCTION_BLOCK

Nun würde ich gerne einen Rücksprung von CASE 14 auf CASE 9 machen falls die Messung nicht i.O.
Erst beim 2 oder 3x nicht i.O. soll die Fehlermeldung kommen.
Ablauf --> Teileeinschub vor --> Messen --> i.o next Step; niO --> Teileeinschub nochmals vor --> iO next step; immer noch nicht iO --Fehlermeldung


Wie könnte ich dies anstellen?
Mit FOR-Schleife etwa oder lieber REPEAT?
FOR #Laufvariable :=??? TO ???? BY ???? DO ????
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Bzw. wie kann ich die Fehlermeldung nach 5s erst kommen lassen?

Code:
IF NOT oTeileeinschub_eGO THEN  
        
    IF a2m_sync = 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
            sf_fehler(Fehlernummer := 1328, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(a1c_step));    //Messung Teil im Teileeinschub außerhalb der Toleranz
            END_IF;            
            sc_nextstep := a1c_step;
        END_IF;
sf_wait(wait_time := T#5000ms);
 
Deine CASE Variable gibt doch vor, in welchen CASE gesprungen werden soll.

Nun würde ich gerne einen Rücksprung von CASE 14 auf CASE 9
Dann beschreibst du in 14: deine Variable "a1c_step" mit 9

Weil E14.2 das GO Signal aus dem Messtaster ausgibt
Warum hast du überhaupt eine BYTE Variable für den CASE deklariert?
Verstehe ich nicht, wo da der Zusammenhang ist aber gut.
 
Könnte man das Problem und den Aufwand nicht umgehen indem man das einfach in Graph macht? Es wäre auch wesentlich lesbarer und wartbarer.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Indem du deine CASE Variable auf 9 setzt.

Warum hast du überhaupt eine BYTE Variable für den CASE deklariert?
Und warum machst du für jede Frage ein neues Thema auf?
damit springt er aber nicht zurück, sondern macht den Zyklus fertig und springt dann in Zweig 9, vorausgesetzt die variable wird unterwegs nicht nochmal verändert.

Was ja grundsätzlich sinnvoll ist, aber halt kein Rücksprung ist.

@Kehrer Case ist grundsätzlich eine Verzweigung wie beim IF, es wird also aus prinzip nicht zurückgesprungen. Aber due kannst die Casevariable im Case verändern, dann zweigt er beim nächsten Durchlauf neu ab, er springt aber nicht aus einem Case zweig in einen anderen. Das ginge dann nur mit Goto, was eher ein nogoto ist.
 
Dann beschreibst du in 14: deine Variable "a1c_step" mit 9
So etwa?
Code:
IF NOT oTeileeinschub_eGO THEN
        a1c_step := 9
   ELSIF= a2m_sync = 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
            sf_fehler(Fehlernummer := 1328, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(a1c_step));    //Messung Teil im Teileeinschub außerhalb der Toleranz
            END_IF;         
            sc_nextstep := a1c_step;
        END_IF;

oder eher so:
Code:
IF NOT oTeileeinschub_eGO THEN 
        GOTO 9
   ELSIF= a2m_sync = 0 THEN // Wenn Bohren aktiv sollte kein Fehler gemeldet werden um Spindel zu schützen
            sf_fehler(Fehlernummer := 1328, Fehlerart := sk_Fehler, Diagnosenummer := BYTE_TO_INT(a1c_step));    //Messung Teil im Teileeinschub außerhalb der Toleranz
            END_IF;           
            sc_nextstep := a1c_step;
        END_IF;


Dann wird aber meine Meldung nie kommen oder?
 
Zuletzt bearbeitet:
Wie könnte ich dies anstellen?
Mit FOR-Schleife etwa oder lieber REPEAT?
FOR #Laufvariable :=??? TO ???? BY ???? DO ????
Weder FOR noch REPEAT noch WHILE. Du willst doch die dreimalige Wiederholung nicht in einem einzigen PLC-Zyklus abarbeiten!
In einem Schritt VOR den zu wiederholenden Schritten eine 3 in eine ZählVariable speichern,
in dem letzten zu wiederholenden Schritt die ZählVariable um 1 vermindern und eine Wiederholung nur veranlassen, solange die ZählVariable grösser als 0 ist.
 
a1c_step := 9;

Insofern, dass die Variable nicht extern neu beschrieben wird, wird beim nächsten Mal Schritt 9 gestartet
 
Zurück
Oben