Programmabschnitt mit For Schleife Wiederholen

Whity93

Level-1
Beiträge
3
Reaktionspunkte
0
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.:D
 
Zuletzt bearbeitet:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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ß
 
Noch ein paar Anmerkungen

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.
 
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 :D)

@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 :D
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich stelle hier noch mal meine Antwort auf die PN ein, die ich erhalten habe ...

Whity93 schrieb:
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 ... 8)

Whity93 schrieb:
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 = 48) ;
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
 
Zuletzt bearbeitet:
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ß
 
Zuletzt bearbeitet:
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
 
Zurück
Oben