# Schrittkette?? noch nie gemacht.



## McNugget (15 Oktober 2008)

Hallo,

bevor alle mich zurechtweisen: ich habe die Suche bereits bemüht, aber nichts wirklich passendes gefunden.

Vielleicht ist eine Schrittkette auch falsch und es geht besser in ST. Aber erst mal denke ich an AS.


Ich brauche folgendes:
Variablen:
VAR_INPUT
 Aktivierung_SK                     :BOOL;
Nachlauf_Umwälzung_SK        :TIME;
Abfluss_SK                          :TIME;
HG_DAUER_ingesamt_SK        :TIME;
HG_Takt_HI_SK                    :TIME;
HG_Takt_LO_SK                   :TIME;
Wartezeit_SK                      :TIME;

END_VAR

VAR_OUTPUT
Umwaelzung_Kontakt_SK      :BOOL;
Abfluss_Kontakt_SK            :BOOL;
HG_Kontakt_SK                   :BOOL;
Ablauf_beendet                   :BOOL;
    Umwaelzung_Ablauf             :Time;
    Abfluss_Ablauf                    :Time;
    HG_Dauer_Ablauf                :Time;
    Wartezeit_Ablauf                :Time;

END_VAR


Der Programmablauf sollte folgender sein (kein Anspruch auf korrekten Code, will es nur mal so zeigen):


Entweder:
Aktivierung_SK=False ---->>> Return (nichts soll passieren)


Oder:
Aktivierung_SK=True 

dann

-->>Umwaelzung_Kontakt=True für die Dauer von Nachlauf_Umwälzung
       Dabei soll Umwaelzung_Ablauf angezeigt werden.

danach

-->>Abfluss_Kontakt_SK=True für die Dauer von Abfluss_SK
       Dabei soll Abfluss_Ablauf angezeigt werden.

danach

-->>Ablauf der Zeit HG_Dauer_insgesamt, innerhalb dieser Zeit soll ein Taktgeber, der durch HG_Takt_HI_SK und HG_Takt_LO_SK parametriert ist, den Ausgang HG_Kontakt_SK schalten.
Dabei soll HG_Dauer_Ablauf angezeigt werden.

danach

-->>Ablauf der Zeit Wartezeit_SK

danach

-->> Ablauf_beendet soll für 1 Sekunde schalten, um anzuzeigen, dass der Ablauf beendet ist.

Wie löst man so eine Aufgabe am Besten?

Danke schon mal für´s Lesen.


Gruss 

McNugget


----------



## Larry Laffer (16 Oktober 2008)

Hallo,
nur mal so als Start-Impuls :
	
	



```
U 10.0
U [COLOR=#ff0000]Aktivierung_SK[/COLOR]
[COLOR=black]U [/COLOR][COLOR=#008000]Umwaelzung_Kontakt[/COLOR]
[COLOR=black]S M 10.1[/COLOR]
[COLOR=black]R M 10.0[/COLOR]
 
U M10.1
L [COLOR=#ff0000]Nachlauf_Umwälzung[/COLOR]
[COLOR=black]SE T1[/COLOR]
U T1
S M10.2
R M10.1
 
U M10.2
U [COLOR=#008000]Abfluss_Kontakt_SK[/COLOR]
[COLOR=black]S M10.3[/COLOR]
[COLOR=black]R M10.2[/COLOR]
 
[COLOR=black]U M10.3[/COLOR]
[COLOR=black]L [COLOR=#ff0000]Abfluss_SK[/COLOR]
[/COLOR][COLOR=black]SE T2[/COLOR]
[COLOR=black]U T2[/COLOR]
[COLOR=black]S M10.4[/COLOR]
[COLOR=black]R M10.3[/COLOR]
 
[COLOR=black]usw.[/COLOR]
```
Vielleicht bringt dich das etwas in die Spur ...

Gruß
LL


----------



## trinitaucher (16 Oktober 2008)

Meine Hilfestellung für CoDeSys /TwinCAT:


```
IF bedingung OR bedingung1 then
  (*tu_dies*);
ELSIF bedingung2 then
  (*tu_das*);
ELSE 
  (*tu_was_anderes*);
END_IF
```
Schrittketten in ST gehen gut mit CASE-Anweisungen:

```
(* Bedingung für Start der Schrittkette*)
IF Startbdingung AND NOT Abbruchbedingung THEN
  Schrittzahler := 1;
END_IF

CASE Schrittzahler OF
1: (*....*)
    Schrittzahler := 2;
2: (*....*)
    Schrittzahler := 3;
3: (*....*)
    Schrittzahler := 4;
4: (*....*)
    Schrittzahler := 0;
END_CASE

(* Abbruch der Schrittkette *)
IF Abbruchbedingung THEN
   Schrittzahler := 0;
END_IF
```


----------



## Zickenbändiger (16 Oktober 2008)

*Schrittkette*

Hallo MC Nugget

habe mal auf die schnelle eine Schrittkette aufgestellt so wie wir sie programmieren das ganze wird in AS als FB programmiert.


----------



## McNugget (16 Oktober 2008)

Hallo allerseits.

vielen Dank für die vielen Ansätze.

@LL: Vielen Dank für Deine Mühe. Mit AWL habe ich so meine Probleme. Habe ich noch nie verwendet, da ich alles bisher gut in FUP erledigen konnte. Ich wollte es extra in AS haben, da hier zyklische Abläufe am besten zu bewältigen sind.
Am liebsten möchte ich mich gar nicht mit AWl beschäftigen, das fand ich in der Berufsschule schon recht umständlich. Lieber ST und FUP und eben für diesen Ablauf mal AS.

@Trinitaucher:Ein Ansatz in ST ist auch nicht schlecht. ich werde das Ganze alternativ noch mal in ST durchkauen, um es mal zu üben. Vielen Dank.

@Zickenbändiger: So hatte ich mir das gedacht. Aber ich verstehe nicht, wie das laufen soll: Wie sage ich dem gesamten AS-Baustein "test" dass er 1-Mal abgearbeitet werden soll und springe dann wieder heraus?
Neben "Init" ist "Action_1" Rufe ich mit so einer Aktion ein Unterprogramm auf?
Wie drücke ich aus dem Unterprogramm aus, dass dieses beendet ist und dass nun zum nächsten Block gesprungen werden kann?

Aktuell habe ich es in FUP realisiert, mit vielen Sets und Resets. Funktioniert, ist aber irgendwie nicht soo schön, weil man wirklich alles explizit abfangen muss.

Wie gesagt: habe noch nie was in AS gemacht, und leider mein schlaues Büchlein schon länger nicht mehr wiederbekommen. 

Vielen Dank noch mal an alle, die sich dir Mühe gemacht haben, zu antworten.

McNugget


----------



## HeizDuese (16 Oktober 2008)

Besser ist es, den gewollten Zustand (Schritt) in einer Integer-Variablen zu speichern. Die Zuweisung kann z.B. mit einem "move" in FUP geschehen. Die gewünschten Aktionen (Abfrage auf Schritt-Nr) kann an entsprechneder Stelle mittels Vergleicher (CMP ==I) geschehen. Funktionieren wird auch eine Variante mit einzeln gestezten Bits - die sind aber aufwendiger zu verwalten und führen schnell zu Fehlern (mehrere Bits gesetzt) - deshalb haben auch viele dieser Schrittketten einen "All-Reset"  .


----------



## Larry Laffer (16 Oktober 2008)

Hallo,
für eine Realisierung in ST / SCL würde ich persönlich den Vorschlag 2 von *Trinitaucher* favourisieren. Das kommt einer schrittweisen Bearbeitung  und einer sauberen Strukturierung am Ehesten entgegen ...

Gruß
LL


----------



## McNugget (16 Oktober 2008)

@HeizDuese: Das mit "move" und der Integer-Variablen verstehe ich nicht so ganz. Kann ich mir das so vorstellen: wenn Erster Schritt dann setze Status-Variable auf "1".
Wenn Statusvariable ="1" dan arbeite den zweiten Schritt ab. nach Abarbeiten des zweiten Schritts setze Statusvariable auf "2".. usw???

Quasi ein "Nockenzähler"???

@LL: Ja, den Ansatz finde ich auch klasse, nur habe ich da wieder das Problem, dass ich viele Zeiten ablaufen lassen muss. Das war ja in ST nicht so schrecklich einfach und fehlerfrei zu realisieren.

Gruss

McNugget


----------



## Larry Laffer (16 Oktober 2008)

McNugget schrieb:


> @LL: Ja, den Ansatz finde ich auch klasse, nur habe ich da wieder das Problem, dass ich viele Zeiten ablaufen lassen muss. Das war ja in ST nicht so schrecklich einfach und fehlerfrei zu realisieren.


 
Wo ist das Problem ?
Du mußt es nur richtig anfangen. Ich würde an dieser Stelle vielleicht nicht unbedingt einen "normalen" Timer nehmen, sondern vielleicht einen IEC-Timer. Das ist dann kein Problem.
Eine andere Alternative wäre sich die Uhrzeit (Systemzeit) beim Start der Zeitfunktion zu "merken" plus der gewünschten Verzögerung und dann immer vergleichen, ob die aktuelle Zeit größer als die "gemerkte" Zeit ist.

Gruß
LL


----------



## Ralle (16 Oktober 2008)

Larry Laffer schrieb:


> Wo ist das Problem ?
> Du mußt es nur richtig anfangen. Ich würde an dieser Stelle vielleicht nicht unbedingt einen "normalen" Timer nehmen, sondern vielleicht einen IEC-Timer. Das ist dann kein Problem.
> Eine andere Alternative wäre sich die Uhrzeit (Systemzeit) beim Start der Zeitfunktion zu "merken" plus der gewünschten Verzögerung und dann immer vergleichen, ob die aktuelle Zeit größer als die "gemerkte" Zeit ist.
> 
> ...


 
LL, dies ist der Beckhoff-Thread ! Da gibts nur IEC-Timer.


----------



## Larry Laffer (16 Oktober 2008)

Dann verstehe ich das Timer-Problem umsoweniger ...

Ich denke aber, dass das eigentliche Thema "inter-Herstellerbezogen" zu betrachten ist ...


----------



## Ralle (16 Oktober 2008)

Larry Laffer schrieb:


> Dann verstehe ich das Timer-Problem umsoweniger ...
> 
> Ich denke aber, dass das eigentliche Thema "inter-Herstellerbezogen" zu betrachten ist ...


 
Aber ja, *ACK* Nur, damit du nicht auf die falsche Spur gerätst.


----------



## Larry Laffer (16 Oktober 2008)

Ralle schrieb:


> Nur, damit du nicht auf die falsche Spur gerätst.



Ist schon richtig - manchmal vergißt/übersieht man das Eine oder Andere in seinem Wahn ...


----------



## trinitaucher (17 Oktober 2008)

Guten Morgen!


McNugget schrieb:


> @LL: Ja, den Ansatz finde ich auch klasse, nur habe ich da wieder das Problem, dass ich viele Zeiten ablaufen lassen muss. Das war ja in ST nicht so schrecklich einfach und fehlerfrei zu realisieren.s


Daher hier nochmal eine Version mit Timern (jeweils Einschaltverzögerungen "TON"):

```
(* Bedingung für Start der Schrittkette*)
IF Startbdingung AND NOT Abbruchbedingung THEN
  Schrittzahler := 1;
END_IF

CASE Schrittzahler OF
1: (*...*)
    TON_1.IN := TRUE;   (* einschalten des Timers *)
    (*...*)
    IF TON_1.Q THEN     (* erst wenn Timer abgelaufen springe in Schritt 2  *)
       TON_1.IN := FALSE; (* Timer zurücksetzen *)
        Schrittzahler := 2;
    END_IF
2: (*....*)
    Schrittzahler := 3;
3: (*....*)
    Schrittzahler := 4;
4: (*....*)
    TON_2.IN := TRUE;   (* einschalten des 2. Timers *)
    tTime_Anzeige := TON_2.ET;     (* Anzeigen der Zeit, hier als Zeitvariable, ggf. zu konvertieren (siehe unten) *)
    IF TON_2.Q THEN
       TON_2.IN := FALSE; (* Timer zurücksetzen *)
       Schrittzahler := 0;
    END_IF
END_CASE

(*Anzeige der Zeit (in Sekungen) *)
diZeitAnzeige := TIME_TO_DINT(TON_2.ET)/ 1000;

(* Abbruch der Schrittkette, evtl. mit Rücksetzen der Timer *)
IF Abbruchbedingung THEN
   TON_1.IN := FALSE;
   TON_2.IN := FALSE;
   Schrittzahler := 0;
END_IF

(* Aufruf der Zeitbausteine *)
TON_1(PT := t#1s); (*jeweils die gewünschte Zeit parametrieren*)
TON_2(PT := t#2s);
```
Tipp: Kopier den Code in ein CoDeSys/TwinCAT-File, dann ist es einfacher zu lesen 

edit: hab noch eine Zeitanzeige hinzugefügt


----------

