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

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

Thema: Programmierung einer zyklischen Beckhoff SPS mit ST

  1. #1
    Registriert seit
    18.12.2014
    Beiträge
    13
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo ich habe mal wieder ein kleines Problem.

    Ich bin derzeit dabei ein Fließband zu steuern und zwar wie folgt:

    In der Mitte des Fließbandes befindet sich ein Sensor, wenn unter diesem etwas hin und herfährt gibt mir der Sensor dies zurück.
    Zu einem festen Zyklus fällt nun in einem vordefinierten Bereich x, links oder rechts vom Sensor, ein Paket auf das Fließband.
    Nun soll sich das Band zu jedem Zyklus arretieren, sprich, das Paket fällt runter und das Band fährt einmal nach links und rechts,
    damit der Sensor merkt ob ein Paket auf dem Band liegt.

    Ist ein Paket da sollen die ersten 5 Pakete nach rechts transportiert werden. Danach sollen die nächste 5 nach links transportiert werden und das wiederholt sich dann immer.
    Die Richtung kann man steuern, sowie den Motor an oder aus machen.

    Ich habe das Programm eigentlich schon fast fertig, es fehlt lediglich noch der Teil, wo das Paket zu Beginn eines jeden Zyklus nach links und rechts fährt, damit der Sensor sieht ob etwas da ist.
    Anmerkung: Es ist immer nur ein Paket gleichzeitig auf dem Fließband.

    Code:
    //Deklarierung der Variablen-Eingänge//Tasten für Steuerrichtungen, Signal der Lichtschranke und Motor Ein-/Auschalten
    VAR_INPUT
    TasteRechts:BOOL;
    TasteLinks:BOOL;
    TasteMotor:BOOL;
    Lichtschranke:BOOL;
    END_VAR
    
    //Ausgänge, Motoransteuerung
    VAR_OUTPUT
    Links:BOOL;
    Rechts:BOOL;
    MotorStart:BOOL;
    END_VAR
    
    //Wird bei einem Stromausfall gesichert
    VAR RETAIN
    Zaehler:BYTE;
    END_VAR
    
    //Initialisierung
    //Am Anfang ist der Motor aus und keine Drehrichtung eingestellt
    Motorstart:=False;
    Links:=False;
    Rechts:=False;
    
    //Wenn die Motortaste gedrückt wird und der Motor aus ist
    //wird der Motor eingeschaltet
    IF TasteMotor AND NOT Motorstart THEN
        
        MotorStart:=True;
    
    //Wenn die Motortaste gedrückt wird und der Motor an ist
    //wird der Motor ausgeschaltet
    ELSIF TasteMotor AND Motorstart THEN
        
        Motorstart:=False;
    END_IF
    
    //Wenn die Taste für Rechtsbetrieb gedrücht wird
    //wird die der Motor in Rechtsbetrieb geschaltet
    IF TasteRechts THEN
        
        Links:=False;
        Rechts:=True;
    
    //Wenn die Taste für Linksbetrieb gedrücht wird
    //wird die der Motor in Linksbetrieb geschaltet
    ELSIF TasteLinks THEN
        
        Rechts:=False;
        Links:=True;
    
    END_IF
    
    
    //Solange der Motor an ist und wenn genau eine Richtung vorgegeben wurde
    //wird die Schleife ausgeführt
    WHILE MotorStart AND (Rechts XOR Links) DO
    
    //Wenn die Lichtschranke ausgelöst wird, erhöht sich der Zähler um 1
    
        IF Lichtschranke THEN
            
            Zaehler:=Zaehler+1;
    
    //Erreicht der Zähler 5 und die Drehrichtung ist links
    //ändert sich die Richtung auf rechts und der Zähler wird zurückgesetzt.
    //Ist der Zähler kleiner als 5 und es wird die rechte Taste
    //betätigt, wird ebenfalls die Richtung geändert.
    //Dies ist notwendig um im laufenden Betrieb die Richtung wechseln zu können.
            ELSIF (Zaehler>=5 OR TasteRechts) AND Links THEN
            
                    Links:=False;
                    Rechts:=True;
                    Zaehler:=0;
                    
            ELSIF (Zaehler>=5 OR TasteLinks) AND Rechts THEN    
                    
                    Links:=True;
                    Rechts:=False;
                    Zaehler:=0;
                    
        END_IF;
    
     END_WHILE;
    Als ich den Code so abgegeben habe wurde angemerkt, dass es so nicht funktionieren würde, mit Verweis darauf, dass bei einem neuen Zyklus alle lokal initialisierten variablen wieder resettet werden.
    Das wäre sehr schlecht weil ich dann nicht weiss wie ich den Zähler realisieren soll.

    Zusätzlich habe ich das Problem das ich nicht weiss wie das mit den Zyklen genau funktioniert und/oder wie ich einen Timer einsetzten kann, der dem Motor sagt das er sich bei jedem Zyklus um einen festen Zeitwert nach links oder rechts drehen soll. Vielleicht blickt ja einer von euch da mehr durch.

    Ich suche auch noch immer nach guten Büchern, leider ist die Doku zu ST auf der Beckhoff Seite selbst nicht sehr umfangreich und zu Timern finde ich generell nichts. Ich hatte bisher auch nur mit Ereignisbasierten Sprachen im klassischen PC bereich zu tun, sprich c++ etc. deswegen will mir dieses zyklus konzept nicht ganz einleuchten.

    Lg

    der Benutzer
    Zitieren Zitieren Programmierung einer zyklischen Beckhoff SPS mit ST  

  2. #2
    Registriert seit
    21.02.2014
    Ort
    Sachsen-Anhalt
    Beiträge
    1.490
    Danke
    263
    Erhielt 243 Danke für 222 Beiträge

    Standard

    Mir hat beim Einstieg sehr schnell geholfen:

    SPS-Programmierung nach IEC 61131-3 (4. Auflage mit DVDs) - Mit Beispielen für CoDeSys und Step 7 von Heinrich Lepers.

    Damit habe ich eigentlich schnell den Einstieg bekommen und kurz danach auch meine erste Anlage auf die Beine gestellt. Ist bei Amazon oder so bestimmt günstig als Remittend zu bekommen.
    Außerdem sind zu ST bei Beckhoff im Infosys doch schon einige Dokumente verstreut.

    Das Konzept Deiner Anlage scheint ein sehr theoretisches zu sein. Nun ja...
    Was Dein Problem mit der zyklischen Codeausführung angeht: Ist doch auf anderen Plattformen fast gleich. Arbeitet das PC-Proggi nicht zyklisch in einer LOOP?
    Das wesentlich andere ist die Sache mit dem Prozessabbild. Also die Abbarbeitung des Programms erfolgt bei der SPS mit einem konsistenten Abbild der Eingänge (PAE). Das schreiben der Ausgangswerte auf die Ausgänge erfolgt erst am Ende des Programms automatisch (PAA).

    Bei Beckhoff erfolgt die zyklische Abbarbeitung in einem festen Zeitraster. Das Entspricht bei Deiner PC-Loop einer Pause am Ende vor dem Rücksprung zum Anfang. So dolle anders ist es eigentlich nicht.


  3. #3
    DerBenutzer ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.12.2014
    Beiträge
    13
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Na was heißt theoretisch, diese Aufgabenstellung habe ich leider so bekommen ...
    Das sie eher nicht so sinnvoll ist will ich gar nicht anzweifeln.
    Ist halt dämlich wenn die Uni einem drei Wochen Zeit gibt sich in ein Thema einzulesen und eine SPS STeuerung zu realisieren, wenn man
    das noch nie vorher gemacht hat.

    Mit dem Buch hatte ich mich auch schon beschäftigt, allerdings war das einfach etwas zu viel, und vor allem in der Regel wenig ST sondern mehr AWL und FBS.

  4. #4
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    745
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    Da hast Du ein grosses Problem, weil
    a) Du mit der zyklischen Programmbearbeitung einer SPS nicht vertraut bist,
    b) die Qualität der Anmerkung, die Du zu Deinem Programm bekommen hast, auf Mircrosoft-Support-Niveau liegt.
    Ich versuche mal, Dir einen schnellen Einstieg zu geben. Das SPS-Betriebssystem stellt Dir etwa Folgendes zur Verfügung:
    Code:
    WHILE SystemRun DO
       Copy_Hardware_Inputs_to_Input_Variables;
       Call UserProgram;   (* Heisst bei einem neu angelegten Projekt MAIN *)
       Copy_Output_Variables_to_Hardware_Outputs;
       Suspend_Control_Task;   (* Wird vom Timer-Interrupthandler in einem festen Zeitraster (Zykluszeit) wieder aktiviert *)
    END_WHILE
    Du brauchst nur das User_Program MAIN schreiben. Nehmen wir mal an, dass ein Antrieb ein- und ausgeschaltet werden soll. Als Ablaufprogramm, ähnlich wie Du Dein Programm geschrieben hast,
    würde das etwa so aussehen:
    Code:
    REPEAT
    UNTIL StartTaster;
    END_REPEAT
    Antrieb:=TRUE;
    REPEAT
    UNTIL StopTaster;
    END_REPEAT
    Antrieb:=FALSE;
    Das würde schon deshalb nicht funktionieren, weil der Datenaustausch zwischen Hardware und I/O-Variablen ja nur einmal in der Betriebssystem-Schleife erfolgt. Vor allem hätte es aber den Nachteil, dass keine weitere Steuerungsfunktion bearbeitet werden könnte, solange das Programm in einer der REPEAT UNTIL-Schleifen festhängt. Deshalb schreibt man das anders:
    Code:
    IF StopTaster THEN
       Antrieb:=FALSE;
    ELSIF StartTaster THEN
       Antrieb:=TRUE;
    END_IF
    Bei dieser Art der Programmierung kannst Du problemlos weitere Steuerungsfunktionen einbinden:
    Code:
    IF StopTaster THEN
       Antrieb:=FALSE;
    ELSIF StartTaster THEN
       Antrieb:=TRUE;
    END_IF
    IF StopTaster2 THEN
       Antrieb2:=FALSE;
    ELSIF StartTaster2 THEN
       Antrieb2:=TRUE;
    END_IF
    Die Laufzeit der Schleife wird zwar etwas länger, aber die paar Mikrosekunden (wenn es überhaupt so viel ist), machen den Kohl nicht fett. Von aussen betrachtet würde es immer noch so aussehen, als ob beide Steuerungsfunktionen gleichzeitig bearbeitet würden. Und genau darauf kommt es bei einer SPS an.

    Ich hoffe, Dir damit etwas weiter zu helfen, auch wenn sicher noch einige Stolpersteine im Weg liegen werden.

  5. Folgende 4 Benutzer sagen Danke zu StructuredTrash für den nützlichen Beitrag:

    DerBenutzer (21.12.2014),Otto (11.08.2015),Pneumatik (13.09.2017),weißnix_ (20.12.2014)

  6. #5
    Registriert seit
    21.02.2014
    Ort
    Sachsen-Anhalt
    Beiträge
    1.490
    Danke
    263
    Erhielt 243 Danke für 222 Beiträge

    Standard

    Das ist eine ausgezeichnete Kurzbeschreibung. Respekt.

  7. Folgender Benutzer sagt Danke zu weißnix_ für den nützlichen Beitrag:

    Otto (11.08.2015)

  8. #6
    DerBenutzer ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.12.2014
    Beiträge
    13
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Super vielen Dank jetzt verstehe ich es und das macht die Sache auch ziemlich leicht denke ich.
    Es bleibt nur eins was ich noch nicht gefunden habe. Wenn wir das ganze realistisch betrachten, wird
    ja ein Antrieb hier von links nach rechtsbetrieb umgeschaltet. Unter Umständen wäre es dann ja nötig,
    dass man bevor man von links nach rechts umschaltet, einen kleinen timer einbaut, der ein paar sekunden wartet,
    damit der motor erst in den leerlauf springen kann. Ansonsten könnte es auf Dauer das Getriebe etwas mitnehmen.

    Gibt es eine interne vordefinierte Methode/Funktion mit der ich dem Programm innerhalb des Zyklus sagen kann beispielweise
    20 Millisekunden auf etwas zu warten oder für einen gewissen zeitraum das band nach links oder rechts zu fahren?

  9. #7
    Registriert seit
    21.02.2014
    Ort
    Sachsen-Anhalt
    Beiträge
    1.490
    Danke
    263
    Erhielt 243 Danke für 222 Beiträge

    Standard

    Das mit der Pause beim reversieren ist auf jeden Fall eine gute Idee.
    Die vordefinierte Funktion heisst TON bzw. TOF, je nach Realisierungsweise.

    Mir scheint, du solltest noch etwas über die zyklisch kontinuierliche Programmabarbeitung nachdenken.

    In der SPS-Welt ist es, wie weiter oben schon erwähnt, wichtig ein Programm immer vollständig abzuarbeiten, da innerhalb des Programms eine Vielzahl von Steuerungsfunktionen quasi gleichzeitig aktiv sind. Nur weil an einer STelle auf eine Reaktion oder eine Beendigung gewartet wird, darf der Rest nicht unterbrochen werden.

    Daher sieht das dann mit den Timern grob gesagt so aus:

    Code:
    var
    timer:TON;
    bewegung_rechts:bool;
    end_var;
    
    timer(pt=t#1s);    (*zykl. Aufruf des Timers*)
    if  bewegung_rechts then timer.in:=true; else timer.in:=false; end_if;   (*par example: wenn also die bewegung nach rechts aktiv ist, timer  starten*)
    if timer.q then bewegung_rechts:=false; end_if;          (*wenn der timer abgelaufen ist, die bewegung stoppen*)

  10. #8
    Registriert seit
    21.02.2014
    Ort
    Sachsen-Anhalt
    Beiträge
    1.490
    Danke
    263
    Erhielt 243 Danke für 222 Beiträge

    Standard

    Bei Beckhoff ist die Demo machine.pro dabei. Das solltest Du Dir mal ansehen.

    send wia hendi
    - Der frühe Wurm wird vom Vogel gefressen -

  11. #9
    Registriert seit
    25.11.2010
    Ort
    OWL
    Beiträge
    745
    Danke
    27
    Erhielt 164 Danke für 142 Beiträge

    Standard

    Zitat Zitat von DerBenutzer Beitrag anzeigen
    Gibt es eine interne vordefinierte Methode/Funktion mit der ich dem Programm innerhalb des Zyklus sagen kann beispielweise
    20 Millisekunden auf etwas zu warten oder für einen gewissen zeitraum das band nach links oder rechts zu fahren?
    Nochmal: Du kannst im Zyklus nicht auf irgendetwas warten, weil
    a) die I/Os während der Bearbeitung Deines Programms gar nicht aktualisiert werden,
    b) alle anderen Steuerungsfunktionen dann auch warten müssten.

    Auch der Ablauf eines SPS-Timers erstreckt sich über mehrere Zyklen. In dem Zyklus, in dem der Timer gestartet wird (Timer.In wird True), merkt sich der Timer nur die Systemzeit als Startzeit. In den folgenden Zyklen wird er immer wieder aufgerufen und vergleicht dabei die Systemzeit mit der gespeicherten Startzeit. In irgendeinem Zyklus wird dann die Differenz zwischen System- und Startzeit >= der Sollzeit. In diesem Zyklus wird der Ausgang Timer.Q True. Nachdem Du Timer.Q ausgewertet hast, kannst Du Timer.In wieder auf False setzen, um den Timer für den nächsten Zeitablauf zu resetten.

  12. #10
    DerBenutzer ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    18.12.2014
    Beiträge
    13
    Danke
    1
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Sooo nach den Feiertagen hab ich mich mal wieder drangesetzt. Ich hab das Problem etwas vereinfacht um den vielleicht besser Herr zu werden und eure Vorschläge so gut ich kann berücksichtigt.

    Die Aufgabe soll es sein, ein Paket links oder rechts von einer Lichtschranke in einem vordefinierten Bereich abzulegen. Zu Beginn eines jeden Zyklus, beispielsweise alle 30 Sekunden, soll die Steuerung nun erkennen
    ob ein Paket auf dem Band liegt. Dafür muss das Fließband eine bestimmte Zeitdauer (5s) nach links fahren, damit das Paket die Lichtschranke passiert. Liegt das Paket unglücklicherweise jedoch auf der anderen Seite des Sensors
    muss das Fließband nach Rechts fahren, dieses mal jedoch 5s + 5s=10s da es das Paket ja zuvor bereits 5s in die falsche Richtung befördert hat.

    Schlägt der Sensor bei einem der beiden Passiervorgänge aus, wird das Paket zuerst 5 mal nach links, danach 5 mal nach Rechts vom Fließband befördert, wobei wir davon ausgehen das dies selbst im schlechtesten Fall innerhalb von 20s
    passiert ist.

    Ich habe jetzt das Programm dazu geschrieben und würde mich natürlich über ein paar Kommentare/Ratschläge freuen! (Bei der Zählvariable bin ich mir nicht ganz sicher wie ich sie initialisieren soll, da sie ihren Wert ja
    nicht verlieren darf, aber einmal ganz am Anfang eigentlich auf 0 Gesetzt werden müsste...)

    Code:
    VARLinks:BOOL;
    Rechts:BOOL;
    Leerlauf:BOOL;
    Richtung:BOOL;
    Motor:BOOL;
    Lichtschranke:BOOL;
    timer1:TON;
    timer2:TON;
    timer3:TON;
    zaehler:BYTE;
    
    
    (*Initialisierung der Variablen*)
    Links:=False;
    Rechts:=False;
    Leerlauf:=False;
    Motor:=False;
    
    
    (*Die Timer*)
    timer1.pt:=T#5s;
    timer2.pt:=T#10s;
    timer3.pt:=t#20s;
    END_VAR
    (*Das Programm startet und das Fließband geht für 5 Sekunden nach links*)
    Motor:=True;
    Links:=True;
    
    
    timer1.IN:=True;
    
    
    (*Solange die pt Zeit bon timer1 nicht abgelaufen ist und wenn die Lichtschranke aktiviert wird*)
    if timer1.Q=false AND Lichschranke=True THEN
    
    
    	(*Solange noch keine 5 Pakte nach links gefahren wurden wird dies ausgelöst*)
    	if zaehler=<4 THEN
    	Links:=True;
    	timer3.IN=True;
    	zaehler:=zaehler+1;
    	(*Ist der Timer abgelaufen und das Paket sicher vom Band wird das Programm beendet und auf den nächsten Zyklus gewartet*)
    	if timer3.Q=true THEN EXIT; END_IF;
    	elsif zaehler=10 THEN
    	zaehler:=0;
    	else
    	(*Solange 5=<zaehler<10 wird das Paket nach links befördert*)
    	Links:=False;
    	Rechts:=True;
    	timer3.IN=True;
    	zaehler=zaehler+1;
    	if timer3.Q=true THEN EXIT; END_IF;
    	end_if;
    (*Ist die Zeit von timer1 abgelaufen und die Lichtschranke hat nicht ausgelöst*)
    (*wird timer1 resettet und timer2 geht an und die richtung des fließbands wird gewechselt*)
    else timer1.Q=True AND Lichtschranke=False 
    
    
    timer1.IN=false;
    timer2.IN=True;
    Links:=False;
    Rechts:=True;
    
    
    (*Solange die pt Zeit von timer2 nicht abgelaufen ist und wenn die Lichtschranke aktiviert wird*)
    	if timer2.Q=False AND Lichtschranke=True THEN
    	
    		if zaehler=<4 THEN
    		Links:=True;
    		timer3.IN=True;
    		zaehler:=zaehler+1;
    		if timer3.Q=true THEN EXIT; END_IF;
    		elsif zaehler=10 THEN
    		zaehler:=0;
    		else
    		Links:=False;
    		Rechts:=True;
    		timer3.IN=True;
    		zaehler=zaehler+1;
    		if timer3.Q=true THEN EXIT; END_IF;
    		end_if;
    		
    (*Wenn die Lichtschranke nicht ausgelöst hat, sprich kein Paket aufs Band gelegt wurde geht der Motor aus*)	
    	else 
    	
    	Motor:=False;
    	
    	end_if;
    	
    end_if;

Ähnliche Themen

  1. TIA S7-1212C mit V11 programmiert, mit V13 geändert
    Von kleiner mann im Forum Simatic
    Antworten: 5
    Letzter Beitrag: 19.08.2014, 14:43
  2. Antworten: 0
    Letzter Beitrag: 24.05.2012, 09:35
  3. Antworten: 10
    Letzter Beitrag: 14.04.2012, 17:28
  4. Programmierung einer KL2541 mit Beckhoff
    Von waska87 im Forum CODESYS und IEC61131
    Antworten: 0
    Letzter Beitrag: 20.01.2012, 21:57
  5. Wer programmiert uns eine Beckhoff-Steuerung?
    Von tiefel00 im Forum Suche - Biete
    Antworten: 1
    Letzter Beitrag: 22.10.2010, 16:22

Lesezeichen

Berechtigungen

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