Endlagenüberwachung Zylinder

mzva

Level-1
Beiträge
144
Reaktionspunkte
2
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo zusammen,

wie macht ihr den so die Endlagenüberwachung eines Zylinders. Habe mir einen FC gebastelt. Nachteil ist das ich sehr viel Timer brauche. Hat hier irgendwer Tips oder Anregungen wie man dies 'eleganter' gestalten könnte?

Gruss

mzva
 
Mit einem FB und den IEC Timern, Nachteil, benötigt mehr Ressourcen.

Zähler, der über einen Sekunden-Takt mitläuft, sehr sparsam.

pt
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo,
ich habe mir einen FC geschrieben in dem ein nachgebildeter SE-Timer etwa in der Art wie du ihn auf Volker's Homepage findest integriert ist. Dazu gibt es dann noch einen DB, in dem die Zeitwerte stehen. An der Schnittstelle des FC's wird dann keine Timer-Nr. übergeben, sondern das entsprechende Datenwort. Funktioniert super auch bei großen Mengen an Abfragen. Wichtig fand ich, den DB nicht über ein Array anzulegen, sondern wirklich jedes Datenwort einzeln mit Bezeichnung und Kommentar, sonst kommt man beim Suchen sehr schnell durcheinander.
Gruß Andre
 
Hallo mzva,

wenn Du Timer sparen willst würde ich das mit einem Taktmerker realisieren.
Z.B. mit folgenden Parametern:

IN:
- Endlage_RUECK
- Endlage_VOR
- Überwachungszeit (Wert)
- Taktmerker (in S7 konfigurierbar)

OUT:
- Stoerung_Endlage

Wenn eine Endlage verlassen wird zählst Du ein Merker- oder Datenwort (oder Byte) mit dem Taktmerker (Flanke) solange hoch, bis die andere Endlage erreicht ist. Wird der Wert größer/gleich der Überwachungszeit gibst Du Störung_Endlage aus.

Ich hoffe ich hab das verständlich rübergebracht.

Gruß Alex
 
Danke fuer die Tips und Anregungen. Werde dies mal mit Taktmerker hochzaehlen versuchen zu realisieren.

mzva :s12:
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Wenn eine Endlage verlassen wird zählst Du ein Merker- oder Datenwort (oder Byte) mit dem Taktmerker (Flanke) solange hoch, bis die andere Endlage erreicht ist. Wird der Wert größer/gleich der Überwachungszeit gibst Du Störung_Endlage aus.

Und wenn der Zylinder erst gar nicht losfährt ist Deine Überwachung für die Katz!

Wenn es richtig funktionieren soll muß die Ansteuerung des Zylinders mit rein (und ggf. noch das Signal des Druckwächter).
 

Also ich hoffe das hier die ganze Zeit um eine art Laufzeitüberwachung von Zylindern ging und nicht wirklich um eine Endlagenüberwachung.

Für Endlagenüberwachung sind Zylinderschalter wohl die erste Wahl. Aber eine Laufzeitüberwachung ist dann aber immer noch sehr schön und hilfreich.
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Es geht um eine Laufzeit Ueberwachung. Natuerlich sind Endschalter an einem Zylinder unabdingbar. Es soll erkannt werden ob der Zylinder die gewuenschte Position auch erreicht hat. Sorry wenn ich mich falsch ausgedrueckt habe.

Gruss

mzva
 
Hi Benedikt, um mal deine Frage zu beantworten.
Also:

U(
U A 0.0 // wenn der Ausgang für die Zylinderbewegung eingeschaltet wird
L S5T#1S // dann startet eine Einschaltverzögerung (z.B. T1)
SE T 1
UN A 0.0 // der Timer wird zurück gesetzt, wenn die Zylinderbewegung wieder ausgeschaltet wird
R T 1
NOP 0
NOP 0
U T 1 // ist die Zeit abgelaufen
)
UN E 0.0 // und die zugehörige Endlage wurde nicht erreicht
= M 0.0 // wird ein Fehler ausgelöst

Der Nachteil dieser Methode, du brauchst jede Menge Timer und du musst die Zeiten den Laufzeiten der Zylinder anpassen.

Grüße aus Sachsen
 
Zuletzt bearbeitet:
Hallo Benedikt,

in CoDeSys nutze ich ausschließllich die Systemfunktion "TIME()" um Zeitstempel zu erzeugen. Diese Zeit läuft nach dem Einschalten der Steuerung automatisch los und bietet tolle Möglichkeiten im Vergleich zu Timern wie TON, TOF, etc.
Bei der S7 geht das auch in SCL. Da habe ich die auch schon verwendet.

Ärgerlich an den TON,.. Bausteinen finde ich, dass das diese per Eingang gestartet werden müssen vor einer erneuten Nutzung muss erst eine neue Flanke erzeugt werden. Das macht die Programmierung fehleranfällig. Mit "TIME()" hast du hier keine Probleme.

Eine Laufzeitüberwachung könntest du elegant in einer Schrittkette umsetzten im ST:

CASE nState OF
0: IF FahreInGS THEN
VentilGS := TRUE;
TimeStamp := TIME();
nState := 10;
END_IF;

10: IF EnschalterGS THEN (* alles paletti Endschalter ist gekommen *)
;(* weitere Aktion einfügen... *)

ELSIF TIME() > TimeStamp + t#1s THEN (* Timeout/Laufzeitüberwachung hat angeschlagen *)
nState := 1000 + nState; (* Sprung zur Fehlerbehandlung usw. *)
END_IF;

1000..1999:
wErrorID := nState - 1000; (* die Fehlerid ist also immer der Schritt in dem der Fehler auftrat. Falls in einem Schritt mehrere Fehler auftreten kannst du auch nState := 1000 + nState + 1 usw. einfügen. Wichtig ist, dass du immer in 10er Schritten alles aufbaust damit der Bezug später bei der Fehlerbehandlung klar ist. *)
; (* Implementiere Fehlerhandling *)
END_CASE;

So setzte ich immer meine Schrittketten um. Falls du viele Laufzeitüberwachungen, also quasi fast jeden Schritt mit einem Timeout überwachen willst würde ich folgendes Konstrukt vorschlagen:
VAR
tTimeOut : TIME;
END_VAR

VAR CONSTANT
tDefaultTimeout : TIME := t#5s;
tDisarmTimeout: TIME := t#0s;
END_VAR


IF nState < 1000 AND tTimeout <> tDisarmTimeout AND TIME() > tTimeout THEN
nState := 1000 + nState + 1; (* 10er Schritt + 1 ist dann immer automatisch ein Timeout *)
END_IF;

CASE nState OF
0: tTimeout := tDisarmTimeout; (* Wenn du auf ein Startsignal wartest muss natürlich die Überwachung deaktiviert werden!*)
IF FahreInGS THEN
VentilGS := TRUE;
tTimeout := TIME() + tDefaultTimeout; (* Überwachung "aufziehen" *)
nState := 10;
END_IF;

10: IF EnschalterGS THEN (* alles paletti Endschalter ist gekommen *)
;(* weitere Aktion einfügen... *)

END_IF;
(* ELSIF Zweig entfällt da nun automatisch außerhalb der Schrittkette ein Schritt überwacht wird und ensprechend in den Bereich > 1000 gesprungen wird *)

1000..1999:
wErrorID := nState - 1000; (* die Fehlerid ist also immer der Schritt in dem der Fehler auftrat. Falls in einem Schritt mehrere Fehler auftreten kannst du auch nState := 1000 + nState + 1 usw. einfügen. Wichtig ist, dass du immer in 10er Schritten alles aufbaust damit der Bezug später bei der Fehlerbehandlung klar ist. *)
; (* Implementiere Fehlerhandling *)
END_CASE;


Gibts hier auch eine "CODE" Funktion? Sieht so ja scheusslich aus!
 
Zuletzt bearbeitet:
Zurück
Oben