TIA Schrittkette in SCL, Programmieren / Aufbau einer Schrittkette in SCL

xxxxxx

Level-1
Beiträge
20
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hi Ihr,

so langsam bringt mich die Schrittkette zum verzweifeln. Folgendes SetUP liegt vor: Es sollen 5 Zuführbänder separat gesteuert werden. Deshalb war meine Vorstellung eine Hauptschrittkette in der verschiedene Modis realisiert werden und 3 unterschrittketten die die Bänder steuern sollen. Dies sollte alles in einem Baustein Programmiert werden. Somit habe ich 4 Case Anweisungen für die Schrittketten in einem Baustein. Die Krogs hierbei ist, dass die Hauptschrittkette wunderbar das tut was sie soll. Die Schrittkette zur Steuerung von Band 3,4 und 5 funktionier ebenfalls. Ausschließlich die Schrittkette für Band 1 und 2 wollen einfach nicht trotz erfüllter Transition. Von Case 0 auf 1 top, jedoch weiter will sie einfach nicht.


Code:
REGION MainSequence 
    
    //Hauptschrittkette
    CASE #mainStepchain OF
        0:// initialschritt
            
            IF #StationBasic.AutomaticOn & NOT #StationBasic.AutomaticOff   THEN
                #mainStepchain := 1;
            END_IF;
            #stepchainBelt1 := 0;
            #stepchainBelt2 := 0;
            #stepchainBelt3to5 := 0;
            
        1: //Auswahl Hand-/Automatikverpacken
            IF #StationBasic.AutomaticOn & #Basic.HandpackingOn THEN
                #mainStepchain := 2;
            ELSIF #DataSequence."Transport Bänder".Waagebereit & #DataSequence."Transport Bänder".FSSbereit & #DataSequence."Transport Bänder".SRSbereit & NOT #Basic.HandpackingOn THEN
                #mainStepchain := 3;
            END_IF;
            
        2: //Auswahl Handverpacken
            IF #TrigHandpacking.Q THEN
                #stepchainBelt3to5 := 0;
            ELSIF #StationBasic.AutomaticOff OR NOT #Basic.HandpackingOn THEN
                #mainStepchain := 0;
                
            END_IF;
            
        3: //Auswahl Automatikverpacken
            IF #TrigAutomaticpacking.Q THEN
                #stepchainBelt1 := 0;
                #stepchainBelt2 := 0;
                #stepchainBelt3to5 := 0;
            ELSIF #StationBasic.AutomaticOff OR #Basic.HandpackingOn THEN
                #mainStepchain := 0;
            END_IF;
            
            
    END_CASE;
END_REGION


REGION Sequenz Band 1 
// Schrittkette Band 1
CASE #stepchainBelt1 OF
        
    0:
    // Initialisirung 
        IF #StationBasic.AutomaticOff THEN
            #DataSequence."Transport Bänder"."Band 1 vorwärts" := FALSE;
            #DataSequence."Transport Bänder"."Band 1 rückwärts" := FALSE;
            IF NOT #Basic.HandpackingOn THEN
                #DataSequence."Transport Bänder".stoppPresse := TRUE;
            END_IF;
        ELSIF #StationBasic.AutomaticOn & NOT #Basic.HandpackingOn & #mainStepchain = 3 THEN
            #DataSequence."Transport Bänder".stoppPresse := FALSE;
            #DataSequence."Transport Bänder"."Start Ablauf" := TRUE;
            #stepchainBelt1 := 1;
        END_IF;
        #DataSequence."Transport Bänder"."Sperre Ablauf" := FALSE;
        #DataSequence."Transport Bänder"."Ende Ablauf" := FALSE;
        
    1:
    // start Ablauf
        IF NOT #DataSequence."Transport Bänder".Waagebereit THEN
            #stepchainBelt1 := 5;
            
        ELSIF #DataSequence."Transport Bänder"."Brikett Aw. 1" OR #DataSequence."Transport Bänder"."Brikett Aw. 2" THEN
            IF NOT (#"tempstückzahl vor Waage" >= 5) & NOT (#"tempstückzahl nach Waage" >= 5) THEN
                #stepchainBelt1 := 6;
            END_IF;
        ELSIF NOT #StationBasic.AutomaticOn THEN
            #DataSequence."Transport Bänder".stoppPresse := TRUE;
        END_IF;
        #DataSequence."Transport Bänder"."Start Ablauf" := FALSE;
        #DataSequence."Transport Bänder"."Sperre Ablauf" := TRUE;
        #DataSequence."Transport Bänder"."Ende Ablauf" := FALSE;
       
        
    2:
    // Prüfe Stau Band 1 behoben
        IF NOT #DataSequence."Transport Bänder".Waagebereit THEN
            #stepchainBelt1 := 5;
        ELSIF NOT #BrikettStauBand1.Q  THEN
            #DataSequence."Transport Bänder".stoppPresse := FALSE;
            #stepchainBelt1 := 6;
        ELSIF  #BrikettStauBand1.Q THEN
            #stepchainBelt1 := 4;
        ELSIF NOT #StationBasic.AutomaticOn THEN
            #DataSequence."Transport Bänder".stoppPresse := TRUE;
        END_IF;
        #DataSequence."Transport Bänder"."Band 1 rückwärts" := FALSE;
        
    3:
    //Automatisch Anlauf nach Stopp
       
        IF NOT #DataSequence."Transport Bänder".Waagebereit THEN
            #stepchainBelt1 := 5;
        ELSIF #LaufzeitBand1.Q THEN
            #stepchainBelt1 := 6;
        ELSIF NOT #StationBasic.AutomaticOn THEN
            #DataSequence."Transport Bänder".stoppPresse := TRUE;
        ELSE
            #stepchainBelt1 := 1;
        END_IF;
        #DataSequence."Transport Bänder"."Ende Ablauf" := FALSE;
        
    4:
    // Brikett Stau
        IF NOT #DataSequence."Transport Bänder".Waagebereit THEN
            #stepchainBelt1 := 5;
        ELSIF #StationBasic.ResetFault THEN
            #DataSequence."Transport Bänder".stoppPresse := FALSE;
            #stepchainBelt1 := 1;
        ELSIF NOT #StationBasic.AutomaticOn THEN
            #DataSequence."Transport Bänder".stoppPresse := TRUE;
        END_IF;
        #DataSequence."Transport Bänder"."Band 1 vorwärts" := FALSE;
        #DataSequence."Transport Bänder"."Band 1 rückwärts" := FALSE;
        
    5:
    //Waage nicht bereit
        IF #StationBasic.ResetFault OR #DataSequence."Transport Bänder".Waagebereit THEN
            #stepchainBelt1 := 0;
        END_IF;
        #DataSequence."Transport Bänder".stoppPresse := TRUE;
        #DataSequence."Transport Bänder"."Band 1 vorwärts" := FALSE;
        #DataSequence."Transport Bänder"."Band 1 rückwärts" := FALSE;
        #DataSequence."Transport Bänder"."Ende Ablauf" := TRUE;
        
    6:
    // Band 1 vorwärts 
        IF NOT #DataSequence."Transport Bänder".Waagebereit THEN
            #stepchainBelt1 := 5;
        ELSIF #BrikettStauBand1.Q THEN
            #DataSequence."Transport Bänder".stoppPresse := TRUE;
            #stepchainBelt1 := 7;
        ELSIF NOT #LaufzeitBand1.Q OR ( #NFBvorWaage.Q & #DataSequence."Transport Bänder"."Brikett vor Waage") OR ((#"tempstückzahl vor Waage">=5) &#DataSequence."Transport Bänder"."Brikett vor Waage"&( #"tempstückzahl nach Waage">=5) ) THEN
            #stepchainBelt1 := 9;
        ELSIF NOT #StationBasic.AutomaticOn THEN
            #DataSequence."Transport Bänder".stoppPresse := TRUE;
        END_IF;
        #DataSequence."Transport Bänder"."Band 1 rückwärts" := False;
        #DataSequence."Transport Bänder"."Band 1 vorwärts" := TRUE;
        
    7:
    //Band 1 rückwäts 
       
        IF NOT #DataSequence."Transport Bänder".Waagebereit THEN
            #stepchainBelt1 := 5;
        ELSIF #LaufzeitBand1rückwärts.Q THEN
            #stepchainBelt1 := 2;
        ELSIF NOT #StationBasic.AutomaticOn THEN
            #DataSequence."Transport Bänder".stoppPresse := TRUE;
        END_IF;
        #DataSequence."Transport Bänder"."Band 1 vorwärts" := FALSE;
        #DataSequence."Transport Bänder"."Band 1 rückwärts" := TRUE;
        
    9:
    // Band 1 Aus 
        IF NOT #DataSequence."Transport Bänder".Waagebereit THEN
            #stepchainBelt1 := 5;
        ELSIF NOT #NFBvorWaage.Q & #DataSequence."Transport Bänder"."Brikett vor Waage"& NOT (#"tempstückzahl vor Waage">=5)& NOT (#"tempstückzahl nach Waage">=5) THEN
            #stepchainBelt1 := 3;
        ELSIF NOT #StationBasic.AutomaticOn THEN
            #DataSequence."Transport Bänder".stoppPresse := TRUE;
        END_IF;
        #DataSequence."Transport Bänder"."Band 1 vorwärts" := FALSE;
        #DataSequence."Transport Bänder"."Band 1 rückwärts" := FALSE;
        #DataSequence."Transport Bänder"."Ende Ablauf" := TRUE;
        
END_CASE;
END_REGION


REGION Sequenz Band 2
   // Schrittkett Band 2
CASE #stepchainBelt2 OF
    0: // Initialisirung     
        IF #StationBasic.AutomaticOff THEN
            #DataSequence."Transport Bänder"."Band 2 start" := FALSE;
        ELSIF #StationBasic.AutomaticOn & NOT #Basic.HandpackingOn & #mainStepchain = 3 THEN
            #DataSequence."Transport Bänder"."Start Ablauf" := True;
            #stepchainBelt1 := 1;
        END_IF;
        #DataSequence."Transport Bänder"."Sperre Ablauf" := FALSE;
        #DataSequence."Transport Bänder"."Ende Ablauf" := FALSE;
        
    1: // start Ablauf
        IF (#DataSequence."Transport Bänder"."Brikett nach Waage"  & (#DataSequence."Transport Bänder"."Brikett Kontrolle IO 1" OR #DataSequence."Transport Bänder"."Brikett Kontrolle IO 2"))OR ((#"tempstückzahl nach Waage" >= 3)&(NOT #DataSequence."Transport Bänder"."Brikett Apos.1" OR NOT #DataSequence."Transport Bänder"."Brikett Apos.2" OR NOT #DataSequence."Transport Bänder"."Brikett Apos.3")) THEN
            #DataSequence."Transport Bänder"."Sperre Ablauf" := TRUE;
            #stepchainBelt2 := 6;
        END_IF;
        #DataSequence."Transport Bänder"."Start Ablauf" := False;
        
    6: //Band 2 Ein
        IF  NOT #DataSequence."Transport Bänder"."Brikett Kontrolle IO 1" & NOT #DataSequence."Transport Bänder"."Brikett Kontrolle IO 2" OR NOT #LaufzeitBand2.Q THEN
            #stepchainBelt2 := 7;
        END_IF;
        #DataSequence."Transport Bänder"."Band 2 start" := TRUE;
        
    7: //Band 2 Aus
        IF  #DataSequence."Transport Bänder"."Brikett Kontrolle IO 1" OR #DataSequence."Transport Bänder"."Brikett Kontrolle IO 2" THEN
            #stepchainBelt2 := 0;
        END_IF;
        #DataSequence."Transport Bänder"."Band 2 start" := FALSE;
        #DataSequence."Transport Bänder"."Ende Ablauf" := TRUE;
        #DataSequence."Transport Bänder"."Sperre Ablauf" := TRUE;
        
END_CASE;
END_REGION


REGION Sequenz Belt 3-5
// Schrittkette Band 3 bis 5
CASE #stepchainBelt3to5 OF
        
    0: // Initialisirung 
        IF #StationBasic.AutomaticOn &  (#mainStepchain = 3 OR  #mainStepchain = 2) & NOT #StationBasic.AutomaticOff  THEN
            #DataSequence."Transport Bänder"."Start Ablauf" := TRUE;
            #stepchainBelt3to5 := 1;
        END_IF;
        #DataSequence."Transport Bänder"."Sperre Ablauf" := FALSE;
        #DataSequence."Transport Bänder"."Ende Ablauf" := FALSE;
        #DataSequence."Transport Bänder"."Band 3 start" := FALSE;
        #DataSequence."Transport Bänder"."Band 4 start" := FALSE;
        #DataSequence."Transport Bänder"."Band 5 start" := FALSE;
        
    1:  // Band 3 ein 
        IF #DataSequence."Transport Bänder"."Brikettpaket  ende Band 4" & NOT #DataSequence."Transport Bänder"."Brikettpaket  ende Band 5" THEN
            #stepchainBelt3to5 := 4;
        ELSIF #DelayswitchOnbelt3.Q THEN
            #DataSequence."Transport Bänder"."Band 3 start" := TRUE;
            #stepchainBelt3to5 := 2;
        END_IF;
        #DataSequence."Transport Bänder"."Start Ablauf" := FALSE;
        #DataSequence."Transport Bänder"."Sperre Ablauf" := TRUE;
        
    2:  // Band 4 ein
        IF #DelayswitchOnbelt4.Q THEN
            #DataSequence."Transport Bänder"."Band 4 start" := TRUE;
            
            #stepchainBelt3to5 := 3;
        END_IF;
        
    3:  // Band 3 Aus  
        IF NOT #DelayShutdownbelt3.Q THEN
            #DataSequence."Transport Bänder"."Band 3 start" := FALSE;
            #stepchainBelt3to5 := 4;
        END_IF;
        
    4: // Band 5 ein
        IF #DataSequence."Transport Bänder"."Brikettpaket  ende Band 4" & NOT #DataSequence."Transport Bänder"."Brikettpaket  ende Band 5" THEN
            #DataSequence."Transport Bänder"."Band 5 start" := TRUE;
            #stepchainBelt3to5 := 5;
        ELSIF #DataSequence."Transport Bänder"."Brikettpaket  ende Band 5" THEN
            #stepchainBelt3to5 := 5;
        END_IF;
        
    5: // Band 4 aus
        IF NOT #DelayShutdownbelt4.Q THEN
            #DataSequence."Transport Bänder"."Band 4 start" := FALSE;
            #stepchainBelt3to5 := 6;
        END_IF;
        
    6: // Band 5 aus
        IF #DataSequence."Transport Bänder"."Brikettpaket  ende Band 5" THEN
            #DataSequence."Transport Bänder"."Band 5 start" := FALSE;
            #stepchainBelt3to5 := 0;
        END_IF;
        #DataSequence."Transport Bänder"."Ende Ablauf" := TRUE;
        
END_CASE;
END_REGION


REGION Timer
//Zeiten Band 1
#LaufzeitBand1(IN := #PFAuswurfschächte.Q,
               PT := T#6s);
#BrikettStauBand1(IN := #DataSequence."Transport Bänder"."Brikett Aw. 1" OR #DataSequence."Transport Bänder"."Brikett Aw. 2",
                  PT := T#1.5s);
#LaufzeitBand1rückwärts(IN := #DataSequence."Transport Bänder"."Band 1 rückwärts",
                        PT := T#1s);
#BrikettStauFehler(IN := #DataSequence."Transport Bänder"."Brikett Aw. 1" OR #DataSequence."Transport Bänder"."Brikett Aw. 2",
                   PT := T#3s);


//Zeiten Waage
#NFBvorWaage(IN := #NFvorWaage.Q,
             PT := T#1.7s);


// Zeiten Band 2
#LaufzeitBand2(IN := #PFnachWaage.Q,
               PT := T#5s);




//Zeiten Band 3-5
#DelayswitchOnbelt3(IN := #DataSequence."Transport Bänder"."Brikettpaket anfang Band 3",
                    PT := T#0.5s);
#DelayShutdownbelt3(IN := #DelayswitchOnbelt3.Q,
                    PT := T#1.6s);
#DelayswitchOnbelt4(IN := #DataSequence."Transport Bänder"."Band 3 start",
                    PT := T#1.5s);
#DelayShutdownbelt4(IN := #DelayswitchOnbelt4.Q,
                    PT := T#1.5s);
END_REGION


REGION Counter
//Zähler vor Waage
IF #NFBvorWaage.Q THEN
    #"tempstückzahl vor Waage" += 1;
ELSIF #NFNIOStoßer.Q THEN
    #"tempstückzahl vor Waage" -= 1;
ELSIF #PFRücksetzeZählervonRoboter.Q THEN
    #"tempstückzahl vor Waage" -= 3;
END_IF;


//Zähler nach Waage
IF "PFnachWaage".Q THEN
    #"tempstückzahl nach Waage" += 1;
ELSIF #PFRücksetzeZählervonRoboter.Q THEN
    #"tempstückzahl nach Waage" -= 3;
END_IF;
END_REGION


REGION Flaggs
//Flanken Auswertung
#PFAuswurfschächte(CLK := #DataSequence."Transport Bänder"."Brikett Aw. 1" OR #DataSequence."Transport Bänder"."Brikett Aw. 2");
#NFvorWaage(CLK := #DataSequence."Transport Bänder"."Brikett vor Waage");
#PFnachWaage(CLK := #DataSequence."Transport Bänder"."Brikett nach Waage");
#NFNIOStoßer(CLK := #DataSequence."Transport Bänder"."NIO Ausstoßer Waage");
#PFRücksetzeZählervonRoboter(CLK := #DataSequence."Transport Bänder".ResetCounterFromRobot);
#TrigHandpacking(CLK := #mainStepchain = 2);
#TrigAutomaticpacking(CLK := #mainStepchain = 3);
END_REGION

VariablenSchrittketteBänder.jpg




Screenshot sind beigefügt.

Hoffe ihr entdeckt den Fehler, bin mit meinem Latein am ende.
 

Anhänge

  • SchritketteBand1_Teil3.jpg
    SchritketteBand1_Teil3.jpg
    36,5 KB · Aufrufe: 70
  • SchritketteBand1_Teil2.jpg
    SchritketteBand1_Teil2.jpg
    66,1 KB · Aufrufe: 56
  • SchritketteBand1_Teil1.jpg
    SchritketteBand1_Teil1.jpg
    66,8 KB · Aufrufe: 38
  • Hauptschrittkette.jpg
    Hauptschrittkette.jpg
    42,5 KB · Aufrufe: 52
Zuletzt bearbeitet:
Zuviel Werbung?
-> Hier kostenlos registrieren
Das ist das Probleme, die Transition ist erfüllte, die schrittkette springt jedoch nicht in den Gewünschten schritt 6

Code:
[COLOR=#333333]1:[/COLOR]
[COLOR=#333333]// start Ablauf[/COLOR]
[COLOR=#333333]IF NOT #DataSequence."Transport Bänder".Waagebereit THEN[/COLOR]
[COLOR=#333333]#stepchainBelt1 := 5;
[/COLOR]
*********
ELSIF #DataSequence."Transport Bänder"."Brikett Aw. 1" OR #DataSequence."Transport Bänder"."Brikett Aw. 2" THEN
IF NOT (#"tempstückzahl vor Waage" >= 5) & NOT (#"tempstückzahl nach Waage" >= 5) THEN
#stepchainBelt1 := 6;
************

[COLOR=#333333]END_IF;[/COLOR]
[COLOR=#333333]ELSIF NOT #StationBasic.AutomaticOn THEN[/COLOR]
[COLOR=#333333]#DataSequence."Transport Bänder".stoppPresse := TRUE;[/COLOR]
[COLOR=#333333]END_IF;[/COLOR]
[COLOR=#333333]#DataSequence."Transport Bänder"."Start Ablauf" := FALSE;[/COLOR]
[COLOR=#333333]#DataSequence."Transport Bänder"."Sperre Ablauf" := TRUE;[/COLOR]
[COLOR=#333333]#DataSequence."Transport Bänder"."Ende Ablauf" := FALSE;
[/COLOR]
 
Hi, du hast einen Kopierfehler in Region 2 (Vermute ich zumindest)

Code:
REGION Sequenz Band 2
   // Schrittkett Band 2
CASE #stepchainBelt2 OF
    0: // Initialisirung     
        IF #StationBasic.AutomaticOff THEN
            #DataSequence."Transport Bänder"."Band 2 start" := FALSE;
        ELSIF #StationBasic.AutomaticOn & NOT #Basic.HandpackingOn & #mainStepchain = 3 THEN
            #DataSequence."Transport Bänder"."Start Ablauf" := True;
         [COLOR=#ff0000][B]   #stepchainBelt1 := 1;[/B][/COLOR]
        END_IF;
        #DataSequence."Transport Bänder"."Sperre Ablauf" := FALSE;
        #DataSequence."Transport Bänder"."Ende Ablauf" := FALSE;

Könnte sein, dass das ganze Problem ist. Mach doch einfach mal einen Trace von #StepchainBelt1 und den Variablen in den Weiterschaltbedingungen.

Außerdem sieht es aus also ob die hier kreuz und quer in den Schritten herumspringst. Vlt. solltest du statt einer Schrittkette die Betriebsmittel mit Zustandslogik steuern? Oder einer Kombination aus beidem.
 
Zuletzt bearbeitet:
Zurück
Oben