Schrittkette?? noch nie gemacht.

McNugget

Level-1
Beiträge
220
Reaktionspunkte
10
Zuviel Werbung?
-> Hier kostenlos registrieren
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
 
Hallo,
nur mal so als Start-Impuls :
Code:
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Meine Hilfestellung für CoDeSys /TwinCAT:

Code:
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:
Code:
(* 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
 
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.
 

Anhänge

  • TestSK.bmp
    100,1 KB · Aufrufe: 187
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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
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" :ROFLMAO:.
 
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
 
@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
 
Zuviel Werbung?
-> Hier kostenlos registrieren
@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
 
Zuletzt bearbeitet:
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

LL, dies ist der Beckhoff-Thread :cool:! Da gibts nur IEC-Timer.
 
Dann verstehe ich das Timer-Problem umsoweniger ...

Ich denke aber, dass das eigentliche Thema "inter-Herstellerbezogen" zu betrachten ist ...
 
Guten Morgen!
@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"):
Code:
(* 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
 
Zuletzt bearbeitet:
Zurück
Oben