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

Ergebnis 1 bis 8 von 8

Thema: Programmabschnitt mit For Schleife Wiederholen

  1. #1
    Registriert seit
    27.08.2014
    Beiträge
    3
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo gleich vor weg ein paar Infos:

    Steuerung: Horner APG.
    Programmiersprache: Strukturierter Text (nach Norm EN 61131-3.)
    Programmiererfahrung: (Berufsschule:Siemens S7 300 FUB.....oder gleich null).

    Ich wollte folgende Funktion schreiben:

    Eine Filteranlage soll 48 Stunden durchgehend im Reinigungsbetrieb sein, wenn die Zeit abgelaufen ist
    dann wird ein anderer Programmabschnitt gestartet.
    Leider kann ich nicht einfach einen Timer nehmen weil ich ihm Maximal 8 Stunden zuweisen kann.
    Ich habe relativ erfolgreich ein Programm geschrieben wo ich das Problem mit zwei Timern die sich gegenseitig
    neustarten und einen Counter mitzählen lassen gelöst habe. Allerdings kommt mir dieser Ansatz sehr fehleranfällig vor.

    Also der Neue Ansatz.

    Mit einer Variable starte ich das ganze, dadurch wird eine for Schleife aktiviert die dann 48 mal einen Timer startet der auf
    eine Stunde eingestellt ist. Wenn der Timer 48 mal durchgelaufen ist Wird eine Variable gesetzt.

    Code:
    if Reinigung_laeuft then //Start Variable
        ink := 0; //ink für Inkremente
                for ink := 0 to 48 by 1 do
                    TON31 (Reinigung_laeuft, 3600);//3600 Sekunden = 1 Stunde
                        if TON31.Q then 
                            ink := ink + 1;//Wert von ink um 1 erhöhen
                        end_if;
                end_for;
    end_if;
        
    //Wenn das ganzue 48 mal durchgelaufen ist soll die Variable High werden
    //aber so funktioniert das nicht.
    
    if ink := 48 then 
        Rueckspuelanforderung :=1;
    end_if;
    Also das ist meine überlegung, der Code ist sicher fehlerhaft denn ich habe keine Ahnung wie eine For Schleife bzw das Inkrementieren funktioniert.


    Seid bitte Nachsichtig mit mir, bin noch ziemlich unerfahren im Programmieren.
    Geändert von Whity93 (27.08.2014 um 14:32 Uhr)
    Zitieren Zitieren Programmabschnitt mit For Schleife Wiederholen  

  2. #2
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Hallo,
    eine For-Schleife inkremetiert (oder dekrementiert) sich selber wenn sie im Script das End_For erreicht.
    Du brauchst für dein Vorhaben die Schleife gar nicht ...! Das würde schon diese Anweisung erledigen :
    Code:
                 TON31 (Reinigung_laeuft, t#3600s);//3600 Sekunden = 1 Stunde
                        if TON31.Q then 
                            ink := ink + 1;//Wert von ink um 1 erhöhen
                        end_if;
    ... allerdings mußt du nach dem Inkrementieren den TON31 wieder neu starten - das sehe ich im Code nicht ...

    Den Code kann man dann auch noch weiter vereinfachen :
    Code:
    Rueckspuelanforderung := (ink = 48) ;
    Gruß
    Larry

  3. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Whity93 (27.08.2014)

  4. #3
    Registriert seit
    17.03.2011
    Ort
    im Wald
    Beiträge
    284
    Danke
    11
    Erhielt 36 Danke für 35 Beiträge

    Standard

    Hallo,

    gucke dir dein Programm einmal online an. Du wirst sehen, das nach dem ersten Durchlauf ink den Wert 49 hat.

    Nach einer Stunde ist TON31.Q gesetzt und mit etwas Glück hat ink den Wert 50.

    Aber die gewünschte Funktion ergibt es nicht.

    Gruß

  5. Folgender Benutzer sagt Danke zu Voxe für den nützlichen Beitrag:

    Whity93 (27.08.2014)

  6. #4
    Registriert seit
    09.11.2007
    Ort
    Rhein Main (Darmstadt)
    Beiträge
    663
    Danke
    61
    Erhielt 112 Danke für 80 Beiträge

    Standard

    Zitat Zitat von Whity93 Beitrag anzeigen
    Hallo gleich vor weg ...
    //Wenn das ganzue 48 mal durchgelaufen ist soll die Variable High werden
    //aber so funktioniert das nicht.

    if ink := 48 then
    Rueckspuelanforderung :=1;
    end_if;
    "if ink := 48 then" ist eine Zuweisung, kein Vergleich !!!!

    Ausserdem muss ink zurück gesetzt werden, wenn die 48 erreicht wird.

    Aber für so etwas gibt es ja den Debugger mit Breakpoints.
    Als Freelancer immer auf der Suche nach interessanten Projekten.
    Zitieren Zitieren Noch ein paar Anmerkungen  

  7. Folgender Benutzer sagt Danke zu RobiHerb für den nützlichen Beitrag:

    Whity93 (27.08.2014)

  8. #5
    Whity93 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    27.08.2014
    Beiträge
    3
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard

    Hallo nochmal,
    Danke für die Schnellen antworten...

    @RobiHerb und @Voxe:
    Wie gesagt ist Strukturierter Text für mich absolutes Neuland also hoffe ich ihr nehmt mir diverse (Programm)- Schreib und Denk fehler nicht übel.
    Das Programm welches ich eingefügt habe sollte nur zeigen wie ich mir das programm ungefähr vorstelle.(Was leider wie ich befürchtet hatte weit von der Realität entfernt war )

    @Larry Laffer

    Ich habe deinen Programmvorschlag gleich mal kopiert und ausprobiert.
    Code:
     TON31 (Reinigung_laeuft, 3);// für versuch auf 3 sekunden gesetzt
    (*Die Zeitanweisung wie man sie normalerweise nimmt klappt hier nicht (zB: t#3s) man darf bei dieser Steuerung nur eine zahl eingeben*)
    
                        if TON31.Q then 
                            ink := ink + 1;//Wert von ink um 1 erhöhen
                        end_if;
    
    Q[2] := (ink = 48);//Ich habe statt einer Variable einen Ausgang genommen um zu sehen ob sich was tut
    Das Programm verhält sich so dass es nach Ablauf der 3 Sekunden dauerhaft raufzählt.

    Ich weiß leider nicht wie ich das Programm schreiben soll damit es wieder neu startet,(Der Plan war dies mit einer For Schleife zu machen, aber du hast
    gesagt das könnte ich mir sparen).
    Könntest du mir sagen wie man das schreibt.

    Danke nochmals

  9. #6
    Registriert seit
    22.03.2007
    Ort
    Detmold (im Lipperland)
    Beiträge
    11.716
    Danke
    398
    Erhielt 2.399 Danke für 1.999 Beiträge

    Standard

    Hallo,
    ich stelle hier noch mal meine Antwort auf die PN ein, die ich erhalten habe ...

    Zitat Zitat von Whity93
    Habe jetzt dreimal versucht noch eine Antwort zu Posten aber das hat nicht geklappt.
    ... schon geklärt - deine Beiträge (es waren ursprünglich 6) mußten alle noch freigeschaltet werden - das besagte auch die Forums-Meldung. Alle Doppelposts habe ich gelöscht ...

    Zitat Zitat von Whity93
    Habe deinen Vorschlag gleich ausprobiert:

    Code:
    TON31 (Reinigung_laeuft , 3);//3 sekunden für Versuch. SChreibweise t#3s in diesem Editor nicht notwendig.
    if TON31.Q then
    ink := ink + 1;//Wert von ink um 1 erhöhen
    end_if;

    Q[2] := (ink = 4 ;
    Das Programm Verhält sich folgender maßen:
    Nach Ablauf der Drei Sekunden wird hochgezählt allerdings unendlich..


    Wie du richtig annimmst - es liegt an dem Timer, da du ja ständig inkrementiert so lange der Timer.Q aktiv ist und das ist er nach Ablauf des Timers so lange wie Reinigung_Laeuft aktiv ist.
    Um das zu verhindern könntest du dir z.B. eine Statische Hilfsvariable erschaffen, die das verhindert. Ich baue das mal in deinen Code mit ein :
    Code:
    TON31 (Reinigung_laeuft and not Timer_abgelaufen , 3);//3 sekunden für Versuch. SChreibweise t#3s in diesem Editor nicht notwendig.
     Timer_abgelaufen := TON31.Q ; 
    
     if Timer_abgelaufen then
        ink := ink + 1 ;  //Wert von ink um 1 erhöhen
     end_if;
    
     Q[2] := (ink >= 4:cool: ;
    Ich hoffe, du kommst so weiter ...

    Gruß
    Larry
    Geändert von Larry Laffer (28.08.2014 um 12:59 Uhr)

  10. Folgender Benutzer sagt Danke zu Larry Laffer für den nützlichen Beitrag:

    Whity93 (28.08.2014)

  11. #7
    Registriert seit
    17.03.2011
    Ort
    im Wald
    Beiträge
    284
    Danke
    11
    Erhielt 36 Danke für 35 Beiträge

    Standard

    Hallo,

    evtl. noch einmal zur Erklärung der Schleife:

    FOR idx := 0 TO 5 DO
    irgendetwas
    END_FOR

    die Schleife wird immer 6 mal durchlaufen, nach jedem Durchlauf wird idx um 1 automatisch erhöht. Nach dem 6ten Durchlauf ist idx = 6.

    Wie Larry beschrieben hat, brauchst du eigentlich einen Zähler. Eine Schleife ist ungeeignet weil sie immer durchlaufen wird. Man könnte noch einen BREAK verwenden, das ist aber durch den Rücken ins Auge geschossen.

    Gruß
    Geändert von Voxe (28.08.2014 um 13:15 Uhr)

  12. Folgender Benutzer sagt Danke zu Voxe für den nützlichen Beitrag:

    Whity93 (28.08.2014)

  13. #8
    Whity93 ist offline Neuer Benutzer
    Themenstarter
    Registriert seit
    27.08.2014
    Beiträge
    3
    Danke
    5
    Erhielt 0 Danke für 0 Beiträge

    Standard


    Zuviel Werbung?
    -> Hier kostenlos registrieren
    Hallo,

    Danke an alle für die schnelle und tolle Hilfe.
    Habe die Funktion mit eurer Hilfe so aufbauen können dass ich damit arbeiten kann.

    Besten Dank & Grüße
    Whity

Ähnliche Themen

  1. Step 7 Unterschied zwischen IF- Schleife und While-Schleife
    Von Vokal12 im Forum Simatic
    Antworten: 11
    Letzter Beitrag: 29.10.2013, 22:52
  2. Verständnisproblem mit AR in Schleife
    Von Pico1184 im Forum Simatic
    Antworten: 20
    Letzter Beitrag: 22.08.2013, 13:38
  3. Datenbankproblem mit Schleife
    Von stackoverflow im Forum Simatic
    Antworten: 1
    Letzter Beitrag: 23.01.2012, 06:32
  4. Antworten: 22
    Letzter Beitrag: 14.01.2011, 12:10
  5. WinCC 6.0 SP4 Alarmton wiederholen
    Von steinche im Forum HMI
    Antworten: 0
    Letzter Beitrag: 17.02.2010, 09:17

Stichworte

Lesezeichen

Berechtigungen

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